1. 版本:sdk-xgs-robo-6.3.
  2. 平台:BCM53344
  3. 应用:控制POE芯片

  4. 描述:POE控制芯片使用PD69200,使用i2c与其通信,每次需要发送15字节数据,并接受15字节的返回数据。
  5.  
  6. 1.更改函数
  7. 打开文件sdk-xgs-robo-6.3./src/soc/i2c/smbus.c
  8. 更改如下:
  9. int
  10. soc_i2c_block_read(int unit, i2c_saddr_t saddr,
  11. uint8 com, uint8* count, uint8* data)
  12. {
  13. //... 省略 ...
  14.  
  15. I2C_LOCK(unit);
  16. // 53344芯片在定义了BCM_CMICM_SUPPORT,所以会运行下面的代码。
  17. #ifdef BCM_CMICM_SUPPORT
  18. if(soc_feature(unit, soc_feature_cmicm) && !SOC_IS_SAND(unit)) {
  19. retry:
      //这个函数是smbus协议的命令格式。与I2C有些区别。注释掉发送地址和com的地方。
      //直接读取数据
  20. // rval = SOC_I2C_TX_ADDR(saddr);
  21. // WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  22. // rval = com;
  23. // WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  24. rval = SOC_I2C_RX_ADDR(saddr);
  25. soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr, &rval, MASTER_WR_STATUSf, ); /* Last Byte */
  26. WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  27.     //更改要接受的数据个数。默认是0,因此会读取0个数据。
        //查看芯片手册,需要将CMIC_I2CM_SMBus_Master_Command寄存器的最低8位(RD_BYTE_COUNT),设置为要读取的字节个数。
  28. // rval = 0;
  29. rval = *count;
  30. soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_COMMANDr, &rval, SMBUS_PROTOCOLf, SMBUS_BLOCK_READ);
  31. WRITE_CMIC_I2CM_SMBUS_MASTER_COMMANDr(unit,rval);
  32.  
  33. rv = smbus_start_wait(unit);
  34. if (rv == SOC_E_NONE) {
        //直接读取即可,这一部分也不需要,smbus协议才需要
  35. // READ_CMIC_I2CM_SMBUS_MASTER_DATA_READr(unit, &rval);
  36. // *count = (uint8) (rval & 0xff);
  37. ptr = data;
  38. for( i = ; i < *count; i++, ptr++) {
  39. READ_CMIC_I2CM_SMBUS_MASTER_DATA_READr(unit, &rval);
  40. *ptr = (uint8) (rval & 0xff);
  41. }
  42. } else if (rt-- > ) {
  43. goto retry;
  44. } else {
  45. rv = SOC_E_TIMEOUT;
  46. }
  47. } else  //后面的不运行
  48. #endif
  49.   // ... 省略 ...
    }

  50. //同理,write函数也进行注释
  51. int
  52. soc_i2c_block_write(int unit, i2c_saddr_t saddr,
  53. uint8 com, uint8 count, uint8* data)
  54. {
  55. int i,rv = SOC_E_NONE;
  56. uint8* ptr = NULL;
  57. #ifdef BCM_CMICM_SUPPORT
  58. uint32 rval;
  59. int rt = ;
  60. #endif
  61.  
  62. soc_cm_debug(DK_I2C, "i2c%d: soc_i2c_block_write %02x bytes @ %02x - %02x\n", unit, count, saddr, com);
  63.  
  64. #ifdef BCM_CALADAN3_SVK
  65. if (unit == -) {
  66. return cpu_i2c_block_write(unit, saddr, com, data, count);
  67. }
  68. #endif
  69.  
  70. I2C_LOCK(unit);
  71. #ifdef BCM_CMICM_SUPPORT
  72. if(soc_feature(unit, soc_feature_cmicm) && !SOC_IS_SAND(unit)) {
  73. retry:
  74. rval = SOC_I2C_TX_ADDR(saddr);
  75. WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  76. // rval = com;
  77. // WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  78. // rval = count;
  79. // WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  80.  
  81. ptr = data;
  82. for( i = ; i < (int) (count - ); i++, ptr++) {
  83. rval = (uint32) *ptr;
  84. WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  85. }
  86. rval = (uint32) *ptr;
  87. soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr, &rval, MASTER_WR_STATUSf, ); /* Last Byte */
  88. WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval);
  89.  
  90. rval = ;
  91. soc_reg_field_set(unit, CMIC_I2CM_SMBUS_MASTER_COMMANDr, &rval, SMBUS_PROTOCOLf, SMBUS_BLOCK_WRITE);
  92. WRITE_CMIC_I2CM_SMBUS_MASTER_COMMANDr(unit,rval);
  93.  
  94. rv = smbus_start_wait(unit);
  95. if (rv != SOC_E_NONE && rt-- > ) {
  96. goto retry;
  97. } else if (rt < ) {
  98. rv = SOC_E_TIMEOUT;
  99. }
  100. } else
  101. #endif
  102.  
  103. 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);
  104.  
  105. 之后从新编译SDK即可。

