i2c驱动

一、

修改设备树,并且在模块入口函数里面注册i2c驱动,也就是注册struct i2c_driver类型的结构体,在里面实现Probe,remove,of_match_table(设备树匹配),id_table(传统匹配),.driver即可。这里有个问题就是,必须of_match_table和id_table都要实现,即使id_table是空的也可以,但是必须实现(不明白)。
在设备树下面添加节点,一定要添加到i2c节点之下,这样注册的struct i2c_driver类型的结构体,才能成功的匹配到节点。(经过实验,不放到i2c节点之下不行)

二、

当probe函数匹配到之后,参数里面有一个client,这个client里面包含了设备树的节点中的reg参数,默认这个reg参数为client的addr,也就是设备地址,设备树里的compatible会进行匹配,然后client里的i2c_transfer(client->adapter, &msg, 1);用到,所以要在probe函数里面将client设置为结构体的私有变量,以便其它函数访问。

三、

在对AP321c进行读取数据之前,要对配置寄存器进行配置,一般配置为0x03.要注意使能三项功能之后,读取三项数据要间隔112.5ms以上。提取ap3216c的数据时要注意,数据都超过了八位,注意对数据的存储变量进行改变,需要16位的unsigend short类型。
四、在读取数据时,利用i2c_transfer(client->adapter, &msg, 1);函数进行发送指令,其中msg是发送的信息,需要具体实现,1是具体发送的几条信息。
msg里面需要实现四项,1:从机地址__u16 addr;2:__u16 flags;标志也就是发送的是读数据命令还是写数据命令3:__u16 len;发送这个数据长度4:__u8 *buf;发送的消息数据。总而言之,2c_transfer(client->adapter, &msg, 1);就是用来与设备通信的,只要实现msg即可。

i2c大致协议:

分为读时序和写时序
1.读:发送两条消息,第一条是发送要读取的寄存器地址(数据那一项),以及设备地址还有,数据长度,和写标志。第二条发送写入寄存器的数据,设备地址,读标志和数据长度。
2.写:写发送一条信息,将寄存器地址和数据信息合并到一起,都作为数据项,然后有设备地址以及两个加到一起的长度,还有写标志,这样就可以对设备寄存器进行写入

总结

:linux驱动的i2c对设备寄存器的读写要比裸机历程简单,很多时序都在内核里写好了,而且i2c控制器的配置也不用操心,只要写怎么对设备操作就可以了。i2c的设备信息要写在i2c的大节点下,可以被匹配到,才可以进行对i2c的控制。发送信息要比裸机历程简单,只需要填充msg信息结构体就可以了,还有就是i2c_driver结构体要把有设备树的匹配和没设备树的列表都写上,哪怕传统匹配列表里面没有项也可以,否则不行(亲测)。另外,也要关注client,cilent两处要用到,一是如果设备节点reg里面有设备地址,则client可以可以获取到,存在client->addr里面。二就是发送数据时第一个参数要用到client->adpater.,所以在probe时要记得保存client,(probe函数第一个参数就是client),最好是存为私有数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值