rk3288的固件刷写

整体可以参考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

rk3288的固件刷写_第1张图片


选择合适的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命令

查看 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分区                     ]]









你可能感兴趣的:(arm,mips等学习)