Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1371557
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类
文章存档

2023年(6)

2022年(20)

2021年(8)

2020年(3)

2018年(17)

2017年(3)

2016年(3)

2015年(9)

2014年(13)

2013年(17)

2012年(77)

2011年(22)

分类: LINUX

2012-07-13 10:19:40

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) |
给主人留下些什么吧!~~