rk3288 intro


原文链接: rk3288 intro

Kris Fei's blog
https://blog.csdn.net/kris_fei?t=1
RK3288笔记
rk3288 官方资料

1.刷写固件

拿到开发板后第一件事就是连接上HDMI和电源,启动系统.
自带的系统默认是Android,如果我们做Linux开发,需要刷成linux系统
下面刷写linux系统步骤

  1. 连接双公头USB, 开发板那头连接到 USB OTG端口
  2. Windows电脑 安装PK驱动助手 和 固件升级工具Android Tools
  3. 按住 recovery 按键不放,同时轻按reset按键,2S后松开recovery按键 进入Loader 模式
  4. 下载固件


注意:

  1. 使用 upgrade_tool 时需要把4G模块卸载,否则因为EC20占用usb3.0端口占用
    导致 Test Device Fail!
  2. AIO-3288J-UBUNTU18.04-LVDS-GPT-20190220-1153.img.tar.gz
    LVDS 版本和普通版本对板子来说都是一样的,刷哪个都可以,只是当你需要外接LVDS显示器的时候,刷LVDS版本就可以了。

Linux 下的串口调试

如果 USB 串口适配器的芯片组受 Linux 内核支持,驱动程序将自动加载。

连接串口适配器,并通过如下命令检查相应的串口设备文件:

$ ls -l /dev/ttyUSB*
crw-rw---- 1 root uucp 188, 0 Apr 10 16:44 /dev/ttyUSB0
将你的 Linux 用户添加到 uucp 组中,以便获得访问此设备的权限(否则每次需要在命令前加sudo来运行相应命令):

sudo gpasswd -a $(whoami) uucp

基于docker 编译

sudo apt install libssl-dev

docker run -it --rm -v $PWD:/work rinetd/firefly bash

git repo sync 源码下载

git config --global user.name rinetd
git config --global user.email "rinetd@163.com"

//问题在于用http提交有上传大小限制,修改传输大小限制使用 
git config --global http.postBuffer 5242880000
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999

git config --global pack.windowMemory "2g"
git config --global pack.packSizeLimit "2g"
git config --global pack.threads "1"

编译

注意:linux是区分大小写的,所以不能用windows 或 macos 默认的分区,必须创建区分大小写的分区
(解决Mac OS X文件系统大小写不敏感问题 git 源码一直需要提交)[http://www.ituring.com.cn/article/215555]

./build.sh aio-3288j.mk
运行完上述脚本后,在 device/rockchip/目录下,生成.BoardConfig.mk 软链接 -> device/rockchip/rk3288/aio-3288j.mk

=> `kernel/arch/arm/boot/dts/rk3288-firefly-aio.dts`

为什么make後面要加上firefly-rk3288.img这样的目标参数?

更换源

sudo sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

分区说明

uboot 分区: 烧写 uboot 编译出来的 uboot.img
trust 分区: 烧写 uboot 编译出来的 trust.img
misc 分区: 烧写 misc.img,给 recovery 使用
boot 分区: 烧写 kernel 编译出来的 zboot.img
recovery 分区: 烧写 recovery.img
backup 分区: 预留,暂时没用。后续作为 recovery 的 backup 使用
oem 分区: 给厂家使用,存放厂家的 app 或数据。只读。代替原来音箱的 data 分区
rootfs 分区: 存放 buildroot 或者 debian 编出来的 rootfs.img
userdata 分区:存放 app 临时生成的文件或给最终用户使用。可读写,挂载在/userdata 目录下

Zimage 和 Uimage 区别

uboot源代码的tools/目录下 有mkimage工 具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。

学习心得:zImage 和uImage 都是生成的可执行内核镜像文件
2者在u-boot中启动的方式分别是 go addr 与 bootm addr 来实现启动过程的
即对于zImage是通过 go 来进行引导 而uImage是通过bootm来进行引导的
zImage 和 uImage 2者的关系 是 uImage 是zImage通过mkimage (u--boot下面tools下的工具)来生成的
结果是后者比前者在头部多了64个byte,这多余的64 个byte是用来通知给u-boot用的;将相关信息告知u-boot;
这样做的结果在u-boot引导内核时存在2个地址:loadaddress 和entry address 2者的差值刚好是0x40(64byte)的大小
这样在使用bootm loadaddress 时u-boot会根据相应的loadaddress进行调整,有2中情况;
1)、当loadaddress与mkimage时传送的一致时:

      那么在加载 ldr pc,entry address时,会选择mkinage 时的entry地址;即pc=loadaddress + 4;然后由pc来控制流程跳转倒ram中去执行; 

