24cxx驱动编程.
1.首先实例化一个i2c设备.
2.编写对应的i2c设备驱动.
3.通过match规则匹配设备和驱动。对应驱动会调用自己的probe函数完成初始化
4.i2c设备的操作实现,write和read.
1)如何实例化一个i2c设备
在\Documentation\i2c\instantiating-devices文件中介绍了4种方法
实例化一个IIC设备
Method 1: Declare the I2C devices by bus number
Method 2: Instantiate the devices explicitly
Method 3: Probe an I2C bus for certain devices
Method 4: Instantiate from user-space
我们使用第一种方式:
Example (from omap2 h4):
static struct i2c_board_info __initdata h4_i2c_board_info[] = {
{
I2C_BOARD_INFO("isp1301_omap", 0x2d),
.irq = OMAP_GPIO_IRQ(125),
},
{ /* EEPROM on mainboard */
I2C_BOARD_INFO("24c01", 0x52),
.platform_data = &m24c01,
},
{ /* EEPROM on cpu card */
I2C_BOARD_INFO("24c01", 0x57),
.platform_data = &m24c01,
},
};
static void __init omap_h4_init(void)
{
(...)
i2c_register_board_info(1, h4_i2c_board_info,
ARRAY_SIZE(h4_i2c_board_info));
(...)
}
I2C_BOARD_INFO(dev_type, dev_addr) 用来初始化 i2c_board_info结构,填充 type类型和 dev_addr地址.
根据线路图连接,确定 dev addr.
实际板子上是24c08.确认address:0x50.
这里需要说明一下,地址计算不算最后一个bit。也就是读写位,当发送读cmd时,最后一位置1,当发送写cmd时,最后一位置0.也就是说1010 000 x.高7bit代表地址,则1010000->0x50.
内核在发送read时,会 addr =0x50<<1 |1;当write 时,会 addr=0x50<<1 |0;
static struct i2c_board_info smdkv210_i2c_devs0[] __initdata = {
{ I2C_BOARD_INFO("24c08", 0x50), },
};
i2c_register_board_info(0, smdkv210_i2c_devs0,
ARRAY_SIZE(smdkv210_i2c_devs0));
i2c_register_board_info(int busnum, struct i2c_board_info const *info,unsigned n)
s5pv210有3组iic总线,我们的连接到iic0上。所以这边的0是有意义的.
只要这样,我们便可以添加一个新的i2c dev到 iic bus上.
当然内核中肯定有24cxx的驱动,我们可以直接拿来用。注意下match规格即可.当然也可以自己写这个驱动.
IIC总线的匹配规则:
IIC 驱动注册流程:
//驱动注册流程
i2c_add_driver
{
--->i2c_register_driver
{
--->driver_register
{
--->bus_add_driver
{
--->driver_attach