嵌入式Linux系统应用及项目实践教学课件作者丰海第6章_字符型驱动课件.ppt
文本预览下载声明
第六章 字符型驱动 * 丰海 驱动程序: 将底层硬件的操作写成供应用程序可以调用的函数集合。 设备文件: 为了让应用程序方便地控制硬件设备,驱动程序将硬件映射成一个设备文件,这样应用程序通过读写这个设备文件就可以控制硬件设备了。Linux设备分为二类:字符设备和块设备,本书只讲解字符型设备的驱动编写。 应用程序: 应用程序通过读写设备文件,并调用驱动程序里的函数来控制硬件设备。 硬件接口:所有的开发板都会把GPIO接口引出来。 驱动程序与应用程序之间的区别 1.应用程序有一个main主函数,从头到尾执行一个任务; 驱动程序却没有main函数。 2.应用程序可以和GLIBC库连接,因此可以包含标准的头文件,比如stdio.h, 在驱动程序中是不能使用标准C库的,比如输出打印函数只能使用内核的printk函数,包含的头文件只能是内核的头文件,比如linux/module.h。 一个字符型驱动的标准框架如下: 1 头文件和宏定义 2 ioctl函数:定义了供应用程序调用的ioctl函数的实体 3 结构体:将所有供应用程序调用的函数名注册在这个结构体中 4 初始化函数模块hello_init:调用register_chrdev()函数为这份 驱动注册主设备号,如; ret = register_chrdev(0, DEVICE_NAME, hello_fops); 5 退出函数模块hello_exit:调用unregister_chrdev( ) 函数注销刚 才申请的主设备号,如: unregister_chrdev(demoMajor, DEVICE_NAME); 6 模块说明:说明那些函数是初始化函数;那些函数是退出函数 1. 实例1驱动的功能说明 我们先编写一个最简单的HELLO 驱动,这个驱动的功能就是用insmod加载时显示: Hello! Welcome to study character driver! 用rmmod卸载模块时显示: Goodbye! Character driver is easy! /***第1部分开始*声明包含所需要的头文件***/ #include linux/kernel.h #include linux/module.h /***第2部分开始* hello_init()初始化函数的具体定义**/ static int __init hello_init(void) { printk(KERN_NOTICE Hello!\nWelcome to study character driver!\n); return 0; } /***第3部分开始* hello_exit()退出函数的具体定义***/ void __exit hello_exit(void) { printk(KERN_NOTICE Goodbye!\nCharacter driver is easy!\n); } /***第4部分开始* 驱动的有关声明***/ module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE(Dual BSD/GPL); Makefile文件 # 指定内核源代码的路径 KERNELDIR ?= /opt/EmbedSky/linux-2.6.30.4/ # 指定编译好的驱动放在当前路径 PWD := $(shell pwd) all: modules modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.order *.mod.c *.symvers .tmp_versions obj-m := hello_driver.o # 生成hello_driver.ko驱动 输入make编译驱动 fh@fh:~/my_experiment/hello$ make make -C /opt/EmbedSky/linux-2.6.30.4/ M=/home/fh/my_experiment/hello modules make[1]: 正在进入目录 `/opt/EmbedSky/linux-2.6.30.4 CC [M] /home/fh/my_experiment/hello/hello_driver.o Building modules, stage 2. MODPOST 1 modules CC /home/fh/my_experiment/hello/
显示全部