最新Linux设备驱动程序课件.ppt

上传人(卖家):晟晟文业 文档编号:5053809 上传时间:2023-02-06 格式:PPT 页数:40 大小:1.24MB
下载 相关 举报
最新Linux设备驱动程序课件.ppt_第1页
第1页 / 共40页
最新Linux设备驱动程序课件.ppt_第2页
第2页 / 共40页
最新Linux设备驱动程序课件.ppt_第3页
第3页 / 共40页
最新Linux设备驱动程序课件.ppt_第4页
第4页 / 共40页
最新Linux设备驱动程序课件.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、内容 设备分类 设备驱动程序的框架 字符型设备 网络设备 文件系统 User Space File System USB设备 FrameBuffer例子和使用 Debug原理和Debug方法 常用设备/fb/ram/loopback/zero直接访问IO端口(/dev/port)port_fd=open(/dev/port/dev/port,O_RDWR);lseek(port_fd,port_addr,SEEK_SET);read(port_fd,);write(port_fd,);close(port_fd);注意:不能用fopen/fread/fwrite/fclose因为它们有数据缓冲

2、,对读写操作不是立即完成的outb()/outw()/inb()/inw()函数#include#include#include#define BASEPORT 0 x378/printerint main()ioperm(BASEPORT,3,1);ioperm(BASEPORT,3,1);/get access permission outboutb(0,BASEPORT);usleep(100000);printf(status:%dn,inbinb(BASEPORT+1);ioperm(BASEPORT,3,0);ioperm(BASEPORT,3,0);/give up exit(0

3、);ioperm(from,num,turn_on)用ioperm申请的操作端口地址在0 x0000 x3FF,利用iopl()可以申请所有的端口地址必须以root运行用“gcc-02 o xxx.elf xxx.c”编译 outb(value,port);inb(port);/8-bitoutw(value,port);inw(port);/16-bit访问时间大约1us设备驱动程序内访问设备地址 设备驱动程序可以通过指针访问设备地址 设备驱动程序接触到的还是虚拟地址,但对于外界设备有固定的设备地址映射(设备的地址在移植Linux时候确定)物理内存地址空间设备驱动程序虚拟地址映射虚拟地址映射

4、设备地址空间设备地址映射设备地址映射设备驱动程序虚拟地址映射虚拟地址映射设备地址映射设备地址映射直接访问IO端口 vs 设备驱动程序IO直接访问 用户态 程序编写/调试简单 查询模式,响应慢 设备共享管理困难设备驱动访问 核心态 编程调试困难 可用中断模式访问、快 设备共享管理简单(由内核帮助完成)设备分类 字符设备鼠标、串口、游戏杆 块设备磁盘、打印机 网络设备由BSD Socket访问字符设备 vs 块设备字符设备 字符设备发出读/写请求时,对应的硬件I/O一般立即发生。数据缓冲可有可无 ADC/DAC、按钮、LED、传感器等块设备 利用一块系统内存作缓冲区,一般读写由缓冲区直接提供,尽量

5、减少IO操作 针对磁盘等慢速设备可装卸的设备驱动程序和静态连接到内核的设备驱动程序 静态连接到内核的设备驱动程序修改配置文件、重新编译和安装内核 可装卸的设备驱动程序 insmod装载 rmmod卸载 lsmod查询Linux对硬件设备的抽象设备文件 Open/Close/Read/Write 例子/dev/mouse/dev/lp0驱动程序与设备文件设备驱动程序设备文件用mknod命令创建用insmod命令安装,或直接编译到内核中用户程序用open/read/write/close等命令访问通过主设备号找到设备驱动驱动程序代码结构驱动程序注册与注销设备文件的操作函数(*open)()(*wr

6、ite)()(*flush)()(*llseek)()中断服务程序LED设备驱动程序的例子CPUstruct file_operations LED_fops=struct file_operations LED_fops=read:read:LED_read,LED_read,write:write:LED_write,LED_write,open:open:LED_open,LED_open,release:release:LED_release,LED_release,;int int LED_init_moduleLED_init_module(void)(void)SET_MODUL

7、E_OWNER(&LED_fops);SET_MODULE_OWNER(&LED_fops);LED_major=register_chrdev(0,LED,&LED_fops);LED_major=register_chrdev(0,LED,&LED_fops);LED_off();LED_off();LED_status=0;LED_status=0;return 0;return 0;void void LED_cleanup_moduleLED_cleanup_module(void)(void)unregister_chrdev(LED_major,LED);unregister_c

8、hrdev(LED_major,LED);module_init(module_init(LED_init_moduleLED_init_module););module_exit(module_exit(LED_cleanup_moduleLED_cleanup_module););程序列表(1)程序列表(2)int int LED_openLED_open(struct inode(struct inode*inode,struct file inode,struct file*filp)filp)printk(LED_open()n);printk(LED_open()n);MOD_IN

9、C_USE_COUNT;MOD_INC_USE_COUNT;return 0;return 0;int int LED_releaseLED_release(struct inode(struct inode*inode,struct inode,struct file file*filp)filp)printk(“LED_release()n“);printk(“LED_release()n“);MOD_DEC_USE_COUNT;MOD_DEC_USE_COUNT;return 0;return 0;程序列表(3)ssize_t ssize_t LED_readLED_read(struc

10、t file (struct file*filp,char filp,char*buf,size_t buf,size_t count,loff_t count,loff_t*f_pos)f_pos)int i;int i;for(i=0;icount;i+)for(i=0;icount;i+)*(char(char*)(buf+i)=LED_Status;)(buf+i)=LED_Status;return count;return count;ssize_t ssize_t LED_writeLED_write(struct file(struct file*filp,const char

11、 filp,const char*buf,buf,size_t count,loff_t size_t count,loff_t*f_pos)f_pos)int i;int i;for(i=0;icount;i+)for(i=0;iData-LED_on();LED_on();else Data-else Data-LED_off();LED_off();return count;return count;(*(volatile unsigned int*)(0 xXXXXXXXX)|=MASK;(*(volatile unsigned int*)(0 xXXXXXXXX)&=MASK;#if

12、ndef _KERNEL_#ifndef _KERNEL_#define _KERNEL_#define _KERNEL_#endif#endif#ifndef MODULE#ifndef MODULE#define MODULE#define MODULE#endif#endif#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includ

13、e#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include MODULE_AUTHOR(Rendong Ying);MODULE_AUTHOR(Rendong Ying);int LED_major,LED_status;int LED_major,LED_status;程序列表(4)头文件程序编译(Makefile)CC=arm-elf-linux-gccCC=arm-elf-linux-gcc

14、LD=arm-elf-linux-ldLD=arm-elf-linux-ldINCLUDE=/usr/local/src/bspLinux/includeINCLUDE=/usr/local/src/bspLinux/includeLIB_INC=LIB_INC=/usr/local/lib/gcc-lib/arm-elf-linux/2.95.3/include/usr/local/lib/gcc-lib/arm-elf-linux/2.95.3/includeCFLAGS=-O6-Wall-DCONFIG_KERNELD-DMODULE-CFLAGS=-O6-Wall-DCONFIG_KE

15、RNELD-DMODULE-D_KERNEL_ D_KERNEL_ -DLinux-nostdinc-I-I.-I$(INCLUDE)-DLinux-nostdinc-I-I.-I$(INCLUDE)-idirafter$(LIB_INC)-idirafter$(LIB_INC)LED.o:LED.cLED.o:LED.c$(CC)$(CFLAGS)-c LED.c$(CC)$(CFLAGS)-c LED.cclean:clean:rm-f LED.orm-f LED.o生成o文件设备装载和设备文件建立 chmod+x/tmp/LED.o/sbin/insmod-f./LED.o cat/pr

16、oc/devices得到装入内核的主设备号 mknod/dev/Lamp c Num1 Num2Num1为主设备号Num2为次设备号强制安装,忽略版本检查设备的测试和使用 命令行echo 8 /proc/sys/kernel/printkecho 8 /proc/sys/kernel/printkcat/dev/Lamp cat/dev/Lamp cat /dev/Lamp cat /dev/Lamp 程序void main()int fd=open(“/dev/Lamp,O_RDWR);write(fd,&data,1);close(fd);开启printk,也可以从/var/log/mes

17、sages看printk的记录设备卸载/sbin/rmmod LEDrm-f/dev/LampFunction ofMOD_INC_USE_COUNT;MOD_DEC_USE_COUNT;复杂的设备驱动程序驱动程序注册与注销(注册/注销 设备、中断)设备文件的操作函数(*open)()(*write)()(*flush)()(*llseek)()中断服务程序内核数据内核数据缓冲区缓冲区用户数用户数据空间据空间复杂设备驱动程序的例子(USB Device)中断资源申请和释放 if(request_irq(USB_INTR_SOURCE1,usb_ep1_int,SA_INTERRUPT,USB

18、EP1,0)i_rdev);int minor=MINOR(inode-i_rdev);filp-private_data=sub_dev_datminor;filp-private_data=sub_dev_datminor;ssize_t dev_write(struct file ssize_t dev_write(struct file*filp,filp,const char const char *buf,buf,size_t count,size_t count,loff_t loff_t *f_pos)f_pos)switch(switch(*(filp-private_data)(filp-private_data)40 结束语结束语

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(最新Linux设备驱动程序课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|