BCM_I2C函数更改
版本:sdk-xgs-robo-6.3.
平台:BCM53344
应用:控制POE芯片
描述:POE控制芯片使用PD69200,使用i2c与其通信,每次需要发送15字节数据,并接受15字节的返回数据。 1.更改函数
打开文件sdk-xgs-robo-6.3./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_SUPPORT
if(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, ); /* 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 = ; i < *count; i++, ptr++) {
READ_CMIC_I2CM_SMBUS_MASTER_DATA_READr(unit, &rval);
*ptr = (uint8) (rval & 0xff);
}
} else if (rt-- > ) {
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_SUPPORT
uint32 rval;
int rt = ;
#endif soc_cm_debug(DK_I2C, "i2c%d: soc_i2c_block_write %02x bytes @ %02x - %02x\n", unit, count, saddr, com); #ifdef BCM_CALADAN3_SVK
if (unit == -) {
return cpu_i2c_block_write(unit, saddr, com, data, count);
}
#endif I2C_LOCK(unit);
#ifdef BCM_CMICM_SUPPORT
if(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 = ; i < (int) (count - ); 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, ); /* Last Byte */
WRITE_CMIC_I2CM_SMBUS_MASTER_DATA_WRITEr(unit, rval); rval = ;
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-- > ) {
goto retry;
} else if (rt < ) {
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函数更改的更多相关文章
- JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class
if 函数的实现步骤: function +名字() 指定id , 指定开关(display: none or block) if + else 构成逻辑 控制开关 决定在哪里安置一个灯泡, 指定 ...
- sql server中常用方法函数
SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...
- PHP常用函数大全
usleep() 函数延迟代码执行若干微秒.unpack() 函数从二进制字符串对数据进行解包.uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.time_sleep_until() ...
- PHP常用函数备用
刚学习php的时候,我也为记忆php函数苦恼不已.认为干嘛记忆这么枯燥无味的东西呢?用的时候查一下手册不就行了吗?但是当时因为身在辅导机构,还是记忆了一大堆自己并不感兴趣的函数. 由此就想起来,小的时 ...
- PHP常用函数大全。
php usleep() 函数延迟代码执行若干微秒. unpack() 函数从二进制字符串对数据进行解包. uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. time_sleep_ ...
- 最全的PHP常用函数大全
PHP的一些常用函数 quotemeta() 函数在字符串中某些预定义的字符前添加反斜杠. quoted_printable_decode() 函数对经过 quoted-printable 编码后的字 ...
- 《APUE》中的函数整理
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...
- 文件和目录之utime函数
一个文件的访问和修改时间可以用utime函数更改. #include <utime.h> int utime( const char *pathname, const struct uti ...
- PHP 各种函数
usleep() 函数延迟代码执行若干微秒. unpack() 函数从二进制字符串对数据进行解包. uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. time_sleep_unti ...
随机推荐
- .net利用SQLBulkCopy进行数据库之间的大批量数据传递
SQLBulkCopy,用于数据库之间大批量的数据传递.通常用于新,旧数据库之间数据的更新.即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来. 首先,SQLBulkCopy需要2个连 ...
- tomcat在debug模式启动直接提示:弹框无法启动,无报错信息;但直接启动的话,就会有报错信息
今天运行项目,Debug模式启动Tomcat,直接弹框:无法启动(翻译,因为后来整理,所以都忘记当时的截图) 后来尝试直接start,发现不弹框了,但是console有报出错信息. 类似以下错误 20 ...
- 在linux下导入.sql文件,数据库中文乱码
现象描述 我是在aix下面导入如下SQL语句时,数据库中显示乱码. insert into CONFERENCE(CONFERENCEID,SUBCONFERENCEID,ACCESSNUMBER,A ...
- jpa多条件查询重写Specification的toPredicate方法(转)
Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor.Criteria 查询:是一种类型安全和更面向对象的查询 . 这个接 ...
- Latex--TikZ和PGF--高级文本绘图,思维绘图,想到--得到!
Latex--TikZ和PGF--高级文本绘图,思维绘图,想到--得到! TikZ和PGF是一种用在TeX上的CLI绘图工具.CLI和GUI是两种常见的绘图方式,前者是所想即所得(WYTIWYG)的, ...
- mysql-5.7.20 版本的 mysql-group-replication 可用性测试报告
一.喜迎 mysql-5.7.20 事实上mysql-group-replication 功能是在mysql-5.7.17这个版本上引入的,它实现了mysql各个结点间数据强一致性, 这个也成为了我 ...
- php长链接
php 连接 mysql 是分为两步走的第一步:建立 php 到 mysql 服务器的 tcp/ip 通道 物理通道第二步:登录 mysql 服务器,建立到数据库的通道 逻辑通道 无论是长连接还是短连 ...
- Flume入门
1.Flume是什么? ○ Flume是由cloudera开发的实时日志收集系统 ○ 核心概念是由一个叫做Agent(代理节点)的java进程运行在日志收集节点 ○ Flume在0.94. ...
- sudo日志记录记录(rsyslog)
1,查软件 rpm -qa|egrep "sudo|rsyslog" 2,编辑sudoers echo "Defaults logfile=/var/log/sudo.l ...
- SourceInsight-显示文件完整路径
使用Source insight的时候想看文件的全路径,但是默认的是中间省略的路径,所以可以通过: 1.Options-->Preferences-->Display 设置Trim lon ...