rk3288 intro
Kris Fei's blog
https://blog.csdn.net/kris_fei?t=1
RK3288笔记
rk3288 官方资料
1.刷写固件
拿到开发板后第一件事就是连接上HDMI和电源,启动系统.
自带的系统默认是Android,如果我们做Linux开发,需要刷成linux系统
下面刷写linux系统步骤
- 连接双公头USB, 开发板那头连接到 USB OTG端口
- Windows电脑 安装PK驱动助手 和 固件升级工具Android Tools
- 按住 recovery 按键不放,同时轻按reset按键,2S后松开recovery按键 进入Loader 模式
- 下载固件
注意:
- 使用 upgrade_tool 时需要把4G模块卸载,否则因为EC20占用usb3.0端口占用
导致 Test Device Fail! - 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 的打包。