創龍首頁 >關于創龍 > 新聞資訊 > 技術文章

聯系我們

Contact Us

公司總機:020-8998-6280

技術熱線:020-3893-9734

技術郵箱:support@tronlong.com

銷售郵箱:sales@tronlong.com

TMS320C6678 ZYNQ OpenAMP 雙ZYNQ 通信案例開發手冊之echo_test案例

2021/07/07

前言

本文主要介紹ZYNQ基于OpenAMP框架的雙核ARM通信案例的使用說明,CPU0(Master)運行Linux系統,CPU1(Remote)運行裸機或FreeRTOS程序。CPU0使用remoteproc加載CPU1程序,并對CPU1進行配置。

圖1


echo_test案例開發手冊是基于創龍科技 TI TMS320C6678 + Xilinx Zynq-7045的高速多路高清視頻采集處理平臺,采用DSP+FPGA+ARM架構。

SOM-TL6678ZH核心板正面圖

SOM-TL6678ZH核心板背面圖


TL6678ZH-EVM評估板資源圖1


TL6678ZH-EVM評估板資源圖2

表 1


目錄說明

linux_demobinCPU0應用程序可執行文件

srcCPU0應用程序源碼

freertos_demobinCPU1 FreeRTOS可執行文件

projectCPU1 FreeRTOS工程

baremetal_demobinCPU1裸機可執行文件

projectCPU1裸機工程

echo_test案例


案例功能

案例功能:CPU0使用RPMsg向CPU1發送數據,CPU1接收到數據后再使用RPMsg向CPU0回傳數據。CPU0對回傳的數據進行驗證,并輸出驗證結果。


操作說明

將CPU1裸機或FreeRTOS可執行文件復制到評估板文件系統“/lib/firmware/”目錄下,并執行如下命令加載CPU1程序。

Target# echo echo_test.elf > /sys/class/remoteproc/remoteproc0/firmware

Target# echo start > /sys/class/remoteproc/remoteproc0/state


圖 2

執行如下命令加載RPMsg驅動,并在“/dev/”目錄下生成RPMsg設備節點。RPMsg驅動源碼為內核“drivers/rpmsg/”目錄下的rpmsg_user_dev_driver.c文件。

Target# modprobe rpmsg_user_dev_driver

圖 3

將CPU0應用程序可執行文件復制到評估板文件系統,并執行如下命令通過RPMsg與CPU1進行通信。

Target# ./echo_test


圖4


輸入1,并按回車鍵進行測試。


圖 5


圖 6

輸入2,并按回車鍵退出測試。


圖 7


執行如下命令,停止CPU1程序。

Target# echo stop > /sys/class/remoteproc/remoteproc0/state


圖 8


關鍵代碼

linux_demo代碼說明

打開RPMsg驅動設備節點。


圖 9


向CPU1發送數據,并對從CPU1回傳的數據進行驗證。


圖 10


freertos_demo代碼說明

創建processing任務。


圖 11


(2)在processing()中進行函數調用。


圖 12


調用init_system()初始化libmetal庫與GIC控制器等。


圖13


綁定中斷號與中斷服務函數,中斷號需與設備樹配置的中斷號一致。


圖 14

圖 15

調用platform_create_proc()創建平臺相關信息。


圖 16


調用get_resource_table()獲取資源表信息,資源表包含內存和virtio設備資源。virtio設備包含vring地址、vring大小和vring對齊方式等信息。


圖 17


(13)以上函數調用成功后,再調用app()。


圖 18


調用remoteproc_resource_init()對之前獲得的平臺信息、資源表信息進行處理。創建Remote Device,并為其設置增加、刪除、讀取RPMsg通道函數。


圖 19


調用hil_poll()以阻塞的方式調用poll函數,并等待數據接收。


圖 20

圖 21

在數據讀取函數rpmsg_read_cb()中,將接收到的數據放入緩沖區后產生數據接收事件,并在app()中進行事件處理。


圖 22

在virtio設備復位函數virtio_rst_cb()中產生復位virtio事件,并在app()中進行事件處理。


圖 23


在RPMsg通道創建函數rpmsg_channel_created()中,創建一個全局RPMsg端點,并設置端點讀取函數。RPMsg通信通過端點完成,與USB類似。


圖 24

在RPMsg通道刪除函數rpmsg_channel_deleted()中,刪除RPMsg端點同時產生通道刪除事件,并在app()中進行事件處理。


圖 25


baremetal_demo代碼說明

由于裸機與FreeRTOS程序相似,因此baremetal_demo代碼說明可參考freertos_demo代碼說明小節,下面對部分代碼進行補充說明。


在main()中調用init_system()初始化libmetal庫與GIC控制器等。調用platform_create_proc()創建平臺相關信息。調用get_resource_table()獲取資源表信息。以上函數調用成功后,再調用app()。


圖 26


調用remoteproc_resource_init()對之前獲得的平臺信息、資源表信息進行處理。創建Remote Device,并為其設置增加、刪除、讀取RPMsg通道函數。


圖 27


在數據讀取函數rpmsg_read_cb()中,對從CPU0接收到的數據進行判斷,并進行不同處理(關機或回傳數據),實現通信和生命周期管理。


圖 28


如需獲取案例源碼、TL6678ZH-EVM評估板或其他產品詳細資料,歡迎留言或者私聊!


創龍官方微信公眾號

Copyright © 2013~2025 廣州創龍電子科技有限公司 All Rights Reserved  | 粵ICP備15055271號