下面是移植过程, 不是简单刷机过程, 刷机过程后面会单独写一篇。
电路板有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信息:
然后根据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字节大小的扇区数:
在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.jpg | 52.02 千字节 |
| i1.log 原机的启动过程串口输出 | 217.39 千字节 |
| 微信图片_20260915201709_8_164.jpg | 168.5 千字节 |
| tp2301_2300.jpg | 94.49 千字节 |
| pcb.jpg | 96.46 千字节 |
| openwrt-2512_iflyhome-i01_patch.zip openwrt-2512补,直接在openwrt git am | 9.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.bin | 184.33 千字节 |
| mark_rom.png 塑壳开孔位置,露出触点和ttl串口 | 293.87 千字节 |
| config.gz openwrt的配置文件,解压缩后,make menuconfig 用load命令载入 | 44.58 千字节 |