- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux下i2c-switch
Linux 下 i2c switch pca9548驱动
作者: 韩大卫 @吉林师范大学
现有的关于 i2c switch 资料非常少。即使阅读完官方的datasheet.也不能写出完全正确的操作。
因为内核中的驱动本身不是那么完善的。还有一些资料是单片机编程的,可惜在linux 上并不能成功执行。
pca954x 系列是一种 i2c switch 芯片,比如 pca9548 可实现8个开关, 进而实现多了8条i2c
通道。
这样可以在有限的i2c 资源上扩展出足够多的接口。解决了在使用 i2c总线容量的问题。
Pca954x 内部只有一个控制寄存器。属于无子地址设备。做I/O 访问时,只需要向0x00 地址处做写
操作即可,这就可实现pca954x 下挂设备 i2c bus 的选路。
但是在现有的pca954x 驱动函数中,没有实现自动对内部控制寄存器进行相应配置,这样的话就需要额
外的写一个附加的配置函数,实现这种功能。
如果没有这种配置函数,只是使用现有的内核代码,那么会出现有一些难以发现的问题,但是还是被我遇到了。
在我看来,这种问题暂且不能算bug,但至少应该去优化,毕竟,如果每次在访问不同的i2c bus 时,
需要我们手动的去操作i2c switch 的开关,这多少会影响执行效率,代码量变大。还有一点,
我们自己编写的配置函数,是严重依赖于硬件的,即我们的开关位置打开的位置需要自己判断,
在代码上固定写出, 可移植性差。稍后可以在我的代码中看到这种缺陷。
基于以上原因, 我认为pca954x 的驱动应该修改。有时间的话我会整理出自己的代码,融入到内核代
码中去,再提供出API 供大家使用。
I2C 1 地址 0x71,0x72,0x73 上都是pca9548 , 每个pca9548上 挂了 8 个 千兆以太网光模块
sfp。 这样 我们系统上就可以同时挂载 24 个 千兆以太网光模块sfp。
I2C 0 地址 0x70 也是pca9548, 挂了2个万兆以太网光模块XFP,还有3个温度传感器TMP411.
*********** ***************
下面的内容是i2c bus 选路函数。之后是从内核代码入手的分析过程,以证明我的判断,阅读起来肯定是
有些难度,因为驱动的工作本身亦如此。如果不是从事嵌入式linux驱动的,就不必深究。
阅读本文前提是在linux 的用户层和内核层要有所了解,请参考其他资料。
*********** ************************
如果需要完整的代码,请联系我:handawei@
转载请务必表明出处。
******* ****************************
// 这是需要我们自己添加的函数。使用它来控制 i2c bus 的选路。
// 0x70 在 i2c 0上 , 0x71 0x72 0x73 在 i2c 1 上。
// 如果是操作的 i2c bus 是/dev/i2c-10 ,程序根据 10 来判断i2c bus 的选路。
// /dev/i2c-2 到 /dev/i2c-9 属于 0x70 的pca9548
// /dev/i2c-10 到 /dev/i2c-17 属于 0x71 的pca9548
// /dev/i2c-18 到 /dev/i2c-25 属于0x72 的pca9548
// /dev/i2c-26 到 /dev/i2c-33 属于 0x73 的pca9548
inline int i2c_bus_chan_enable(char* argv,int flag){
int ret,tmp;
unsigned char val = 0;
unsigned short addr;
char *s = argv;
while(*s++ != - *s);
if(*s)
ret = atoi(s);
if(ret 10 ret != 1)
addr = 0x70;
else
addr = ret 18 ? 0x71 : (ret 25 ? 0x73 : 0x72);
文档评论(0)