- 2
- 0
- 约5.58千字
- 约 5页
- 2017-03-03 发布于湖北
- 举报
手把手教你写Linux I2C设备驱动
??? Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片、音视频采集芯片、音视频输出芯片、EEROM芯片、AD/DA转换芯片等等。
??? Linux I2C驱动涉及的知识点还是挺多的,主要分为Linux I2C的总线驱动(I2C BUS Driver)和设备驱动(I2C Clients Driver),本文主要关注如何快速地完成一个具体的I2C设备驱动(I2C Clients Driver)。关于Linux I2C驱动的整体架构、核心原理等可以在网上搜索其他相关文章学习。
??? 本文主要参考了Linux内核源码目录下的 ./Documentation/i2c/writing-clients 文档。以手头的一款视频采集芯片TVP5158为驱动目标,编写Linux I2C设备驱动。
1.???i2c_driver结构体对象?????
??? 每一个I2C设备驱动,必须首先创造一个i2c_driver结构体对象,该结构体包含了I2C设备探测和注销的一些基本方法和信息,示例如下:
static?struct?i2c_driver?tvp5158_i2c_driver?=?{ ?
????????.driver?=?{ ?
????????????.name?=?tvp5158_i2c_driver, ?
????????}, ??
????????.attach_adapter?=?tvp5158_attach_adapter, ?
????????.detach_client??=?tvp5158_detach_client, ?
????????.command????????=?NULL, ?
}; ?
??? 其中,name字段标识本驱动的名称(不要超过31个字符),attach_adapter和detach_client字段为函数指针,这两个函数在I2C设备注册的时候会自动调用,需要自己实现这两个函数,后面将详细讲述。
2.???i2c_client 结构体对象
??? 上面定义的i2c_driver对象,抽象为一个i2c的驱动模型,提供对i2C设备的探测和注销方法,而i2c_client结构体则是代表着一个具体的i2c设备,该结构体有一个data指针,可以指向任何私有的设备数据,在复杂点的驱动中可能会用到。示例如下:???
struct?tvp5158_obj{?????? ?
????struct?i2c_client?client;?????? ?
????int?users;?//?how?many?users?using?the?driver?? ?
}; ?
?
struct?tvp5158_obj*?g_tvp5158_obj;??
??? 其中,users为示例,用户可以自己在tvp5158_obj这个结构体里面添加感兴趣的字段,但是i2c_client字段不可少。具体用法后面再详细讲。
3.?? 设备注册及探测功能
??? 这一步很关键,按照标准的要求来写,则Linux系统会自动调用相关的代码去探测你的I2C设备,并且添加到系统的I2C设备列表中以供后面访问。
??? 我们知道,每一个I2C设备芯片,都通过硬件连接设定好了该设备的I2C设备地址。因此,I2C设备的探测一般是靠设备地址来完成的。那么,首先要在驱动代码中声明你要探测的I2C设备地址列表,以及一个宏。示例如下:
static?unsigned?short?normal_i2c[]?=?{ ?
????????0xbc??1, ?
????????0xbe??1, ?
????????I2C_CLIENT_END ?
}; ?
I2C_CLIENT_INSMOD; ?
??? normal_i2c 数组包含了你需要探测的I2C设备地址列表,并且必须以I2C_CLIENT_END作为结尾,注意,上述代码中的0xbc和0xbe是我在硬件上为我的tvp5158分配的地址,硬件上我支持通过跳线将该地址设置为 0xbc 或者 0xbe,所以把这两个地址均写入到探测列表中,让系统进行探测。如果你的I2C设备的地址是固定的,那么,这里可以只写你自己的I2C设备地址,注意必须向右移位1。
??? 宏 I2C_CLIENT_INSMOD 的作用网上有许多文章进行了详细的讲解,这里我就不详细描述了,记得加上就行,我们重点关注实现。
??? 下一步就应该编写第1步中的两个回调函数,一个用于注册设备,一个用于注销设备。探测函数示例如下:
static?int?tvp5158_attach_adapt
您可能关注的文档
- 批量删除Word文件中的图文框.doc
- 批量生成指定名称的工作表.doc
- 批量缩小照片 两个方法.doc
- 批量修改mp3文件中的ID3以及批量删除mp3自带封面.doc
- 批判性思维(13第四讲反思).ppt
- 抢答器调试).ppt
- 撬装站谈判宣传演示资料.ppt
- 拳皇97人物绝对电脑键盘出招表(带图).doc
- 撒谎微表情的分析及运用4.ppt
- 扫描仪6125安装和设置.ppt
- 全过程工程管理造价咨询工程监理项目服务方案投标方案(技术部分).doc
- 招标代理服务投标技术服务方案(技术方案).doc
- AI大模型与AIGC技术在公安领域的应用解决方案(99页 PPT).pptx
- 工业4.0智能制造数字工厂规划方案.pptx
- 树立社会主义核心价值观.docx
- 三年(2023-2025)中考历史真题分类汇编(全国)专题21 科技文化与社会生活(解析版).docx
- 2025年中考道德与法治真题完全解读(吉林卷).pdf
- 2025年中考道德与法治真题完全解读(安徽卷).pdf
- 三年(2023-2025)中考历史真题分类汇编(全国)专题14 人民解放战争(解析版).pdf
- 三年(2023-2025)广东中考历史真题分类汇编:专题03 中国近代史(八年级上册)(解析版).docx
最近下载
- 巴西饶坚赞《山法了义海论》思想探析.docx VIP
- 啊我永远失去了你bersempreioti选自清教徒Ipuritani原版调钢琴伴奏谱五线谱正谱伴奏音频.pdf VIP
- 浙江省温州市2023-2024学年七年级上学期期末考试语文试卷(含答案).doc VIP
- 人教版六年级上册数学期末测试卷可打印.docx VIP
- (期末考点培优)专题10 短文填空(含答案解析)八年级英语下册期末复习考点培优专项冀教版.docx VIP
- 复杂剖宫产手术专家共识(2024).pdf VIP
- (冀教版)—六年级英语上册期末测试卷.doc VIP
- GB50275-2010风机、压缩机、泵安装工程施工及验收规范.docx VIP
- 江西省赣州市文清外国语学校2024-2025学年高三下学期联考押题卷物理试题试卷含解析.doc VIP
- 铁路工程测量:控制测量PPT教学课件.pptx
原创力文档

文档评论(0)