1.首先介绍一下内核驱动包含的内容
头文件包含
驱动模块的入口和出口
声明信息
功能实现
一般步骤
第一步,包含头文件:
#include <linux/init.h> //包含宏定义的头文件
#include <linux/module.h> //包含初始化加载模块的头文件
第二步,驱动模块的入口和出口
module_init();
module_exit();
第三步,声明模块拥有开源许可证
MODULE_LICENSE("GPL");
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void){
printk("hello kitty\n");
return 0;
}
stataic void hello_exit(void){
printk("bye bye\n");
return;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
# @makefile
# 内核模块的Makefile文件名必须大写(Ubuntu上小写会报错,no such file or directory)
# 入口函数没有参数,要传入void 否则编译报错
#
LINUX_PATH=/lib/modules/$(shell uname -r)/build
CURRENT_PATH=$(shell pwd)
obj-m += hello.o
all:
make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean
完成之后,执行命令
sudo make
即可看到生成的模块文件 hello.ko
插入模块执行命令:
sudo insmod hello.ko
查看打印信息使用命令:
sudo dmesg
移除模块使用命令:
sudo rmmod hello.ko
查看打印信息:
sudo dmesg
Makefile的说明
LINUX_PATH #内核源码的路径
CURRENT_PATH #当前路径
obj-m += hello.o #编译生成模块
all:
#进入内核源码路径,把当前的代码编译生成模块
make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean
2.加载模块的另一种方式:modprobe
a)把上面编译生成的hello.ko 拷贝到内核源码的目录:
cp hello.ko /lib/modules/(你的内核目录 使用命令uname -r获得)/
b)执行命令 demod -a
c) 在任意目录下,执行 modprobe hello
这里需要注意,使用命令 modprobe 只需要给出模块的名称即可。查看打印信息同i能insmod的方式
编译驱动注意事项:
1.内核源码一定要先编译通过。
2.编译驱动模块的内核源码一定要和开发板上运行的内核镜像是同一套
3.注意ARM和 x86架构区别
进入到 /lib/modules/【内核源码路径】/build下,执行 sudo make menuconfig查看
如果缺少对应的pkg包,请手动安装,如:sudo apt-get install libncurses5-dev