RK3288 EVB BOARD 从SDcard启动UBUNTU系统
1. 准备工作
1.1 制作SD card GPT分区
PC端运行:
sudo gdisk
出现提示:
Type device filename, or press <Enter> to exit:
输入:
/dev/sdc (根据自己机器上出现的SDcard的设备节点输入)
按照下面流程操作:
Command (? for help):
Creating new GPT entries.
Command (? for help): n (增加新的分区)
Partition number (1-128, default 1): 1(分区名为1)
First sector (34-15523806, default = 2048) or {+-}size{KMGTP}: 8192(分区起始地址8192 sector,即4M开始,前面4M存储loader与GPT头)
Last sector (8192-15523806, default = 15523806) or {+-}size{KMGTP}: +400M (分区大小400M)
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): w(保存设置)
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.
1.2. 格式化SD card
sudo mkfs.ext4 /dev/sdc1 格式化SD card 第一分区
2. Kernel
2.1 下载kernel 源码
- v3.14 kernel需要revert rk partition的提交
2.2. 编译kernel
make ARCH=arm rockchip_defconfig
sudo CROSS_COMPILE=arm-eabi- make zImage ARCH=arm -j4
sudo CROSS_COMPILE=arm-eabi- make rk3288-evb-act8846.dtb ARCH=arm -j4
如果找不到rockchip_defconfig文件,可以用这个rockchip_defconfig
2.3 安装kernel
将zImage 与rk3288-evb-act8846.dtb 拷贝到SD card 第一分区,即上面的/dev/sdc1
3. U-boot
3.1 下载uboot源码
3.2 编译uboot
CROSS_COMPILE=arm-linux-gnueabi- make O=evb-rk3288 evb-rk3288_defconfig all
3.3 安装U-boot
将uboot打包并下载到SD card(假设sd card 在PC上认到的设备是/dev/sdc)
./evb-rk3288/tools/mkimage -n rk3288 -T rksd -d evb-rk3288/spl/u-boot-spl-dtb.bin out&&
sudo dd if=out of=/dev/sdc seek=64&&sudo dd if=evb-rk3288/u-boot-dtb.img of=/dev/sdc seek=256
4. uboot 启动kernel
插入sd card, 启动设备,进入uboot,在uboot中运行如下命令启动kernel:
(1) env set bootargs "earlyprintk console=ttyS2,115200n8 loglevel=7 root=/dev/sda1 rootwait rw init=/sbin/init" (设置CMD_LINE,这里设置UBUNTU从U盘启动)
(2) ext4ls mmc 0:1 (如果是之前格式化SD card时用的是fat 格式,用fatls命令,uboot里面sdcard指定为mmc0,kernel在之前的操作中拷贝到了sdcard的第一分区,这个命令是列出在sdcard第一分区的文件)
(3) ext4load mmc 0:1 0x02000000 zImage (如果是用fat格式化sdcard,用fatload命令,这个命令将zImage loader到DDR地址0x02000000)
(4) ext4load mmc 0:1 0x01f00000 rk3288-evb-act8846.dtb (load dtb 到DDR 0x01f00000)
(5) bootz 0x02000000 - 0x01f00000 (加载kernel及DTB)
可将上述命令记录在uboot的环境变量中,启动后可以自动load kernel:
(1) env set bootargs "earlyprintk console=ttyS2,115200n8 loglevel=7 root=/dev/sda1 rootwait rw
init=/sbin/init"
(2) env set bootcmd "ext4load mmc 0:1 0x02000000 zImage; ext4load mmc 0:1 0x01f00000
rk3288-evb-act8846.dtb; bootz 0x02000000 - 0x01f00000"
(3) env save
重启后就可以自动启动kernel, 插入装有UBUTU系统的U盘可进入UBUNTU系统
5 遇到的问题
5.1 emmc里有旧的U-boot
解决方法,通过短路emmc禁止启动emmc的U-boot,方法和进入Maskrom一样.
或者进入Maskrom后,用upgt工具从0地址开始
$sudo ./upgt ef RK3288UbootLoader_V2.19.07.bin
5.2 ubuntu里使用libmali以及armsoc
1、将当前使用的libEGL以及libGLESv2等opengl库链接到libmali
2、编译并安装与当前Xorg版本匹配的,并且支持rockchip的armsoc
3、安装dri2、exa库
4、添加armsoc的xorg.conf,比如rk32.conf
5.3 Thermal的配置
v4.4 kernel中, rk3288-evb.dtsi默认没有打开thermal的OTP_OUT输出功能.
&tsadc {
rockchip,hw-tshut-mode = <1>; /* tshut mode 0:CRU 1:GPIO */
rockchip,hw-tshut-polarity = <1>; /* tshut polarity 0:LOW 1:HIGH */
status = "okay";
};
tshut mode 0:CRU 高温时,不触发OTP OUT(就是gpio0_b2)脚输出,只是通知cru去重启系统; 1:GPIO, 高温时会触发OTP OUT脚输出高或低电平;
tshut polarity 0:LOW 高温时输出低电平 1:HIGH 高温时输出低电平.
如果这2个属性都是0,那OTP OUT会维持高电平.
5.4 把uboot打包成一个bin文件
编译和打包:
#!/bin/sh
CROSS_COMPILE=arm-linux-gnueabi- make O=evb-rk3288 evb-rk3288_defconfig all
./evb-rk3288/tools/mkimage -n rk3288 -T rksd -d evb-rk3288/spl/u-boot-spl-dtb.bin out && sudo dd if=out of=loader.bin seek=64&&sudo dd if=evb-rk3288/u-boot-dtb.img of=loader.bin seek=256
先下载一个固件:RK3288Uboot_flash_0_addr.bin
进Maskrom 后烧入:
upgt db RK3288Uboot_flash_0_addr.bin
upgt wl 0 loader.bin
upgt rd