对于一个i2c设备来说,其设备文件是最简单也是最复杂的,说它简单是因为很设备厂商会提供linux下的代码,这样就简单了;但是也有很多厂商它不提供或不完整提供linux下的代码,这样的话当然就复杂了。那么这个我现在这里就不说了,下面说说做了几个I2C设备(以ISA1200为例)后发现,不管设备文件如何总是要自己来做的一些事情,这大概就是所谓的移植吧。
当然这个工作都是在板文件中进行的。以mach-s5pv210.c为例来说一下:
先说下用板子自己带的I2C实现驱动加载:
首先在板文件中建立ISA1200的信息:
static int isa1200_power(int on)
{
if(on){
gpio_direction_output(S5PV210_GPJ3(1), 1);
gpio_direction_output(S5PV210_GPJ3(0), 1);
}else{
gpio_direction_output(S5PV210_GPJ3(1), 0);
gpio_direction_output(S5PV210_GPJ3(0), 0);
}
return 0;
}
static struct isa1200_platform_data isa1200_1_pdata = {
.name = "isa1200",
.power_on = isa1200_power,
.pwm_ch_id = 1,
.hap_en_gpio = S5PV210_GPH3(1),
.max_timeout = 60000,
};
static void isa1200_init(void)
{
gpio_direction_output(S5PV210_GPJ3(7), 1);
gpio_direction_output(S5PV210_GPJ3(1), 1);
gpio_direction_output(S5PV210_GPJ3(0), 1);
/*i2c_register_board_info(3, isa1200_board_info,
ARRAY_SIZE(isa1200_board_info));*/
return;
}
以及i2c_board_info结构体:
{
I2C_BOARD_INFO("isa1200_1", 0x90>>1),/*这个是I2C设备的从机地址*/
.platform_data = &isa1200_1_pdata,
},
然后在以下三个I2C总线中找到一条如i2c_devs1[]
/* I2C0 */
static struct i2c_board_info i2c_devs0[] __initdata = {
{
I2C_BOARD_INFO("act8937", 0x5B),
.platform_data = &act8937_platform_data,
},
{
I2C_BOARD_INFO("wm8580", 0x1b),
},
};
/* I2C1 */
static struct i2c_board_info i2c_devs1[] __initdata = {
#ifdef CONFIG_VIDEO_TV20
{
I2C_BOARD_INFO("s5p_ddc", (0x74>>1)),
},
#endif
};
/* I2C2 */
static struct i2c_board_info i2c_devs2[] __initdata = {
#ifdef CONFIG_REGULATOR_MAX8698
{
/* The address is 0xCC used since SRAD = 0 */
I2C_BOARD_INFO("max8698", (0xCC >> 1)),
.platform_data = &max8698_platform_data,
},
#endif
将i2c_boa