分析ov3640 摄像头的驱动
2012-10-28 22:11
441 查看
static struct i2c_driver ov3640_i2c_driver = {
.driver = {
.name = "ov3640",
},
.attach_adapter = ov3640_attach_adapter,
.probe = ov3640_probe,
.remove = ov3640_remove,
.command = ov3640_command,
.id_table = ov3640_i2c_id,
};
static __init int ov3640_init(void)
{
printk("ov3640 camera initialized\n");
return i2c_add_driver(&ov3640_i2c_driver);
}
驱动初始化调用int ov3640_init(void) 。。在这个函数中调用i2c_add_driver(&ov3640_i2c_driver);
调用i2c_add_driver后如果存在adapter适配器就会调用attach函数。在attach在要构造一个client
static int ov3640_attach_adapter(struct i2c_adapter *adapter)
{
int ret = 0;
struct i2c_board_info info;
printk("[ov3640]ov3640_attach_adapter.\n");
memset(&info, 0, sizeof(struct i2c_board_info));
strlcpy(info.type, "ov3640", I2C_NAME_SIZE);
info.addr = ov3640_data.addr;//地址信息包装成结构体i2c_board_info
这个信息最重要
ov3640_data.camera_data.client = i2c_new_device(adapter, &info);
if (!ov3640_data.camera_data.client)
{
printk("failed to abc ov3640 driver\n");
return -ENODEV;
}
if (!ov3640_data.camera_data.client->driver)
{
i2c_unregister_device(ov3640_data.camera_data.client);
ov3640_data.camera_data.client = NULL;
err("failed to attach ov3640 driver\n");
return -ENODEV;
}
list_add_tail(&ov3640_data.camera_data.client->detected,
&ov3640_data.camera_data.client->driver->clients);
s3c_fimc_register_camera(&ov3640_data.camera_data);
s3c_fimc_reset_camera(0);
return 0;
}
如果名字一样紧接着就会调用probe函数。。probe函数和第二种方式酒一样了。主要调用i2c_set_clientdata
static int ov3640_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
i2c_set_clientdata(client, &ov3640_data);
//ov3640_start(client);
return 0;
}
到此一个I2C设备就注册成功了。
参考:http://blog.csdn.net/kuangrenyu/article/details/7392745
.driver = {
.name = "ov3640",
},
.attach_adapter = ov3640_attach_adapter,
.probe = ov3640_probe,
.remove = ov3640_remove,
.command = ov3640_command,
.id_table = ov3640_i2c_id,
};
static __init int ov3640_init(void)
{
printk("ov3640 camera initialized\n");
return i2c_add_driver(&ov3640_i2c_driver);
}
驱动初始化调用int ov3640_init(void) 。。在这个函数中调用i2c_add_driver(&ov3640_i2c_driver);
调用i2c_add_driver后如果存在adapter适配器就会调用attach函数。在attach在要构造一个client
static int ov3640_attach_adapter(struct i2c_adapter *adapter)
{
int ret = 0;
struct i2c_board_info info;
printk("[ov3640]ov3640_attach_adapter.\n");
memset(&info, 0, sizeof(struct i2c_board_info));
strlcpy(info.type, "ov3640", I2C_NAME_SIZE);
info.addr = ov3640_data.addr;//地址信息包装成结构体i2c_board_info
这个信息最重要
ov3640_data.camera_data.client = i2c_new_device(adapter, &info);
if (!ov3640_data.camera_data.client)
{
printk("failed to abc ov3640 driver\n");
return -ENODEV;
}
if (!ov3640_data.camera_data.client->driver)
{
i2c_unregister_device(ov3640_data.camera_data.client);
ov3640_data.camera_data.client = NULL;
err("failed to attach ov3640 driver\n");
return -ENODEV;
}
list_add_tail(&ov3640_data.camera_data.client->detected,
&ov3640_data.camera_data.client->driver->clients);
s3c_fimc_register_camera(&ov3640_data.camera_data);
s3c_fimc_reset_camera(0);
return 0;
}
如果名字一样紧接着就会调用probe函数。。probe函数和第二种方式酒一样了。主要调用i2c_set_clientdata
static int ov3640_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
i2c_set_clientdata(client, &ov3640_data);
//ov3640_start(client);
return 0;
}
到此一个I2C设备就注册成功了。
参考:http://blog.csdn.net/kuangrenyu/article/details/7392745
相关文章推荐
- S5PV210开发板 摄像头ov3640 fimc驱动分析 :fimc_dev.c 分析
- S5PV210开发板 摄像头ov3640 fimc驱动分析 :fimc_capture.c 分析
- ov9650摄像头驱动之——linux内核v4l2架构分析1
- ov9650摄像头驱动之——linux内核v4l2架构分析2
- ov9650摄像头驱动之——linux内核v4l2架构分析3
- ov9650摄像头驱动之——linux内核v4l2架构分析1
- 基于2.6.35内核的OV9650摄像头驱动分析
- 摄像头(Ov965x)驱动分析
- ov9650摄像头驱动之——linux内核v4l2架构分析
- ov9650摄像头驱动之——linux内核v4l2架构分析1
- 关于wince5.0 下2440 OV3640/OV2640 摄像头驱动和wince6.0 S5pv210OV3640/OV9650/OV9655/OV2640 摄像头驱动差异
- ov9650摄像头驱动之——linux内核v4l2架构分析1
- ov9650摄像头驱动之——linux内核v4l2架构分析2
- ov9650摄像头驱动之——linux内核v4l2架构分析3
- 帮朋友调试S5pv210 OV3640 wince6.0 摄像头驱动
- 摄像头驱动实现源码分析
- 摄像头驱动笔记1---V4L2框架分析
- 摄像头驱动实现源码分析
- 【调试】关于300W 摄像头OV3640 实现动态分辨率调整的问题
- 分析我的OV3640 打开软件立即导致PDA死机的原因