创龙之前开放了一个99元的T113i开发板,全志或者瑞芯微都好,他们基本上要满血都是BSP全家桶,代码质量一言难尽的,作为折腾的人受不了,所以就搞了主线计划.
U-Boot => https://github.com/nickfox-taterli/t113-uboot
配置文件 t113i_minievm_defconfig
U-Boot比较好移植,毕竟我的目标是能启动就行,所以没那么高要求,所以我在U-Boot阶段是很多东西都做不了的,比如BSP支持的U-Boot阶段亮屏什么就不行的,但是我也说了,折腾这个就是娱乐,你产品非要特别要求,手戳寄存器当然也可以在U-Boot显示.
Linux内核 => https://github.com/nickfox-taterli/t113-linux
配置文件 tl-t113i-minievm_defconfig
设备树 sun8i-t113i-minievm.dts
Linux内核其实很多驱动D1都提供了,但是我还移植了下面特性.
- remoteproc
- HiFi4 启动/双向通信
- C906 启动/双向通信
- 多媒体编码 (MJPEG)
- 多媒体解码 (H264/H265)
- 硬件支持H263,VP8,VP9但是这些都没移植.
- 硬件不支持缩放,所以省CPU的播放都是解码NV12直接进DE上屏
- 如果CPU参与缩放,光缩放都卡到不到5fps,所以硬解如果不上屏,就NV12转RTP发网络走,但是网络你明白的.
- LRADC 按键扫描
- LT8912B DSI 驱动
- 硬件上就没连接EDID,所以用的是强制分辨率.
- ASoC 音频子系统
- 播放OK
- 录音可能失败,因为我也没麦克风,直接录基本收到的是极小的信号,不确定是否正确.
- IOMMU
- 目前针对显示和解码,编码实施了IOMMU,所以CMA用量就很小了.
原有的SPI,GPIO等特性,主线本身有,现在知道没有的,但是也没测试的有这些.
- 红外接收
- CVBS输出 / RGB输出
- CVBS输入 / 并口CSI输入
- TPADC (电阻触摸屏接口)
- DMIC (数字麦克风)
- OWA (单总线)
- SPI DBI 模式 (SPI TFT 驱动模式,开发板上关键IO都用于其他作用了)
- CAN
一些不常见但是主线早有的驱动,已经测试过.
- GPADC
- 一个非常飘逸的ADC,BSP内核也很飘,手册上有写,虽然是12位ADC,但是有效可信最多8位,实测可能就6位吧.
- LEDC
- 驱动WS2812的专用外设
- PWM
所以说主线能启动,不代表全外设,折腾的路还是很长的.说个题外话,就算RK3399都这么老了,现在大家都还没做到全主线全外设驱动,比如Stateless V4L2 API.
C906小核代码我提供了两种形式,一种是非常simple的,就是纯裸,什么都没有,对于实际项目而言意义没那么大,但是对折腾意义可就大了,一种提供FreeRTOS + OpenAMP移植好的,并且是中断方式响应.这里先说比较完善的这个,注意这里是没有全志特调私货的.
C906 代码 => https://github.com/nickfox-taterli/t113-c906
调试信息在UART3端口输出,编译后把c906-fw.elf复制到/lib/firmware,然后启动就可以.
echo start > /sys/class/remoteproc/remoteproc0/state

在C906的UART3输出

在我另一个源 https://github.com/nickfox-taterli/t113-utils 的cpux下,有两个通信用工具,简单编译一下放到目标板.
主机上编译
root@debian:~/t113/t113-utils/cpux_code# arm-linux-gnueabihf-gcc rpmsg_open.c -o rpmsg_open
root@debian:~/t113/t113-utils/cpux_code# arm-linux-gnueabihf-gcc rpmsg_ping.c -o rpmsg_ping
刚才启动的最后一句能看到
virtio_rpmsg_bus virtio0: creating channel c906-echo addr 0x400
所以目标板可以这么测试.
# ./rpmsg_open /dev/rpmsg_ctrl0 c906-echo 0x400
# ./rpmsg_ping /dev/rpmsg0 "hello"
rx (5 bytes): hello
可以看到小核上也有打印

在C906要注意维护内存一致性,另外C906虽然支持S/U模式等,但是我试了几次都没办法target中断,看BSP实现也没用S/U模式,我也用M模式了.
HiFi4 核心本身是需要License的,但是我既然不是玩商业,我也不好意思问创龙他们要啊,所以我直接用GCC了,所以性能肯定上不来,HiFi4有自己的SRAM,所以关键时间代码要放SRAM运行,不然很崩,由于加载方法都是一样的,这里不多说测试了.HiFi4的是UART2输出.
HiFi4 代码 => https://github.com/nickfox-taterli/t113-hifi4
最后讲一下第一阶段BOOT,我这里用的是SysterKit,也是绕不开ddr blob的,这部分闭源是很正常的,通常是法律原因.我直接改SyterKit/board/100ask-t113i/board.c,就是换个串口,然后做了个小引导,这里就不多说了.单片机开发一样的体验.
第一阶段BOOT => https://github.com/nickfox-taterli/t113-utils/tree/main/SyterKit

写在最后
不知道是我这个板子什么原因,BSP内核NAND访问也是经常出错,我自己用主线驱动也是2Gbit的后半部分基本是出错的,对了手册查了寄存器无果,不过实际上我也基本不用NAND,也就是用来做一个拉起TF卡引导而已.我这个折腾里,系统就两个分区,一个是/boot (vfat),另一个是rootfs (ext4),算是最小化了,对于做产品是不好,毕竟这么多功能缺了,做产品还是看BSP的shit.
