驱动概述
驱动种类:
- 字符设备驱动(Character Device Drivers)
- 块设备驱动(Block Device Drivers)
- 网络设备驱动(Network Device Drivers)
驱动设计原则:
只提供功能,不提供方法
HelloWorld驱动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <linux/module.h> // 包含模块相关函数的头文件 #include <linux/kernel.h> // 包含内核相关函数的头文件 #include <linux/init.h> // 包含初始化和清理函数的头文件
static int __init helloworld_init(void) { printk(KERN_INFO "Hello, World!\n"); // 打印消息到内核日志 此处用printf也可 return 0; }
static void __exit helloworld_exit(void) { printk(KERN_INFO "Goodbye, World!\n"); // 打印消息到内核日志 }
module_init(helloworld_init); // 指定驱动程序的初始化函数 module_exit(helloworld_exit); // 指定驱动程序的清理函数
MODULE_LICENSE("GPL"); // 指定模块的许可证信息 MODULE_AUTHOR("Name"); // 指定模块的作者信息 MODULE_DESCRIPTION("A simple Hello World driver"); // 指定模块的描述信息
|
编译驱动
将驱动由源代码.c编译为.ko需要借助makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| LINUX_KERNEL_PATH = /home/elf/work/linux-imx-imx_4.1.15_2.0.0_ga CURRENT_PATH := $(shell pwd) CROSS_COMPILE = arm-poky-linux-gnueabi- //编译器前缀 CC = $(CROSS_COMPILE)gcc -march=armv7ve -mfpu=neon -mcpu=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi //编译器及其参数
obj-m :=hello.o
all: $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean: $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean .PHONY: modules clean //-C后加.config文件所在文件夹 //M参数后面是要编译的模块
|
设置环境变量后编译并拷贝驱动至开发板
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make
scp hello.ko root@\192.168.0.232:/home/root
安装驱动
insmod hello.ko
卸载驱动
rmmod hello.ko
带参数的驱动
此处的参数指随驱动安装可使用命令行或配置文件传入的参数。参数可以是整形、字符型或布尔型。需做如下更改:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <linux/moduleparam.h> //包含模块参数相关函数的头文件
//定义的参数 static int my_param = 0; static char *who = "helloworld";
module_param(my_param, int, S_IRUSR | S_IWUSR); //定义并注册一个驱动模块参数 需要填入:参数名称、参数类型、访问权限 MODULE_PARM_DESC(my_param, "An integer parameter"); //添加参数描述信息
module_param(who, charp, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(who, "An integer parameter");
...
|
而后就可以在驱动模块中引用这些参数