hi all:
我现在在调试dm8168的uboot,尝试在uboot中添加,iic从设备初始化的代码。在调试中发现这样的现象。
在我上电后,uboot中调用i2c_read函数读取iic从器件的内容时,会报“I2C read: I/O error”的错误,使用示波器在抓取iic引脚的波形发现没有数据输出。
但是在uboot中输入boot启动内核,在linux启动完成后,在linux中输入reboot,重启设备。
重启到uboot输入回车中止启动,这时执行同样的iic操作,全部是好用的,读写的数据全部正确。
现在uboot中iic的接口函数,是调用omap24xx_i2c.c中的函数,在uboot启动中已经调用iic_init函数。
开始怀疑io复用的问题,但是iic0,1的引脚都没有复用。
所以这个问题现在比较迷惑,iic初始化时出了对iic寄存器的初始化还要依赖于其他单元吗?内核中应当是做了一些初始化,使iic工作了,而uboot中没有做。
Chris Meng:
你好,
请问在uboot下测试的是I2C0还是I2C1?应该是I2C0在uboot下是可以正常访问的。I2C1无论是在uboot/kernel下默认代码都是没有配置的。
如果是I2C0,你可以看看相关时钟是否有使能。
下面的信息可以在http://processors.wiki.ti.com/index.php/TI81XX_PSP_04.04.00.02_Feature_Performance_Guide找到。
Module/Subsystem Usage Info
Module/Subsystem
Enabled on Reset?
Enabled in UBoot?
Enabled in Linux?
Remarks
I2C0
NO
YES
CONFIG
I2C1
NO
NO
NO
I2C2
NO
YES
CONFIG
NA – TI816X
I2C3
NO
NO
NO
NA- TI816X
gaoz henzhong:
回复 Chris Meng:
使用的是iic0,我确定下时钟源的问题。
uboot中默认iic操作的接口是操作的iic0,因为从代码上看寄存器的赋值是iic0的寄存器,其中包括三个函数,初始化化,write,read。
用的是read调用
gaoz henzhong:
回复 gaoz henzhong:
从uboot代码上看使能了iic0的clk:
s_init–>prcm_init–>peripheral_enable()
peripheral_enable中有下边的代码
/* I2C0 */ __raw_writel(0x2, CM_ALWON_I2C_0_CLKCTRL); while(__raw_readl(CM_ALWON_I2C_0_CLKCTRL) != 0x2); /* I2C1 */ __raw_writel(0x2, CM_ALWON_I2C_1_CLKCTRL); while(__raw_readl(CM_ALWON_I2C_1_CLKCTRL) != 0x2);
从注释来看应当是使能了iic的时钟
kooking:
可以把u-boot和kernel初始化I2C后相关的寄存器打印出来,比较一下有差异的寄存器
gaoz henzhong:
回复 kooking:
对比打印iic寄存器的值,好用和不好用时,没有发现不一样的地方。
下边是iic寄存器的值
48028000 = [9]48028004 = [5040]48028008 = [0]4802800c = [0]48028010 = [1]48028014 = [0]48028018 = [0]4802801c = [0]48028020 = [0]48028024 = [0]48028028 = [0]4802802c = [1f]48028030 = [1f]48028034 = [0]48028038 = [0]4802803c = [0]48028040 = [0]48028044 = [0]48028048 = [0]4802804c = [0]48028050 = [0]48028054 = [0]48028058 = [0]4802805c = [0]48028060 = [0]48028064 = [0]48028068 = [0]4802806c = [0]48028070 = [0]48028074 = [0]48028078 = [0]4802807c = [0]48028080 = [0]48028084 = [0]48028088 = [0]4802808c = [0]48028090 = [1]48028094 = [0]48028098 = [0]4802809c = [fd]480280a0 = [0]480280a4 = [8000]480280a8 = [1]480280ac = [3ff]480280b0 = [1]480280b4 = [5a]480280b8 = [5a]480280bc = [e0]480280c0 = [8000]480280c4 = [0]480280c8 = [0]480280cc = [0]480280d0 = [0]好和不好没有区别。48181564 = [2] CM_ALWON_I2C_0_CLKCTRL clk使能,iic0使能48181428 = [102] CM_ALWON_SYSCLK6_CLKCTRL 上一级时钟使能48140400 = [380188] MAINPLL_CTRL 工作48140404 = [0] MAINPLL_PWD 供电单元使能没有问题
在测试时发现,有时第一次上电也好用,有时不好用。还是怀疑那个寄存器可能没有初始化。不过我能想到的就是,时钟控制,电源控制,和iic模块本身寄存器,是否还有其他寄存器会影响iic的工作