자유게시판

STM32MP1으로 배우는 A7 코어와 M4 코어 RPMSG 통신 이해하기 1
2020. 5. 28 (목) 16:44 메이슨 조회 152 좋아요 2 스크랩 0 댓글 2

개인 블로그는 처음 운영해보는데 처음 주제를 RPMSG로 정했네요. 많이들 봐주세요~!

https://studywithmason.tistory.com/3

 

 


 

안녕하세요! 개인블로그는 처음 운영해보는 메이슨조입니다.

 

e4ds MAKE 라는 곳에서 우연히 STM32MP157C-DK2 보드를 얻어서 뜻밖에도 없는 리눅스 공부를 시작하게 됬습니다.

처음 STM32MP1 보드를 봤을때 했던 생각이 나네요. 

 

이 혼종은 뭐지? 임베디드+마이크로프로세서 라는 조합이 낮설게 느껴졌습니다. 

알고보니 그냥 혼종이 아닌 꽤 재미있는 물건이였습니다.

 

보드 내부의 arm A7코어와 cortex-m4 코어는 Bootloader에서 부터 서로 독립적으로 부팅이 가능합니다.

정보도 서로 공유할 수 있고 M4 코어가 저전력 상태에 있는 A7 코어를 wakeup 시키는 기능도 있더군요.

 

이제부터 천천히 STM32MP1에 대해 알아갈려고 합니다. (그리고 잊혀지는 제 책상의 NVIDIA Jetson Nano....)

 


 

이번 포스팅에서는 A7코어와 M4코어 사이 RPMSG를 이용한 통신이 어떻게 이루어 지는지 알아볼려고 합니다.

 

아래 사진을 보시면 rpmsg가 대략적으로 어떻게 이루어져 있는지 알 수 있습니다.

 

하지만 아래 사진을 그냥보시면 무슨 소리인지 하나도 모르실 겁니다.

 

처음 공부할때 제 머리속에는 마치

"remote proc은 뭐고 virtio는 또 뭐지? 때려치고 싶네."

이랬습니다.

 

하지만 이걸 배움으로써 할 수 있는 선택지들이 너무 매력적이여서 결국은 겉핥기 식으로 배우게 되었습니다 ㅎㅎ

 

걱정이 드신다면 여러분 걱정마세요.

저도 한달전에 리눅스 공부를 시작한 초보입니다. 여러분도 꼭 이해 하실 수 있으실 겁니다.

이제부터 저와 함께 알아보도록 합시다. Let's get started!

 

출처: ST사 wiki

 


1. IPCC(Inter Process Communication Controller)

 - 두 코어간 interrupt channel을 담당하는 controller입니다.

 - Channel 1에서 6까지 있으며 Channel 1, 2, 3은 이미 rpmsg와 remoteproc을 위해 reserved되어 있습니다.

 - 각 채널마다 두개의 subchannel이 있습니다.

 - Sender측에서 IPCC 내부 register의 status flag를 toggle하면 그 즉시 IPCC에서 (Occupied 또는 Free) Interrupt 신호를 receiver측으로 전달합니다. Interrupt를 받은 Reciver측에서는 flag를 처리할 의무가 있습니다.

 - 총 3가지 모드를 지원합니다. RPMSG의 Async Virtual UART 를 이용하기 위해서는 Full-duplex communication mode만으로도 충분합니다.

 

 

아래 사진은 STM32MP1 보드 기준 IPCC가 어떻게 구성되어 있는지 보여주고 있습니다.

출처: ST사 IPCC wiki

 


2. Linux Mailbox framework

- Mailbox는 linux device tree 에 등록된 node(device)입니다.

- Mailbox는 Mailbox controller와 Mailbox client로 구성되어 있습니다.

- STM32MP1보드 기준으로 controller는 IPCC이며 client는 remoteproc입니다.

- 기본적인 framwork인 만큼 client와 controller사이를 이어주는 역할만 합니다.

 

아래 device tree에서는 IPCC의 채널 1,2,3이 어떻게 mailbox에게 reserved 됐는지 보여주고 있습니다.

ipcc: mailbox@4c001000 {
	compatible = "st,stm32-ipcc";
	#mbox-cells = <1>;
	reg = <0x4c001000 0x400>;
	interrupts-extended = <&intc GIC_SPI 100 IRQ_TYPE_NONE>,
			      <&intc GIC_SPI 101 IRQ_TYPE_NONE>,
			      <&exti 62 1>;
	interrupt-names = "rx", "tx", "wakeup";
	clocks = <&rcc_clk IPCC>;
	wakeup-source;

        Status = "Okay";
 };

 


 

