整体可以参考http://wiki.t-firefly.com/index.php/Firefly-RK3288的linux开发
固件刷写通过upgrade_tool刷写,也可以rkflashkit 也可以rkflashtool
http://dl.radxa.com/rock/tools/linux/
刷写工具 uboot kernel可以从
https://github.com/linux-rockchip (这里都是源码)
下载。
对于uboot。瑞芯微使用了自定义的格式。需要对u-boot.bin和一些初始化ddr的bin等等进行合并产生upgrade_tool可以识别的bin文件才可以写。
对于其他的好像是没有要求的。
uboot合并的代码在tools/boot_merger.c中。
sudo ./upgrade_tool
选择合适的rockcusb设备。
ul rk3288uboot.bin
执行下载完成。
通过使用DI命令可以下载不同的分区文件到EMMC当中
支持 -s -k -b -r -p
-s(system分区)、-k(kernel分区)、-b(boot分区)、-r(recovery分区) -p(parameter文件)和-m(misc??分区)
设备已烧录过 parameter 情况下,烧写单个分区镜像命令:
di –s system.img
设备未烧录过 parameter 情况下,烧写单个分区镜像命令:
di –p,–s system.img parameter
设备已烧录过 parameter 情况下,烧写多个分区镜像命令:
di –s,-k system.img,kernel.img
采取命令行指定rootfs 就是在CMDLINE中添加 root=xxxx
root=/dev/block/mtd/by-name/linuxroot # 名为 "linuxroot" 的 nand 分区 root=/dev/mmcblk0p1 # TF 卡的第一个分区 root=/dev/sda1 # U 盘或 USB 硬盘的第一个分区 root=LABEL=linuxroot # 卷标为 "linuxroot" 的分区,可以是任一存储设备
这样必须创建一个名字是liuxroot的ext4文件
如果是自己创建一个ext4文件。可以根据下面的步骤来
dd if=/dev/zero of=linuxroot.img bs=1M count=1024
# 格式化成 ext4 文件系统格式,卷标为 linuxroot
mkfs.ext4 -F -L linuxroot linuxroot.img
挂载,拷贝数据,然后卸载:
mount -o loop linuxroot.img /opt
cp -a /mnt/ubuntu/ /opt/
umount /opt
查看 e2label device
修改 e2label device labelname
对于rk3288 flash的固件。RK3288UbootLoader_V2.19.01.bin 烧写到0地址。parameter也是烧写到0地址。这不是冲突了吗?
实际上 烧写RK3288UbootLoader_V2.19.01是烧写到 pba的0地址。
parameter和其他的固件都是StorageWriteLba烧写到LBA的0地址。
以下理解纯属于个人的理解,如果有错误请指正
对于emmc。有多个分区,有两个boot分区。和其他的用户分区USR。
比如boot1 boot2 usr分区。
写boot1的0地址和boot2的0地址 和usr的0地址都是不同的。通过修改emmc的控制寄存器的某个bit位置达到 写不同的分区,每个分区的地址都是独立的。
形式如下
WriteLba(offset,num,buf)
{
setCtrlReg(boot1分区)
write(0,num,buf)
}
WritePba(offset,num,buf)
{
setCtrlReg(boot2分区)
write(0,num,buf)
}
写不同的地址
但是对于rk3288还有另外一种形式。那就是不使用boot1 boot2分区。而是将USR分区分成几块区域来操作。通过增加一定量的偏移来实现不同的操作。
比如
WriteLba(offset,num,buf)
{
write(0+LBAOFFSET,num,buf)
}
WritePba(offset,num,buf)
{
write(0+PBAOFFSET,num,buf)}
按照源码来看。写LBA的时候
iret = SDM_Write(ChipSel, LBA + gSdCardInfoTbl[ChipSel].FwPartOffset, nSec, pbuf);
增加了一个gSdCardInfoTbl[ChipSel].FwPartOffset 这个值是8192.
所以是保留了8192个扇区 8192*512字节=4MB
写 PBA的时候
PBA = PBA + SD_CARD_BOOT_PART_OFFSET;
SD_CARD_BOOT_PART_OFFSET=64 。也就是保留了64*512为32kb
pba开始 LBA开始
0-32KB-----------4MB-----------------------------
[[ 整个USR分区 ]]