1.在kernel/msm-4.4/drivers文件夹中增加一个frist_driver文件夹
对应有以下文件:
frist_driver/
├── frist_driver.c //源代码
├── Kconfig //config控制脚本
└── Makefile //该目录的编译规则
2.源代码frist_driver.c分析:
本章注重怎么在kernel下增加驱动模块,不纠结于驱动怎么编写
#include <linux/init.h>
#include <linux/module.h>
static int __init first_drv_init(void)
{
printk("first_drv_init\n");
return 0;
}
static void __exit first_drv_exit(void)
{
printk("first_drv_exit\n");
}
module_init(first_drv_init);
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");
3.编译规则
要让kernel编译这个模块,要符合一下几点:
a.让kernel知道这个模块存在(Kconfig作用)
模块文件夹下的Kconfig;
frist_driver/Kconfig
config FRIST_DRIVER //会在kernel编译的时候生成CONFIG_FRIST_DRIVER宏
tristate "First Android Driver" //tristate 是指模块中的y m n中三选一。其中y表示编译进内核镜像中,和Image融为一体,m是module,指编译成模块,成一个ko文件,可动态加载卸载,指的是不编译进内核,也不编译成模块。 后面的是该选项的名字,在menuconfig中会以该名称显示
default m //默认值是M,如果你不选择
help //解析说明,在menuconfig中和按help显示该内容
This is the first android driver.
在drivers下的Kconfig后添加上述的Kconfig,指的是在kernel目录下执行menuconfig的时候能显示上述的配置.
......
+ source "drivers/frist_driver/Kconfig"
endmenu
b.让kernel按照自己的规则编译(Makefile)
模块文件夹下的Makefile;
obj-$(CONFIG_FRIST_DRIVER) += frist_driver.o //CONFIG_FRIST_DRIVER是上述的Kconfig的宏,用户的配置决定了是否编译或者是怎么编译该模块。 += 表示在kernel原有的基础上添加frist_driver.o对象。frist_driver.o对应的是frist_driver.c文件
同样的,也要drivers下Makefile添加上述的Makefile
obj-$(CONFIG_FRIST_DRIVER) += frist_driver/ //解析同上,不再说明
4.在安卓系统中,上述都是源码,真正生成是在out/目录下。可以在out目录下编译
cd out/target/product/XXX(对应的机器目录)/obj/kernel/msm-4.4
make -j32 ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- menuconfig //用户选择配置,生效的上述Kconfig
Device Drivers ---> <M> First Android Driver //这里选择了M,也是会在kernel编译的时候生成#define CONFIG_FRIST_DRIVER m
make -j32 ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- modules // modules表示在kernel中所有选M的都会编译
5.编译成功就可以在对应的目录下找到驱动了:
drivers/frist_driver/frist_driver.ko