3. Linux remoteproc framwork

 - remote processor의 거의 모든것을 담당하는 framwork라고 생각하시면 됩니다. (전원 끄기, 켜기, 펌웨어 교체 등등)

 - M4 펌웨어에 있는 resource table(struct)에서 코어간 통신과 RAM 설정 정보를 추출하여 m4 startup initialization을 수행하게 됩니다.

 - Linux mailbox framework의 client이기도 합니다.

-STM32MP1 기준으로 virtio/rpmsg driver에게 쓰이게 됩니다.

출처: ST사 wiki

 


 

4. Virtio(An I/O virtualization framework for Linux)

 - 가상의 input, output 통신 채널(Vring)을 내부 메모리 주소에 생성합니다. Vring은 데이터를 수송하는 역할을 합니다.

 - 각각의 Device(예시로 M4 코어)들은 virtqueues(Read 또는 Write 요청)를 가지고 있습니다.

 - 먼저 Host(Linux Guest)의 Virtio Driver에서 Device들의 virtqueues를 탐색합니다. Device의 요청(virtqueues)에 따라 할당된 Vring buffer에 데이터를 전송합니다.

 - qemu-kvm 같은 가상화 기술에 많이 쓰이는 framework이라고 합니다.

        예시) 가상환경에서 virtio가 네트워크 드라이버를 모방해서 host와 똑같은 인터넷망을 이용할 수 있다.

 - [추측] STM32MP1 에서의 virtqueues는 remoteproc의 mailbox framwork의 IPCC를 통해 송수신 된다고 추측됩니다.

 

Remark) 마지막 부분은 ST사 wiki에서 virtio에 대한 설명이 미약해서 제 추측으로 대신했습니다. 혹시 제 추측이 틀렸다면 댓글로 남겨주세요. 

 

 


 

5. RPMSG(Linux Remote Processor Messaging framwork)

 - Virtio를 기반으로 한 remote processor와 통신 메커니즘입니다.

 - STM32MP157C-DK2 보드 기준으로 유저는 /dev/ttyRPMSG0 (Channel 0) 또는 /dev/ttyRPMSG1 (Channel 1)의 char device을 통해 접근이 가능합니다.

 - register_rpmsg_driver() 메소드를 통해 custom rpmsg_driver를 rpmsg 커널 모듈에 등록가능합니다.

 


 

6. OPENAMP(Open Asymmetric Multi Processing)

 - remote processor 측의 RPMSG라고 생각하시면 됩니다.

 - IPCC에서 Interrrupt을 받아서 vring에서 buffer를 읽고 쓰는것 등등을 처리합니다.

 


 

이상으로 RPMSG의 구성원들을 대략 살펴 보았습니다.

어떠신가요? 제가 봐도 정말 복잡합니다.

 

다행히 사용자 입장에서는 Linux A7코어 측의 RPMSG framwork와 M4 코어의 OPENAMP만 잘 사용하면 원하는 대부분의 기능을 구현하실 수 있습니다.

 

이제 배움을 하셨으니 실천을 해야할 시간입니다!

 

7. 아래 링크는 RPMSG와 OPENAMP을 이용한 간단한 예제 튜토리얼입니다. 

 

https://visualgdb.com/tutorials/arm/stm32/stm32mp1/openamp/

 


 

다음 포스팅에서는 DMA를 이용한 STM32MP1 A7코어와 M4 코어 대용량 buffer(MB 단위) 교환에 대해 올려보도록 하겠습니다.

 

사실 다음 포스팅을 쓸 수 있는 능력이 있을지... 모르겠습니다.

 

아무튼 여러분 Happy Coding~~

 


 

Reference:

 

https://developer.ibm.com/articles/l-virtio/

https://wiki.st.com/stm32mpu/wiki/Linux_RPMsg_framework_overview

https://www.slideshare.net/zenixls2/052-virtio-introduction-17191942

https://wiki.st.com/stm32mpu/wiki/Linux_remoteproc_framework_overview

https://wiki.st.com/stm32mpu/wiki/Linux_Mailbox_framework_overview

https://wiki.st.com/stm32mpu/wiki/IPCC_internal_peripheral

3958 2020.05.29 13:12 답글  | 
오~ 저도 이쪽으로 생각하고 있는데.. 감사합니다.
메이슨 2020.05.28 17:11 답글  | 
오 방금 봤는데 마지막 퀘스트가 자유 결과물이네요! 제가 올린 글로 좋은 결과 만드시고 추가점수 타가세요~~

로그인 후
참가 상태를 확인할 수 있습니다.