版本:sdk-xgs-robo-6.3.8
平台:BCM53344
应用:控制POE芯片
描述:POE控制芯片使用PD69200,使用i2c与其通信,每次需要发送15字节数据,并接受15字节的返回数据。

1.更改函数
打开文件sdk-xgs-robo-6.3.8/src/soc/i2c/smbus.c
更改如下:
int
soc_i2c_block_read(int unit, i2c_saddr_t saddr,uint8 com, uint8* count, uint8* data)
{//... 省略 ...I2C_LOCK(unit);
// 53344芯片在定义了BCM_CMICM_SUPPORT,所以会运行下面的代码。
#ifdef BCM_CMICM_SUPPORTif(soc_feature(unit, soc_feature_cmicm) && !SOC_IS_SAND(unit)) {
retry:  //这个函数是smbus协议的命令格式。与I2C有些区别。注释掉发送地址和com的地方。  //直接读取数据
//        rval = SOC_I2C_TX_ADDR(saddr);
//        WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
//        rval = com;
//        WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);rval = SOC_I2C_RX_ADDR(saddr);soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr, &rval, MASTER_WR_STATUSf, 1); /* Last Byte */WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);//更改要接受的数据个数。默认是0,因此会读取0个数据。    //查看芯片手册,需要将CMIC_I2CM_SMBus_Master_Command寄存器的最低8位(RD_BYTE_COUNT),设置为要读取的字节个数。
//        rval = 0;rval = *count;soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_COMMANDr, &rval, SMBUS_PROTOCOLf, SMBUS_BLOCK_READ);WRITE_CMIC_I2CM_SMBUS_MASTER_COMMANDr(unit,rval);rv = smbus_start_wait(unit);if (rv == SOC_E_NONE) {    //直接读取即可,这一部分也不需要,smbus协议才需要
//            READ_CMIC_I2CM_SMBUS_MASTER_DATA_READr(unit, &rval);
//            *count = (uint8) (rval & 0xff);ptr = data;for( i = 0; i < *count; i++, ptr++) {READ_CMIC_I2CM_SMBUS_MASTER_DATA_READr(unit, &rval);*ptr = (uint8) (rval & 0xff);}} else if (rt-- > 0) {goto retry;} else {rv = SOC_E_TIMEOUT;}} else  //后面的不运行
#endif// ... 省略 ...}
//同理,write函数也进行注释
int
soc_i2c_block_write(int unit, i2c_saddr_t saddr,uint8 com, uint8 count, uint8* data)
{int i,rv = SOC_E_NONE;uint8* ptr = NULL;
#ifdef BCM_CMICM_SUPPORTuint32 rval;int rt = 5;
#endifsoc_cm_debug(DK_I2C, "i2c%d: soc_i2c_block_write %02x bytes @ %02x - %02x\n", unit, count, saddr, com);#ifdef BCM_CALADAN3_SVKif (unit == -1) {return cpu_i2c_block_write(unit, saddr, com, data, count);}
#endifI2C_LOCK(unit);
#ifdef BCM_CMICM_SUPPORTif(soc_feature(unit, soc_feature_cmicm) && !SOC_IS_SAND(unit)) {
retry:rval = SOC_I2C_TX_ADDR(saddr);WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
//        rval = com;
//        WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
//        rval = count;
//        WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
ptr = data;for( i = 0; i < (int) (count - 1); i++, ptr++) {rval = (uint32) *ptr;WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);}rval = (uint32) *ptr;soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr, &rval, MASTER_WR_STATUSf, 1); /* Last Byte */WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);rval = 0;soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_COMMANDr, &rval, SMBUS_PROTOCOLf, SMBUS_BLOCK_WRITE);WRITE_CMIC_I2CM_SMBUS_MASTER_COMMANDr(unit,rval);rv = smbus_start_wait(unit);if (rv != SOC_E_NONE && rt-- > 0) {goto retry;} else if (rt < 0) {rv = SOC_E_TIMEOUT;}} else
#endif

2.导出全局符号打开文件 sdk/systems/linux/kernel/modules/include/bcmx_export.h最后添加:  #include <soc/i2c.h>  EXPORT_SYMBOL(soc_i2c_is_attached);  EXPORT_SYMBOL(soc_i2c_attach);  EXPORT_SYMBOL(soc_i2c_block_read);  EXPORT_SYMBOL(soc_i2c_block_write);

之后从新编译SDK即可。

