您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> TI专栏 >> TI DaVinci >> TMS320DM646x SOC >> 正文
  关于DM6467由5150导致 I2C timeout问题           ★★★ 【字体:
关于DM6467由5150导致 I2C timeout问题
作者:piaozhiy…    文章来源:piaozhiye    点击数:    更新时间:2013-9-11    

由于TVP5150I2C协议不标准,TVP5150 I2C挂死导致系统I2C总线挂死,但是在dm6467 I2C总线驱动中并没有处理好I2C timeout问题,因为一直dm6467I2C复的位也是通过I2C读写去完成的,但是总线总是busy,因此I2C 永远复位不成功,导致死循环,系统CPU使用率100?(CPU使用率100 这个是猜测)。

I2C 挂死只能通过上电复位来恢复I2C总线,这个是linux 2.6.18版本的davinci驱动的一个bug,在后面的高版本内核已经修改过来,但是只是在DM355DM644X中有效,在DM6467中没有作用。其原因是因为DM355DM646X中它们的I2C引脚和GPIO引脚是复用的,可以通过操作GPIO引脚来复位I2C,但是在DM6467I2C引脚没有复用因此不能通过这种方法去恢复I2C总线。

其大致的算法是在i2c_davinci_wait_bus_not_busy 中增加timeout次数的判定超过两次timeout的话,就恢复I2C总线,重新初始化I2C。代码如下:

  1. static int i2c_davinci_wait_bus_not_busy(struct davinci_i2c_dev *dev,  
  2.  char allow_sleep)  
  3. {  
  4. unsigned long timeout;  
  5. static u16 to_cnt;  
  6. timeout = jiffies + DAVINCI_I2C_TIMEOUT;  
  7. while (davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG)  
  8.        & DAVINCI_I2C_STR_BB) {  
  9.     if (to_cnt <= DAVINCI_I2C_MAX_TRIES) {  
  10. if (time_after(jiffies, timeout)) {  
  11. dev_warn(dev->dev,  
  12. "timeout waiting for bus ready\n");  
  13. to_cnt++;  
  14. return -ETIMEDOUT;  
  15. else {  
  16. to_cnt = 0;  
  17. i2c_recover_bus(dev);  
  18. i2c_davinci_init(dev);  
  19. }  
  20. }  
  21.          
  22. /*  if (time_after(jiffies, timeout)) { 
  23. dev_warn(dev->dev, 
  24.  "timeout waiting for bus ready\n"); 
  25. return -ETIMEDOUT; 
  26. }*/  
  27. if (allow_sleep)  
  28. schedule_timeout(1);  
  29. }  
  30. return 0;  
  31. }  

i2c_recover_bus(dev);是通过发送一个NACK给从设备,然后用GPIO模拟I2C时钟停止I2C设备,来恢复总线。

  1. static void i2c_recover_bus(struct davinci_i2c_dev *dev)  
  2. {  
  3. u32 flag = 0;  
  4. struct davinci_i2c_platform_data *pdata = dev->dev->platform_data;  
  5. dev_err(dev->dev, "initiating i2c bus recovery\n");  
  6. /* Send NACK to the slave */  
  7. flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);  
  8. flag |=  DAVINCI_I2C_MDR_NACK;  
  9. /* write the data into mode register */  
  10. davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);  
  11. if (pdata)  
  12. generic_i2c_clock_pulse(pdata->scl_pin);  
  13. /* Send STOP */  
  14. flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);  
  15. flag |= DAVINCI_I2C_MDR_STP;  
  16. davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);  
  17. }  

具体可查阅:

http://lxr.linux.no/linux+v3.3.6/drivers/i2c/busses/i2c-davinci.c

其中需要修改的头文件。

i2c.h头文件davinci_i2c_platform_data中增加 I2C sda scl 两个引脚的描述

1.include\asm-arm\arch\i2c.h

2.include\asm-arm\arch-davinci\i2c.h

3.include\asm\arch\i2c.h

4.asm\arch-davinci\i2c.h

#ifndef __ASM_ARCH_I2C_H

#define __ASM_ARCH_I2C_H

/* All frequencies are expressed in kHz */

struct davinci_i2c_platform_data {

unsigned int bus_freq; /* standard bus frequency */

unsigned int bus_delay; /* transaction delay */

unsigned int    sda_pin;        /* GPIO pin ID to use for SDA */

unsigned int    scl_pin;        /* GPIO pin ID to use for SCL */

};

#endif /* __ASM_ARCH_I2C_H */

2.初始化davinci_i2c_platform_data数据,例如以下是DM355的私有数据,

static struct davinci_i2c_platform_data i2c_pdata = {

.bus_freq = 400 /* kHz */,

.bus_delay = 0 /* usec */,

.sda_pin        = 15,

.scl_pin        = 14,

};

具体可以看path信息

http://linux.davincidsp.com/pipermail/davinci-linux-open-source/2010-January/017526.html 

http://davinci-linux-open-source.1494791.n2.nabble.com/PATCH-v1-i2c-Davinci-i2c-bus-recovery-procedure-to-come-out-of-time-out-conditions-td4051690.html 

这里是一个同样的问题

http://e2e.ti.com/support/embedded/linux/f/354/p/70448/309432.aspx#309432 

http://e2e.ti.com/search/default.aspx#q=timeout+waiting+for+bus+ready&as=1&g=232 

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    编译Davinci linux 的方法
    TI Davinci u-boot 编译方法
    TI davinci DM6467 通过串口…
    TI DaVinci DM6467 基于ligh…
    Linux 2.6.32系统中基于DM64…
    DM6467中视频数据流在其中的…
    TMS320DM6467T uboot env
    CCS build error: relocatio…
    DM6467自己制作的cramfs文件…
    DM6467 DSP侧算法编译错误 C…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2