[U-Boot-Users] i2c_init - is this a bug?
Timur Tabi
timur at freescale.com
Wed Dec 20 17:36:50 CET 2006
Michael wrote:
> Hi, guys.
> Here is something suspicious about i2c_init(int speed, int slaveadd),
> in i2c.c and fsl_i2c.c -
> the speed parameter passed to it is never used, instead the value is hard-coded.
>
> /* set clock */
> writeb(0x3f, &I2C->fdr);
>
> Sets the speed.
> Shouldn't it be writeb(speed, &I2C->fdr); , with speed being the divider value?
Yes, the code is currently wrong, but no, 'speed' should not be the divider value.
I have code which calculates the correct value for the FDR based on the real
speed, the bus clock rate, and a CPU-specific table lookup. I just haven't
gotten around to cleaning it up and submitting it yet. It's on my to-do list
for next month.
3F is a conservative value for the bus speed that (so far) works for all
Freescale boards. The only drawback is that I2C operations are not as fast as
they could be. However, the difference is practically imperceptible, at least
in U-Boot. If you were doing heavy I2C I/O in Linux, then you might notice
something.
--
Timur Tabi
Linux Kernel Developer @ Freescale
More information about the U-Boot
mailing list