rk3399移植linux kernel

rk3399移植linux kernel


参考文章:
1.RK3399移植u-boot
2.I.MX6Q-SDB开发板移植ubuntu
3.Rockchip RK3399 - 移植ubuntu 20.04.4根文件系统
4.Rockchip RK3399 - 移植uboot 2023.04 & linux 6.3

0.前言

  在前一节中移植了rk3399的u-boot,这一节就继续移植linux kernel。不过rk3399在移植kenel前,需要先制作根文件系统,这样才能在生成内核镜像文件Image时,将根文件系统的相关信息填入。

一、移植ubuntu根文件系统

  这里就不再赘述移植步骤,参考之前对i.mx6Q移植的步骤即可。不过有一些步骤略有不同,比如暂时先不配置串口的输出,后续启动板卡到u-boot界面再进行配置。另外,制作好的根文件系统需要打包成.img格式。这里就简述下打包步骤作为记录:

制作好的ubuntu根文件系统在ubuntu_base目录下,在同级目录下新建一个目录ubuntu_ext4_mount,用于挂载虚拟磁盘,并格式化成ext4格式:

bash 复制代码
mkdir ubuntu_ext4_mount
#挂载虚拟磁盘
sudo dd if=/dev/zero of=ubuntu_ext4.img bs=1M count=1300
#格式化
sudo mkfs.ext4 ubuntu_ext4.img
#挂载img镜像
sudo mount ubuntu_ext4.img ubuntu_ext4_mount/
#拷贝根文件系统
sudo cp ubuntu_base/* ubuntu_ext4_mount/ -af

其中count为根文件系统大小的2倍,可以使用du -h --max-depth=1命令查看目录大小。

之后就可以卸载并删除ubuntu_ext4_mount目录,然后检查下制作好的img即可:

bash 复制代码
umount ubuntu_ext4_mount
rm -rf ubuntu_rootfs
#用e2fsck修复及检测镜像文件系统
e2fsck -p -f ubuntu_ext4.img
#resize2fs减小镜像文件的大小
resize2fs -M ubuntu_ext4_rootfs.img

二、移植linux

官网下载地址:https://www.kernel.org/

镜像下载站:http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/。

这里下载最新的linux-6.4.7并解压:

bash 复制代码
tar -xvf linux-6.4.7.tar.gz

修改顶层makefile中的目标平台及交叉编译链:

由于官方kernel只有一个默认配置,所以需要对其进行一些裁剪。

bash 复制代码
#配置文件存放位置
ll arch/arm64/configs/defconfig
#加载默认配置
make defconfig
#手动裁剪
make menuconfig

1.支持NFS(可选)

NFS为网络文件系统,如果后续需要对内核或文件系统进行开发,用NFS会更加方便,这里先勾选上。

2.配置uevent helper

该选项的作用是启用uevent helper程序的支持。uevent是内核与用户空间之间通信的一种方式,当内核检测到新的设备时,会生成一个uevent来通知用户空间,使得用户空间能够及时响应设备插拔事件,并做出相应的处理。其中, uevent helper程序就是在接收到uevent后执行的用户空间程序,用来完成设备的热插拔处理。

3.支持etx4文件系统(默认已支持)

4.配置DRM驱动

DRM,全称Direct Rending Manger。是目前Linux主流的图形显示框架,配置这个是为了后续支持带有桌面的ubuntu根文件系统。

5.有线网卡驱动

板子上带了一个RTL8111有线网卡,按照以下配置:

注:在6.4版本中STMicroelectronics 10/100/1000/EQOS Ethernet driver改成了STMicroelectronics Multi-Gigabit Ethernet driver。

6.无线网卡驱动

板载AP6236无线网卡,按照如下进行配置:

bash 复制代码
Device Drivers  ---> 
	<*> Broadcom specific AMBA  ---> 
		[*]   Support for BCMA on PCI-host bus (NEW)                                       
		[*]   Support for BCMA in a SoC                                             
		[*]   ChipCommon-attached serial flash support (NEW)                               
		[*]   BCMA Broadcom GBIT MAC COMMON core driver                                    
		[*]   BCMA GPIO driver

配置完保存即可。

三、设备树

这里笔者使用的设备树是从网上找到的反编译出的dts文件,可以直接拿来使用,所以就先略过。将该dts添加进dtb编译目录即可。

四、内核镜像文件制作

编译完成后会在arch/arm64/boot/文件夹下生成内核镜像文件Image.gz,因为mkimage是根据its文件中的描述来打包镜像生成itb文件(FIT uImage),所以首先需要制作一个its文件,在its文件中描述需要被打包的镜像,主要是kernel镜像,dtb文件等。

kernel.its:

bash 复制代码
/*
 * Simple U-Boot uImage source file containing a single kernel and FDT blob
 */
