camera相关

1】camera端设备驱动api 
__ccic_cam_cmd(pxa910_camera.c)--> command-->> ov5640_mipi_command(供host端调用的接口ov5640_mipi.c)-- >
switch case
{
    case v4l2定义的ioctl:
        调用camera操作函数(通过i2c)
}

【2】camera控制器驱动
struct ccic_camera
{
    int irq;
    struct platform_device *pdev;
    struct video_device v4ldev;//重要
    struct i2c_adapter i2c_adapter;
    struct i2c_client *sensor;
    struct i2c_client *sensors[SENSOR_MAX];//重要
    unsigned int bus_type[SENSOR_MAX];    /* parrallel or MIPI */
    unsigned char __iomem *regs;
    struct list_head dev_list;    /* link to other devices */
    ................
};

static int pxa910_camera_probe(struct platform_device *pdev)
{
    struct ccic_camera *cam;
    cam = kzalloc(sizeof(struct ccic_camera), GFP_KERNEL);
    tasklet_init(&cam->s_tasklet, ccic_frame_tasklet, (unsigned long) cam);
    cam->regs = ioremap(res->start, SZ_4K);
    ret = request_irq(cam->irq, ccic_irq, IRQF_SHARED, "pxa910-camera", cam);
    ccic_ctlr_init(cam);
    cam->v4ldev = ccic_v4l_template;//!!!!
    video_register_device(&cam->v4ldev, VFL_TYPE_GRABBER, -1);
    ccic_alloc_dma_bufs(cam, 1)

}

static struct video_device  ccic_v4l_template =
{
    .name = "pxa910-camera",
    .fops = &ccic_v4l_fops,
    .ioctl_ops = &ccic_ioctl_ops,
};

static const struct v4l2_file_operations ccic_v4l_fops =
{
    .owner = THIS_MODULE,
    .open = ccic_v4l_open,
    .release = ccic_v4l_realease,
    .poll = ccic_v4l_poll,
    .mmap = ccic_v4l_mmap,
    .ioctl = ccic_v4l_ioctl,
};

struct v4l2_ioctl_ops ccic_ioctl_ops =
{
    ........
}

static int __video_register_device(struct video_device *vdev, int type, int nr, int warn_if_nr_in_use)
{
    vdev->cdev = cdev_alloc();
    vdev->cdev->ops = &v4l2_fops;
    cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
    vdev->dev.class = &video_class;
    device_register(&vdev->dev);
}

static const struct file_operations v4l2_fops =
{
    .read = v4l2_read,
    .write = v4l2_write,
    .open = v4l2_open,
    .mmap = v4l2_mmap,
    .ioctl = v4l2_ioctl,
    .poll = v4l2_poll,
}

static ssize_t v4l2_read(xxxx)
{
    struct video_device *vdev = video_devdata(filp);
    vdev->fops->read(filp,  buf,  sz, off);
}

static int v4l2_ioctl(xxx)
{
    struct video_device *vdev = video_devdata(filp);
    vdev->fops->ioctl->(filp, cmd, arg);//  ccic_v4l_fops.ccic_v4l_ioctl->video_ioctl2(file, cmd, arg)->__video_do_ioctl(file, cmd, arg)->ccic_v4l_template->ccic_ioctl_ops;然后进行switch (case)各个接口函数,各个接口在调用__ccic_cam_cmd去操作camera设备
}

【3】向host添加camera设备的函数
int ccic_sensor_attach(struct i2c_client *client)
{
    struct ccic_camera *cam;
    cam->sensors[SENSOR_HIGH] = client;
}
原文地址:https://www.cnblogs.com/to7str/p/2765847.html