测试开发板: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
ARM64在kernel未建立console之前,使用earlycon,实现日志信息的打印,因此首先配置了earlycon:其中:
uart8250表示针对uart8250这个串口设备;mio32表示内存I/O资源32位,0xff1a0000是RK3399 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进制表示的32位NT disk signature,PP是用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 10月 9 17:24 boot.img
其中:
-b:表示文件系统块的数量;-B: 表示文件系统块的大小,单位为字节;-d:从指定目录开始创建文件系统-i 8192;每个inode使用的字节数;-U:选项表示创建一个唯一的文件系统UUID;
这里我们设置了32768个块,每个块大小为64*1024*1024/32768,所以文件系统总大小为64MB,足够放下boot文件夹内的所有文件。
使用瑞芯微烧录工具烧写入内存分区表:00008000
540

被折叠的 条评论
为什么被折叠?



