文章目录
________________________________________________________________________________
驱动模块静态增加
一、驱动文件
步骤:
1、在kernel/device目录下相应的外设目录新建一个文件夹,在里面放自己驱动(比较好管理和区别原有的驱动)
2、在新建文件夹创建Kconfig和Makefile文件
3 、config文件编写
底层Kconfig
menu "menu_name"
config Symbol_name
type "drv_name"
default x(默认值,根据类型和需求设置)
help
xxxxxx
endmenu
4、makefile文件编写
二、新建文件夹上层目录文件修改
1
上层Kconfig内容增加
2
上层Makefile内容增加
三、menuconfig效果
menuconfig有相应的选项,编译后出现 ".o"文件
四、编译
编译 根据 顶层 “.config” 文件里面信息决定哪些配置需要编译进内核,哪些需要编译成模块(insmod安装那种)、哪些是不需要的驱动(相当于注释掉)
一般情况下厂商初始化好的.config文件放在arch/arm/configs里面
1.第一次编译需要修改下Makefile文件
修改顶层Makefile文件(指定ARCH架构和CROSS_COMPILE交叉编译器前缀名字)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf- (这个具体情况会不一样,填写相应交叉编译器的前缀即可)
2.内核编译命令
修改完Makefile文件以后,每次make menuconfig配置好内核后,根据需求去获得相应的内核文件,编译完的内核文件一般放在arch/arm/boot目录下
make zImage -j8 (-j 多少线程编译,可以加快编译速度)
make uImage
根据需要编译相应的内核
________________________________________________________________________________
模块驱动动态添加
只需要一个makefile即可
//makefile文件内容
obj-m += xxx.o <----驱动文件的.o名字
KERNEL_DIR := 内核目录的绝对路径
//交叉编译器的绝对路径+前缀
CROSS_COMPILE := /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
PWD = $(shell pwd)
default:
make -C $(KERNEL_DIR) M=$(PWD) modules
rm -rf .*.cmd *.mod.c *.o *.symvers *.order .tmp_versions
clean:
rm -rf .*.cmd *.mod.c *.o *.symvers *.order .tmp_versions *.ko
Ps
:
1、如果内核目录顶层makefile没有把ARCH
和CROSS_COMPILE
属性写死的话,命令要加入这两个属性的值
make ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNEL_DIR) M=$(PWD) modules
________________________________________________________________________________
清理
________________________________________________________________________________
可能出现的问题
1.新建的驱动没有生成对应的.o文件
检查这三个对应的CONFIG配置信息是否写对