2)、当loadaddress与mkimage时传送的不一致时:

      那么,u-bbot会进行地址比较 后,将当前的loadaddress减去64byte后,将真正的内核映像(去掉64byte头部的内核)拷贝倒预先制定的loadaddress,然后 直接从这个loadaddress来引导内核运行;  

总结,那么上面2中情况实际区别呢?其实就是最终代码执行时,如果地址与mkinage时指定的 不符,那么u-boot将进行去头后,拷贝内核代码,直接执行;而如果不处理,则会将 loadaddress+0x40来执行内核;
通过tftp服务来下载 zImage或者uImage;
loadb 在tftp不成功的情况下使用 串口来下载内核 希望不要用这个方法
cp【.b.w.l】 完成 内存之间 内存向flash之间进行拷贝
最后可以设置 bootcmd 环境变量可以实现 u-boot自动引导内核启动

至于文件系统的2中方式:ramdisk 以及nfs 推荐开发者使用nfs 方便修改;
当使用ramdisk时,

gunzip k9.img.gz                      //解压缩 
mount –o loop k9.img /mnt/new_disk    //挂载 
umount /mnt/new_disk                  //卸载 
gzip –c –v9 k9.img > k9.img.gz        //压 缩生成最终的文件系统  

这四条命令不要忘记,对于你来说多么强大
不要你去再建立根文件系统。

UBOOT

RK Uboot是基于开源的Uboot进行开发的,UBoot的工作模式有启动加载模式和下载模式。启动加载模式是Uboot的正常工作模式,嵌入式产品发布时,Uboot都工作在此模式下,主要用于开机时把FLASH中的内核加载到SDRAM中,启动操作系统;下载模式主要用于将固件下载到FLASH,开机时长按recovery键可进入下载模式。本文简单说明Uboot的使用,更多Uboot相关文档请看SDK下面的 RKDocs/Develop reference documents/Rockchip U-Boot 开发指南 V3.7-20160708.pdf。

编译
编译Uboot与编译内核类似,编译前把默认配置写入.config,执行:

make rk3399_box_defconfig

linux 则为
make rk3399_linux_defconfig
如果需要修改相关选项,也可以用

make menuconfig
编译执行:

make ARCHV=aarch64
编译后生成:

u-boot/uboot.img
u-boot/trust.img
u-boot/RK3399MiniLoaderAll_Vx.xx.bin

烧录
打开烧录工具,板子接好OTG线,接通电源时按住recovery键,使用开发板进入Uboot的下载模式,在烧录工具中选择编译好的Loader文件,点击执行即可,如下图:

Uboot_rk3399_download
确认是否正确烧写新的Loader
如果你已经成功烧写你最新编译的Loader,在开机的串口输出log中可以看到类似如下信息:

#Boot ver: 2016-12-19#1.05
如果打印的时间及版本与你编译的一致,说明你成功更新了Loader。

进入Uboot命令行模式
由于Firefly产品主要用于开发,所以我们默认设置开机时有1秒的倒计时,如果这时候在串口输入任意键即可进入u-boot命令行模式。 发布的产品是不需要进入u-boot命令行模式的,如果需要设置u-boot默认不进入命令行模式的,可以做如下修改:
在文件 u-boot/include/configs/rk33plat.h

/* mod it to enable console commands. */
#define CONFIG_BOOTDELAY 0
把宏CONFIG_BOOTDELAY改为 0 即默认不进入命令行模式。

一级Loader
U-BOOT 作为一级Loader模式,那么仅支持EMMC存储设备,编译完成后生成的镜像:

RK3288LoaderU-BOOT_V2.17.01.bin
其中V2.17.01是发布的版本号,rockchip 定义U-Boot loader 的版本,其中2.17是根据存储版本定义的,客户务必不要修改这个版本,01是U-Boot定义的小版本,用户根据实际需求在 Makefile中修改。

二级Loader
U-Boot 作为二级Loader模式,那么固件支持所有的存储设备,该模式下,需要MiniLoader支持,通过宏CONFIG_MERGER_MINILOADER进行配置生成。同时引入Arm Trusted,Firmware后会生成trust image,这个通过宏CONFIG_MERGER_TRUSTIMAGE进行配置生成。
RK3399使用二级Loader,编译生成的镜像为:

u-boot/uboot.img
u-boot/trust.img
u-boot/RK3399MiniLoaderAll_V1.05.bin
其中V1.05是发布的版本号,rockchip 定义U-Boot loader 的版本,其中1.05是根据存储版本定义的,客户务必不要修改这个版本。 uboot.img 是U-Boot作为二级loader 的打包。 trust.img 是U-Boot作为二级loader 的打包。

`