rpmsg_char_zerocopy
作为TI-AM62X系列提供的两种核间通信方式中的一种,rpmsg_char_zerocopy采用DMA方式,直接共享内存,核间并不频繁的传递消息内容,而是直接传递块地址,来一次发送大量消息,在数据量大的情况下占据优势。
linux脚本编译
- 获取项目源码 :
git clone git://git.ti.com/rpmsg/rpmsg_char_zerocopy.git
- 配置TI_SDK :
wget https://dr-download.ti.com/software-development/software-development-kit-sdk/MD-PvdSyIiioq/09.01.00.08/ti-processor-sdk-linux-am62xx-evm-09.01.00.08-Linux-x86-Install.bin
- 执行下载好的SDK文件 :
./ti-processor-sdk-linux-am62xx-evm-09.01.00.08-Linux-x86-Install.bin
- 进入SD安装目录:
cd cd ti-processor-sdk-linux-am62xx-evm-09.01.00.08/
- 复制dma_buf_phys.h头文件到交叉编译环境中:
cp board-support/linux-<version>/include/uapi/linux/dma_buf_phys.h linux-devkit/sysroots/aarch64-linux/usr/include/linux
- Source SDK环境:
source /linux-devkit/environment-setup
- 进入项目目录:
cd /home/fl/ti/mcu_plus_sdk_am62x_08_03_00_07/examples/drivers/ipc/ipc_rpmsg_zerocopy/rpmsg_char_zerocopy
,并阅读该目录下README.md内容 - README.md中设备树相关内容与M4F固件相关,后面详细讲述。
- 进入linux脚本项目目录:
cd linux
- 生成配置文件:
autoreconf --install
- 根据当前编译器环境执行配置文件:
./configure --host=aarch64-linux-gnu-gcc
- 生成脚本:
make
- 生成的脚本在src目录下
M4F固件编译
- 配置SDK+MCU 8.03:
wget https://downloads.ti.com/ccs/esd/tirex/zips/mcu_plus_sdk_am62x_08_03_00_07/all/mcu_plus_sdk_am62x_08_03_00_07__all.zip
- 配置sysconfig1.12.0:
wget https://software-dl.ti.com/ccs/esd/sysconfig/sysconfig-1.12.0_2406-setup.run
- 配置TI_Clang1.3.1:
wget https://software-dl.ti.com/codegen/esd/cgt_public_sw/ARM_LLVM/1.3.1.LTS/ti_cgt_armllvm_1.3.1.LTS_linux-x64_installer.bin
- 创建项目目录:
cd /home/fl/ti/mcu_plus_sdk_am62x_08_03_00_07/examples/drivers/ipc
;mkdir ipc_rpmsg_zerocopy
- 获取项目源码:
git clone git://git.ti.com/rpmsg/rpmsg_char_zerocopy.git
- 进入rtos目录:参阅REMADE.md
- 设置MCU_SDK路径 :
export MCU_PLUS_SDK_PATH=${HOME}/ti/mcu_plus_sdk_am62x_08_03_00_07
- 编译生成M4F固件 :
gmake -s -C am62x-sk/system_freertos all
,编译过程中可能遇到问题,需要修改代码中的uint_16t - 生成的.out在rpmsg_char_zerocopy/rtos/am62x-sk/m4fss0-0_freertos/ti-arm-clang/目录下
- 在该过程中选取和README.md中一样的SDK版本和sysconfig版本,因为其他版本会出现错误,说没有BGA包,关于BGA包的地方可在sysconfig文件中找到,更高版本的sysconfig文件中没有该包,同时该项目只能使用make进行编译,在CCS中导入时,会遇到BUG,说版本不匹配,可能的原因是当前CCS版本过高,尚未降低CCS版本以匹配该项目。
- CCS导入问题解决:进入rpmsg_char_zerocopy/rtos/am62x-sk/m4fss0-0_freertos/ti-arm-clang/目录下vim example.projectspec文件,根据自己SDK版本将所有的下列字符修改为对应版本,我这里使用的AM62X系列的版本,所以修改为AM62X
固件及设备树移植
- 固件移植方法很简单,以通用M4F固件移植方式移植即可,但是该固件版本较低,尚不支持运行时更新固件状态。
- 设备树移植参考ipc_rpmsg_zerocopy/rpmsg_char_zerocopy/README.md中内容
- 由于我们使用的米尔的开发板,故设备树文件修改如下图所示
- 重新编译设备树,更新开发板设备树。README.md中提到需要更新kernel和modules,但是我仅更新设备树文件一样可以打开该驱动。
- 设备树,M4F固件,脚本文件均更新后,在板子上进行测试。
- 测试时会出现一个问题,M4F的消息没有回传,查看M4F固件代码,如下图,能够发现有个函数在M4F不能够起作用,会卡死此处,于是注释掉该函数。
- 最终能够得到正确测试结果
小结
该项目存在的两个问题
- .当SDK环境相关库文件适配成功rpmsg_char_zerocopy脚本后,可能会导致当前SDK环境编译出来的另一套核间通信机制rpmsg_char_simple脚本出问题哦(可能是同名库文件,但是其中内容有差异)。
- rpmsg_char_zerocopy的M4F固件只能在MCU_SDK8.03下编译,不知道后续版本更新会不会支持