BCM_I2C函数更改相关推荐

  1. R语言sys方法:sys.info函数获取系统和用户信息、sys.localeConv函数获取当前区域中的数字和货币表示的详细信息、sys.setFileTime函数更改文件的时间

    R语言sys方法:sys.info函数获取系统和用户信息.sys.localeConv函数获取当前区域中的数字和货币表示的详细信息.sys.setFileTime函数更改文件的时间 目录

  2. R语言ggplot2可视化:修改已经创建的ggplot2可视化对象进行自定义的修改、使用ggplot_build函数更改已经创建的可视化结果

    R语言ggplot2可视化:修改已经创建的ggplot2可视化对象进行自定义的修改.使用ggplot_build函数更改已经创建的可视化结果 目录

  3. python函数用于创建对象_Python-创建类并使用函数更改其对象值

    有人建议我把这个重新贴出来以便更清楚. 上完一节课,剩下的就不上这节课了.欢迎任何指导.我已经得出了这个问题的一部分,在那里我坚持要保持简短.我还附上了我的工作. 在下面的工作中,我希望能够创建一个包 ...

  4. JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class

    if 函数的实现步骤: function 名字() 指定id , 指定开关(display: none or block) if else 构成逻辑 控制开关 决定在哪里安置一个灯泡, 指定一个id给 ...

  5. python kivy kv模板调用_Python-Kivy:使用另一个类中的函数更改和保留kv文件值

    我目前正试图改变一个.kv文件的值(如微调器小部件的文本),同时改变一个屏幕-基于我以前从屏幕上得到的值.这就是我的设置的样子(简化): mail = '' name = '' gender = '' ...

  6. linux C之alarm函数(更改)

    http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seconds指定 ...

  7. 函数声明末尾的“ const”是什么意思? [重复]

    本文翻译自:What is meant with "const" at end of function declaration? [duplicate] This question ...

  8. softmax函数_数学证明深度学习激活函数从Softmax到Sparsemax

    Sparsemax封闭形式解及其损失函数的推导 本文目标是三个方面.第一部分讨论了sparsemax背后的动机及其与softmax的关系,首次介绍了该激活函数的原始研究论文摘要,以及使用sparsem ...

  9. 孙鑫VC++课程中用到的函数一览

    在许多VC教科书中这些函数/方法.结构.宏等比较常见,觉得比较重要,虽然不用记住,但应该知道,所以列举出来,没写出参数和返回值情况,编写程序时还需仔细查看MSDN文档.本人英语水平较差再加上自己的一些 ...

最新文章

  1. Redis安装整理(window平台) +php扩展redis
  2. 【连载】优秀程序员的45个习惯之42——允许大家自己想办法
  3. 'eval' is null or not an object
  4. json 是个什么东西?
  5. matlab 定义string_MATLAB开发自动驾驶第十课-创建用于加载自定义地面真值数据源的类...
  6. 苹果Mac操作系统下怎么显示隐藏文件
  7. TVS管(瞬态电压抑制二极管)好坏 简单检测方法
  8. Mac 环境变量配置
  9. 中国连计算机硬盘都无法生产吗,中国仍无能力制造出电脑中的硬盘
  10. Docker JFrog Artifactory 7.27.10 maven私服(IDEA 实战篇01) linux
  11. mysql在同一台机器上实现主从_MySQL 5.7主从搭建(同一台机器)
  12. 机器学习的gridSearchCV调参
  13. ssh 免密_大数据时代:SSH如何免密码登录?
  14. 2021新版成语接龙小程序搭建详细教程
  15. ENVI哨兵一号数据处理
  16. 【EXLIBRIS】随笔记 008
  17. C#中的InputBox
  18. 记录帖-电脑版微信多开
  19. 【Web3 系列开发教程——创建你的第一个 NFT(9)】如何在手机钱包里查看你的 NFT
  20. 木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖

热门文章

  1. 减治法解决约瑟夫斯问题(JAVA)
  2. Oracle创建、删除、备份表
  3. The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized 偶然遇到的mysql时区问题
  4. java 执行机制_Java类的执行机制
  5. java jni技术_JNI技术简介
  6. 机器学习 监督学习论文_NeurIPS 2020最佳机器学习论文奖
  7. java amf3_Java AMF3 反序列化漏洞分析
  8. python 简历处理_按照这个方式学Python,老板把垃圾桶里的简历舔回来:月薪50000...
  9. python使用函数目的_Python函数的概念和使用
  10. mysql同步数据到另一张表_mysql:Otter跨机房数据同步(单向)