移植openwrt到rk3328讯飞超脑魔盒iflyhome-i01,过程记录一下

下面是移植过程, 不是简单刷机过程, 刷机过程后面会单独写一篇。
电路板有ttl串口, 接上后, 115200,8n1,  抓取到启动信息, 从cmdline中可以获取到16G的emmc的分区信息,rk29xxnand是16进制扇区:

earlyprintk=uart8250-32bit,0xff120000 \
console=ttyFIQ0 \
androidboot.baseband=N/A \
androidboot.selinux=permissive \
androidboot.hardware=rk30board \
androidboot.console=ttyFIQ0 \
init=/init mtdparts=
rk29xxnand:\
0x00002000@0x00002000(uboot),\

0x00004000@0x00004000(trust),\
0x00002000@0x00008000(misc),\
0x00000800@0x0000A000(baseparamer),\
0x00007800@0x0000A800(resource),\
0x00010000@0x00012000(kernel),\
0x00010000@0x00022000(boot),\
0x00010000@0x00032000(recovery),\
0x00020000@0x00042000(backup),\

0x00040000@0x00062000(cache),\
0x00008000@0x000A2000(metadata),\
0x00002000@0x000AA000(kpanic),\
0x00300000@0x000AC000(system),\
0x00004000@0x003AC000(oem),\
-@0x003B0000(userdata) \
storagemedia=emmc \
uboot_logo=0x02000000@0x7dc00000 \
loader.timestamp=2020-08-14_11:09:16 \
hdmi.vic=65536 \
tve.format=1 \
SecureBootCheckOk=0 \
androidboot.serialno=O2Q7EOI0

ddr的芯片是4片k4b4g1646e-bcma, ddr3-1866Mhz 4Gb芯片,  2G字节ram

准备一个usb的type-a连线,  5v接5v,  D-接D-, D+接D+, GND接GND, 连接电脑和盒子的白色的usb2口,  盒子不用接电源, usb线就可以供电,  
电路板背面有2个触点 tp2301, tp2300 短接后,插上usb线, 然后usb2的口, 就切换成外设模式, 电脑上 就可以lsusb看到:
Bus 003 Device 080: ID 2207:320c Fuzhou Rockchip Electronics Company RK3328 in Mask ROM mode

直接用rkdeveloptool工具(debian带了这个软件,可以直接apt install)读取完整rom,然后在resource分区,根据dtb特征字提取到dtb信息, 
rkdeveloptool 需要一个loader , 在 git clone https://github.com/rockchip-linux/rkbin.git  获得,
find . -iname '*rk3328*' -o -iname '*3328*loader*'
找到后,要用这个命令,生成一下rk3328_loader_v1.22.250.bin :
./tools/boot_merger RKBOOT/RK3328MINIALL.ini  
然后把rk3328_loader_v1.22.250.bin 加载到盒子里, 才可以dump rom: 
sudo rkdeveloptool db ./rk3328_loader_v1.22.250.bin

然后就可以看rom信息:  

sudo rkdeveloptool rfi
Flash Info:
Manufacturer: SAMSUNG, value=00
Flash Size: 14910 MB
Flash Size: 30535680 Sectors
Block Size: 512 KB
Page Size: 2 KB
ECC Bits: 0
Access Time: 40
Flash CS: Flash<0> 
 
sudo rkdeveloptool rci
Chip Info:  48 32 32 33 FF FF 0 0 FF FF 0 0 FF FF 0 0
 
rkdeveloptool 的rl, wl命令,后面的参数 , 第一个是读取起始扇区位置,每扇区512字节,  第二个参数是读取字节长度可以加前缀0x,

30535680个扇区*512 是15634268160 字节,全部读取备份:
sudo rkdeveloptool rl 0 15634268160 iflyhome-i01-emmc-full.img

然后根据dtb的特征码和长度, 提取出dtb

反编译成dts
dtc -I dtb -O dts -o 3.10_i01.dts 3.10_i01.dtb
这个dts, 是linux-3.10的, 跟目前的linux-6不匹配, 但是可以参考,可以让chatgpt帮忙转成linux6的格式
附件999-arm64-dts-rockchip-add-iflyhome-i01.patch 就是最终结果,可以直接在openwrt的git进行引入am,

 

编译openwrt,系统需要安装一些软件包

apt install  python3-pyelftools swig python3-dev 
make download -j 4

make target/linux/prepare V=s -j1

生成build_dir/target-aarch64_generic_musl/linux-rockchip_armv8/linux-6.12.108/目录
然后到build_dir/target-aarch64_generic_musl/linux-rockchip_armv8/linux-6.12.108/ 去做dts配置文件,
修改target/linux/rockchip/image/armv8.mk, 增加型号, openwrt编译完成,现在继续搞uboot这一部分。
rk3328的启动过程, 会跳过emmc硬盘的开始部分, 从0x4000开始执行, 这样, 就可以在emmc的开始放一个分区表, 不过这个分区表是简单的dos分区表, 把分区合并成3个, 后面是扩展分区

