I2c设备初始化方法1--通过总线编号初始化i2c设备
2012-04-11 18:45
225 查看
(本文的部分内容来源自Documentation/i2c/instantiating-devices)
I2c不像PCI或是USB设备,它不能在硬件层被枚举,软件部分必须明确了解哪些i2c设备连接到总线上了,以及哪些地址可用。因此,内核代码必须明确初始化i2c设备。I2c初始化方式有4种:
a) 通过总线编号初始化i2c设备;
b) 直接初始化设备;
c) 侦测一个指定的i2c设备;
d) 从用户空间初始化i2c设备;
下面就对上述四种初始化方法进行详细解释:
方式1:通过总线编号初始化i2c设备
-----------------------------------------------
这种方式使用于大多数嵌入式系统中使用I2C总线作为一种系统总线的情况。在这种系统中,每一个I2C设备都有一个预先分配好的地址,因此才可能预定义总线上的I2C设备。预定义工作是通过调用一个被注册的结构数组i2c_board_info实现的。
以smdk6410开发板的I2C设备初始化为例:
staticstruct i2c_board_info i2c_devs0[] __initdata = {
{ I2C_BOARD_INFO("24c08", 0x50),},
{ I2C_BOARD_INFO("wm8580", 0x1b),},
#ifdefCONFIG_SMDK6410_WM1192_EV1
{ I2C_BOARD_INFO("wm8312", 0x34),
.platform_data = &smdk6410_wm1192_pdata,
.irq= S3C_EINT(12),
},
#endif
#ifdefCONFIG_SMDK6410_WM1190_EV1
{ I2C_BOARD_INFO("wm8350", 0x1a),
.platform_data = &smdk6410_wm8350_pdata,
.irq= S3C_EINT(12),
},
#endif
};
staticvoid __init smdk6410_machine_init(void)
{
s3c_i2c0_set_platdata(NULL);
s3c_i2c1_set_platdata(NULL);{
(...)
i2c_register_board_info(0, i2c_devs0,ARRAY_SIZE(i2c_devs0));
(...)
}
上面的代码在I2C bus 0上声明了4个设备(其中"24c08"、"wm8580"为固定声明的设备"wm8312"、"wm8350"需要通过编译CONFIG_SMDK6410_WM1192_EV1和CONFIG_SMDK6410_WM1190_EV1实现),声明包括地址和驱动程序所需的数据。当I2C总线按要求注册后,I2C设备会被i2c-core自动初始化创建。
当I2C设备移除时会被自动取消绑定和销毁。
I2c不像PCI或是USB设备,它不能在硬件层被枚举,软件部分必须明确了解哪些i2c设备连接到总线上了,以及哪些地址可用。因此,内核代码必须明确初始化i2c设备。I2c初始化方式有4种:
a) 通过总线编号初始化i2c设备;
b) 直接初始化设备;
c) 侦测一个指定的i2c设备;
d) 从用户空间初始化i2c设备;
下面就对上述四种初始化方法进行详细解释:
方式1:通过总线编号初始化i2c设备
-----------------------------------------------
这种方式使用于大多数嵌入式系统中使用I2C总线作为一种系统总线的情况。在这种系统中,每一个I2C设备都有一个预先分配好的地址,因此才可能预定义总线上的I2C设备。预定义工作是通过调用一个被注册的结构数组i2c_board_info实现的。
以smdk6410开发板的I2C设备初始化为例:
staticstruct i2c_board_info i2c_devs0[] __initdata = {
{ I2C_BOARD_INFO("24c08", 0x50),},
{ I2C_BOARD_INFO("wm8580", 0x1b),},
#ifdefCONFIG_SMDK6410_WM1192_EV1
{ I2C_BOARD_INFO("wm8312", 0x34),
.platform_data = &smdk6410_wm1192_pdata,
.irq= S3C_EINT(12),
},
#endif
#ifdefCONFIG_SMDK6410_WM1190_EV1
{ I2C_BOARD_INFO("wm8350", 0x1a),
.platform_data = &smdk6410_wm8350_pdata,
.irq= S3C_EINT(12),
},
#endif
};
staticvoid __init smdk6410_machine_init(void)
{
s3c_i2c0_set_platdata(NULL);
s3c_i2c1_set_platdata(NULL);{
(...)
i2c_register_board_info(0, i2c_devs0,ARRAY_SIZE(i2c_devs0));
(...)
}
上面的代码在I2C bus 0上声明了4个设备(其中"24c08"、"wm8580"为固定声明的设备"wm8312"、"wm8350"需要通过编译CONFIG_SMDK6410_WM1192_EV1和CONFIG_SMDK6410_WM1190_EV1实现),声明包括地址和驱动程序所需的数据。当I2C总线按要求注册后,I2C设备会被i2c-core自动初始化创建。
当I2C设备移除时会被自动取消绑定和销毁。
相关文章推荐
- I2c设备初始化方法--通过总线编号初始化i2c设备
- XP系统通过Twain扫描提示成像设备无法初始化的解决方法
- I2C设备初始化方法3--侦测一个指定的I2C设备
- I2C设备初始化方法2--初始化确定设备
- Linux i2c子系统(二) _通过i2c-dev.c访问设备的方法
- Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- 定义一个交通工具(Vehicle)的类,在测试类Vehicle中的main()中实例化一个交通工具对象,通过方法给它初始化speed,size的值,并打印出来。另外,调用加速,减速的方法对速度进行改变
- I2C总线死锁原因及解决方法
- U-boot中通过ENV设置显示设备(如LCD)参数的方法与格式
- “vmware 未能初始化监视器设备”的解决方法
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- arduino读取I2C总线上连接设备的地址
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- Linux设备驱动之——I2C总线
- 第十五章 Linux I2C核心、总线与设备驱动
- Android通过反射的方法获取手机存储设备的状态信息
- 乾坤合一~Linux设备驱动之I2C核心、总线以及设备驱动
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- Linux I2C核心、总线与设备驱动(一)