嵌入式系驱动开发.ppt

  1. 1、本文档共133页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式系驱动开发

注册与注销 注册和注销函数: register_*dev() unregister_*dev() //include/linux/fs.h 所谓注册就是在内核的chrdevs或blkdevs中添加一项。 struct device_struct { const char * name; struct file_operations * fops; }; 相同主设备号的fops元素内容相同。 打开与释放 打开设备: open() 检查与设备有关的错误,如未准备好。 如果是首次打开,则初始化设备。 确定次设备号,根据需要可更新设备的f_op。 如果需要,分配且设置文件中的private_data。 递增设备使用的计数器。 如果只允许一个进程使用设备,则需要设忙标志。 释放设备:release() 递减设备使用的计数器 释放设备文件中的私有数据所占空间 如果是独占设备,则要清除忙标志,使其他进程可以使用 如果是最后一个释放,则关闭设备 设备的读写操作 字符设备: foo_read()和foo_write() 块设备 block_read和block_write()——策略规程,不需要在驱动程序中实现。 通过缓冲区读写,只在数据不在缓冲区时才真正执行数据传输,通过request_fn()完成。 struct blk_dev_struct struct request 设备的控制 ioctl() 一般做法是: 首先差错检查, 然后用一个大的switch语句(可能是内嵌的)来处理所有可能的ioctl命令。 返回: 出错返回-erro 其他情况由用户定义 字符设备驱动程序 数据结构 注册与注销 轮询和中断 对应驱动程序的“三个接口”。 添加一个简单的字符设备 确定主设备号 编写file_operations中的函数以及中断处理函数。 编写初始化函数foo_init() 在chr_dev_init()中添加调用和返回初始化函数的代码。 修改drivers/char/Makefile; 假设我们把所以必要的函数写foo.c中,则在“L_OBJS := tty_io.o n_tty.o console.o \”行把“foo.o”加到其中。 将该设备私有的*.c,*.h复制到目录drivers/char下。 用命令:make clean;make dep;make zImage重新编译内核。 用mknod命令在目录/dev下建立相应主设备号的用于读写的特殊文件 mknod命令:建立设备特殊文件 格式: mknod 文件名 类型 主设备号 次设备号 类型:c或b,代表字符设备或块设备 块设备驱动程序 数据结构 注册与注销 读写请求及其处理 增加一个块设备的方法和字符设备差不多。 块设备不需要编写file_operations结构里的read和write函数,但是也需要read和write在request中调用。 需要有请求处理函数,以及中断处理函数。 驱动源代码 驱动源代码 驱动源代码 驱动源代码 驱动源代码 编译驱动程序 应用程序 编译应用程序 背景知识: Linux设备管理 主要内容 概述 驱动程序基础 中断处理 辅助函数 设备驱动程序 模块编程基础 字符设备 块设备 网络设备 概述 输入输出子系统: 下层:设备驱动程序 上层:设备无关部分 设备管理总体结构示意 用户程序 系统调用接口 文件系统 高速缓存 字符设备 块设备 驱动程序 硬件设备 输入输出系统层次结构 用户进程 设备无关软件 设备驱动程序 设备服务子程序 中断处理程序 硬件 I/O请求 I/O应答 进行I/O调用; 格式化I/O 命名、保护、阻塞、缓冲、分配 建立设备寄存器、检测状态 I/O结束时,唤醒设备服务子程序 执行I/O操作 驱动程序基础——命名空间 并行设备:lp 软盘:fd SCSI盘:sd IDE硬盘:hda1, hda2, hdb等 网络设备:ethn, slipn, pppn等 在写驱动程序的时候,需要给函数名加上选择的前缀来避免任何混淆。如:foo_read(),foo_write()等。 驱动程序基础——内存分配 函数kmalloc() 内存以2的幂大小的块分配 有一个优先级参数 宏kfree()和函数kfree_s() kfree()调用kfree_s(),和free()一样工作 可以直接调用kfree_s(),但是需要知道释放内存块的大小 驱动程

文档评论(0)

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

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

1亿VIP精品文档

相关文档