原分区的作用(16进制数字为512字节大小的扇区数:

mtdparts=rk29xxnand:
0x000000040@0(hidden), 32k@0,保留, 未暴露给android
0x00001bc0@40(hidden), 4M@0x8000,uboot文件 未暴露给android
0x80@0x1c00(hidden),64k@0x380000,  DVKR
0x80@0x1c80(hidden),64k@0x390000,  DVKR
0x80@0x1d00(hidden),64k@0x3A0000, DVKR
0x80@0x1d80(hidden),64k@0x3B0000, DVKR
 
0x00002000@0x00002000(uboot), 4M@0x400000,U-Boot 的设置
0x00004000@0x00004000(trust), 8M@0x800000, ARM Trusted Firmware/Trust OS 等
0x00002000@0x00008000(misc),4M@0x1000000, Android/recovery 启动控制、bootloader message
0x00000800@0x0000A000(baseparamer), 1M@0x1400000, Rockchip 基础参数
0x00007800@0x0000A800(resource),15M@0x1500000,DTB、logo、启动资源等
0x00010000@0x00012000(kernel),32M@0x2400000, linux kernel
0x00010000@0x00022000(boot),32M@0x4400000, Android/Linux boot image initrd 等启动内容
0x00010000@0x00032000(recovery),32M@0x6400000, 恢复系统 initrd
0x00020000@0x00042000(backup), 64M@0x8400000, 厂商备份/升级使用
0x00040000@0x00062000(cache),128M@0xC400000, Android cache、OTA 临时文件
0x00008000@0x000A2000(metadata),16M@0x14400000, 系统/升级相关元数据
0x00002000@0x000AA000(kpanic),4M@0x15400000, kernel panic/crash 信息
0x00300000@0x000AC000(system),1536M@0x158000,android的/
0x00004000@0x003AC000(oem),8M, adroid 厂商 OEM 配置/资源
-@0x003B0000(userdata), 15G, 用户数据
 
rk3328的uboot地址应该是lba 0x40  0x8000字节, 位于第一个隐藏位置,无法在android下读取
mac0 地址在0x3a0400-0405, 0x3b0400-0405
mac1 无线地址在0x380400-0405,  0x390400-0405
mac2 地址在0x380480-0485,0x390480-0405
SN在 0x390440-0447,0x3a0440-0447
 
openwrt的2512带的uboot版本是2510, 增加uboot的i01支持,需要写一个package/boot/uboot-rockchip/patches/999-uboot_iflyhome_i01.patch   增加i01的uboot的dts, 用如下命令可以测试uboot的编译:
cd openwrt
make package/boot/uboot-rockchip/clean
make package/boot/uboot-rockchip/compile V=s -j1
编译出来的结果在:
staging_dir/target-aarch64_generic_musl/image/iflyhome-i01-rk3328-u-boot-rockchip.bin
sudo rkdeveloptool wl 0x40 staging_dir/target-aarch64_generic_musl/image/iflyhome-i01-rk3328-u-boot-rockchip.bin
 

在openwrt的rk3328分区中, 默认分为2个分区, 在分区的起始, 保留了32M空间不用, 用以保护原来的sn,mac地址之类的数据,
从32m开始分16m做kernel, 再保留16m不分配, 然后从64m的起始位置, 分104M做rootfs,  rootfs会自动分为2部分前半部分是squash的部分, 后面的部分, 自动作为loop设备挂载为overlay, 做永久存储, 在openwrt中, rootfs分区的大小可以用make menuconfig进行设置,

从lba 0扇区开始刷bin文件, 肯定会覆盖出厂数据的,

源码在 https://github.com/lshw/openwrt/commits/iflyhome/

短接
附件大小
3.10_i01.dts 原机的dts文件138.73 千字节
iflyhome.jpg52.02 千字节
i1.log 原机的启动过程串口输出217.39 千字节
微信图片_20260915201709_8_164.jpg168.5 千字节
tp2301_2300.jpg94.49 千字节
pcb.jpg96.46 千字节
openwrt-2512_iflyhome-i01_patch.zip openwrt-2512补,直接在openwrt git am9.63 千字节
999-arm64-dts-rockchip-add-iflyhome-i01.patch linux-6.12的iflyhome补丁9.2 千字节
0002-iflyhome-i01-uboot-rk3328-75Mhz-24Mhz.patch uboot-2510的补丁15.15 千字节
rk3328_loader_v1.22.250.bin184.33 千字节
mark_rom.png 塑壳开孔位置,露出触点和ttl串口293.87 千字节
config.gz openwrt的配置文件,解压缩后,make menuconfig 用load命令载入44.58 千字节