




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主题 Linux设备驱动程序 主讲人 徐文正 V1 0 大纲 1 设备驱动程序入门2 中断处理3 等待队列4 定时处理5 实例分析字符设备驱动程序6 实例分析网络设备驱动程序7 用户与内核的接口 1设备驱动程序入门 驱动程序分类模块方式驱动程序内核方式驱动程序用户模块驱动程序 1 1驱动程序分类 字符设备驱动程序表现为文件 面向字节 即时收发数据块设备驱动程序表现为文件 面向块 通过缓存区进行缓冲网络设备驱动程序表现为net device结构链表中的一项 面向流或数据报 通过sk buff结构进行收发 1 2模块方式驱动程序 编写步骤1 写入口函数2 写模块函数3 编译为 O文件4 插入模块5 创建设备文件调试方式实例 1 2模块方式驱动程序 一 入口函数 Open 打开设备增加使用记数 分配内存空间 初始化变量 函数 申请中断 I O空间Release 关闭设备减少使用记数 释放内存空间 释放中断 I O空间Write 写设备 Copy from user Read 写设备 Copy to user 其他函数如ioctl 和中断处理函数等 1 2模块方式驱动程序 二 模块函数 Init module 模块初始化函数 在插入模块时执行也可以用module init your init func 主要执行设备的注册Cleanup module 模块清理函数 在移除模块时执行也可以用module exit your cleanup func 主要执行设备的反注册 1 2模块方式驱动程序 三 编译 用如下命令将mydriver c编译为mydriver oPpc 8xx gcc DLINUX DMODULE D KERNEL Wall Wstrict prototypes fno builtin nostdinc O2 I opt hardhat devkit lsp embeddedplanet cllf ppc 8xx linux 2 4 17 mvl21 include I opt hardhat devkit ppc 8xx lib lib gcc Lib powerpc hardhat linux 2 95 3 include I opt hardhat devkit lsp embeddedplanet cllf ppc 8xx linux 2 4 17 mvl21 arch ppc cMydriver c 1 2模块方式驱动程序 四 插入模块 insmodmydriver o该命令将驱动程序模块插入到内核中 并执行init module 函数 该命令也可以向驱动程序中传递一些参数 rmmodmydriver该命令将驱动程序模块从内核中先移除 并执行cleanup module 函数 其它命令 modprobe depmod modinfo 1 2模块方式驱动程序 五 创建设备文件 Mknod dev mydrivercmajorminor该命令创建一个字符设备文件mydriver 它的主设备号是major 次设备号是minor 设备号信息可以在 proc devices文件中获得 网络设备驱动程序不需要此步骤 因为它不出现在文件系统中 1 2模块方式驱动程序 模块驱动程序的调试 使用printk函数在程序的开始加入 defineMY debug在需要打印调试信息的位置加入 ifdefMY DEBUGprintk mydebuginfo endif 1 2模块方式驱动程序 模块驱动程序实例 Modexample c include include include include include includeunsignedinttest major 0ssize tread test structfile file char buf size tcount loff t offset intleft if verify area VERIFY WRITE buf count EFAULT Return EFAULT for left count left 0 left put user 1 buf buf Returncount 1 2模块方式驱动程序 ssize twrite test structfile file constchar buf size tcount loff t offset Returncount Intopen test structinode inode strutfile file MOD INC USE COUNT Return0 Intrelease test structinode inode structfile file MOD DEC USE COUNT Return0 1 2模块方式驱动程序 Staticstructfile operationsTest fops Read read test write write test open open test release release test Intmy init module void Intresult Result register chrdev test major test 1 2模块方式驱动程序 Voidmy cleanup module void Unregister chrdev test major test Module init my init module Module exit my cleanup module 编译Insmodmodexample o如果安装成功 在 proc devices文件中就可以看到设备test 并可以看到它的主设备号 创建设备文件Mknod dev testmajorminor将minor设为0即可 1 3内核方式驱动程序 编写步骤1 写入口函数2 写初始化函数3 修改Config in文件4 修改Makefile文件5 配置初始化函数6 编译内核7 创建设备文件调试方式实例 1 3内核方式驱动程序 一 入口函数 Open Release 打开和关闭设备Write Read 读写设备ioctl 对设备的控制函数其他函数 如和中断处理函数等 二 初始化函数 一般命名为mydriver init 其功能包括 填充设备相关结构的信息域实现入口函数指针与设备相关结构的连接探测可用的IRQ号探测可用的IO基址注册设备 1 3内核方式驱动程序 三 修改Config in文件 目的 在配置内核时要在相应菜单下出现mydriver选项修改文件linux 2 4 17 mv121 drivers char Config in 在相应位置添加如下语句bool mydriver CONFIG MYDRIVER 四 修改Makefile文件 目的 使内核能够编译mydriver c文件 在配置内核时选择了mydriver 修改文件linux 2 4 17 mv121 drivers char Makefile 在相应位置添加如下语句obj CONFIG MYDRIVER mydriver o将mydriver c等源文件拷贝到目录linux 2 4 17 mv121 drivers char 下 1 3内核方式驱动程序 五 配置初始化函数 目的 使内核启动时执行mydriver init 函数在linux 2 4 17 mv121 drivers block genhd c中device init 函数外的适当位置添加 ifdefCONFIG MYDRIVERexternvoidmydriver init void endif在linux 2 4 17 mv121 drivers block genhd c中device init 函数内的适当位置添加 ifdefCONFIG MYDRIVERmydriver init endif 1 3内核方式驱动程序 六 编译内核 在linux 2 4 17 mv121 下执行如下命令makeclean makedep makezImage编译好的内核保存在linux 2 4 17 mv121 arch ppc boot images zImage embedded中 启动内核就可以在 proc devices文件中看到mydriver设备 七 创建设备文件 Mknod dev mydrivercmajorminor该命令创建了一个字符设备文件mydriver 它的主设备号是major 次设备号是minor 设备号信息可以在 proc devices文件中获得 也可以在rc sysinit文件中添加此命令 从而在启动时自动创建该设备文件 1 3内核方式驱动程序 内核驱动程序调试 PrintkKgdbBDI2000 一 配置内核1 Makemenuconfig2 在KernelHacking部分选中CONFIG KGDB3 将makefile中的CFLAGS变量修改为CFLAGS Wall Wstrict prototypes o2 g ggdb二 重新编译内核并启动 内核会等待gdb连接三 关闭minicom四 在主机上执行ddd debugger opt hardhat devkit ppc 8xx bin ppc 8xx gdb gdb opt hardhat devkip lsp embeddedplaNet cllf ppc 8xx linux2 4 17 mv121 vmlinux五 然后在ddd中输入targetremote dev ttyS0 1 3内核方式驱动程序 BDI2000 一 配置内核1 Makemenuconfig2 在KernelHacking部分选中CONFIG KGDB3 将makefile中的CFLAGS变量修改为变量修改为CFLAGS Wall Wstrict prototypes o2 g ggdb二 配置BDI2000 ip设为192 168 1 20三 在主机上输入telnet192 168 1 20四 通过BDI2000下载并启动内核BDI loadOx200000nete860 binBINBDI tiOx200000五 在主机上执行ddd debugger opt hardhat devkit ppc 8xx bin ppc 8xx gdb gdb opt hardhat devkip lsp embeddedplanet cllf 8xx linux2 4 17 mvl21 vmlinux六 在ddd中输入 Targetremote192 168 1 20 2001 1 4用户模式驱动程序 适用范围及特点I O映射内存映射读写设备 1 4用户模式驱动程序 适用范围及特点 测试新的硬件设备测试一个新的设备是否可用观察设备的工作情况快速创建一个硬件应用比如控制小马达的转动点亮某个指示灯 范围 特点 优点 1 可以连接完整的C库 编程容易2 可以使用传统调试器 而不必调试内容缺点 1 不支持设备中断2 不支持设备定时 1 4用户模式驱动程序 I O映射 ioperm 为用户应用程序打开一块I O空间iopl 为用户应用程序打开整个I O地址空间MontaVistaLinux不支持 1 4用户模式驱动程序 内存映射 通过设备 dev mem来访问硬件设备使用mmap 函数来选择要访问的内存物理基址和块大小 它返回已经映射到物理基址的虚拟地址void mmap void start size tlength intprot intflags infd off toffset fd open dev men O WRONLY ledptr mmap 0 sizeof LED AREA PROT WRITE MAP SHARED fd LED ADDRESS ledptr value 1 4用户模式驱动程序 读写设备 使用函数inb inw inl 或readb readw readl 来读设备使用函数outb outw outl 或writeb writew writel 来写设备它们的头文件是 2中断处理 基本概述探测中断安装中断取消中断 2 1基本概念 分类 硬件中断由硬件设备产生的中断执行相应的中断处理程序可以产生软中断 tasklet 来实现耗时的中断处理任务 也就是下半部中断软中断 softIRQ 内核中共有32个softIRQ 其中一个就是TASKLET SOFTIRQ在内核执行do softirq 函数时 轮询这32个softirq 如果相应的softirq可以执行 就执行它指导的函数TASKLET SOFTIRQ对应的函数是tasklet action 它会依次执行挂在TASKLET SOFTIRQ上的tasklet 2 1基本概念 Read执行流程 Processread DeviceDriver TopHalf markbin Dev read InitiatetransferWait timepasses BottomHalf Task resume 2 1基本概念 中断处理程序举例 structtasklet structmy tasklet elsewhere insomeinitializationsectiontasklet init recordthataninterruptarrived 2 2探测中断 1 probe irq on void 返回一个unsignedlong位掩码 2 使设备发中断3 probe irq oof unsignedlong 第一步返回的位掩码传给此函数返回值即为探测到的中断号 如果为0或为负则没有可用中断 探测中断例子 unsignedlongmask probe irq on outb p 0 x10 short base 2 enablereporting outb p 0 x00 short base clearthebit outb p 0 xFF short base setthebit interrupt outb p 0 x00 short base 2 disablereporting irq probe irq off mask 2 2探测中断 安装SIU中断 SIU中断向量表16个 include asm asm ppc irq h 外部中断根据硬件连线确定IRQ号码 比如是IRQ3调用函数request 8xxirq SIU IRQ3 my handler flag devname devpointer 内部中断选择一个未用的LEVEL号码 比如是LEVEL3调用函数request 8xxirq SIU LEVEL3 my handler flag devname NULL 2 2探测中断 安装SIU中断例子 defineCPM INTERRUPTSIU LEVEL2 在文件irq h中定义 cpm interrupt init 函数中 arch ppc 8xx io commproc c SetourinterruphandlerwiththecoreCPU If request 8xxirq CPM interrupt cpm interrupt 0 cpm NULL 0 Panic couldnotallocateCPMIRQ 2 2探测中断 安装CPM中断 CPM中断向量表32个 arch ppc 8xx io commproc h 确定相应的中断向量 比如是SCC1调用函数cpm install handler CPMVEC SCC1 scc1 handler devpointer 2 2探测中断 例子 cpm interrupt init 函数中 arch ppc 8xx io commproc c Installourownerrorhandler cpm install handler CPMVEC ERROR cpm error interrupt NULL 取消中断 取消SIU中断 do free irq intirq void dev id 例 do free irq SIU IRQ3 devpointer 取消CPM中断cpm free handler intvec 例 cpm free handler CPMVEC ERROR 2 2探测中断 中断处理程序任务 响应中断查看中断状态寄存器 判断中断源根据中断源进行相应处理 3等待队列 概述 使用时机请求暂不可用的资源版本相关 linux wait h 2 4版以前使用结构体wait queue2 4版使用结构体wait queue head t 3等待队列 主要函数 kernel sched c sleep on wait queue head t q interruptible sleep on wait queue head t q linux sched h wake up wait queue head t q wake up interruptible wait queue head t q inclued linux wait h DECLARE wait queue head name DECLARE waitqueue name tsk add wait queue wait queue head t head wait queue t new remove wait queue wait queue head t head wait queue t old 3等待队列 使用实例 情景 内核中有一块内存 在写时发现满了首先在程序开始定义全局变量strutwait queue head twqh structwait queue twq 或者使用宏DECLARE WAIT QUEUE HEAD wqh DECLARE WAITQUEUE wq current 在write函数中 while is full interruptible sleep on 3等待队列 使用实例 续 write to buffer is empty 0 在read函数中 if is empty read from buffer if full 0 wake up interruptible 4定时处理 概述 数据结构include linux timer hstructtimer list structtimer list next structtimer list prev unsignedlongexpires unsignedlongdata void function unsignedloing 4定时处理 主要函数 初始化timervoidinit timer structtimer list timer 添加timervoidadd timer structtimer list timer 删除timervoiddel timer structtimer list timer 4定时处理 使用实例 structtimer listmy timer init timer 4定时处理 等待队列和定时器综合实例 init timer out structtimer listtimer voidtimeout func unsignedlongwho timed out 1 debug Timingout n wake up interruptible wait queue head t who intsleep or timerout wait queue head t wait inttimeout timed out 0 timer data unsignedlong wait timer function timeout func 4定时处理 等待队列和定时器综合实例 timer expires jiffies timeout add timer 5实例分析字符设备驱动程序 源程序 mydriver cmydriver h该程序是一个典型的模块方式字符设备驱动程序该程序包含了中断 上下半部 时钟 等待队列的处理例程其特点在于用时钟中断来模拟硬件中断 5实例分析字符设备驱动程序 函数列表 my init module mydriver init my cleanup module mydriver stop mydriver open mydriver release mydriver timer expiration mydriver interrupt mydriver task mydriver read mydriver write 5实例分析字符设备驱动程序 程序分析 my init module void调用mydriver init my cleanup module void 调用mydriver stop 注册设备if rc unregister chrdev mydriver major mydriver name 取消设备注册If rc unregister chrdev mydriver major mydriver name 5实例分析字符设备驱动程序 mydriver open pinode pfile 增加打开记数mydriver open count 为文件的缓存区分配内存空间mydriver buffer char kmalloc MYDRIVER BUFFERSIZE GEP KERNEL 初始化所分配的内存空间memset mydriver buffer 0 MYDRIVER BUFFERSIZE 申请中断号 ifndefMYDRIVER SIMULATE INTERRUPTrc request irq mydriver irq mydriver interrupt SA SHIRQ mydriver name NULL 初始化定时器init timer 5实例分析字符设备驱动程序 mydriver release pinode pfile 增加释放记数mydriver release count 删除定时器if rc del timer 5实例分析字符设备驱动程序 mydriver timer expiration mydriver data 说明定义MYDRIVER SIMULATE INTERRUPT时才编译 其作用是用定时器来模拟硬件中断增加定时器超时记数mydriver timer count 执行中断处理函数mydriver interupt MYDRIVER IRQ void mydriver data NULL 5实例分析字符设备驱动程序 mydriver interrupt irq dev id fp 增加中断记数mydriver interrup count 设置I O成功标志mydriver final status 0 初始化tasklet 下半部 tasklet init mydriver task data 唤醒等待队列wake up interruptible 5实例分析字符设备驱动程序 mydriver read pfile user buf count poffset 增加读记数mydriver read count 给定时器赋值 并添加定时器mydriver timer function mydriver timer expiration mydriver timer data 0 mydriver timer expires jiffies MYDRIVER IO DURATION HZ add timer 5实例分析字符设备驱动程序 mydriver read pfile user buf count poffset 续 处理异常情况if signal pending current del timer 5实例分析字符设备驱动程序 mydriver write pfile user buf count poffset 增加写记数mydriver write count 拷贝数据到文件缓存区if copy from user mydriver buffer user buf count 给定时器赋值 并添加定时器与read中相同睡眠在等待队列mydriver zz上interruptible sleep on 5实例分析字符设备驱动程序 mydriver write pfile user buf count poffset 续 处理异常情况if signal pending current del timer 5实例分析字符设备驱动程序 思考 如何将此模块方式驱动程序修改为内核方式驱动程序 6实例分析网络设备驱动程序 源程序enet ccommproc hMotorolaMPC8xx以太网驱动在SCCx上实现以太网功能 6实例分析网络设备驱动程序 函数列表 scc enet init scc enet open scc enet start xmit scc enet rx scc enet close scc enet interrupt scc enet get stats scc enet timeout scc enet t 6 1scc enet init 调用路径 init main c start kernel init do basic setup do initcalls fs partitions check c initcall partition setup partion setup drivers block genhd c device init net core dev c net dev init network probe 使用pci probes 初始化数组 其中包含scc enet init 初始化net device结构的各个域 dev init etherdev 0 0 初始化MPC860的parameterram ep scc enet t 6 1scc enet init 初始化MPC860的寄存器immap immap t get IMMR 6 1scc enet init 将函数指针赋给net device结构中相应的入口dev open scc enet open dev hard star xmit scc enet start xmit dev tx timeout scc enet timeout dev watchdog timeo TX TIMEOUT dev stop scc enet close dev get stats scc enet get stats dev set multicast list set multicast list 6 2实例分析网络设备驱动程序 scc enet open 更改dev state域的指示位netif start queue dev 相当于下面的语句clear bit LINK STATE XOFF scc enet close dev 更改dev state域的指示位netif stop queue dev 相当于下面的语句set bit LINK STATE XOFF 6 3scc enet start xmit skb dev 当用户通过enet发送数据时 执行该函数将skb中相应域的值赋给bdp 即cep cur tx 的相应域包长度 bdp cbd datlen skb len 包数据指针 bdp cbd vufaddr pa skb data 保存skb指针cep tx skbuff cep skb cur skb增加统计域中的发送字节数 cep stats tx bytes skb len 将cep skb cur域加一 如果超过TX RING SIZE 则置为0cep skb cur cep skb cur 1 6 3scc enet start xmit skb dev 清理相应数据缓冲区中的内容flush dcache range unsignedlong skb data unsignedlong skb data skb len 锁中断spin lock irq 6 3scc enet start xmit skb dev 设定发送开始时间dep trans start jiffies 调理BD指针 将BD的指针向下一个可用BD 并判断发送缓冲区是否满设置cep cur tx指针cep cur tx cbd t bdp 解锁中断spin unlock irq 6 4scc enet rx dev 当产生RXF中断 即收到帧后 执行获取cep指针cep structscc enet private dev priv 获取bdp指针bdp cep cur rx 检查收到的是否是完整帧更新统计信息为skb申请内存skb dev alloc skb pkt len 4 将skb与设备相关连skb dev dev 6 4scc enet rx dev 在skb中分配pkt len 4长度的空间skb put skb pkt len 4 skbuff h中 将数据拷贝到skb中eht copy and sum skb unsignedchar va bdp cbd bufaddr pkt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年儿童辅导员面试流程与模拟题详解
- 2025年公共关系专员岗位素质测评试题及答案解析
- 2025年安全员面试资料及答案
- 课件不同步显示问题
- 2025年安全员C证考试重点题目解析
- 课件《宝葫芦的秘密》
- 2025年智能物业招聘面试题及解析
- 机电基础知识培训
- 初中语文教学课件运用
- 读懂彼此的心课件
- 小红书运营:小红书账号运营培训课件
- GB/T 40565.3-2021液压传动连接快换接头第3部分:螺纹连接通用型
- 九年级历史下册-复习资料提纲
- FZ/T 01137-2016纺织品荧光增白剂的测定
- 分镜头脚本设计-课件
- 冀教版四年级数学下册小数进位加法说课稿
- 深锥沉降槽地面倒装工法
- (精选word)2019《普速铁路线路修理规则》
- 《信念永恒》(朗诵稿)
- 瑞吉欧活动-人群课件
- 大学生生命教育与心理危机应对
评论
0/150
提交评论