u-boot移植随笔:EEPROM移植及测试

u-boot 专栏收录该内容
18 篇文章 2 订阅

EEPROM说简单也简单,说难自己也捣鼓好几天。

开发板上的EEPROM是AT24C08,大小1024个字节,使用I2C接口。——严重注意,EEPROM是指设备,而I2C是指接口,两者有着很密切的关系,但不可混淆它们,这点必须注意。

 

u-boot已经在“封装”好了I2C和EEPROM操作函数了,而底层的24x0的I2C函数也已经实现好了。我们所要做的就是开几个宏定义就OK了。

移植之前我在google上百度了几下,但得到的信息相当少,甚至是无用信息。所以关键时刻还得靠手册、靠README文件。

u-boot的“文档”README文件中关于I2C的说明在

I2C Support:

下面。

开头便是CONFIG_HARD_I2C | CONFIG_SOFT_I2C

就是说,它们两者只取其一而不能两个都定义,在一个ARM中,有硬件的I2C接口是很正常的事,当然,也可以模拟I2C。

其次要定义CONFIG_SYS_I2C_SLAVE(从设备地址?)和EEPROM的设备地址CONFIG_SYS_I2C_EEPROM_ADDR,还有CONFIG_SYS_I2C_EEPROM_ADDR_LEN,这个宏要么为1,要么为2,8位页地址的定义为1——代码中就是这么说的。

还有一个重要的宏,就是CONFIG_DRIVER_S3C24X0_I2C,这个可以在./drivers/i2c/Makefile中找到,如果定义这个宏,就将s3c24x0_i2c加入u-boot。——这也是u-boot的常用手段,与Linux如出一辙。

 

上面讲那么多,还不如直接上代码来得爽,所定义的宏如下:

 

u-boot的i2c命令我还不知道怎么使用,网上基本没这资料,用得多的是eeprom命令,它的命令格式如下:

eeprom read addr off cnt

eeprom write addr off cnt

解释:

addr:内存地址

off:EEPROM的偏移

cnt:要读取的数量,16进制的

 

下面的是对EEPROM进行操作的示例:

 

在测试过程中的一些疑问:

 

1、CONFIG_SYS_I2C_SLAVE:这个宏字面意思是从设备地址,网上有资料显示它是7位的,在u-boot中,如果对这个宏赋值(或定义),则默认为0,——这是不行的!经过山人的测试,这个7位的从设备地址只要不为0就可以!无论是0x7f还是0x01,都可以。或许可以这样理解:I2C器件最多可以有2^7-1个,只要地址不为0,就表示它是有效设备,跟USB那个意思是一样的。——怎么发现有些拗口?山人其实也不是懂的,勿怪。

2、CONFIG_SYS_I2C_EEPROM_ADDR:这个宏是设备地址(跟上面那个没有任何关系,只是大家都是地址)。datasheet上说这个地址的组成是:

1    0    1    0    A2    A1    A0    R/W

 

开发板中的A2~A0都接低电平,按理说它应该是0xa0或0xa1才对——而且,我见到有些单片机程序代码中也是这样。

但在u-boot中不然,它是0x50,我好意地改为0xa0,结果出错,读不到数据。山人也不知道是怎么回事。

 

在cmd_eeprom.c这个文件的do_eeprom函数中,无论读写都会在终端中显示

EEPROM @0xXX read: addr XXXX off XX  count XX ... done

在代码中是这样调用的:

printf (fmt, dev_addr, argv[1], addr, off, cnt);

fmt定义:

const char *const fmt =
  "/nEEPROM @0x%lX %s: addr %08lx  off %04lx  count %ld ... ";

 

通过代码的分析,这个EEPROM @0xXX 中的XX就是由宏CONFIG_SYS_I2C_EEPROM_ADDR传给它的。

 

上面的疑问目前还不知道是何原因,记录于此,证明山人曾经努力了一下下。

 

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值