| 目录 前 ?言  1 echo_test案例  1.1 案例功能  1.2 操作说明  1.3 关键代码  1.3.1 linux_demo代码说明  1.3.2 freertos_demo代码说明  1.3.3 baremetal_demo代码说明  
 前??言本文主要介绍ZYNQ基于OpenAMP框架的双核ARM通信案例的使用说明,CPU0(Master)运行Linux系统,CPU1(Remote)运行裸机或FreeRTOS程序。CPU0使用remoteproc加载CPU1程序,并对CPU1进行配置。 echo_test案例开发手册是基于创龙科技?TI TMS320C6678 + Xilinx Zynq-7045的高速多路高清视频采集处理平台,采用DSP+FPGA+ARM架构。 
 SOM-TL6678ZH核心板正面图?? 
 SOM-TL6678ZH核心板背面图  TL6678ZH-EVM评估板资源图1
 ?? 
 TL6678ZH-EVM评估板资源图2 
 图 1 ?表 1 | 目录 | 目录 | 说明 |  | linux_demo | bin | CPU0应用程序可执行文件 |  | src | CPU0应用程序源码 |  | freertos_demo | bin | CPU1 FreeRTOS可执行文件 |  | project | CPU1 FreeRTOS工程 |  | baremetal_demo | bin | CPU1裸机可执行文件 |  | project | CPU1裸机工程 | 
 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 在processing()中进行函数调用。
 
 图 12 调用init_system()初始化libmetal库与GIC控制器等。 
 图 13 绑定中断号与中断服务函数,中断号需与设备树配置的中断号一致。 
 图 14 
 图 15 调用platform_create_proc()创建平台相关信息。 
 图 16 调用get_resource_table()获取资源表信息,资源表包含内存和virtio设备资源。virtio设备包含vring地址、vring大小和vring对齐方式等信息。 
 图 17 以上函数调用成功后,再调用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评估板或其他产品详细资料,欢迎留言或者私聊! |