19、RK3399 内核移植


测试开发板:Firefly-RK3399 2+16

一、下载源码及编译

下载Linux内核4.4 git clone https://github.com/rockchip-linux/kernel.git

官网链接为: https://opensource.rock-chips.com/wiki_Rockchip_Kernel
瑞芯微kernel4.4git链接
导入瑞芯微配置(也可以在主目录下的Makefile中配置交叉编译工具链):

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rockchip_linux_defconfig

编译:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4

二、制作启动镜像(开始输入指令)

复制内核镜像和设备树文件。不同的开发板内核镜像通用,需要注意区分设备树,我这里使用的是firefly的开发板,所以复制的为firefly的设备树配置。

mkdir boot
cp arch/arm64/boot/dts/rockchip/rk3399-firefly-linux.dtb boot/rk3399.dtb
cp arch/arm64/boot/Image boot/

瑞芯微使用的内核引导方式为distro
为了实现distro引导,我们需要在启动分区中添加extlinux引导程序以及相应的配置文件。

我们需要创建一个名为extlinux的文件夹,在其中创建一个名为extlinux.conf的文件:

mkdir boot/extlinux
touch boot/extlinux/extlinux.conf

extlinux.conf文件中编写配置信息,指定内核镜像和设备树的路径,以及其它启动参数。配置文件内容如下:

label rockchip-kernel-4.4.4
    kernel /Image
    fdt /rk3399.dtb
    append earlycon=uart8250,mmio32,0xff1a0000 console=ttyS2,1500000n8 root=PARTUUID=B921B045-1D rw rootwait rootfstype=ext4 init=/sbin/init

参数解释:

earlycon:
earlycon=uart8250,mmio32,0xff1a0000 

ARM64kernel未建立console之前,使用earlycon,实现日志信息的打印,因此首先配置了earlycon:其中:

  • uart8250表示针对uart8250这个串口设备;
  • mio32表示内存I/O资源32位,0xff1a0000RK3399 UART2寄存器基地址,这里没有配置波特率,默认还是使用uboot中配置的波特率。
console

接着设置了控制台console,当RK3399 UART2控制台驱动注册之后,将会注销earlycon驱动,将内核输出的日志通过指定的console打印出来。

console=ttyS2,1500000n8

如果我们没有设置console,那么console将会使用tty0这个终端(tty0表示当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。

注意:我们需要根据自己的开发板配置串口。

root

指定根文件系统以及根文件系统类型;通过root属性指定根文件系统所在位置,通常这是一个必须明确设置的选项,格式如下:

root=字符串 rw rootwait rootfstype=ext4

rw表示可以对根文件系统进行读写,默认配置是只读;

rootwait表示在根文件系统就绪之前无限等待。主要用于等待那些反应速度较慢的异步检测的设备就绪(例如USB/MMC/FireWire)

rootfstype为根文件系统类型;

“字符串”可以采用如下几种形式:

  • XXxx:一个16进制数,其中XX是主设备号,xx是次设备号。例如/dev/sdc15(主设备号是8,次设备号是47),可以表示成082F;
  • /dev/nfs:表示使用nfsroot选项指定的NFS磁盘,仅在根文件系统位于NFS文件系统上的时候才可以使用,比如配置成root=/dev/nfs rw rootwait nfsroot=192.168.0.200:/work/nfs_root/ubuntu,vers=4 ip=192.168.0.105:192.168.0.200:192.168.0.1:255.255.255.0::eth0:off
  • /dev/disk:表示一块完整的无分区块设备。比如/dev/mmcblk0/dev/sdb
  • /dev/diskN:表示disk磁盘的第N个分区,这是最常见的写法,比如:/dev/mtdblock3/dev/mmcblk0p5/dev/sda2
  • PARTUUID=b921b045-1df0-41c3-af44-4c6f280d3fae:仅用于EFI/GPT格式的磁盘,表示分区表中UUID值为b921b045-1df0-41c3-af44-4c6f280d3fae的分区;
  • PARTUUID=SSSSSSSS-PP :仅用于传统的MSDOS分区表,SSSSSSSS是用16进制表示的32NT disk signaturePP是用16进制表示的分区号。比如:PARTUUID=97531ACF-02 可能相当于/dev/sda2
  • major:minor由一对十进制数组成,其中major是主设备号,minor是次设备号。例如/dev/sdc15(主设备号是8,次设备号是47),可以表示成8:47
三、打包并烧录

使用genext2fs工具可以生成一个ext2文件系统镜像文件。在使用genext2fs命令时,需要指定生成文件系统的大小、块大小、inode大小等参数,以及输出的镜像文件名称和所在路径。

执行以下命令,将boot文件夹中的文件和目录打包成一个ext2文件系统镜像:

sudo apt-get install genext2fs(若未安装需要安装)
genext2fs -b 32768 -B $((64*1024*1024/32768)) -d boot/ -i 8192 -U boot.img
liu@liu-virtual-machine:~/rockchip/kernel/kernel-develop-4.4_back$ ll boot.img 
-rw-rw-r-- 1 liu liu 67108864 109 17:24 boot.img

其中:

  • -b :表示文件系统块的数量;
  • -B : 表示文件系统块的大小,单位为字节;
  • -d :从指定目录开始创建文件系统
  • -i 8192;每个inode使用的字节数;
  • -U:选项表示创建一个唯一的文件系统UUID

这里我们设置了32768个块,每个块大小为64*1024*1024/32768,所以文件系统总大小为64MB,足够放下boot文件夹内的所有文件。

使用瑞芯微烧录工具烧写入内存分区表:00008000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值