我能在编写驱动代码前,要先复制一份内核的config
因为编写驱动代码前需要一个已经编译好的内核
那么如何复制一份内核的config呢?
第一种方法:
cp 厂家的xxx.defconfig xxx.confing 完完整整的复制了厂家的config
第二种方法:
make menuconfig 基于厂家的配置一项项自己手动配置 可多添加一些配置
第三种方法:
完全靠自己配置(难度较大)
下面我们对第二种方法进行补充
1、 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7
arm架构 制定交叉编译工具 树莓派
make bcm2709_defconfig
主要核心指令
2、ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
我们提供上述的两两条指令进入配置内核的界面(ps:要实现下好源码和交叉编译工具 以及相关的库)
前面的M和*分别是什么意思呢?
这就不得不说到驱动加载的两种方式了
1、* 表示直接将驱动编译进内核 内核编译的生成文件之一zImage包含了这些驱动
2、M 表示以模块化的方式,将驱动生成驱动文件xxx.ko 在系统启动之后 用inmosd xxx.ko
编译驱动
编译内核:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage
使用4核的资源
modules dtbs
zImage 生成内核镜像文件
modules 生成驱动模块
dtbs 生成配置文件
编译后在源码树目录下看到vmlinux说明编译成功
打包zImage文件为kernel_new.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
数据拷贝
将树莓派内核的u盘插入电脑
mkdir data1 data2
挂载u盘 sudo mount /dev/sdb1 ./data1 sudo mount /dev/sdb2 ./data2
data1为kenel分区 data2为根目录分区
安装modules设备驱动文件hdmi、WiFi、usb、io等(要进入源码的目录下)
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/cqf/data2 modules_instal
操作data2 根目录分区,需要root权限。
安装更新 kernel.img 文件,注意镜像名字是kernel7.img
先备份kernel7.img cp ./data1/kernel7.img kernel7OLD.img
把编译生成的kernel_new.img拷贝到kenel分区文件 起名kenel7.img
拷贝复制文件
cp arch/arm/boot/dts/.*dtb* /home/cqf/SYSTEM/data1(data1为kenel分区)
cp arch/arm/boot/dts/overlays/.*dtb* /home/cqf/SYSTEM/data1/overlays/(*为通配符)
cp arch/arm/boot/dts/overlays/README /home/cqf/SYSTEM/data1/overlays/
附件:
源码:git clone git@github.com:raspberrypi/linux
交叉编译工具:git clone git@github.com:raspberrypi/tools
安装必要的库:
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g
sudo apt-get install libc6