• 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;
    }
  • 相关阅读:
    动图+源码,演示 Java 中常用数据结构执行过程及原理
    16 个超级实用的 Java 工具类
    图解 Java 垃圾回收机制,写得非常好!
    一些值得收藏的开源框架
    JVM 发生内存溢出的 8 种原因、及解决办法
    VC的function类说明 -- 继续
    引用文章 如何在lambda中引入递归调用
    VC中function函数解析
    folly无锁队列正确性说明
    C++ Programming Language中的Calculator源代码
  • 原文地址:https://www.cnblogs.com/to7str/p/2765847.html
Copyright © 2020-2023  润新知