在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2088|回复: 1

[原创] 【从0教学嵌入式Linux】第二十四集(下)

[复制链接]
发表于 2016-6-20 15:09:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

24课:I2C驱动程序及应用程序开发(二)


(三)I2C子系统下的字符驱动

前面我们说了如何I2C用户模式驱动,这种驱动基于I2C子系统,但是他对于应用程序开发人员的要求较高,需要应用程序开发人员了解硬件的一些东西,比如时序、地址等等,而多数时候应用程序开发人员是按照操作文键的方法操作设备,所以我们更希望用一些更简单的接口去访问,也就是我们今天的内容——基于I2C子系统的字符驱动。

I2C子系统的代码分为三部分:

Host:主机控制器驱动

Device:设备驱动代码

Core:核心代码,提供设备与控制器的接口

一、主机控制器驱动

Linux下主机控制器驱动,大多数是BSP提供的,这里不多说,主要说一下他是干什么的。I2C主机控制器在内核里又叫适配器,用结构i2c_adapter描述

图片11.jpg

其中master_xfer就是我们给设备提供的接口,这部分内容按照芯片手册中寄存器的操作实现数据的收发。

最终我们将i2c_adapter注册到系统中使用如下函数:

int i2c_add_numbered_adapter(struct i2c_adapter*);

二、核心代码

刚才我们介绍的函数全是核心代码提供,它主要是提供标准的统一的接口。

三、设备代码

图片12.jpg

基于I2C
的字符驱动的编写首先我们需要了解几个特定的结构。

1.i2c_bus_type

i2c总线结构定义了一些总线相关的方法,这里我们关心的是i2c_driveri2c_client的配备规则,为什么匹配呢,i2c_client携带硬件信息,而i2c_driver只负责操作设备,而不管操作的是哪个设备,他需要的硬件信息有i2c_client提供,所以需要i2c_clienti2c_driver协同操作,而一个系统中i2c_driveri2c_client都可能有多个,如何得到自己的另一半就是我们所说的匹配规则,i2c_bus_type匹配规则如下:

图片13.jpg

我们发现i2c总线的匹配规则是idname两种,id优先级高。

2.板级结构

图片14.jpg

板子上没有一个I2C的设备,我们就要注册一个这样的结构体到内核里面,这部分代码一般添加在平台代码里面,注册函数如下:

i2c_register_board_info(int busnum,struct i2c_board_info const *info,unsigned n)

busnum现在很多CPU有多条I2C总线,这个参数表示第几条总线

Info是一个结构体数据,表示我们要注册的I2C设备

n表示我们注册了几个I2C设备

通过上面函数就能把设备注册到系统中,结构如图:

图片15.jpg

3.I2c_client

这个结构我们不需要操作,是操作系统即核心代码自动完成,这个过程其实是在注册i2c_adapter的时候完成的,即在函数i2c_add_numbered_adapter中完成,最终i2c_client携带着i2c_board_infoi2c_adapter的信息。

4.i2c_driver

这部分代码主要负责注册i2c_driver和匹配相应的i2c_clientI2c_driver定义如下:

图片16.jpg

注册函数如下:

int i2c_add_driver(struct i2c_driver *driver)

这个函数负责注册i2c_driver并匹配到了对应的i2c_clientprobe函数被执行,并且i2c_client被拟参数的形式传递过来。我们可以通过i2c_client提供的硬件信息和操作接口操作我们想要的设备

5.数据传输

数据传输结构:

图片17.jpg

消息的封装与上节用户模式驱动相似,封装好消息使用如下函数提交给核心代码,最终通过控制器驱动发送给具体的设备。

int i2c_transfer(struct i2c_adapter *adap,struct i2c_msg *msgs,int num);

adap适配器,由client->adapter获得

msgs 消息

num 消息个数

通过上面内容我们就可以构建我们的基于Linuxi2c子系统的设备驱动了,例程如下:

平台代码添加:

图片18.jpg

驱动代码:

图片19.jpg

图片20.jpg

图片21.jpg

图片22.jpg

(四)S5PV210,具体添加方法:

1.编辑文件kernel/arch/arm/mach-s5pv210/mach-smdkv210.c

图片23.jpg

2.建立设备驱动的基本信息

图片24.jpg

3.CPU带有三条I2C总线,硬件如果链接的是I2C1的话,在i2c_devs1中添加i2c_board_info信息

图片25.jpg

4.这时,我们的I2C设备就会自动挂载到I2C总线上了

发表于 2016-6-24 04:28:02 | 显示全部楼层
经典经典!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 16:21 , Processed in 0.030825 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表