Android中在main线程执行的方法
2014-09-18 11:22
696 查看
当uboot启动时候,出现 "EEPROM @ 0x50 read FAILED!!! " 这样的错误提示,大体解决思路如下:
这个错误是在uboot执行board/davinci/dm6467_evm/dm6467_evm.c代码时候提示的,分析这个错
误所在代码得知,当uboot启动时候,通过i2c读取eeprom中0x7f00处6个字节(即MAC地址),读取失
败后会打印"EEPROM @ 0x50 read FAILED!!"错误提示,读取成功的话,先判断ethaddr参数是否为空
,若为空,将读到的6个字节MAC地址 setenv ethaddr。
之所以读取失败,最大的原因是i2c中eeprom设备地址有问题,这得根据具体硬件原理图分析得知。
配置eeprom设备地址等相关信息在include/configs/davinci_dm6467_evm.h文件中:
60 /*====================================================*/
61 /* EEPROM definitions for EEPROM */
62 /*====================================================*/
63 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
64 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
65 #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 6
66 #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20
提示:打印的错误提示"EEPROM @ 0x50 read FAILED!!"中的 50 就是此处
定义的宏 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
其中 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2 意思如下(参考common/cmd_eeprom.c):
129 /*-----------------------------------------------------------------------
130 *
131 * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 2 (16-bit EEPROM address) offset is
132 * 0x000nxxxx for EEPROM address selectors at n, offset xxxx in EEPROM.
133 *
134 * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 (8-bit EEPROM page address) offset is
135 * 0x00000nxx for EEPROM address selectors and page number at n.
136 */
如何得知该宏CONFIG_SYS_I2C_EEPROM_ADDR_LEN设置成 1 还是 2 ,可以从数据手册中相关
介绍得知,以ATC24C512为例子,从其数据手册中Memory Organization 处介绍可以得知,此处宏
应该设置成 2。
其中 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50 ,该宏意思是设备地址,以ATC24C512
为例子,从其数据手册中Device Adress 处介绍得知其设备地址结构如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/20/5bd1e0749da014c077c0e1cb751a363a.jpg)
提示:此处宏不设置成 0xa0 是因为该宏设置的值是取其高7位。
如何得知该宏 CONFIG_SYS_I2C_EEPROM_ADDR 的值设置成多少了,先从数据手册中分析下引脚
信息,在根据具体电路原理图具体设置,若A0接低电平,A1接高电平,则设置成0x52 。
其中 #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 6,该宏设置的值与eeprom芯片的
Page Write Mode 多少有关,可以从数据手册中 Features 处可以知道。若为 16 Page Write Mode,
则设置成 4,若为 64 Page Write Mode,则设置成 6,若为 128 Page Write Mode,则设置成 7,
看出规律来了吧,2 的 n 次方,n 即为设置的值。(俺在这个宏纠结过一段时间才得知)
其中 #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20,从其字面可以看出是延时时间。
本人在启动uboot时候遇到 "EEPROM @ 0x50 read FAILED!!!" 这个错误提示,就是根据我的
板子上AT24C512芯片相关电路,得知其设备地址是0x52,CONFIG_SYS_EEPROM_PAGE_WRITE_BITS应该
设置成 7,因为是 128 Page Write Mode,而我的uboot源码中默认的设备地址是0x50,
CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 默认的是 6 。所以当通过 i2c 读取eeprom设备时候,由于
设备地址有误,就会报此错误信息。
当上面配置正确后,eeprom读写可能还有一种情况出现,就是读写eeprom时候,读的值读不出
来,写的值写不进去。这种情况,经一个前辈指导得知跟i2c时序有关系,主要是因为i2c标准时序
是飞利浦的专利,其他公司在用的时候,会将时序适当改下,以免侵权。而 uboot 源码中i2c的相
关的代码是根据其标准时序编写的。
因此,只要将其时序适当调整下即可,具体代码解决方法:在i2c_read()和i2c_write()两个
函数中的适当位置加些延时即可。
本文出自 “ITDS” 博客,请务必保留此出处http://limingshang.blog.51cto.com/2975568/1281043
这个错误是在uboot执行board/davinci/dm6467_evm/dm6467_evm.c代码时候提示的,分析这个错
误所在代码得知,当uboot启动时候,通过i2c读取eeprom中0x7f00处6个字节(即MAC地址),读取失
败后会打印"EEPROM @ 0x50 read FAILED!!"错误提示,读取成功的话,先判断ethaddr参数是否为空
,若为空,将读到的6个字节MAC地址 setenv ethaddr。
之所以读取失败,最大的原因是i2c中eeprom设备地址有问题,这得根据具体硬件原理图分析得知。
配置eeprom设备地址等相关信息在include/configs/davinci_dm6467_evm.h文件中:
60 /*====================================================*/
61 /* EEPROM definitions for EEPROM */
62 /*====================================================*/
63 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
64 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
65 #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 6
66 #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20
提示:打印的错误提示"EEPROM @ 0x50 read FAILED!!"中的 50 就是此处
定义的宏 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
其中 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2 意思如下(参考common/cmd_eeprom.c):
129 /*-----------------------------------------------------------------------
130 *
131 * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 2 (16-bit EEPROM address) offset is
132 * 0x000nxxxx for EEPROM address selectors at n, offset xxxx in EEPROM.
133 *
134 * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 (8-bit EEPROM page address) offset is
135 * 0x00000nxx for EEPROM address selectors and page number at n.
136 */
如何得知该宏CONFIG_SYS_I2C_EEPROM_ADDR_LEN设置成 1 还是 2 ,可以从数据手册中相关
介绍得知,以ATC24C512为例子,从其数据手册中Memory Organization 处介绍可以得知,此处宏
应该设置成 2。
其中 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50 ,该宏意思是设备地址,以ATC24C512
为例子,从其数据手册中Device Adress 处介绍得知其设备地址结构如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/20/5bd1e0749da014c077c0e1cb751a363a.jpg)
提示:此处宏不设置成 0xa0 是因为该宏设置的值是取其高7位。
如何得知该宏 CONFIG_SYS_I2C_EEPROM_ADDR 的值设置成多少了,先从数据手册中分析下引脚
信息,在根据具体电路原理图具体设置,若A0接低电平,A1接高电平,则设置成0x52 。
其中 #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 6,该宏设置的值与eeprom芯片的
Page Write Mode 多少有关,可以从数据手册中 Features 处可以知道。若为 16 Page Write Mode,
则设置成 4,若为 64 Page Write Mode,则设置成 6,若为 128 Page Write Mode,则设置成 7,
看出规律来了吧,2 的 n 次方,n 即为设置的值。(俺在这个宏纠结过一段时间才得知)
其中 #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20,从其字面可以看出是延时时间。
本人在启动uboot时候遇到 "EEPROM @ 0x50 read FAILED!!!" 这个错误提示,就是根据我的
板子上AT24C512芯片相关电路,得知其设备地址是0x52,CONFIG_SYS_EEPROM_PAGE_WRITE_BITS应该
设置成 7,因为是 128 Page Write Mode,而我的uboot源码中默认的设备地址是0x50,
CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 默认的是 6 。所以当通过 i2c 读取eeprom设备时候,由于
设备地址有误,就会报此错误信息。
当上面配置正确后,eeprom读写可能还有一种情况出现,就是读写eeprom时候,读的值读不出
来,写的值写不进去。这种情况,经一个前辈指导得知跟i2c时序有关系,主要是因为i2c标准时序
是飞利浦的专利,其他公司在用的时候,会将时序适当改下,以免侵权。而 uboot 源码中i2c的相
关的代码是根据其标准时序编写的。
因此,只要将其时序适当调整下即可,具体代码解决方法:在i2c_read()和i2c_write()两个
函数中的适当位置加些延时即可。
本文出自 “ITDS” 博客,请务必保留此出处http://limingshang.blog.51cto.com/2975568/1281043
相关文章推荐
- Code Fragment-Android在其他线程可以使用方法在UI线程执行UI相关
- AndroidStudio执行Java的main方法报错解决方案
- Android 项目中执行java的main方法
- 关于Android中定时周期执行线程方法
- Android 之 View线程 run方法和draw方法执行的先后顺序
- main入口方法中创建线程执行顺序的问题
- Thread.join()方法实现main()方法等待所有子线程执行完成[base jdk8]
- Android中有多种方法可以实现其他线程与Main线程通讯
- Android 项目中执行java的main方法
- Android平台在UI Thread中执行非UI线程中定义的代码片段的几种方法
- Android 线程 thread 两种实现方法!
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- 在Android中使用Handler和Thread线程执行后台操作
- 在Android中使用Handler和Thread线程执行后台操作
- Android调用本机程序执行文件的方法
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
- android彻底杀死当前activity和线程方法
- maven项目如何执行main方法
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android中Handler的使用方法——在子线程中更新界面