chap6-1嵌入式Linux驱动程序开发-精选(公开课件).ppt

chap6-1嵌入式Linux驱动程序开发-精选(公开课件).ppt

  1. 1、本文档共67页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 嵌入式Linux驱动程序开发 倪福川 6.1 嵌入式Linux的设备管理 块设备/字符设备 块设备:仅支持面向块的I/O操作,所有I/O操作都通过在内核地址空间中的I/O缓冲区进行,可以支持随机存取的功能。文件系统通常都建立在块设备上。 字符设备:支持面向字符的I/O操作,不经过系统的快速缓存,要负责管理自己的缓冲区结构。字符设备接口只支持顺序存取的功能,一般不能进行任意长度的I/O请求,而是限制I/O请求的长度必须是设备要求的基本块长的倍数。 处理器与设备间数据交换方式 查询方式、 中断方式 直接内存存取(DMA)方式。 1.查询方式 设备驱动程序通过设备的I/O端口空间,以及存储器空间完成数据的交换。 利用这些地址空间,驱动程序可以向外设发送指定的操作指令。 驱动程序在提交命令之后,开始查询设备的状态寄存器,当状态寄存器表明操作完成时,驱动程序可继续后续处理。 优点:硬件开销小,使用起来比较简单。 缺点:CPU要不断地查询外设的状态,当外设未准备好时,就只能循环等待,不能执行其他程序,这样就浪费了CPU的大量时间,降低了处理器的利用率。 中断响应 能够向CPU发出中断请求的设备或事件称为中断源。中断源向CPU发出中断请求,若优先级别最高,则CPU在满足一定的条件时,可中断当前程序的运行,保护好被中断的主程序的断点及现场信息,然后根据中断源提供的信息,找到中断服务子程序的入口地址,转去执行新的程序段,这就是中断响应。 CPU响应中断是有条件的,如内部允许中断、中断未被屏蔽、当前指令执行完等。 CPU响应中断以后,就会中止当前的程序,转去执行一个中断服务子程序,以完成为相应设备的服务。 设备驱动程序的概念 Linux设备驱动程序 Linux设备驱动程序 驱动程序结构 驱动程序结构 字符型设备驱动程序入口点: ioctl入口点。执行读、写之外的操作。 select入口点。检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用select入口点。 阻塞 6.2 设备驱动程序的开发过程 6.2嵌入式Linux设备驱动的开发流程: 模块化驱动程序设计 模块化驱动程序设计 设备注册和初始化 设备注册和初始化 中断管理 中断管理 设备驱动开发的基本函数 设备驱动开发的基本函数 定时机制 加载和卸载驱动程序 加载和卸载驱动程序 6.3 LED驱动程序设计 LED接口设计 LED驱动程序代码分析 加载运行LED驱动程序 6.4 按键驱动程序设计 S3C2410X中断控制器 S3C2410X中断接口函数 键盘驱动代码设计 按键测试程序的实现 5.文件系统接口和字符设备定义 static struct file_operations buttons_fops = { owner: THIS_MODULE, ioctl: buttons_ioctl, poll: buttons_select, read: buttons_read, }; static devfs_handle_t devfs_handle; 6.系统入口函数 /*按键初始化*/ static int __init buttons_init(void) { int ret; ready = 0; /*注册按键设备*/ ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME, buttons_fops); if (ret 0) { printk(DEVICE_NAME cant register major number\n); return ret; } ret = request_irqs();/*申请中断资源*/ if (ret) { unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME); printk(DEVICE_NAME cant request irqs\n); return ret; } /*注册devfs,从而可以使用devfs文件系统*/ devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT,BUTTON_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR,buttons_fops, NULL); return 0; } static void __exit buttons_exit(void) { devfs_unregister(devfs_handle); free_irqs();

文档评论(0)

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

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

1亿VIP精品文档

相关文档