PanGu开发板使用Linux 4.19.9版本,通过构建Linux内核代码,可以得到内核文件vmlinux和设备树描述文件dtb。提供的Linux代码中有两种config文件:

文件名描述
i2som_panguboard_defconfig适用于PanGu开发板,包含板载的功能

构建内核文件和设备树文件

下面以i2som_panguboard_defconfig的配置文件进行编译。
Linux kernel的源代码存放在开发资源包里"03-Source/Linux"目录下,文件名为linux-st-xxxx.tar.gz,xxxx代表版本标识,以实际为主。
编译Linux代码前,需要先加载SDK的环境变量。

$ tar xvf linux-st.tar.gz
$ cd linux-st
$ make i2som_panguboard_defconfig
$ make uImage LOADADDR=0xC2000040
$ make dtbs

编译完成后,vmlinux存放在i2SOM-Linux/arch/arm/boot/目录下,dtb文件存放在i2SOM-Linux/arch/arm/boot/dts目录下。

dtb文件描述
stm32mp157a-panguboard.dtb支持HDMI显示
stm32mp157a-panguboard-mipi.dtb支持MIPI显示
stm32mp157a-panguboard-lcd070p1024c.dtb支持i2M-LCD070P1024C液晶显示
stm32mp157a-panguboard-lcd043p800c.dtb支持i2M-LCD043P800C液晶显示

编译和安装模块驱动

Linux kernel支持驱动以模块的方式在系统运行中动态加载。对vmlinux文件体积有限制的场景,可以将驱动选择为"<M>",然后编译成模块文件。

$ make modules
$ mkdir ../target-kernel
$ make INSTALL_MOD_PATH=../target-kernel modules_install

以上将模块安装在了上级目录的target-kernel目录内,可以将此目录打包后,解压在目标系统的"/lib"目录下使用。

版本问题

修改后重新编译kernel Image和module,会出现和当前开发板的版本标识不匹配问题,可以通过下面的方法来解决。
编译的命令如下

$ make uImage LOADADDR=0xC2000040 LOCALVERSION=""
$ make modules LOCALVERSION=""

版本管理

kernel开发中,建议使用git来管理源代码,更便捷的管理代码的多个版本。如果在修改kernel并测试后,代码无误,可以提交到本地仓库中,这样后面使用Yocto来构建系统也更容易。

编译外置驱动

Linux kernel中包含的驱动是已经提交到Linux社区后合并的代码仓库的,但有些驱动并没有提交到社区,只提供了源代码,可以用module的方式加载到系统来使用。比如一些WiFi驱动,是由厂商提供源代码,自行编译成ko文件后,然后在PanGu开发板上加载使用。
编译这种类型的驱动,需要先编译驱动,然后再编译单独的驱动。
下面以RTL8188驱动为例。先下载RTL8188驱动,尽量和Linux kernel的源代码目录在同一目录层级下,然后加载SDK环境变量。

git clone https://github.com/i2som/RTL8188EU.git
cd RTL8188EU
make KERNEL_SRC=../linux-st

这里KERNEL_SRC是指定linux kernel源代码目录,因为RTL8188驱动需要kernel上相关的头文件。所有的外置驱动都需要指定kernel的源代码目录,但变量名不一定是KERNEL_SRC,具体要查看该驱动的Makefile文件来确定。

部署镜像文件

Linux kernel编译完成得到的uImage和dtb文件,需要在开发板上来运行测试,有两种方法
1.直接复制并替换到开发板"/boot"目录下的对应文件,复制后执行以下命令

# sync & reboot

2.打包为更新包,使用SD或USB方式烧写到开发板

作者:SteveChen  创建时间:2024-09-18 11:48
最后编辑:SteveChen  更新时间:2024-10-18 15:16
上一篇:
下一篇: