欢迎来到天天文库
浏览记录
ID:50348792
大小:990.00 KB
页数:17页
时间:2020-03-08
《嵌入式Linux系统应用及项目实践 教学课件 作者 丰海 第6章_字符型驱动.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第六章字符型驱动丰海1驱动程序:将底层硬件的操作写成供应用程序可以调用的函数集合。设备文件:为了让应用程序方便地控制硬件设备,驱动程序将硬件映射成一个设备文件,这样应用程序通过读写这个设备文件就可以控制硬件设备了。Linux设备分为二类:字符设备和块设备,本书只讲解字符型设备的驱动编写。应用程序:应用程序通过读写设备文件,并调用驱动程序里的函数来控制硬件设备。硬件接口:所有的开发板都会把GPIO接口引出来。23驱动程序与应用程序之间的区别1.应用程序有一个main主函数,从头到尾执行一个任务;驱动程序却没有main函数。2.应用程序可以和GLIBC库连接,因此可以包含标准
2、的头文件,比如,在驱动程序中是不能使用标准C库的,比如输出打印函数只能使用内核的printk函数,包含的头文件只能是内核的头文件,比如。4一个字符型驱动的标准框架如下:1头文件和宏定义2ioctl函数:定义了供应用程序调用的ioctl函数的实体3结构体:将所有供应用程序调用的函数名注册在这个结构体中4初始化函数模块hello_init:调用register_chrdev()函数为这份驱动注册主设备号,如;ret=register_chrdev(0,DEVICE_NAME,&hello_fops);5退出函数模块hello_
3、exit:调用unregister_chrdev()函数注销刚才申请的主设备号,如:unregister_chrdev(demoMajor,DEVICE_NAME);6模块说明:说明那些函数是初始化函数;那些函数是退出函数51.实例1驱动的功能说明我们先编写一个最简单的HELLO驱动,这个驱动的功能就是用insmod加载时显示:Hello!Welcometostudycharacterdriver!用rmmod卸载模块时显示:Goodbye!Characterdriveriseasy!6/***第1部分开始*声明包含所需要的头文件***/#include4、rnel.h>#include/***第2部分开始*hello_init()初始化函数的具体定义**/staticint__inithello_init(void){printk(KERN_NOTICE"Hello!Welcometostudycharacterdriver!");return0;}/***第3部分开始*hello_exit()退出函数的具体定义***/void__exithello_exit(void){printk(KERN_NOTICE"Goodbye!Characterdriveriseasy!");5、}/***第4部分开始*驱动的有关声明***/module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("DualBSD/GPL");7Makefile文件#指定内核源代码的路径KERNELDIR?=/opt/EmbedSky/linux-2.6.30.4/#指定编译好的驱动放在当前路径PWD:=$(shellpwd)all:modulesmodules:$(MAKE)-C$(KERNELDIR)M=$(PWD)modulesclean:rm-rf*.o*~core.depend.*.cmd*.ko*.o6、rder*.mod.c*.symvers.tmp_versionsobj-m:=hello_driver.o#生成hello_driver.ko驱动8输入make编译驱动fh@fh:~/my_experiment/hello$makemake-C/opt/EmbedSky/linux-2.6.30.4/M=/home/fh/my_experiment/hellomodulesmake[1]:正在进入目录`/opt/EmbedSky/linux-2.6.30.4'CC[M]/home/fh/my_experiment/hello/hello_driver.oBuilding7、modules,stage2.MODPOST1modulesCC/home/fh/my_experiment/hello/hello_driver.mod.oLD[M]/home/fh/my_experiment/hello/hello_driver.komake[1]:正在离开目录`/opt/EmbedSky/linux-2.6.30.4'9下载到开发板并运行[root@EmbedSkysky]#insmodhello_driver.koHello!Welcometostudycharacterdriver![root@Em
4、rnel.h>#include/***第2部分开始*hello_init()初始化函数的具体定义**/staticint__inithello_init(void){printk(KERN_NOTICE"Hello!Welcometostudycharacterdriver!");return0;}/***第3部分开始*hello_exit()退出函数的具体定义***/void__exithello_exit(void){printk(KERN_NOTICE"Goodbye!Characterdriveriseasy!");
5、}/***第4部分开始*驱动的有关声明***/module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("DualBSD/GPL");7Makefile文件#指定内核源代码的路径KERNELDIR?=/opt/EmbedSky/linux-2.6.30.4/#指定编译好的驱动放在当前路径PWD:=$(shellpwd)all:modulesmodules:$(MAKE)-C$(KERNELDIR)M=$(PWD)modulesclean:rm-rf*.o*~core.depend.*.cmd*.ko*.o
6、rder*.mod.c*.symvers.tmp_versionsobj-m:=hello_driver.o#生成hello_driver.ko驱动8输入make编译驱动fh@fh:~/my_experiment/hello$makemake-C/opt/EmbedSky/linux-2.6.30.4/M=/home/fh/my_experiment/hellomodulesmake[1]:正在进入目录`/opt/EmbedSky/linux-2.6.30.4'CC[M]/home/fh/my_experiment/hello/hello_driver.oBuilding
7、modules,stage2.MODPOST1modulesCC/home/fh/my_experiment/hello/hello_driver.mod.oLD[M]/home/fh/my_experiment/hello/hello_driver.komake[1]:正在离开目录`/opt/EmbedSky/linux-2.6.30.4'9下载到开发板并运行[root@EmbedSkysky]#insmodhello_driver.koHello!Welcometostudycharacterdriver![root@Em
此文档下载收益归作者所有