在S5pv210 uboot上增加I2C 读写功能

本文记录了作者为S5PV210平台的U-Boot添加I2C读写功能的过程。面对不支持I2C的S5PV210,作者通过移植6410平台的代码并进行必要的修改,最终成功实现了I2C功能,并解决了编译错误及设备地址探测问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值