/dts-v1/;
/ {
	  description = "Simple image with single Linux kernel and FDT blob";
	  #address-cells = <1>;
	  images {
	          kernel {
	                  description = "Vanilla Linux kernel";
	                  data = /incbin/("arch/arm64/boot/Image.gz");
	                  type = "kernel";
	                  arch = "arm64";
	                  os = "linux";
	                  compression = "gzip";
	                  load = <0x280000>;
	                  entry = <0x280000>;
	                  hash-1 {
	                          algo = "crc32";
	                  };
	                  hash-2 {
	                          algo = "sha1";
	                  };
	          };
	
	         fdt {
	                  description = "Flattened Device Tree blob";
	                  data = /incbin/("arch/arm64/boot/dts/rockchip/rk3399_sw799.dtb");
	                  type = "flat_dt";
	                  arch = "arm64";
	                  compression = "none";
	                  load = <0x8300000>;
	                  entry = <0x8300000>;
	                  hash-1 {
	                          algo = "crc32";
	                  };
	                  hash-2 {
	                          algo = "sha1";
	                  };
	          };
	
	  };
	
	  configurations {
	          default = "conf-1";
	          conf-1 {
	                  description = "Boot Linux kernel with FDT blob";
	                  kernel = "kernel";
	                  fdt = "fdt";
	          };
	  };
};

然后将u-boot-2023.07/tools/路径下的mkimage工具拷贝过来,使用mkimage工具编译即可:

bash 复制代码
cp u-boot-2023.07/tools/mkimage linux-6.4.7/
./mkimage -f kernel.its kernel.itb

五、烧录

相关文件已全部制作完毕,如果不需要在u-boot下进行功能开发,则使用前一节制作的u-boot即可。如有需要,由于较新版本的u-boot也分成了u-boot + 设备树dtb的方式,所以在编译u-boot时将相关设备树指定为自己板子的设备树进行编译即可。

rk3399烧录地址:

bash 复制代码
idbloader.img     --->     eMMC的0x40扇区
u-boot.itb        --->     0x4000扇区
kernel.itb        --->     0x8000扇区
ubuntu_ext4.img   --->     0x40000扇区

除了上述的几个文件,rk3399还需要一个rk3399_loader_v1.24.126.bin文件,这个文件在芯片启动时,会被加载到内部的sram中,用来初始化板载内存等基本外设。此文件从rockchip官方即可下载。

烧录工具有两种,一种是使用rockchip官方的RKDevTool,这个需要在windows环境下运行。另一种是使用rkdeveloptool,可以在linux下使用命令行进行烧录,具体的使用方式可以参考这篇文章,笔者使用的也是这种方式。将芯片进入Loader模式或Maskrom模式,然后使用以下命令将对应文件烧写到板卡上去:

bash 复制代码
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x40 idbLoader.img
rkdeveloptool wl 0x4000 uboot.itb
rkdeveloptool wl 0x8000 boot.itb
rkdeveloptool wl 0x40000 ubuntu_ext4.img

六、总结

笔者制作的kernel中没有使能对应的GPU驱动,所以后续使用桌面显示的话会比较卡,且CPU占用较高,发热严重。所以最后笔者还是沿用了大佬移植的armbian系统(躺平真爽)。这里附上对应的镜像和工具下载地址,如果是同款SW799板子可以使用对应的镜像烧录使用,这里还有一些其他板子和一些简单教程,也可以借鉴一点。硬件就先玩到这里了,后面找点嵌入式小demo做做看看。

相关推荐
HLC++9 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室10 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy13 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕13 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫14 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生15 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1116 小时前
linux基础IO
linux·运维·服务器
BelongPanda18 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯18 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983418 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器