免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8391 | 回复: 0
打印 上一主题 下一主题

I2C/SPI外设驱动基于regmap框架的那点用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-06-04 14:56 |只看该作者 |倒序浏览
这两天有几位职场加油站的码农朋友在问老王基于Linux的SPI外设驱动编写相关的问题,想了下确实还没有开始讲内核的东东,索性就以此为引子展开内核之旅吧,今天的大讲堂就先简单介绍下当前内核里对SPI/I2C外设驱动操作的一套新的API接口regmap吧。虽说是新的,但是其实它的引入已经是在long long ago啦。


1 简介


传统方式:
为了方便,一般的驱动中,读写I2C设备的时候我们肯定需要使用i2c_transfer或者/i2c_smbus_read_word_data这样的底层函数,读写SPI设备我们需要使用spi_message_init/spi_message_add_tail/spi_synch函数。然后我们在写读写接口的时候一般都会基于这些接口上再写一个Wrapper函数,然后通过调用这个Wrapper来读写寄存器。

传统的SPI读函数:
Oh,my god,真的还是有些步骤呢?

而如果使用regmap方式的话,对于以上两种方式我们只需要如下操作:


第三步:直接使用regmap抽象出来的读写接口进行外设读写操作。
通过上面的例子,我们可以发现我们驱动不需要再关心具体属于哪种总线类型而去调用不同的读写API了,直接通过regmap统一调用regmap_read/regmap_write/regmap_bulk_read就行了。

别忙,话说我们知其然,还是要知其所以然嘛,咋们继续。

3.实现细节
代表设备寄存器的配置信息,定义了设备的地址和数据位宽,寄存器总数,缓存类型,读写属性等。初始化regmap之前需要定义好struct regmap_config结构体,然后传递给regmap。这个结构体定义在kernel/include/linux/regmap.h中。

2.Regmap_ops

目前内核支持如下几种缓存类型:
REGCACHE_FLAT:普通数组,最简单的缓存类型,用于寄存器比较少的外设芯片。代码位于regcache-flat.c。

算法就是用的LZO,算法特性:压缩很快,解压不需要额外的内存,压缩比可以自动调节。这里你可以简单理解为在数组的基础上套了一层压缩算法,使得可以节约内存。当设备的寄存器数目中等的时候我们可以使用这种方式。代码位于regcache-lzo.c<span]REGCACHE_RBTREE:红黑树。什么?红黑树,在数据结构课程上面我们貌似听到过这个名词啊,当时只感觉头脑一片浆糊啊。。。对的,你没记错,就是它。它的特性就是索引快,所以当设备寄存器数量比较大,或者对寄存器操作延时要求低时,就可以用这种缓存类型。代码位于regcache-rbtree.c。虽然我们对于它的算法早已抛之九霄云外了或者压根不懂,但是这一点也不妨碍我们对它的使用,只需要如下一行代码就行:

然后剩下算法那点事儿就让OS去做吧,我们先来杯咖啡提提神。
对于regmap_read来说,先判断是否需要bypass当前缓存,如不bypass,则直接从缓存里面取值,调用regcache_read来获取值,否则若需要从硬件上读取,则调用具体协议的读写函数,若是I2C,调用i2c_transfer。写的过程也是大同小异。

上面聊的操作都是基于regmap的封装,而真正进行设备I/O操作的细节都是在这一层。它定义了设备总线上的读写函数,它类似于之前我们对i2c_transfer所做的封装一样。
我们前面使用的regmap_read实际上是调用了如下流程:
提问:那么map->reg_read到底是如何一步步获取到底层的API读写接口的呢?






所以实际在使用regmap_read的时候还是归根到底操作的i2c bus的底层读写接口。



好了,今天的码农大讲堂课就到这了,下课。


欢迎关注老王微信公众号:“嵌入式职场加油站” 查看更多精彩文章。希望能够在一些技术点上为大家抛砖引玉,答疑解惑。你的关注将是激励我坚持创作和分享更多干货技能的源动力。更多技术干货经验技巧会第一时间发布在公众号,欢迎查阅!
技术交流答疑Q群:262047367。单独交流技术也可加个人微信号:wang_ping_66
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP