关于linux中camera驱动的加载

    在camera驱动中有这么一个结构变量:
   static struct v4l2_i2c_driver_data v4l2_i2c_data = {
    .name = "ov2655",
   .probe = ov2655_probe,
    .remove = ov2655_remove,
   .id_table = ov2655_id,
  }
      除了这个之外,没有像其他模块一样的module_init等入口,也没有添加I2C驱动的接口,那此I2C驱动如何被probe到的呢?
这个驱动要被加载不可能没有入口,可奇怪的是根本找不到。呵呵,还好功夫不负有心人,最终还是有结果了!
原因是有这一句:#include <media/v4l2-i2c-drv.h>。
头文件里面的定义如下:
#ifndef __V4L2_I2C_DRV_H__
#define __V4L2_I2C_DRV_H__

#include <media/v4l2-common.h>

struct v4l2_i2c_driver_data {
 const char * const name;
 int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
 int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);
 int (*remove)(struct i2c_client *client);
 int (*suspend)(struct i2c_client *client, pm_message_t state);
 int (*resume)(struct i2c_client *client);
 const struct i2c_device_id *id_table;
};

static struct v4l2_i2c_driver_data v4l2_i2c_data;
static struct i2c_driver v4l2_i2c_driver;


/* Bus-based I2C implementation for kernels >= 2.6.26 */

static int __init v4l2_i2c_drv_init(void)
{
 v4l2_i2c_driver.driver.name = v4l2_i2c_data.name;
 v4l2_i2c_driver.command = v4l2_i2c_data.command;
 v4l2_i2c_driver.probe = v4l2_i2c_data.probe;
 v4l2_i2c_driver.remove = v4l2_i2c_data.remove;
 v4l2_i2c_driver.suspend = v4l2_i2c_data.suspend;
 v4l2_i2c_driver.resume = v4l2_i2c_data.resume;
 v4l2_i2c_driver.id_table = v4l2_i2c_data.id_table;
 return i2c_add_driver(&v4l2_i2c_driver);
}


static void __exit v4l2_i2c_drv_cleanup(void)
{
 i2c_del_driver(&v4l2_i2c_driver);
}

module_init(v4l2_i2c_drv_init);
module_exit(v4l2_i2c_drv_cleanup);

#endif /* __V4L2_I2C_DRV_H__ */

呵呵,乖乖这里面全已经写好了,其他模块中只要包含此头文件就行了。
普及一点小知识:
无初始化的变量将被连接到未初始化数据段,在头文件中可以定义。当头文件被多个文件包含时,该未初始化段在运行时也将只有一份,
静态无初始化的变量也将被连接到未初始化数据段,在头文件中可以定义。当头文件被多个文件包含时,编译的时候将会在多个目标文
件中各自记录一个未初始化数据段,在运行时则会在内存中存在多份。

 

你可能感兴趣的:(c,linux,struct,Module,command,table)