最新Linux设备驱动程序课件

上传人:29 文档编号:252488332 上传时间:2024-11-16 格式:PPT 页数:40 大小:1.27MB
返回 下载 相关 举报
最新Linux设备驱动程序课件_第1页
第1页 / 共40页
最新Linux设备驱动程序课件_第2页
第2页 / 共40页
最新Linux设备驱动程序课件_第3页
第3页 / 共40页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,http:/ Space File System,USB,设备,FrameBuffer,例子和使用,Debug,原理和,Debug,方法,常用设备,/fb/ram/loopback/zero,内容设备分类,2,最新Linux设备驱动程序课件,3,最新Linux设备驱动程序课件,4,最新Linux设备驱动程序课件,5,最新Linux设备驱动程序课件,6,最新Linux设备驱动程序课件,7,最新Linux设备驱动程序课件,8,直接访问,IO,端口,(/dev/port),port_fd=open(,/dev/port,O_RDWR);lseek(port_fd,port_addr,SEEK_SET);read(port_fd,);,write(port_fd,);close(port_fd);,注意:不能用,fopen/fread/fwrite/fclose,因为它们有数据缓冲,对读写操作不是立即完成的,直接访问IO端口(/dev/port)port_fd=o,9,outb()/outw()/inb()/inw(),函数,#include,#include,#include,#define BASEPORT 0 x378/printer,int main(),ioperm(BASEPORT,3,1);,/get access permission,outb,(0,BASEPORT);,usleep(100000);,printf(status:%dn,inb,(BASEPORT+1);,ioperm(BASEPORT,3,0);,/give up,exit(0);,ioperm(from,num,turn_on),用,ioperm,申请的操作端口地址在,0 x0000 x3FF,,利用,iopl(),可以申请所有的端口地址,必须以,root,运行,用,“gcc-02 o xxx.elf xxx.c”,编译,outb(value,port);inb(port);/8-bit,outw(value,port);inw(port);/16-bit,访问时间大约,1us,outb()/outw()/inb()/inw()函数#in,10,设备驱动程序内访问设备地址,设备驱动程序可以通过指针访问设备地址,设备驱动程序接触到的还是虚拟地址,但对于外界设备有固定的设备地址映射(设备的地址在移植,Linux,时候确定),物理内存地址空间,设备驱动程序,虚拟地址映射,设备地址空间,设备地址映射,设备驱动程序,虚拟地址映射,设备地址映射,设备驱动程序内访问设备地址设备驱动程序可以通过指针访问设备地,11,直接访问,IO,端口,vs,设备驱动程序,IO,直接访问,用户态,程序编写,/,调试简单,查询模式,响应慢,设备共享管理困难,设备驱动访问,核心态,编程调试困难,可用中断模式访问、快,设备共享管理简单(由内核帮助完成),直接访问IO端口 vs 设备驱动程序IO直接访问设备驱动访问,12,设备分类,字符设备,鼠标、串口、游戏杆,块设备,磁盘、打印机,网络设备,由,BSD Socket,访问,设备分类字符设备,13,字符设备,vs,块设备,字符设备,字符设备发出读,/,写请求时,对应的硬件,I/O,一般立即发生。,数据缓冲可有可无,ADC/DAC,、按钮、,LED,、传感器等,块设备,利用一块系统内存作缓冲区,一般读写由缓冲区直接提供,尽量减少,IO,操作,针对磁盘等慢速设备,字符设备 vs 块设备字符设备块设备,14,可装卸的设备驱动程序和静态连接到内核的设备驱动程序,静态连接到内核的设备驱动程序,修改配置文件、重新编译和安装内核,可装卸的设备驱动程序,insmod,装载,rmmod,卸载,lsmod,查询,可装卸的设备驱动程序和静态连接到内核的设备驱动程序静态连接,15,Linux,对硬件设备的抽象,设备文件,Open/Close/Read/Write,例子,/dev/mouse,/dev/lp0,Linux对硬件设备的抽象设备文件,16,驱动程序与设备文件,设备驱动程序,设备,文件,用,mknod,命令创建,用,insmod,命令安装,,或直接编译到内核中,用户程序,用,open/read/write/close,等命令访问,通过主设备号找到设备驱动,驱动程序与设备文件设备驱动程序设备用mknod命令创建用i,17,驱动程序代码结构,驱动程序注册与注销,设备文件的操作函数,(*open)(),(*write)(),(*flush)(),(*llseek)(),中断服务程序,驱动程序代码结构驱动程序注册与注销设备文件的操作函数中断服务,18,LED,设备驱动程序的例子,CPU,LED设备驱动程序的例子CPU,19,struct file_operations LED_fops=,read:,LED_read,write:,LED_write,open:,LED_open,release:,LED_release,;,int,LED_init_module,(void),SET_MODULE_OWNER(,LED_major=register_chrdev(0,LED,LED_off();LED_status=0;,return 0;,void,LED_cleanup_module,(void),unregister_chrdev(LED_major,LED);,module_init(,LED_init_module,);,module_exit(,LED_cleanup_module,);,程序列表(,1,),struct file_operations LED_fop,20,程序列表,(,2,),int,LED_open,(struct inode*inode,struct file*filp)printk(LED_open()n);MOD_INC_USE_COUNT;return 0;,int,LED_release,(struct inode*inode,struct file*filp)printk(“LED_release()n“);MOD_DEC_USE_COUNT;return 0;,程序列表(2)int LED_open(struct in,21,程序列表,(,3,),ssize_t,LED_read,(struct file*filp,char*buf,size_t count,loff_t*f_pos)int i;for(i=0;icount;i+)*(char*)(buf+i)=LED_Status;return count;ssize_t,LED_write,(struct file*filp,const char*buf,size_t count,loff_t*f_pos)int i;for(i=0;i,LED_on();,else Data-,LED_off();,return count;,(*(volatile unsigned int*)(0 xXXXXXXXX)|=MASK;(*(volatile unsigned int*)(0 xXXXXXXXX),程序列表(3)ssize_t LED_read(stru,22,#ifndef _KERNEL_#define _KERNEL_#endif#ifndef MODULE#define MODULE#endif#include#include#include#include#include#include#include#include#include#include#include#include#include#include,#include,#include#include#include MODULE_AUTHOR(Rendong Ying);int LED_major,LED_status;,程序列表,(,4,),头文件,#ifndef _KERNEL_#de,23,程序编译,(,Makefile,),CC=arm-elf-linux-gcc,LD=arm-elf-linux-ld,INCLUDE=/usr/local/src/bspLinux/include,LIB_INC=,/usr/local/lib/gcc-lib/arm-elf-linux/2.95.3/include,CFLAGS=-O6-Wall-DCONFIG_KERNELD-DMODULE-D_KERNEL_ -DLinux-nostdinc-I-I.-I$(INCLUDE)-idirafter$(LIB_INC),LED.o:LED.c,$(CC)$(CFLAGS)-c LED.c,clean:,rm-f LED.o,生成,o,文件,程序编译(Makefile)CC=arm-elf-li,24,设备装载和设备文件建立,chmod+x/tmp/LED.o,/sbin/insmod-f./LED.o,cat/proc/devices,得到装入内核的主设备号,mknod,/dev/Lamp,c Num1 Num2,Num1,为主设备号,Num2,为次设备号,强制安装,忽略版本检查,设备装载和设备文件建立chmod+x/tmp/LED.o,25,设备的测试和使用,命令行,echo 8 /proc/sys/kernel/printk,cat/dev/Lamp,cat /dev/Lamp,程序,void main()int fd=open(“,/dev/Lamp,O_RDWR);write(fd,开启,printk,,也可以从,/var/log/messages,看,printk,的记录,设备的测试和使用命令行开启printk,也可以从/var/l,26,设备卸载,/sbin/rmmod LEDrm-f/dev/Lamp,Function of,MOD_INC_USE_COUNT;,MOD_DEC_USE_COUNT;,设备卸载/sbin/rmmod LEDrm-f/dev,27,复杂的设备驱动程序,驱动程序注册与注销,(注册,/,注销 设备、中断),设备文件的操作函数,(*open)(),(*write)(),(*flush)(),(*llseek)(),中断服务程序,内核数据,缓冲区,用户数,据空间,复杂的设备驱动程序驱动程序注册与注销设备文件的操作函数中断服,28,复杂设备驱动程序的例子,(USB Device),中断资源申请和释放,if(request_irq(,USB_INTR_SOURCE1,usb_ep1_int,SA_INTERRUPT,USB EP1,0)i_rdev);,filp-private_data=sub_dev_datminor;,ssize_t dev_write(struct file*filp,const char *buf,size_t count,loff_t *f_pos),switch(*(filp-private_data),同一设备驱动管理几个接口int dev_open(struc,39,结束语,谢谢大家聆听!,40,结束语谢谢大家聆听!40,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!