Posted in

芯劢微 XM232 开发笔记及 XM212 内存优化

本文是一篇芯劢微 XM232 IPC SoC 开发板的实战上手笔记,基于原厂 XM232R1 主板与 tuya sofia 固件,记录从硬件约定、各类驱动调试到 XM212 内存优化的真实踩坑与解决思路,供同样入手该平台的开发者参考。

XM232 开发板

开发使用原厂提供的一片型号 IPC-RM1-XM232R1-M231-ETH-WB-V1_01 这个主板开发的。
主板附带了一个 tuya 方案的 turnkey 固件,主进程叫 sofia,可以直接在这个固件上体验效果。
找原厂 FAE 可以要到这个固件的终端登录用户密码,可以登录进去,对文件系统做一个简单了解,也可以尝试理解学习一下其他开发者的思维。
平心而论,从固件的输出以及 APP 体验,这个 sofia 的固件还是做得相当不错的,背后有高人,只可惜不开源。

XM232 开发过程趟过的一些「坑」‌

总体来说,整个开发过程还是很顺利的。整个 SDK 设计的很精简,与当年海思 HI3518C 相似度很高(包括一些术语、命名规则、API 设计等),原厂 FAEs 也比较 nice,
整体开发起来没有太大的问题。
之所以说趟过一些「坑」‌(有引号)但对于一个新入手的芯片平台,不过 SDK 做得多完善,文档多完整,开发过程中总是难免一些遇到磕磕碰碰的情况,记录下来作为这次开发经验的笔记:

  1. ⚠️ 开发板在不焊接 PHY,要加焊一个电阻(如图)便于软件标识不使用 PHY,这个是一个软硬件设计的约定,否则 PHY 驱动有异常。
    XM232 开发板 PHY 电阻位置

  2. ⚠️ USB Wi-Fi 模块单纯加载 cfg80211 和模块驱动是跑不起来的,必须要加载 SDK 的 extdrv 目录下面的 xm_usb0.ko 和 dwc.ko,因为这几个驱动没有驱动依赖关系提醒,文档上有这个说明,不看仔细会忽略,其中 xm_usb0.ko 加载时要传入 USB Wi-Fi 的电源复位引脚。

  3. ⚠️ i2c 提供的参考代码上,三组 I2C 使用同一个 mutex,因此在多个 I2C 工作时传输效率由于互相等待锁导致很低。而这块主板需要使用 I2C1 与 MX2209 通讯驱动电机,这里要优化一下 xm_i2c.c 的驱动代码,把三组 I2C 操作独立 mutex,否则很容易由于中断调度不足(一个电机脉冲周期小于一个 i2c 写指令周期,内核会报错 ),导致内核异常,另外,很保证 MX2209 I2C 操作并发性对 I2C 写耗时影响,因此电机驱动上实现最好 timer+workqueue 实现,这个我折腾了一周时间。上述提及由于单次定时器中断操作时间大于定时器最小执行时间内核会有类似报错:
    BuG: scheduling while atomic: ipc mini servic/574/0x00010000

  4. ⚠️ 调试的主板使用一个 sdio0_1_sd.ko,这个驱动在内核 drivers/mmc/host 有源码,但是默认没有打开,需要改一下内核目录下的 Makefile,让他编译出来;

  5. API 文档中 XM_MPI_SYS_Exit() 与 XM_MPI_SYS_GetVersion() 都没有显式定义,但是库是有的,如果要调用需要显式调用一下,我也不理解,这个是开发人员疏忽了还是什么回事儿。

  6. ADC3_IN 读入参考 mpp/sample/adc.c,方案使用 ioctl 的方式;

  7. ⚠️ 搬完文件系统以后,加载 hevc.ko 会出现芯片卡死的问题,是应为 pll.sh 脚本未严格执行完。这个有个很潜在的问题,pll.sh 里用到 sleep 0.1 浮点参数支持,busybox 的 mini 配置缺省去掉,这里可以重新配置您环境的 busybox 让 sleep 支持浮点,也可以改用 usleep 指令。

  8. GPIO 的调试可能经常用到,寄存器地址 0x10020000 + NUM 4,例如 ADDR(GPIO_A016) = 0x10020000 + 16 4 = 0x10020040;

  9. ⚠️ GPIO B036 的 GPIO 寄存器在 MPP 跑起来的时候会把他重置成 0x82,因此 GPIO 此时可能没效,这个估计与 DVP 总线初始化行为有关,注意在跑完 MPP 的时候要对齐有效初始化。

  10. ⚠️ SDK 里面 pll.sh 脚本 reg 0x20000068 0x02020501 配置,人形侦测跑起来一段时间 CPU 会宕机,与 FAE 沟通此处需要改成 reg 0x20000068 0x02020502,修改以后测试正常。另外,如果使用 XM212 PSRAM,这个寄存器要配置 reg 0x20000068 0x82020502(即最高位置位)

  11. 内存优化的方法:开启行模式和 3D 内存共享,方法

    1. insmod vi.ko  line=1080  yc3dshard=1
    2. XM_MPI_ISPAPP_Run 中 NrEnable=0x5( 共享模式下,压缩是 vi 模块做了,5 和 7都一样的效果)
    3. 在 1 基础上,vb 不需要配置主码流,这里可以省掉一块大内存。
  12. u-boot 传入的 mmz 内存大小必须 1MB 对齐,对于 XM232R1 内存相对充裕问题不大,后面用到 XM212R0 或者 XM232R0 方案,能省一点是一点,这个 1MB 的颗粒就比较浪费了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注