From: Tom H. <Bas...@gm...> - 2013-06-13 11:55:26
|
Hello, I have a problem with the use of the i2c_transfer function. I want to implement the camera sensor driver (ov3640) from e-con systems into the linux kernel 3.5. I got the driver sources from e-con-systems for the use with the kernel 2.6.34. My problem is that the i2c_transfer function gives me an errorcode -121 back. But I really don't know what I did wrong or missed. I am working with an gumstix overo board with an OMAP3730 on it. So I added into the board-overo.c file: /#define LM3553_SLAVE_ADDRESS 0x53 #define OV3640_I2C_ADDR (0x78 >> 1) int omap3evm_ov3640_platform_data; int lm3553_platform_data; static struct i2c_board_info __initdata omap3_i2c_boardinfo_3[] = { { I2C_BOARD_INFO("ov3640", OV3640_I2C_ADDR), .platform_data = &omap3evm_ov3640_platform_data, }, { I2C_BOARD_INFO("lm3553",LM3553_SLAVE_ADDRESS), .platform_data = &lm3553_platform_data, }, }; static int __init overo_i2c_init(void) { u32 pdata_flags = 0; u32 regulators_flags = TWL_COMMON_REGULATOR_VPLL2; #if defined(CONFIG_USB_MUSB_HDRC) || \ defined (CONFIG_USB_MUSB_HDRC_MODULE) pdata_flags |= TWL_COMMON_PDATA_USB; #endif #if defined(CONFIG_MFD_TWL4030_AUDIO) || \ defined (CONFIG_MFD_TWL4030_AUDIO_MODULE) pdata_flags |= TWL_COMMON_PDATA_AUDIO; #endif #if defined(CONFIG_TWL4030_MADC) || \ defined (CONFIG_TWL4030_MADC_MODULE) pdata_flags |= TWL_COMMON_PDATA_MADC; #endif #if defined(CONFIG_OMAP2_DSS) || defined(CONFIG_OMAP2_DSS_MODULE) regulators_flags |= TWL_COMMON_REGULATOR_VDAC; #endif omap3_pmic_get_config(&overo_twldata, pdata_flags, regulators_flags); overo_twldata.vpll2->constraints.name = "VDVI"; omap3_pmic_init("tps65950", &overo_twldata); /* i2c2 pins are used for gpio */ //omap_register_i2c_bus(3, 400, NULL, 0); int ret; ret = omap_register_i2c_bus(3, 400, omap3_i2c_boardinfo_3, ARRAY_SIZE(omap3_i2c_boardinfo_3)); return 0; }/ to register the camera sensor on the i2c bus. I also gave my driver the same name an registered it like that: /static const struct i2c_device_id ov3640_id[] = { { "ov3640", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, ov3640_id); static struct i2c_driver ov3640_driver = { .driver = { .owner = THIS_MODULE, .name = "ov3640", }, .probe = ov3640_probe, .remove = __exit_p(ov3640_remove), .id_table = ov3640_id, }; module_i2c_driver(ov3640_driver);/ this seems to work, because the probe function was called when I made "insmod". Within the driver I called: /v4l2_i2c_subdev_init(sd, client, &ov3640_ops); / Do you have an idea what I need to do or what I forgot to do to make sure that the camera sensor can use i2c? Regards, Tom |