课件chap6-1 嵌入式Linux驱动程序开发.ppt

  1. 1、本文档共67页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
设备驱动的初始化函数主要完成功能 (1)对驱动程序管理的硬件进行必要的初始化。 对硬件寄存器进行设置。比如,设置中断掩码,设置串口的工作方式、并口的数据方向等。 (2)初始化设备驱动相关的参数。 一般说来,每个设备都要定义一个设备变量,用以保存设备相关的参数。在这一步骤里对设备变量中的项进行初始化。 (3)在内核注册设备。 调用register_chrdev()函数来注册设备。 (4)注册中断。 如果设备需要IRQ支持,则要使用request_irq()函数注册中断。 优选文档 * 设备驱动的初始化函数主要完成功能 (5)其他初始化工作。 初始化部分一般还负责给设备驱动程序申请包括内存、时钟、I/O端口等在内的系统资源,这些资源也可以在open子程序或者其他地方申请。这些资源不用时,应该释放,以利于资源的共享。 若驱动程序是内核的一部分,初始化函数则要按如下方式声明: int __init chr_driver_init(void); 其中__init是必不可少的,在系统启动时会由内核调用chr_driver_init,完成驱动程序的初始化。 当驱动程序是以模块的形式编写时,则要按照如下方式声明: int init_module(void) 当运行后面介绍的insmod命令插入模块时,会调用init_module函数完成初始化工作。 优选文档 * 中断管理 设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。它们在linux/sched.h中的定义如下: int request_irq( unsigned int irq, void (*handler)(int irq,void dev_id,struct pt_regs *regs), unsigned long flags, const char *device, void *dev_id ); void free_irq(unsigned int irq, void *dev_id); 通常从request_irq函数返回的值为0时,表示申请成功;负值表示出现错误。 ? irq表示所要申请的硬件中断号。 ? handler为向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数irq为中断号,dev_id为申请时告诉系统的设备标识,regs为中断发生时寄存器内容。 ? device为设备名,将会出现在/proc/interrupts文件里。 ? flag是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是决定中断处理程序是快速处理程序(flag里设置了SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT)。 下面的代码将在SBC-2410X的Linux中注册外部中断2。 eint_irq = IRQ_EINT2; set_external_irq (eint_irq, EXT_FALLING_EDGE,GPIO_PULLUP_DIS); ret_val = request_irq(eint_irq,eint2_handler, “S3C2410X eint2”,0); if(ret_val 0){ return ret_val; } 用来打开和关闭中断的函数如下: #define cli() _asm_ _volatile_ (cli::) #define sli() _asm_ _volatile_ (sli::) 优选文档 * 中断管理 设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。在linux/sched.h中定义: int request_irq( unsigned int irq, /*所要申请的硬件中断号*/ void (*handler)(int irq,void dev_id,struct pt_regs *regs), unsigned long flags, /*申请时的选项 SA_INTERRUPT快速处理程序*/ const char *device, /*设备名,出现在/proc/interrupts文件*/ void *dev_id ); void free_irq(unsigned int irq, void *dev_id); 通常从request_irq函数返回的值为0时,表示申请成功;负值表示出现错误。 ? handler为向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数irq为中断号,dev_id为申请时告诉系统的设备标识,regs为中断发生时寄存器内容。 优选文档 * 设备驱动开发的基本函数 1.I/O口函数 无论驱动程序多么复杂,归根结底,无非还是向某个端口或

文档评论(0)

liuxiaoyu99 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档