BCM_I2C函数更改的更多相关文章

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

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

  2. sql server中常用方法函数

    SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...

  3. PHP常用函数大全

    usleep() 函数延迟代码执行若干微秒.unpack() 函数从二进制字符串对数据进行解包.uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.time_sleep_until() ...

  4. PHP常用函数备用

    刚学习php的时候,我也为记忆php函数苦恼不已.认为干嘛记忆这么枯燥无味的东西呢?用的时候查一下手册不就行了吗?但是当时因为身在辅导机构,还是记忆了一大堆自己并不感兴趣的函数. 由此就想起来,小的时 ...

  5. PHP常用函数大全。

    php usleep() 函数延迟代码执行若干微秒. unpack() 函数从二进制字符串对数据进行解包. uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. time_sleep_ ...

  6. 最全的PHP常用函数大全

    PHP的一些常用函数 quotemeta() 函数在字符串中某些预定义的字符前添加反斜杠. quoted_printable_decode() 函数对经过 quoted-printable 编码后的字 ...

  7. 《APUE》中的函数整理

    第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...

  8. 文件和目录之utime函数

    一个文件的访问和修改时间可以用utime函数更改. #include <utime.h> int utime( const char *pathname, const struct uti ...

  9. PHP 各种函数

    usleep() 函数延迟代码执行若干微秒. unpack() 函数从二进制字符串对数据进行解包. uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. time_sleep_unti ...

随机推荐

  1. ICDAR2017 Competition on Reading Chinese Text in the Wild(RCTW-17) 介绍

    阅读文章:<ICDAR2017 Competition on Reading Chinese Text in the Wild(RCTW-17)> 这篇文章是对一项中文检测和识别比赛项目( ...

  2. 外网登陆SAP的两种方式

    1.用SAP router实现从外网登录SAPserver(方式一) 自已搭建的局域网结构例如以下: SAPserverIP: 192.168.0.2, 路由器中设为DMZ区 在SAPserver上启 ...

  3. git使用(一)----git安装

    windows安装git msysgit是windows版本的Git 下载地址:https://git-for-windows.github.io/ 安装步骤 linux安装git https://g ...

  4. 使用Xcode 5创建Cocoa Touch Static Library(静态库)

    转自:http://blog.csdn.net/jymn_chen/article/details/21036035 首先科普一下静态库的相关知识: 程序编译一般需经预处理.编译.汇编和链接几个步骤. ...

  5. C# winform 多线程异步操作线程启动暂停与恢复

    /// <summary> /// 线程控制模块 /// </summary> private ManualResetEvent manualResetEvent = new ...

  6. SqlServer 如何知道是否发生了索引碎片

    --如何知道是否发生了索引碎片 SELECT object_name(dt.object_id) Tablename,si.name IndexName,dt.avg_fragmentation_in ...

  7. 简单好用的hash表-----uthash

    在软件开发中,不可不免的会使用到hash表,hash表的优点这里就不说了,以下介绍一个hash表的C实现, uthash是用宏实现的,使用的时候非常方便,只用包含uthash.h即可. Uthash的 ...

  8. 每日英语:Hong Kong Lifestyle Strains City's Resources

    Hong Kong's rapacious consumption and waste production is straining its natural resources and could ...

  9. ny236 心急的C小加 hdoj1051 Wooden Sticks

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间 ...

  10. CentOS7.3 搭建Openvpn

    环境:CentOS Linux release 7.3.1611 (Core) 查看os版本命令:[root@openvpn ~]# cat /etc/redhat-release 命令记录如下: y ...