在为at91sam9260移植2.6.33内核的I2C时,直接用driver/bus/i2c-at91.c这个iic的adapter驱动是不能用的,而且在makemenuconfig时,在devicedriver/i2c菜单下是看不到它的选项的。这是为什么呢?
可以通过看driver/i2c/buses/Kconfig看到,对于I2C_AT91项选的依赖多了一个BROKEN这个选项,如下:
280 config I2C_AT91
281 tristate"Atmel AT91 I2C Two-Wire interface (TWI)"
282 depends onARCH_AT91 && EXPERIMENTAL&&BROKEN
283 help
284 Thissupports the use of the I2C interface on Atmel AT91
285 processors.
286
287 Thisdriver is BROKEN because the controller which it uses
288 willeasily trigger RX overrun and TX underrun errors. Using
289 low I2Cclock rates may partially work around those issues
290 on somesystems. Another serious problem is thatthere is no
291 documented way to issue repeated START conditions, as needed
292 tosupport combined I2C messages. Use thei2c-gpio driver
293 unlessyour system can cope with those limitations.
而这个broken是在init/Kconfig下定义的,如下:
57 config BROKEN
58 bool
59
60 config BROKEN_ON_SMP
61 bool
62 depends onBROKEN || !SMP
63 default y
在这里broken是一个bool值,同时它没有一个显示的菜单名,所以在makemenuconfig时,我们是看不到它的选项的,所以它也就没有打开,一直为n。
这就说明,在2.6.33中at91sam9260的i2c的驱动i2c-at91.c是不能用的,同时可以通过I2C_AT91下的comments也可以看到:
This driver is BROKEN because the controller which it uses willeasily trigger RX overrun and TX underrun errors. Using lowI2C clock rates may partially work around those issues on some systems. Another serious problem is that there is no documented way to issue repeated STARTconditions, as needed to supportcombined I2C messages. Use the i2c-gpiodriver unless your system can cope withthose limitations.
此驱动程序被破坏,因为它使用的控制器很容易会触发溢出RX和TX欠载错误。在某些系统上,使用低 时钟速率可能部分地解决这些问题。另一个严重的问题是,有没有记录的方式发出重复的起始条件,需要支持结合I2C消息。请使用I2C-GPIO驱动程序,除非您的系统可以应付这些限制。
所以我们在2.6.33的内核中,对于at91sam9260的i2c controller的驱动我们用i2c-gpio.c,用gpio来模拟。
364 config I2C_GPIO
365 tristate "GPIO-based bitbangingI2C"
366 depends on GENERIC_GPIO
367 select I2C_ALGOBIT
368 help
369 This is a very simple bitbanging I2Cdriver utilizing the
370 arch-neutral GPIO API to control theSCL and SDA lines.
至于为什么这样,暂时不管,我用了i2c-at91.c的驱动,是有问题,在接收时会超时。