文章目录
今天我们就来编写一个最简的linux驱动。
一、最小驱动模块
二、驱动的处理方式
Linux内核针对驱动的处理有一下两种方式:
第一种方式:把所有需要的功能全部编译到内核中,这种方法会导致重新添加或者删除功能的时候,需要重新编译内核。
第二种方式:动态的添加模块,也就是以模块的方式添加驱动。
三、linux内核模块结构
一个linux内核模块主要由一下几个部分组成。
1.模块加载函数
当通过insmod命令加载内核模块的时候,模块的加载函数会自动调用到内核运行,完成模块的初始化工作。
2.模块卸载函数
当通过rmmod命令卸载内核模块的时候,模块的卸载函数会自动被调用到内核运行,完成模块的卸载工作,完成与模块卸载函数相反的功能。
3.模块的许可声明
LICENSE声明描述内核的许可权限,如果不声明LICENSE,模块加载的时候,会受到内核被污染的警告。
4.模块作者信息
四、编写mini_linux_module
1. 编写mini_linux_module.c
#include <linux/init.h>
/* 包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/
#include <linux/module.h>
/* 包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中 */
MODULE_LICENSE("Dual BSD/GPL");
/* 声明是开源的,没有内核版本限制 */
MODULE_AUTHOR("luatao");
/* 声明作者 */
static int luatao_init(void)
{
printk(KERN_EMERG"luatao world enter!\n");
/* 打印信息,KERN_EMERG表示紧急信息 */
return 0;
}
static void luatao_exit(void)
{
printk(KERN_EMERG"luatao world exit!\n");
}
/* 初始化函数 */
module_init(luatao_init);
/* 卸载函数 */
module_exit(luatao_exit);
2.printk等级
打印函数 printk 是分级的,它的 8 个级别如下:
#define KERN_EMERG 0
/紧急事件消息,系统崩溃之前提示,表示系统不可用/
#define KERN_ALERT 1
/报告消息,表示必须立即采取措施/
#define KERN_CRIT 2
/临界条件,通常涉及严重的硬件或软件操作失败/
#define KERN_ERR 3
/错误条件,驱动程序常用 KERN_ERR 来报告硬件的错误/
#define KERN_WARNING 4
/警告条件,对可能出现问题的情况进行警告/
#define KERN_NOTICE 5
/正常但又重要的条件,用于提醒/
#define KERN_INFO 6
/提示信息,如驱动程序启动时,打印硬件信息/
#define KERN_DEBUG 7
/调试级别的消息/
3.脚本文件Makefile
#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译mini_linux_module.c这个文件编译成中间文件mini_linux_module.o
obj-m += mini_linux_module.o
#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将linux源码拷贝到目录/home/luatao/4412_test/iTop4412_Kernel_3.0
KDIR := /home/luatao/4412_test/iTop4412_Kernel_3.0
#当前目录变量
PWD ?= $(shell pwd)
#make命令默认寻找第一个目标
#make -c就是指调用执行的路径
#$(KDIR)linux的源码目录
#$(PWD)当前目录变量
# modules 要执行的操作
all:
make -C $(KDIR) M=$(PWD) modules
#make clean执行的操作时删除后缀为o的文件
clean:
rm -rf *.o
五、编译驱动模块
在/home/luatao目录下新建文件夹mini_linux_module
执行命令
mkdir mini_linux_module
将前面编写好的mini_linux_module.c和对应的makefile拷贝到该文件夹下
sudo cp /home/samba/mini_linux_module.c .
sudo cp /home/samba/Makefile .
执行make命令
编译成功。
mini_linux_module.ko”,这个文件就是最后要加载到开发板中的文件。
六、开发板运行
使用tftp将这个文件下载到开发板上
先将这个文件复制到tftp文件夹下
sudo cp /home/luatao/mini_linux_module/mini_linux_module.ko .
下载到开发板
tftp -g -l mini_linux_module.ko 192.168.1.6
七、加载卸载驱动
1.加载驱动
insmod mini_linux_module.ko
2.查看驱动
lsmod
3.卸载驱动
rmmod mini_linux_module
如果报错
需要新建目录
mkdir /lib/modules
又报错
mkdir /lib/modules/3.0.15
再次执行成功