Linux系統驱动概述课件.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* Linux下的中断驱动 中断概念 基本定义:中断,异常,中断源,中断嵌套,中断优先级等 中断向量:标识中断的无符号数,组成中断向量表。ARM有7个: 复位:当复位电平有效时产生。程序跳转到复位异常处理程序处 未定义指令:遇到不能处理的指令时产生 软件中断:执行SWI指令产生。用于实现系统调用功能 指令预取中止:预取指令的地址不存在,或该地址不允许当前指令访问,发出中止信号,但指令被执行时产生异常 数据中止:数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常 IRQ:标准中断请求 FIQ:快速中断请求 Linux下的中断驱动 ARM的中断过程 中断的进入 将下一条指令的地址存入相应连接寄存器LR 将CPSR复制到相应的SPSR中 根据中断/异常类型,强制设置CPSR的运行模式位 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序 从中断返回 将连接寄存器LR的值减去相应的偏移量后送到PC中 将SPSR复制回CPSR中 如果进入时设置了中断禁止位,那么清除该标志 中断返回 注意:给IRQ脚中断信号前,必须先打开该中断的使能寄存器和正确设置对应的屏蔽寄存器。当这两个寄存器都设置正确了,中断产生了,CPU保存当前程序运行环境,跳到中断入口,ARM芯片一般是0x18地址处。设置好中断向量,中断向量一般是个跳转语句,跳到正式的中断处理过程,在这里可以关闭所有中断,清中断,处理等等,然后退出。某些处理器一定要清中断,否则下次再给中断信号时就没有反应了。 中断相关函数说明 int set_external_irq(int irq, int edge, int pullup); 功能:设置中断线相应的属性,完成注册中断前的设置 参数: irq:需要设置的中断号。可以自定义数值,也可以直接使用kernel/arch/arm/kernel/irqs.h中预定义的值。例如: IRQ_EINT0, IRQ_EINT4_7,IRQ_DMA0等 edge:中断触发方式,可以是EXT_LOWLEVEL,EXT_HIGHLEVEL,EXT_FALLING_EDGE,EXT_RISING_EDGE,EXT_BOTH_EDGES pullup:是否拉高。可以设为GPIO_PULLUP_EN和 GPIO_PULLUP_DIS方式。当设为GPIO_PULLUP_EN时,在GPIO没有输入输出时,线路保持高电平。否则始终保持低电平。一般需要设置成拉高状态 void enable_irq(unsigned int irq); 参数: irq:set_external_irq中设置的中断线号 功能:使能所选的中断线 void disable_irq(unsigned int irq); 参数: 功能:使得所选择的中断线无效 和enable_irq配对使用,实现相反功能 中断相关函数说明 int request_irq(unsigned int irq, void (*handler)(int,void *,struct pt_regs *), unsigned long irq_flags,const char * devname, void * dev_id); 功能:定位中断源,使能中断线和IRQ处理函数 irq:外设所使用的中断号 handler函数指针:设备驱动程序所实现的ISR函数 irqflags:中断请求类型标志,可以是下列值的“或”: SA_SHIRQ:中断是共享的。此时要求参数dev_id必须有效,不能为NULL; IRQ号参数irq不能大于NR_IRQS;且handler指针不能为NULL。否则将出现错误号为-22的参数无效错,无法注册中断服务程序 SA_INTERRUPT:当处理中断时,其他局部中断不可用 SA_SAMPLE_RANDOM:中断可以作为随机计量单位熵使用 devname指针:设备名字字符串 dev_id:指向全局唯一的设备标识ID,void类型的指针,供驱动程序自行解释 中断相关函数说明 void free_irq(unsigned int irq, void *dev_id); 功能:释放和中断号绑定的中断处理函数 注意:必须和register_irq()配对使用,它的参数必须和register_irq()里注册的参数一致。dev_id不能是中断服务程序地址,否则执行rmmod删除该将出现错误,必须重启系统才能再次insmod该模块 示例 功能描述 编写简单的虚拟硬件驱动程序并进行调试 参考驱动代码框架如下,其中的demo_read,demo_write函数完成驱动的读写接口功能,do_write函数实现将用户写入的数据逆序排列,通过读取

文档评论(0)

qianqiana + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5132241303000003

1亿VIP精品文档

相关文档