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 源码

v4.4 kernel, v3.14 kernel

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源码

U-boot

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