1、定义并填充i2c_driver:
staticconst struct i2c_device_id at24c08b_id[] = {
{"at24c08b", 0 }, //该i2c_driver所支持的i2c_client
{}
};
MODULE_DEVICE_TABLE(i2c,at24c08b_id);
/*定义并填充i2c_driver:
*probe设备探测函数,i2c_add_driver()时会被调用
*remove设备卸载函数;
*/
staticstruct i2c_driver at24c08b_driver = {
.driver= {
.name= "at24c08b",
.owner = THIS_MODULE,
},
.probe= at24c08b_probe,
.remove= __devexit_p(at24c08b_remove),
.id_table= at24c08b_id,
};
2、模块初始化函数
staticint __init at24c08b_init(void)
{
returni2c_add_driver(&at24c08b_driver);
}
3、注册i2c设备相关信息
对于newstyle方式,需要通过i2c_register_board_info()函数注册i2c_board_info,向内核提供i2c设备的相关信息。
在arch/arm/mach-s3c2440/mach-mini2440.c添加如下代码:
/*I2C设备at24c08b的相关信息*/
staticstruct i2c_board_info i2c_devices[] __initdata = {
{I2C_BOARD_INFO("at24c08b", 0x50), }, //0x50是at24c08b的设备地址
};
staticvoid __init mini2440_machine_init(void)
{
…
i2c_register_board_info(0,i2c_devices,ARRAY_SIZE(i2c_devices));
}
4、i2c_driver的probe()函数
正常的注册字符设备即可,即:
(1)分配设备号:alloc_chrdev_region()
(2)构造file_operations
(3)分配设置注册cdev:cdev_init(&cdev,&file_operations); cdev_add()
5、file_operations的read()和write()函数
(1)read:
{
/* 检查该i2c_adapter是否支持读字节的功能 */
i2c_check_functionality(I2C_FUNC_SMBUS_READ_BYTE_DATA)
i2c_smbus_read_byte_data()//从eeprom读一个字节的数据
copy_to_user()//拷贝至用户空间
}
(2)write:
{
/* 检查该i2c_adapter是否支持读字节的功能 */
i2c_check_functionality()
copy_from_user(); //获得用户空间的数据
i2c_smbus_write_byte_data()//写数据到eeprom
}
阅读(3673) | 评论(0) | 转发(0) |