【linux开发-驱动】-linux内核相关

开发板:STM32MP157

一、编译linux内核源码

编译完成以后就会在 arch/arm/boot 这个目录下生成一个叫做 uImage 的文件,uImage 就是
我们要用的 Linux 镜像文件。

Linux 编 译 的 时 候 需 要 设 置 目 标 板 架 构 ARCH 和 交 叉 编 译 器CROSS_COMPILE。

ARCH?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabihf-

在linux源码目录下建立一个shell脚本,方便编译

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-
stm32mp1_atk_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- uImage dtbs
LOADADDR=0XC2000040 -j16

注:

第二行,执行“make distclean”,清理工程。如果通过图形界面配置linux,慎重使用该脚本

第三行,执 行 “ make xxx_defconfig ”, 配 置 工 程

第四行,执行“make menuconfig”,打开图形配置界面,对 Linux 进行配置

第五行,编译 Linux 内核,后面的“uImage”表示编译 uImage 格式的 Linux 内核,“dtbs”
表示编译设备树,LOADADDR 表示 Linux 内核在 DDR 中的加载地址为 0XC2000040

运行时可能报错:

our display is too small to run Menuconfig! It must be at least 19 lines by 80 columns. scripts/kconfig/Makefile:33: recipe for target 'menuconfig' failed make[1]: *** [menuconfig] Error 1 Makefile:567: recipe for target 'menuconfig' failed make: *** [menuconfig] Error 2 Makefile:613: include/config/auto.conf: 没有那个文件或目录 Makefile:659: include/config/auto.conf.cmd: 没有那个文件或目录 *** *** Configuration file ".config" not found! *** *** Please run some configurator (e.g. "make oldconfig" or *** "make menuconfig" or "make xconfig"). *** Makefile:662: recipe for target '.config' failed make: *** [.config] Error 1

因为终端窗口太小,menuconfig 需要至少 80 列 × 19 行的显示空间来运行。

如果不需要图形配置则退出。

编译完成以后就会在 arch/arm/boot 这个目录下生成一个叫做 uImage 的文件,uImage 就是
我们要用的 Linux 镜像文件。

在 arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件,我们需要的
是 stm32mp157d-atk.dtb 这个文件。

Linux 的编译过程基本和 uboot 一样,都要先执行“make xxx_defconfig”来配置一下,然后在执行“make uImage”进行编译吗,如果需要使用图形界面配置的话就执行“makemenuconfig”。

二、linux内核移植

编译完后,会得到 uImage 和对应的 stm32mp157d-atk.dtb 设备树

要单独编译 uImage 使用命令:

make uImage LOADADDR=0XC2000040

单独编译设备树的话使用如下命令:

make dtbs

移植过程:

1、获取ST官方linux源码,解压会得到一个linux-xxx源码文件

2、内核打补丁

for p in `ls -1 ../*.patch`; do patch -p1 < $p; done //打补丁

3、生成默认配置文件

make ARCH=arm multi_v7_defconfig "fragment*.config" //生成默认配置文件

完成后 Linux 源码根目录下生成了.config 配置文件

Linux 内核的所有配置项最终都保存在.config 文件里面,最终编译。
Linux 内核的时候需要读取.config 里面的配置项。

此时我们只是生成了.config,还并没有将fragment config 补丁文件打进去,执行如入两条命令打补丁:

for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
yes '' | make ARCH=arm oldconfig

Linux 源码根目录下的.config 文件就已经保存了所有的配置项,所以只需要复制一份.config 作为我们的默认配置文件即可。

三、编译ST官方linux源码

1、修改Makefile

和uboot那修改一样。

2、网络驱动修改

3、在linux中添加自己的开发板,在 arch/arm/boot/dts/目录下新建名为“stm32mp157d-atk.dtsi”的设备树头文件,然后将 stm32mp15xx-edx.dtsi 文件里面的内容全部复制到 stm32mp157d-atk.dtsi 里面

4、修改设备树文件

测试过了 Linux 系统镜像和设备树,但是我们是通过 tftp 命令从网络上下载测试
的,实际产品开发中最终是要将系统烧写到外部 Flash 中的,比如 EMMC。

怎样将系统镜像打包?

首先就是将 uImage 和 stm32mp157d-atk.dtb 打包在一起,格式为 ext4 格式。

1、先新建一个名为“bootfs”的文件夹,然后将 uImage和 stm32mp157d-atk.dtb 这两个文件放到 bootfs 文件夹下

2、进入到 bootfs 文件夹,创建ext4磁盘:

cd bootfs
dd if=/dev/zero of=bootfs.ext4 bs=1M count=10
mkfs.ext4 -L bootfs bootfs.ext4

3、将系统镜像拷贝到 ext4 磁盘中

4、拷贝完成以后使用 umount 卸载/mnt/bootfs 即可

sudo umount /mnt/bootfs

使用 STM32CubeProgrammer 软件将其烧写到 EMMC 里面。

注:

在调试阶段都不会烧写到 EMMC 里面,而是在 uboot里面使用 tftp 或 nfs 命令通过网络下载系统镜像并运行,这样当我们修改了系统以后只需要将系统镜像复制到 tftp 或 nfs 服务器目录即可

此外:Linux 内核启动以后是需要根文件系统的!!!

参考:正点原子资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值