完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
第24课:I2C驱动程序及应用程序开发(二) (三)I2C子系统下的字符驱动 前面我们说了如何I2C用户模式驱动,这种驱动基于I2C子系统,但是他对于应用程序开发人员的要求较高,需要应用程序开发人员了解硬件的一些东西,比如时序、地址等等,而多数时候应用程序开发人员是按照操作文键的方法操作设备,所以我们更希望用一些更简单的接口去访问,也就是我们今天的内容——基于I2C子系统的字符驱动。 I2C子系统的代码分为三部分: Host:主机控制器驱动 Device:设备驱动代码 Core:核心代码,提供设备与控制器的接口 一、主机控制器驱动 Linux下主机控制器驱动,大多数是BSP提供的,这里不多说,主要说一下他是干什么的。I2C主机控制器在内核里又叫适配器,用结构i2c_adapter描述 其中master_xfer就是我们给设备提供的接口,这部分内容按照芯片手册中寄存器的操作实现数据的收发。 最终我们将i2c_adapter注册到系统中使用如下函数: int i2c_add_numbered_adapter(struct i2c_adapter*); 二、核心代码 刚才我们介绍的函数全是核心代码提供,它主要是提供标准的统一的接口。 三、设备代码 基于I2C 的字符驱动的编写首先我们需要了解几个特定的结构。 1.i2c_bus_type i2c总线结构定义了一些总线相关的方法,这里我们关心的是i2c_driver和i2c_client的配备规则,为什么匹配呢,i2c_client携带硬件信息,而i2c_driver只负责操作设备,而不管操作的是哪个设备,他需要的硬件信息有i2c_client提供,所以需要i2c_client和i2c_driver协同操作,而一个系统中i2c_driver和i2c_client都可能有多个,如何得到自己的另一半就是我们所说的匹配规则,i2c_bus_type匹配规则如下: 我们发现i2c总线的匹配规则是id或name两种,id优先级高。 2.板级结构 板子上没有一个I2C的设备,我们就要注册一个这样的结构体到内核里面,这部分代码一般添加在平台代码里面,注册函数如下: i2c_register_board_info(int busnum,struct i2c_board_info const *info,unsigned n) busnum现在很多CPU有多条I2C总线,这个参数表示第几条总线 Info是一个结构体数据,表示我们要注册的I2C设备 n表示我们注册了几个I2C设备 通过上面函数就能把设备注册到系统中,结构如图: 3.I2c_client 这个结构我们不需要操作,是操作系统即核心代码自动完成,这个过程其实是在注册i2c_adapter的时候完成的,即在函数i2c_add_numbered_adapter中完成,最终i2c_client携带着i2c_board_info和i2c_adapter的信息。 4.i2c_driver 这部分代码主要负责注册i2c_driver和匹配相应的i2c_client。I2c_driver定义如下: 注册函数如下: int i2c_add_driver(struct i2c_driver *driver); 这个函数负责注册i2c_driver并匹配到了对应的i2c_client,probe函数被执行,并且i2c_client被拟参数的形式传递过来。我们可以通过i2c_client提供的硬件信息和操作接口操作我们想要的设备 5.数据传输 数据传输结构: 消息的封装与上节用户模式驱动相似,封装好消息使用如下函数提交给核心代码,最终通过控制器驱动发送给具体的设备。 int i2c_transfer(struct i2c_adapter *adap,struct i2c_msg *msgs,int num); adap适配器,由client->adapter获得 msgs 消息 num 消息个数 通过上面内容我们就可以构建我们的基于Linux下i2c子系统的设备驱动了,例程如下: 平台代码添加: |
|
相关推荐
2 个讨论
|
|
只有小组成员才能发言,加入小组>>
芯灵思SinlinxA33开发板Linux内核workqueue(附实测代码)
11864 浏览 0 评论
芯灵思SinlinxA33开发板Linux内核 tasklet 机制(附实测代码)
12521 浏览 0 评论
芯灵思Sinlinx A33开发板 Linux内核等待队列poll ---阻塞与非阻塞
34797 浏览 0 评论
芯灵思Sinlinx A33开发板Linux中断编程 3-应用程序
34728 浏览 0 评论
38813 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 01:24 , Processed in 0.649419 second(s), Total 73, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号