驱动程序功能简介:
1.无操作系统 驱动程序实现应用程序和硬件的隔离,模块化的方式,提高复用率和安全性,实现高内聚低耦合的要求
有操作系统 驱动程序 实现内核和硬件的隔离,提供统一的接口至内核,内核提供统一的接口至应用程序
2.驱动程序直接通过内核操作硬件或直接操作硬件
3.驱动设备有三大类:字符设备;块设备;网络设备。
简单实例:
0.选择对应的系统的版本,本人使用的是3.14.38
1.获取Linux内核源代码linux-3.14.38.tar.bz2,解压至当前目录,2.在linux-3.14.38 目录下 执行 make 执行,config文件根据对应的系统进行 配置
3. 执行make modules 和make modules_install
4. 生成内核树 /lib/modules/3.14.38_6UL_ga/ ,此内核已经被发布者修改,适用于对应的嵌入式开发板
5. /lib/modules/3.14.38_6UL_ga/build 驱动程序编译时需要此目录
编写驱动程序,程序为通用实例 ,详见《Linux设备驱动程序》
//hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_ALERT "Hello, world/n");
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT"Goodbye, cruel world/n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile文件必须命名为Makefile,不得使用makefie等名字
obj-m:=hello.o
KERNELDIR:=/lib/modules/3.14.38_6UL_ga/build
PWD:=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *symvers *~
$(MAKE) rm前必须以Tab开始
将hello.c和 Makefile文件放置同一目录下,打开命令行,执行make指令
即可生成对应的文件 hello.ko
将hello.ko拷贝至 嵌入式平台上, 执行 insmod hello.ko ,即可实现驱动程序的加载
可以看到 执行成功 ,输出 hello,world
卸载 即调用 rmmod hello.ko 即可。
本人的内核已经输出相应的信息。
printk是内核级别的函数,若没有看到对应的输出,可以输入 dmesg | tail 进行查看内核输出的最近10条信息
dmesg | tail -30 即可查看内核输出最近的30条信息