您的位置:首页 > 其它

分析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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: