书签 分享 收藏 举报 版权申诉 / 38
上传文档赚钱

类型Linux设备驱动程序课件.pptx

  • 上传人(卖家):三亚风情
  • 文档编号:2491379
  • 上传时间:2022-04-25
  • 格式:PPTX
  • 页数:38
  • 大小:180.74KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《Linux设备驱动程序课件.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Linux 设备 驱动程序 课件
    资源描述:

    1、内容 设备分类 设备驱动程序的框架 字符型设备 网络设备 文件系统 User Space File System USB设备 FrameBuffer例子和使用 Debug原理和Debug方法 常用设备/fb/ram/loopback/zero设备驱动程序的任务 设备初始化 硬件操作和管理 外部硬件和内核空间的数据传递 内核空间和用户空间的数据传递设备驱动程序的功能外部硬件设备驱动程序用户程序存储缓冲用户空间内核空间用户态程序 vs 内核态程序用户程序 权限受限 虚拟运行环境逻辑地址关键资源访问受监管 函数调用由用户控制内核程序 最高权限 实际的运行环境物理地址可访问所有资源 函数由内核直接调用

    2、 可以运行驱动程序地址映射与物理地址访问物理地址空间用户进程1用户进程2用户进程3虚拟地址映射用户利用指针访问的是虚地址,不是物理地址,IO设备的物理地址可能是用户进程不可触及的虚拟地址映射虚拟地址映射直接访问内核内存(/dev/kmem)kmfd=open(/dev/kmem/dev/kmem,O_RDONLY);lseek(kmfd,offset,SEEK_SET);read(kmfd,byteArray,byteArrayLen);close(kmfd); 直接访问内核地址(内核态的虚地址) 一般内核地址起始于0 xC0000000直接访问物理地址(/dev/mem)mem_fd=ope

    3、n(/dev/mem/dev/mem,O_RDONLY);b=mmap(0, 0 x10000, PROT_READ|PROT_WRITE,MAP_SHARED, mem_fd,0 xA0000)close(memfd);0 xA00000 xB0000Pointer bmmap将文件中的数据映射成数组这里是将物理内存(由特殊文件/dev/mem访问)映射成指针b指向的数组。注意,指针b的值不一定是0 xA0000,它是和物理地址0 xA0000对应的用户态的虚拟地址Linux中/dev/mem主要是用于设备内存的访问(比如显卡内存),而不是普通存储器直接访问IO端口(/dev/port)po

    4、rt_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因为它们有数据缓冲,对读写操作不是立即完成的outb()/outw()/inb()/inw()函数#include #include #include #define BASEPORT 0 x378 / printerint main() iopermioperm(BASEPORT, 3, 1);

    5、(BASEPORT, 3, 1);/ get access permission outboutb(0, BASEPORT); usleep(100000); printf(status: %dn, inbinb(BASEPORT + 1); iopermioperm(BASEPORT, 3, 0);(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” 编译

    6、outb(value, port); inb(port); / 8-bitoutw(value, port); inw(port); / 16-bit访问时间大约1us设备驱动程序内访问设备地址 设备驱动程序可以通过指针访问设备地址 设备驱动程序接触到的还是虚拟地址,但对于外界设备有固定的设备地址映射(设备的地址在移植Linux时候确定)物理内存地址空间设备驱动程序虚拟地址映射虚拟地址映射设备地址空间设备地址映射设备地址映射设备驱动程序虚拟地址映射虚拟地址映射设备地址映射设备地址映射直接访问IO端口 vs 设备驱动程序IO直接访问 用户态 程序编写/调试简单 查询模式,响应慢 设备共享管理困难

    7、设备驱动访问 核心态 编程调试困难 可用中断模式访问、快 设备共享管理简单(由内核帮助完成)设备分类 字符设备鼠标、串口、游戏杆 块设备磁盘、打印机 网络设备由BSD Socket访问字符设备 vs 块设备字符设备 字符设备发出读/写请求时,对应的硬件I/O一般立即发生。 数据缓冲可有可无 ADC/DAC、按钮、LED、传感器等块设备 利用一块系统内存作缓冲区,一般读写由缓冲区直接提供,尽量减少IO操作 针对磁盘等慢速设备可装卸的设备驱动程序和静态连接到内核的设备驱动程序 静态连接到内核的设备驱动程序修改配置文件、重新编译和安装内核 可装卸的设备驱动程序 insmod装载 rmmod卸载 ls

    8、mod查询Linux对硬件设备的抽象设备文件 Open/Close/Read/Write 例子/dev/mouse/dev/lp0驱动程序与设备文件设备驱动程序设备文件用mknod命令创建用insmod命令安装,或直接编译到内核中用户程序用open/read/write/close等命令访问通过主设备号找到设备驱动驱动程序代码结构驱动程序注册与注销设备文件的操作函数(*open)()(*write)()(*flush)()(*llseek)()中断服务程序LED设备驱动程序的例子CPUstruct file_operations LED_fops = struct file_operation

    9、s 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_MODULE_OWNER(&LED_fops); SET_MODULE_OWNER(&LED_fops); LED_major = register_chrdev(0, LED, &

    10、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_chrdev(LED_major, LED); module_init(module_init(LED_init_moduleLE

    11、D_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_INC_USE_COUNT; MOD_INC_USE_COUNT; return 0; return

    12、 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 (struct file (struct file * *fil

    13、p, 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 *

    14、*filp, const char 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;(*(v

    15、olatile unsigned int *)(0 xXXXXXXXX) &=MASK;#ifndef _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

    16、#include #include #include #include #include #include #include #include #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;in

    17、t LED_major, LED_status;程序列表 (4)头文件程序编译 (Makefile)CC = arm-elf-linux-gccCC = arm-elf-linux-gccLD = 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/

    18、lib/gcc-lib/arm-elf-linux/2.95.3/includeCFLAGS = -O6 -Wall -DCONFIG_KERNELD -DMODULE -CFLAGS = -O6 -Wall -DCONFIG_KERNELD -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$

    19、(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 /proc/devices得到装入内核的主设备号 mknod /dev/Lamp c Num1 Num2Num1为主设备号Num2为次设备号强制安装,忽略版本检查设备的测试和使用 命令行echo 8 /proc/sys/kernel/printkecho 8 /proc/sys/kernel/printkc

    20、at /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/messages看printk的记录设备卸载/sbin/rmmod LEDrm -f /dev/LampFunction ofMOD_INC_USE_COUNT;MOD_DEC_USE_COUNT;复杂的设备驱动程序驱动程序注册与注销(注册/注销 设备、中断)设备文件的操作函数(*open

    21、)()(*write)()(*flush)()(*llseek)()中断服务程序内核数据内核数据缓冲区缓冲区用户数用户数据空间据空间复杂设备驱动程序的例子(USB Device)中断资源申请和释放 if (request_irq(USB_INTR_SOURCE1, usb_ep1_int, SA_INTERRUPT, USB 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)

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:Linux设备驱动程序课件.pptx
    链接地址:https://www.163wenku.com/p-2491379.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


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

    163文库