目錄 前 言 1 echo_test案例 1 案例功能 2 操作說明 3 關(guān)鍵代碼 3.1 linux_demo代碼說明 3.2 freertos_demo代碼說明 3.3 baremetal_demo代碼說明
前 言
本文主要介紹ZYNQ基于OpenAMP框架的雙核ARM通信案例的使用說明,CPU0(Master)運(yùn)行Linux系統(tǒng),CPU1(Remote)運(yùn)行裸機(jī)或FreeRTOS程序。CPU0使用remoteproc加載CPU1程序,并對CPU1進(jìn)行配置。 
echo_test案例開發(fā)手冊是基于創(chuàng)龍科技 TI TMS320C6678 + Xilinx Zynq-7045的高速多路高清視頻采集處理平臺,采用DSP+FPGA+ARM架構(gòu)。
SOM-TL6678ZH核心板正面圖
SOM-TL6678ZH核心板背面圖
TL6678ZH-EVM評估板資源圖1
TL6678ZH-EVM評估板資源圖2 表 1
目錄說明 linux_demobinCPU0應(yīng)用程序可執(zhí)行文件 srcCPU0應(yīng)用程序源碼 freertos_demobinCPU1 FreeRTOS可執(zhí)行文件 projectCPU1 FreeRTOS工程 baremetal_demobinCPU1裸機(jī)可執(zhí)行文件 projectCPU1裸機(jī)工程 echo_test案例 案例功能 案例功能:CPU0使用RPMsg向CPU1發(fā)送數(shù)據(jù),CPU1接收到數(shù)據(jù)后再使用RPMsg向CPU0回傳數(shù)據(jù)。CPU0對回傳的數(shù)據(jù)進(jìn)行驗(yàn)證,并輸出驗(yàn)證結(jié)果。 操作說明 將CPU1裸機(jī)或FreeRTOS可執(zhí)行文件復(fù)制到評估板文件系統(tǒng)“/lib/firmware/”目錄下,并執(zhí)行如下命令加載CPU1程序。 Target# echo echo_test.elf > /sys/class/remoteproc/remoteproc0/firmware Target# echo start > /sys/class/remoteproc/remoteproc0/state
圖 2 執(zhí)行如下命令加載RPMsg驅(qū)動,并在“/dev/”目錄下生成RPMsg設(shè)備節(jié)點(diǎn)。RPMsg驅(qū)動源碼為內(nèi)核“drivers/rpmsg/”目錄下的rpmsg_user_dev_driver.c文件。 Target# modprobe rpmsg_user_dev_driver
圖 3
將CPU0應(yīng)用程序可執(zhí)行文件復(fù)制到評估板文件系統(tǒng),并執(zhí)行如下命令通過RPMsg與CPU1進(jìn)行通信。 Target# ./echo_test
圖4
輸入1,并按回車鍵進(jìn)行測試。
圖 5
圖 6
輸入2,并按回車鍵退出測試。
圖 7
執(zhí)行如下命令,停止CPU1程序。 Target# echo stop > /sys/class/remoteproc/remoteproc0/state
圖 8
關(guān)鍵代碼 linux_demo代碼說明 打開RPMsg驅(qū)動設(shè)備節(jié)點(diǎn)。
圖 9
向CPU1發(fā)送數(shù)據(jù),并對從CPU1回傳的數(shù)據(jù)進(jìn)行驗(yàn)證。
圖 10
freertos_demo代碼說明 創(chuàng)建processing任務(wù)。
圖 11
(2)在processing()中進(jìn)行函數(shù)調(diào)用。
圖 12
調(diào)用init_system()初始化libmetal庫與GIC控制器等。
圖13
綁定中斷號與中斷服務(wù)函數(shù),中斷號需與設(shè)備樹配置的中斷號一致。
圖 14
圖 15
調(diào)用platform_create_proc()創(chuàng)建平臺相關(guān)信息。
圖 16
調(diào)用get_resource_table()獲取資源表信息,資源表包含內(nèi)存和virtio設(shè)備資源。virtio設(shè)備包含vring地址、vring大小和vring對齊方式等信息。
圖 17
(13)以上函數(shù)調(diào)用成功后,再調(diào)用app()。
圖 18
調(diào)用remoteproc_resource_init()對之前獲得的平臺信息、資源表信息進(jìn)行處理。創(chuàng)建Remote Device,并為其設(shè)置增加、刪除、讀取RPMsg通道函數(shù)。
圖 19
調(diào)用hil_poll()以阻塞的方式調(diào)用poll函數(shù),并等待數(shù)據(jù)接收。
圖 20
圖 21
在數(shù)據(jù)讀取函數(shù)rpmsg_read_cb()中,將接收到的數(shù)據(jù)放入緩沖區(qū)后產(chǎn)生數(shù)據(jù)接收事件,并在app()中進(jìn)行事件處理。
圖 22
在virtio設(shè)備復(fù)位函數(shù)virtio_rst_cb()中產(chǎn)生復(fù)位virtio事件,并在app()中進(jìn)行事件處理。
圖 23
在RPMsg通道創(chuàng)建函數(shù)rpmsg_channel_created()中,創(chuàng)建一個(gè)全局RPMsg端點(diǎn),并設(shè)置端點(diǎn)讀取函數(shù)。RPMsg通信通過端點(diǎn)完成,與USB類似。
圖 24
在RPMsg通道刪除函數(shù)rpmsg_channel_deleted()中,刪除RPMsg端點(diǎn)同時(shí)產(chǎn)生通道刪除事件,并在app()中進(jìn)行事件處理。
圖 25
baremetal_demo代碼說明
由于裸機(jī)與FreeRTOS程序相似,因此baremetal_demo代碼說明可參考freertos_demo代碼說明小節(jié),下面對部分代碼進(jìn)行補(bǔ)充說明。 在main()中調(diào)用init_system()初始化libmetal庫與GIC控制器等。調(diào)用platform_create_proc()創(chuàng)建平臺相關(guān)信息。調(diào)用get_resource_table()獲取資源表信息。以上函數(shù)調(diào)用成功后,再調(diào)用app()。
圖 26
調(diào)用remoteproc_resource_init()對之前獲得的平臺信息、資源表信息進(jìn)行處理。創(chuàng)建Remote Device,并為其設(shè)置增加、刪除、讀取RPMsg通道函數(shù)。
圖 27
在數(shù)據(jù)讀取函數(shù)rpmsg_read_cb()中,對從CPU0接收到的數(shù)據(jù)進(jìn)行判斷,并進(jìn)行不同處理(關(guān)機(jī)或回傳數(shù)據(jù)),實(shí)現(xiàn)通信和生命周期管理。
圖 28
如需獲取案例源碼、TL6678ZH-EVM評估板或其他產(chǎn)品詳細(xì)資料,歡迎留言或者私聊!
|