本帖最后由 maskmoo 于 2024-7-21 21:06 编辑
Linux 系统要启动需要通过 bootloader 程序引导,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内核从 flash(NAND,
NOR FLASH,SD,EMMC 等)拷贝到 DDR 中,最后启动 Linux 内核。
通过 M33 固件来测试异核通信例程时,需要提前修改 uboot 的 bootargs 变量,否则可能出现 M33 核启动后无法接收 A55 核指令的问题和。
启动开发板时,在串口打印信息界面可以看到 uboot 启动相关的信息,需要在 uboot 倒计时结束前按下回车键,停留在 uboot 命令行,才能在 uboot 命令行中进行 uboot 命令的操作。
1 修改 uboot 启动参数
在 uboot 下我们可以将开发板虚拟成一个 U 盘,可以选择将 EMMC 虚拟成 U 盘以后就可以直接在电脑上向开发板拷贝文件了。uboot 提供的 ums 命令是来完成此功能。
使用 Type C 线将电脑的 USB 接口和开发板的 USB_OTG 接口连接起来。在 uboot中,使用以下指令将 EMMC 虚拟成 U 盘。
ums 0 mmc 0
当 EMMC 成功挂载后,在显示的U盘中找到挂载显示的 extlinux.conf 文件。
修改 extlinux.conf 配置文件,添加 clk_ignore_unused 参数
确认clk_ignore_unused 参数是否成功传参到内核中,在开发板成功进入到文件系统后,使用如下指令查看。
cat /proc/cmdline
2 修改异核通信缓冲区大小
修改 Cortex-A55 异核通信单次接收数据包的总大小
异核通信例程SDK已经将所有异核通信例程中的异核通信缓冲区大小修改为 1024 字节。为了确保异核通信不出现问题,还需将 Linux 内核的异核通信缓冲区大小同样修改为 1024 字节。
在内核源码kernel-6.1.55/drivers/rpmsg 目录的 virtio_rpmsg_bus.c 文件。修改宏定义变量 MAX_RPMSG_BUF_SIZE 的大小为 1024。这个值代表单次接收数据包的总大小 。
修改 Cortex-A55 异核通信缓冲池大小
在 kernel-6.1.55/arch/arm64/boot/dts/freescale 目录下找到 imx93-11x11-atk.dts 文件。定位到 vdevbuffer 节点,修改 reg 属性的第四个参数为 0x20000。出厂设备中值reg 属性的第四个参数是 0x10000,对应 512 字节的缓冲区大小,将其调整为0x20000 就能对应1024 字节的缓冲区大小,按以上方法即可计算出其它缓冲区大小对应的 reg 属性第四个参数的值
测试验证
使用 imx_rpmsg_tty.ko 进行测试,检验异核通信缓冲区大小修改是否完成。
将宏定义 MSG 的值改为以下内容,数据大小大于默认的512字节。修改完后重新编译内核模块文件并将新的内核模块文件替换到核心板中。
修改Cortex-M33 SDK 驱动源码
主要是 rpmsg_config.h 的 RL_BUFFER_PAYLOAD_SIZE 变量大小修改为 1008和 main_remote.c 下的 app_buff 字符串数组大小,将其修改为1024 即可,这个数值代表异核通信缓冲区总大小。SDK源码默认这两处都已经修改完成,因此这里只需要重新编译文件,将生成的 elf 文件放到开发板的/lib/firmware 文件夹路径下即可。
分别将调整后的内核镜像设备树更新到对应目录,然后重启开发板。
打开 M33 和 A55 的串口终端,接着拨码 A55 EMMC 模式启动开发板,进入/lib/firmware文件夹,使用以下指令进行测试
modprobe imx_rpmsg_tty
./load_remoteproc.sh rpmsg_buffer_test.elf
第一次测试发现现象不符合预期,检查发现时更改后的imx_rpmsg_tty模块没有更新到开发板。
更新imx_rpmsg_tty模块
最终测试成功
检验修改成功后记得将内核源码中的 imx_rpmsg_tty.c 文件里宏定义 MSG 的值改回“helloworld!”再进行接下来的例程测试,否则建立异核通信通道后无法完整初始化硬件,容易出现
一些与测试现象不相符的内容。