在S5pv210 uboot上增加I2C 读写功能

来源:互联网 发布:世纪三部曲知乎 编辑:程序博客网 时间:2024/06/11 11:43

 6410  uboot 增加IIC 读写功能两下就搞定了,但是S5pv210 增加uboot IIC 读写功能却出状况了

#define CONFIG_CMD_I2C
//#undef CONFIG_S3C64XX_I2C                /* this board has H/W I2C */
#define CONFIG_S3C64XX_I2C
#ifdef CONFIG_S3C64XX_I2C
#define CONFIG_HARD_I2C                1
#define CFG_I2C_SPEED                50000
#define CFG_I2C_SLAVE                0x70
#endif



这样编译,就出错了。
'S3C64XX_I2C' undeclared (first use in this function) 
咋回事呢。这个S5pv210 是不支持I2C的,这个功能需要从6410 上移植过来。
试试看吧。

这个应该是一些名称改一下就可以了
6410 的是这个
/************************************************
* NAME            : S3C64XX.h
* Version  : 31.3.2003
*
* common stuff for SAMSUNG S3C64XX SoC
************************************************/
/* IIC (see manual chapter 20) */
typedef struct {
        S3C64XX_REG32        IICCON;
        S3C64XX_REG32        IICSTAT;
        S3C64XX_REG32        IICADD;
        S3C64XX_REG32        IICDS;
} /*__attribute__((__packed__))*/ S3C64XX_I2C;
S5PV210 是这个

/************************************************
* NAME            : S5PC11X.h
* Version  : 31.3.2003
*
* common stuff for SAMSUNG S5PC11X SoC
************************************************/
/* IIC (see manual chapter 20) */
typedef struct {
        S5PC11X_REG32        IICCON;
        S5PC11X_REG32        IICSTAT;
        S5PC11X_REG32        IICADD;
        S5PC11X_REG32        IICDS;
} /*__attribute__((__packed__))*/ S5PC11X_I2C;

介绍几个主要命令
iprobe     检测所有在总线上的i2c设备号(相当好用的命令)
imw        i2c内存赋值,使用方法 imw 从机地址 数据地址 数据
              eg. imw 0x76 4 0x20
imd         观察i2c内存
imm        自动增加地址赋值
出来了。
嘿嘿,程序是挂上去了,但是还是找不到IIC的设备地址。

原来S5pv210 根本就不支持uboot IIC 读写功能

那就自己照着6410 往上加了。

复制内容到剪贴板
  1. void i2c_init (int speed, int slaveadd)
  2. {
  3.         S5PC11X_I2C *const i2c = S5PC11X_GetBase_I2C ();
  4.         ulong freq, pres = 16, div;
  5.         int i, status;

  6.         /* wait for some time to give previous transfer a chance to finish */

  7.         i = I2C_TIMEOUT * 1000;
  8.         status = i2c->IICSTAT;
  9.         while ((i > 0) && (status & I2CSTAT_BSY)) {
  10.                 udelay (1000);
  11.                 status = i2c->IICSTAT;
  12.                 i--;
  13.         }

  14.         /* calculate prescaler and divisor values */
  15.         freq = get_PCLK ();
  16.         
  17. #if 0        
  18.         if ((freq / pres / (16 + 1)) > speed)
  19.                 /* set prescaler to 512 */
  20.                 pres = 512;

  21.         div = 0;
  22.         while ((freq / pres / (div + 1)) > speed)
  23.                 div++;

  24. #else
  25.         if (((freq>>4)/speed)>0xf) {
  26.                 pres        =        1;
  27.                 div                =        (freq>>9)/speed;                //        PCLK/512/freq
  28.         } else {
  29.                 pres        =        0;
  30.                 div                =        (freq>>4)/speed;                //        PCLK/16/freq
  31.         }        
  32. #endif
  33.         /* set prescaler, divisor according to freq, also set
  34.          * ACKGEN, IRQ */
  35.         i2c->IICCON = (pres<<6) | (1<<5) | (div&0xf);

  36.         /* init to SLAVE REVEIVE and set slaveaddr */
  37.         i2c->IICSTAT = 0;
  38.         i2c->IICADD = slaveadd;
  39.         /* program Master Transmit (and implicit STOP) */
  40.         i2c->IICSTAT = I2C_MODE_MT | I2C_TXRX_ENA;

  41. }
已经运行到这里,IIC设备电源也已经打开但是
输入iprobe命令很久也查找不到IIC的 设备地址
U-boot@SMDKV210# iprobe 
Valid chip addresses:
U-boot@SMDKV210# 

囧,终于搞定了,uboot也不少bug ,代码的一些优化了,啥的。写有些问题。
改了之后就OK了。
U-boot@SMDKV210# iprobe 
Valid chip addresses: 50

输入iproe 命令两秒钟就查询了外设的ID了。

0 0