自己写的uvc驱动支持IP2977/ip2970

  1. /* 作者: [email protected]  
  2.  * 此驱动程序是基于linux2.6.31.14内核 
  3.  * 上一篇自己写的uvc驱动程序是针对环宇飞扬6190来写的,有一些缺点,这些缺点在本次的驱动 
  4.  * 中进行了修改此uvc驱动是针对IP2977进行了支持,根据IP2977芯片厂商提供的修改手册进行了修改。 
  5.  * 此驱动程序虽然支持IP2977摄像头,但是显示效果不太好,此驱动只是针对学习使用。 
  6.  */  
  7.   
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13. #include   
  14. #include   
  15. #include   
  16. #include   
  17. #include   
  18.   
  19. #include   
  20. #include   
  21. #include   
  22.   
  23. #include "uvcvideo.h"  
  24.   
  25. /* 参考 drivers/media/video/uvc */  
  26.   
  27. #define MYUVC_URBS 5  
  28.   
  29. /* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */  
  30. #define UVC_STREAM_EOH  (1 << 7)  
  31. #define UVC_STREAM_ERR  (1 << 6)  
  32. #define UVC_STREAM_STI  (1 << 5)  
  33. #define UVC_STREAM_RES  (1 << 4)  
  34. #define UVC_STREAM_SCR  (1 << 3)  
  35. #define UVC_STREAM_PTS  (1 << 2)  
  36. #define UVC_STREAM_EOF  (1 << 1)  
  37. #define UVC_STREAM_FID  (1 << 0)  
  38.   
  39.   
  40. struct myuvc_streaming_control {  
  41.     __u16 bmHint;  
  42.     __u8  bFormatIndex;  
  43.     __u8  bFrameIndex;  
  44.     __u32 dwFrameInterval;  
  45.     __u16 wKeyFrameRate;  
  46.     __u16 wPFrameRate;  
  47.     __u16 wCompQuality;  
  48.     __u16 wCompWindowSize;  
  49.     __u16 wDelay;  
  50.     __u32 dwMaxVideoFrameSize;  
  51.     __u32 dwMaxPayloadTransferSize;  
  52.     __u32 dwClockFrequency;  
  53.     __u8  bmFramingInfo;  
  54.     __u8  bPreferedVersion;  
  55.     __u8  bMinVersion;  
  56.     __u8  bMaxVersion;  
  57. };  
  58.   
  59.   
  60.   
  61. struct frame_desc {  
  62.     int width;  
  63.     int height;  
  64. };  
  65.   
  66. /* 参考uvc_video_queue定义一些结构体 */  
  67. struct myuvc_buffer {      
  68.     struct v4l2_buffer buf;  
  69.     int state;  
  70.     int vma_use_count; /* 表示是否已经被mmap */  
  71.     wait_queue_head_t wait;  /* APP要读某个缓冲区,如果无数据,在此休眠 */  
  72.     struct list_head stream;  
  73.     struct list_head irq;      
  74. };  
  75.   
  76. struct myuvc_queue {  
  77.     void *mem;  
  78.     int count;  
  79.     int buf_size;      
  80.     struct myuvc_buffer buffer[32];  
  81.   
  82.     struct urb *urb[32];  
  83.     char *urb_buffer[32];  
  84.     dma_addr_t urb_dma[32];  
  85.     unsigned int urb_size;  
  86.   
  87.     struct list_head mainqueue;   /* 供APP消费用 */  
  88.     struct list_head irqqueue;    /* 供底层驱动生产用 */  
  89. };  
  90.   
  91. static struct myuvc_queue myuvc_queue;  
  92.   
  93. static struct video_device *myuvc_vdev;  
  94. static struct usb_device *myuvc_udev;  
  95.   
  96. static int myuvc_bEndpointAddress = 0x82;  
  97. static int myuvc_streaming_intf;  
  98. static int myuvc_control_intf;  
  99. static struct v4l2_format myuvc_format;  
  100.   
  101. static struct frame_desc frames[] = {{640, 480}, {320, 240}, {160, 120}};  
  102. static int frame_idx = 1;  
  103. static int bBitsPerPixel = 0; /* lsusb -v -d 0x1e4e:  "bBitsPerPixel" */  
  104. static int uvc_version = 0x0100; /* lsusb -v -d 0x1b3b: bcdUVC */  
  105.   
  106. static int ProcessingUnitID = 3;  /* lsusb -v -d 0x1b3b: PROCESSING_UNIT */  
  107.   
  108. /* 以后再设置 */  
  109. static int wMaxPacketSize = 800;  
  110. static int myuvc_streaming_bAlternateSetting = 5;  
  111. static int dwMaxVideoFrameSize = 77312;  
  112.   
  113. static struct myuvc_streaming_control myuvc_params;  
  114.   
  115. static int last_fid = -1;  
  116.   
  117. /* A2 参考 uvc_v4l2_do_ioctl */  
  118. static int myuvc_vidioc_querycap(struct file *file, void  *priv,  
  119.                     struct v4l2_capability *cap)  
  120. {      
  121.     memset(cap, 0, sizeof *cap);  
  122.     strcpy(cap->driver, "myuvc");  
  123.     strcpy(cap->card, "myuvc");  
  124.     cap->version = 1;  
  125.       
  126.     cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;  
  127.    
  128.     return 0;  
  129. }  
  130.   
  131. /* A3 列举支持哪种格式 
  132.  * 参考: uvc_fmts 数组 
  133.  */  
  134. static int myuvc_vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,  
  135.                     struct v4l2_fmtdesc *f)  
  136. {  
  137.     /* 人工查看描述符可知我们用的摄像头只支持1种格式 */  
  138.     if (f->index >= 1)  
  139.         return -EINVAL;  
  140.   
  141.     strcpy(f->description, "MJPEG");  
  142.     f->pixelformat = V4L2_PIX_FMT_MJPEG;      
  143.     //f->flags       = ;  
  144.     f->type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  145.       
  146.     return 0;  
  147. }  
  148.   
  149. /* A4 返回当前所使用的格式 */  
  150. static int myuvc_vidioc_g_fmt_vid_cap(struct file *file, void *priv,  
  151.                     struct v4l2_format *f)  
  152. {  
  153.     memcpy(f, &myuvc_format, sizeof(myuvc_format));  
  154.     return (0);  
  155. }  
  156.   
  157. /* A5 测试驱动程序是否支持某种格式, 强制设置该格式  
  158.  * 参考: uvc_v4l2_try_format 
  159.  *       myvivi_vidioc_try_fmt_vid_cap 
  160.  */  
  161. static int myuvc_vidioc_try_fmt_vid_cap(struct file *file, void *priv,  
  162.             struct v4l2_format *f)  
  163. {  
  164.     if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)  
  165.     {  
  166.         return -EINVAL;  
  167.     }  
  168.   
  169.     if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)  
  170.         return -EINVAL;  
  171.       
  172.     /* 调整format的width, height,  
  173.      * 计算bytesperline, sizeimage 
  174.      */  
  175.   
  176.     /* 人工查看描述符, 确定支持哪几种分辨率 */  
  177.     f->fmt.pix.width  = frames[frame_idx].width;  
  178.     f->fmt.pix.height = frames[frame_idx].height;  
  179.   
  180.     /* 对于MJPEG数据类型来说,bBitsPerPixel是无法知道的。因此我们设为0 */  
  181.     f->fmt.pix.bytesperline =  
  182.         (f->fmt.pix.width * bBitsPerPixel) >> 3;  
  183.       
  184.     /* 一帧数据最大为dwMaxVideoFrameSize=77312,是由确定带宽时确定出来的。 */  
  185.     f->fmt.pix.sizeimage = dwMaxVideoFrameSize;  
  186.   
  187.     f->fmt.pix.field      = V4L2_FIELD_NONE;  
  188.     /* 由描述符bColorPrimaries  1 (BT.709,sRGB)可知 */  
  189.     f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;  
  190.     f->fmt.pix.priv       = 0;       /* private data, depends on pixelformat */  
  191.       
  192.     return 0;  
  193. }  
  194.   
  195. /* A6 参考 myvivi_vidioc_s_fmt_vid_cap */  
  196. static int myuvc_vidioc_s_fmt_vid_cap(struct file *file, void *priv,  
  197.                     struct v4l2_format *f)  
  198. {  
  199.     int ret = myuvc_vidioc_try_fmt_vid_cap(file, NULL, f);  
  200.     if (ret < 0)  
  201.         return ret;  
  202.   
  203.     memcpy(&myuvc_format, f, sizeof(myuvc_format));  
  204.       
  205.     return 0;  
  206. }  
  207.   
  208. static int myuvc_free_buffers(void)  
  209. {  
  210.     if (myuvc_queue.mem)  
  211.     {  
  212.         vfree(myuvc_queue.mem);  
  213.         memset(&myuvc_queue, 0, sizeof(myuvc_queue));  
  214.         myuvc_queue.mem = NULL;  
  215.     }  
  216.     return 0;  
  217. }  
  218.   
  219. /* A7 APP调用该ioctl让驱动程序分配若干个缓存, APP将从这些缓存中读到视频数据  
  220.  * 参考: uvc_alloc_buffers 
  221.  */  
  222. static int myuvc_vidioc_reqbufs(struct file *file, void *priv,  
  223.               struct v4l2_requestbuffers *p)  
  224. {  
  225.     int nbuffers = p->count;  
  226.     int bufsize  = PAGE_ALIGN(myuvc_format.fmt.pix.sizeimage);  
  227.     unsigned int i;  
  228.     void *mem = NULL;  
  229.     int ret;  
  230.   
  231.     if ((ret = myuvc_free_buffers()) < 0)  
  232.         goto done;  
  233.   
  234.     /* Bail out if no buffers should be allocated. */  
  235.     if (nbuffers == 0)  
  236.         goto done;  
  237.   
  238.     /* Decrement the number of buffers until allocation succeeds. */  
  239.     for (; nbuffers > 0; --nbuffers) {  
  240.         mem = vmalloc_32(nbuffers * bufsize);  
  241.         if (mem != NULL)  
  242.             break;  
  243.     }  
  244.   
  245.     if (mem == NULL) {  
  246.         ret = -ENOMEM;  
  247.         goto done;  
  248.     }  
  249.   
  250.     /* 这些缓存是一次性作为一个整体来分配的 */  
  251.     memset(&myuvc_queue, 0, sizeof(myuvc_queue));  
  252.   
  253.     INIT_LIST_HEAD(&myuvc_queue.mainqueue);  
  254.     INIT_LIST_HEAD(&myuvc_queue.irqqueue);  
  255.   
  256.     for (i = 0; i < nbuffers; ++i) {  
  257.         myuvc_queue.buffer[i].buf.index = i;  
  258.         myuvc_queue.buffer[i].buf.m.offset = i * bufsize;  
  259.         myuvc_queue.buffer[i].buf.length = myuvc_format.fmt.pix.sizeimage;  
  260.         myuvc_queue.buffer[i].buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  261.         myuvc_queue.buffer[i].buf.sequence = 0;  
  262.         myuvc_queue.buffer[i].buf.field = V4L2_FIELD_NONE;  
  263.         myuvc_queue.buffer[i].buf.memory = V4L2_MEMORY_MMAP;  
  264.         myuvc_queue.buffer[i].buf.flags = 0;  
  265.         myuvc_queue.buffer[i].state     = VIDEOBUF_IDLE;  
  266.         init_waitqueue_head(&myuvc_queue.buffer[i].wait);  
  267.     }  
  268.   
  269.     myuvc_queue.mem = mem;  
  270.     myuvc_queue.count = nbuffers;  
  271.     myuvc_queue.buf_size = bufsize;  
  272.     ret = nbuffers;  
  273.   
  274. done:  
  275.     return ret;  
  276. }  
  277.   
  278. /* A8 查询缓存状态, 比如地址信息(APP可以用mmap进行映射)  
  279.  * 参考 uvc_query_buffer 
  280.  */  
  281. static int myuvc_vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *v4l2_buf)  
  282. {  
  283.     int ret = 0;  
  284.       
  285.     if (v4l2_buf->index >= myuvc_queue.count) {  
  286.         ret = -EINVAL;  
  287.         goto done;  
  288.     }  
  289.   
  290.     memcpy(v4l2_buf, &myuvc_queue.buffer[v4l2_buf->index].buf, sizeof(*v4l2_buf));  
  291.   
  292.     /* 更新flags */  
  293.     if (myuvc_queue.buffer[v4l2_buf->index].vma_use_count)  
  294.         v4l2_buf->flags |= V4L2_BUF_FLAG_MAPPED;  
  295.   
  296.   
  297.     switch (myuvc_queue.buffer[v4l2_buf->index].state) {  
  298.         case VIDEOBUF_ERROR:  
  299.         case VIDEOBUF_DONE:  
  300.             v4l2_buf->flags |= V4L2_BUF_FLAG_DONE;  
  301.             break;  
  302.         case VIDEOBUF_QUEUED:  
  303.         case VIDEOBUF_ACTIVE:  
  304.             v4l2_buf->flags |= V4L2_BUF_FLAG_QUEUED;  
  305.             break;  
  306.         case VIDEOBUF_IDLE:  
  307.         default:  
  308.             break;  
  309.     }  
  310.   
  311. done:      
  312.     return ret;  
  313. }  
  314.   
  315. /* A10 把缓冲区放入队列, 底层的硬件操作函数将会把数据放入这个队列的缓存  
  316.  * 参考: uvc_queue_buffer 
  317.  */  
  318. static int myuvc_vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *v4l2_buf)  
  319. {  
  320.     struct myuvc_buffer *buf;  
  321.   
  322.     /* 0. APP传入的v4l2_buf可能有问题, 要做判断 */  
  323.   
  324.     if (v4l2_buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||  
  325.         v4l2_buf->memory != V4L2_MEMORY_MMAP) {  
  326.         return -EINVAL;  
  327.     }  
  328.   
  329.     if (v4l2_buf->index >= myuvc_queue.count) {  
  330.         return -EINVAL;  
  331.     }  
  332.   
  333.     buf = &myuvc_queue.buffer[v4l2_buf->index];  
  334.   
  335.     if (buf->state != VIDEOBUF_IDLE) {  
  336.         return -EINVAL;  
  337.     }  
  338.   
  339.   
  340.     /* 1. 修改状态 */  
  341.     buf->state = VIDEOBUF_QUEUED;  
  342.     buf->buf.bytesused = 0;  
  343.   
  344.     /* 2. 放入2个队列 */  
  345.     /* 队列1: 供APP使用  
  346.      * 当缓冲区没有数据时,放入mainqueue队列 
  347.      * 当缓冲区有数据时, APP从mainqueue队列中取出 
  348.      */  
  349.     list_add_tail(&buf->stream, &myuvc_queue.mainqueue);  
  350.   
  351.     /* 队列2: 供产生数据的函数使用 
  352.      * 当采集到数据时,从irqqueue队列中取出第1个缓冲区,存入数据 
  353.      */  
  354.     list_add_tail(&buf->irq, &myuvc_queue.irqqueue);  
  355.       
  356.     return 0;  
  357. }  
  358.   
  359. static void myuvc_print_streaming_params(struct myuvc_streaming_control *ctrl)  
  360. {  
  361.     printk("video params:\n");  
  362.     printk("bmHint                   = %d\n", ctrl->bmHint);  
  363.     printk("bFormatIndex             = %d\n", ctrl->bFormatIndex);  
  364.     printk("bFrameIndex              = %d\n", ctrl->bFrameIndex);  
  365.     printk("dwFrameInterval          = %d\n", ctrl->dwFrameInterval);  
  366.     printk("wKeyFrameRate            = %d\n", ctrl->wKeyFrameRate);  
  367.     printk("wPFrameRate              = %d\n", ctrl->wPFrameRate);  
  368.     printk("wCompQuality             = %d\n", ctrl->wCompQuality);  
  369.     printk("wCompWindowSize          = %d\n", ctrl->wCompWindowSize);  
  370.     printk("wDelay                   = %d\n", ctrl->wDelay);  
  371.     printk("dwMaxVideoFrameSize      = %d\n", ctrl->dwMaxVideoFrameSize);  
  372.     printk("dwMaxPayloadTransferSize = %d\n", ctrl->dwMaxPayloadTransferSize);  
  373.     printk("dwClockFrequency         = %d\n", ctrl->dwClockFrequency);  
  374.     printk("bmFramingInfo            = %d\n", ctrl->bmFramingInfo);  
  375.     printk("bPreferedVersion         = %d\n", ctrl->bPreferedVersion);  
  376.     printk("bMinVersion              = %d\n", ctrl->bMinVersion);  
  377.     printk("bMinVersion              = %d\n", ctrl->bMinVersion);  
  378. }  
  379.   
  380.   
  381. /* 参考: uvc_get_video_ctrl  
  382.  (ret = uvc_get_video_ctrl(video, probe, 1, GET_CUR))  
  383.  static int uvc_get_video_ctrl(struct uvc_video_device *video, 
  384.      struct uvc_streaming_control *ctrl, int probe, __u8 query) 
  385.  */  
  386. static int myuvc_get_streaming_params(struct myuvc_streaming_control *ctrl)  
  387. {  
  388.     __u8 *data;  
  389.     __u16 size;  
  390.     int ret;  
  391.     __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;  
  392.     unsigned int pipe;  
  393.   
  394.     size = uvc_version >= 0x0110 ? 34 : 26;  
  395.     data = kmalloc(size, GFP_KERNEL);  
  396.     if (data == NULL)  
  397.         return -ENOMEM;  
  398.      
  399.     pipe = (GET_CUR & 0x80) ? usb_rcvctrlpipe(myuvc_udev, 0)  
  400.                   : usb_sndctrlpipe(myuvc_udev, 0);  
  401.     type |= (GET_CUR & 0x80) ? USB_DIR_IN : USB_DIR_OUT;  
  402.   
  403.     ret = usb_control_msg(myuvc_udev, pipe, GET_CUR, type, VS_PROBE_CONTROL << 8,  
  404.             0 << 8 | myuvc_streaming_intf, data, size, 5000);  
  405.   
  406.     if (ret < 0)  
  407.         goto done;  
  408.   
  409.     ctrl->bmHint = le16_to_cpup((__le16 *)&data[0]);  
  410.     ctrl->bFormatIndex = data[2];  
  411.     ctrl->bFrameIndex = data[3];  
  412.     ctrl->dwFrameInterval = le32_to_cpup((__le32 *)&data[4]);  
  413.     ctrl->wKeyFrameRate = le16_to_cpup((__le16 *)&data[8]);  
  414.     ctrl->wPFrameRate = le16_to_cpup((__le16 *)&data[10]);  
  415.     ctrl->wCompQuality = le16_to_cpup((__le16 *)&data[12]);  
  416.     ctrl->wCompWindowSize = le16_to_cpup((__le16 *)&data[14]);  
  417.     ctrl->wDelay = le16_to_cpup((__le16 *)&data[16]);  
  418.     ctrl->dwMaxVideoFrameSize = get_unaligned_le32(&data[18]);  
  419.     ctrl->dwMaxPayloadTransferSize = get_unaligned_le32(&data[22]);  
  420.   
  421.     if (size == 34) {  
  422.         ctrl->dwClockFrequency = get_unaligned_le32(&data[26]);  
  423.         ctrl->bmFramingInfo = data[30];  
  424.         ctrl->bPreferedVersion = data[31];  
  425.         ctrl->bMinVersion = data[32];  
  426.         ctrl->bMaxVersion = data[33];  
  427.     } else {  
  428.         //ctrl->dwClockFrequency = video->dev->clock_frequency;  
  429.         ctrl->bmFramingInfo = 0;  
  430.         ctrl->bPreferedVersion = 0;  
  431.         ctrl->bMinVersion = 0;  
  432.         ctrl->bMaxVersion = 0;  
  433.     }  
  434.   
  435. done:  
  436.     kfree(data);  
  437.       
  438.     return (ret < 0) ? ret : 0;  
  439. }  
  440.   
  441. /* 参考: uvc_v4l2_try_format ∕uvc_probe_video  
  442.  *       uvc_set_video_ctrl(video, probe, 1) 
  443.  */  
  444. static int myuvc_try_streaming_params(struct myuvc_streaming_control *ctrl)  
  445. {  
  446.     __u8 *data;  
  447.     __u16 size;  
  448.     int ret;  
  449.     __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;  
  450.     unsigned int pipe;  
  451.       
  452.     memset(ctrl, 0, sizeof *ctrl);  
  453.       
  454.     ctrl->bmHint = 1;    /* dwFrameInterval */  
  455.     ctrl->bFormatIndex = 1;  
  456.     ctrl->bFrameIndex  = frame_idx + 1;  
  457.     ctrl->dwFrameInterval = 333333;  
  458.   
  459.   
  460.     size = uvc_version >= 0x0110 ? 34 : 26;  
  461.     data = kzalloc(size, GFP_KERNEL);  
  462.     if (data == NULL)  
  463.         return -ENOMEM;  
  464.   
  465.     *(__le16 *)&data[0] = cpu_to_le16(ctrl->bmHint);  
  466.     data[2] = ctrl->bFormatIndex;  
  467.     data[3] = ctrl->bFrameIndex;  
  468.     *(__le32 *)&data[4] = cpu_to_le32(ctrl->dwFrameInterval);  
  469.     *(__le16 *)&data[8] = cpu_to_le16(ctrl->wKeyFrameRate);  
  470.     *(__le16 *)&data[10] = cpu_to_le16(ctrl->wPFrameRate);  
  471.     *(__le16 *)&data[12] = cpu_to_le16(ctrl->wCompQuality);  
  472.     *(__le16 *)&data[14] = cpu_to_le16(ctrl->wCompWindowSize);  
  473.     *(__le16 *)&data[16] = cpu_to_le16(ctrl->wDelay);  
  474.     put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]);  
  475.     put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]);  
  476.   
  477.     if (size == 34) {  
  478.         put_unaligned_le32(ctrl->dwClockFrequency, &data[26]);  
  479.         data[30] = ctrl->bmFramingInfo;  
  480.         data[31] = ctrl->bPreferedVersion;  
  481.         data[32] = ctrl->bMinVersion;  
  482.         data[33] = ctrl->bMaxVersion;  
  483.     }  
  484.   
  485.     pipe = (SET_CUR & 0x80) ? usb_rcvctrlpipe(myuvc_udev, 0)  
  486.                   : usb_sndctrlpipe(myuvc_udev, 0);  
  487.     type |= (SET_CUR & 0x80) ? USB_DIR_IN : USB_DIR_OUT;  
  488.   
  489.     ret = usb_control_msg(myuvc_udev, pipe, SET_CUR, type, VS_PROBE_CONTROL << 8,  
  490.             0 << 8 | myuvc_streaming_intf, data, size, 5000);  
  491.   
  492.     kfree(data);  
  493.       
  494.     return (ret < 0) ? ret : 0;  
  495.       
  496. }  
  497.   
  498.   
  499. /* 参考: uvc_v4l2_try_format ∕uvc_probe_video  
  500.  *       uvc_set_video_ctrl(video, probe, 1) 
  501.  */  
  502. static int myuvc_set_streaming_params(struct myuvc_streaming_control *ctrl)  
  503. {  
  504.     __u8 *data;  
  505.     __u16 size;  
  506.     int ret;  
  507.     __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;  
  508.     unsigned int pipe;  
  509.       
  510.     size = uvc_version >= 0x0110 ? 34 : 26;  
  511.     data = kzalloc(size, GFP_KERNEL);  
  512.     if (data == NULL)  
  513.         return -ENOMEM;  
  514.   
  515.     *(__le16 *)&data[0] = cpu_to_le16(ctrl->bmHint);  
  516.     data[2] = ctrl->bFormatIndex;  
  517.     data[3] = ctrl->bFrameIndex;  
  518.     *(__le32 *)&data[4] = cpu_to_le32(ctrl->dwFrameInterval);  
  519.     *(__le16 *)&data[8] = cpu_to_le16(ctrl->wKeyFrameRate);  
  520.     *(__le16 *)&data[10] = cpu_to_le16(ctrl->wPFrameRate);  
  521.     *(__le16 *)&data[12] = cpu_to_le16(ctrl->wCompQuality);  
  522.     *(__le16 *)&data[14] = cpu_to_le16(ctrl->wCompWindowSize);  
  523.     *(__le16 *)&data[16] = cpu_to_le16(ctrl->wDelay);  
  524.     put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]);  
  525.     put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]);  
  526.   
  527.     if (size == 34) {  
  528.         put_unaligned_le32(ctrl->dwClockFrequency, &data[26]);  
  529.         data[30] = ctrl->bmFramingInfo;  
  530.         data[31] = ctrl->bPreferedVersion;  
  531.         data[32] = ctrl->bMinVersion;  
  532.         data[33] = ctrl->bMaxVersion;  
  533.     }  
  534.   
  535.     pipe = (SET_CUR & 0x80) ? usb_rcvctrlpipe(myuvc_udev, 0)  
  536.                   : usb_sndctrlpipe(myuvc_udev, 0);  
  537.     type |= (SET_CUR & 0x80) ? USB_DIR_IN : USB_DIR_OUT;  
  538.   
  539.     ret = usb_control_msg(myuvc_udev, pipe, SET_CUR, type, VS_COMMIT_CONTROL << 8,  
  540.             0 << 8 | myuvc_streaming_intf, data, size, 5000);  
  541.   
  542.     kfree(data);  
  543.       
  544.     return (ret < 0) ? ret : 0;  
  545.       
  546. }  
  547.   
  548. static void myuvc_uninit_urbs(void)  
  549. {  
  550.     int i;  
  551.     for (i = 0; i < MYUVC_URBS; ++i) {  
  552.         if (myuvc_queue.urb_buffer[i])  
  553.         {  
  554.             usb_buffer_free(myuvc_udev, myuvc_queue.urb_size, myuvc_queue.urb_buffer[i], myuvc_queue.urb_dma[i]);  
  555.             myuvc_queue.urb_buffer[i] = NULL;  
  556.         }  
  557.   
  558.         if (myuvc_queue.urb[i])  
  559.         {  
  560.             usb_free_urb(myuvc_queue.urb[i]);  
  561.             myuvc_queue.urb[i] = NULL;  
  562.         }  
  563.     }  
  564. }  
  565.   
  566. /* 参考: uvc_video_complete / uvc_video_decode_isoc */  
  567. static void myuvc_video_complete(struct urb *urb)  
  568. {  
  569.     u8 *src;  
  570.     u8 *dest;  
  571.     int ret, i;  
  572.     int len;  
  573.     int maxlen;  
  574.     int nbytes;  
  575.     struct myuvc_buffer *buf;  
  576.     static int fid;  
  577.     static int wake_cnt = 0;  
  578.   
  579.     // 要修改影像資料,必須先宣告一個特別型態的指標變數,才能正確存取記憶體中的資料  
  580.     unsigned char *point_mem;  
  581.     static unsigned char *mem_temp = NULL;  
  582.   
  583.     // 初始化暫存用的記憶體位置  
  584.     static unsigned int nArrayTemp_Size = 1000;  
  585.   
  586.     u8* mem;  
  587.     int data_len;  
  588.       
  589.     switch (urb->status) {  
  590.     case 0:  
  591.         break;  
  592.   
  593.     default:  
  594.         printk("Non-zero status (%d) in video "  
  595.             "completion handler.\n", urb->status);  
  596.         return;  
  597.     }  
  598.   
  599.     /* 如果irqqueue队列不空的话,从irqqueue队列中取出第1个缓冲区,用于存放urb的数据 */  
  600.     if (!list_empty(&myuvc_queue.irqqueue))  
  601.     {  
  602.         buf = list_first_entry(&myuvc_queue.irqqueue, struct myuvc_buffer, irq);  
  603.     }  
  604.     else  
  605.     {  
  606.         /* 什么情况下会导致irqqueue队列为空呢? 
  607.          * usb设备填充数据太快,但是应用程序没能及时处理 
  608.          */  
  609.         buf = NULL;  
  610.     }  
  611.       
  612.     /* 开始处理urb中的每一个小包 */  
  613.     for (i = 0; i < urb->number_of_packets; ++i) {  
  614.         if (urb->iso_frame_desc[i].status < 0) {  
  615.             //printk("USB isochronous frame "  
  616.             //  "lost (%d).\n", urb->iso_frame_desc[i].status);  
  617.             continue;  
  618.         }  
  619.   
  620.         src  = urb->transfer_buffer + urb->iso_frame_desc[i].offset;  
  621.   
  622.   
  623.         len = urb->iso_frame_desc[i].actual_length;  
  624.         /* 判断数据是否有效 */  
  625.         /* URB数据含义: 
  626.          * data[0] : 头部长度 
  627.          * data[1] : 错误状态 
  628.          */  
  629.         if (len < 2 || src[0] < 2 || src[0] > len)  
  630.             continue;  
  631.           
  632.         /* Skip payloads marked with the error bit ("error frames"). */  
  633.         if (src[1] & UVC_STREAM_ERR) {  
  634.             //printk("Dropping payload (error bit set).\n");  
  635.             continue;  
  636.         }  
  637.   
  638.         /* 根据ip2970/ip2977厂家提供的修改手册,如果想要支持ip2970/ip2977就必须 
  639.          * 添加如下代码  
  640.          */  
  641.         if (myuvc_udev->descriptor.idVendor == 0x1B3B)  
  642.         {  
  643.             if ( len >= 16 ) // have data in buffer  
  644.             {  
  645.                 // 資料必須從data[12]開始判斷,是因為前面的資料是封包專用  
  646.                 if ( (src[12]==0xFF && src[13]==0xD8 && src[14]==0xFF) ||  
  647.                     (src[12]==0xD8 && src[13]==0xFF && src[14]==0xC4))   
  648.                 {  
  649.                     if(last_fid)  
  650.                         fid &= ~UVC_STREAM_FID;  
  651.                     else  
  652.                         fid |= UVC_STREAM_FID;  
  653.                 }  
  654.             }  
  655.         }  
  656.         else  
  657.         {  
  658.             fid = src[1] & UVC_STREAM_FID;  
  659.         }  
  660.   
  661.         /* Store the payload FID bit and return immediately when the buffer is 
  662.          * NULL. 
  663.          */  
  664.         if (buf == NULL) {  
  665.             last_fid = fid;  
  666.             continue;  
  667.         }  
  668.   
  669.         /* 根据FID判断当前帧的数据是否结束 */  
  670.         /* VIDEOBUF_ACTIVE表示正在接收数据,buf->state!= VIDEOBUF_ACTIVE, 表示"之前还未接收数据",  
  671.          * 因此就是说即将接收数据 
  672.         */    
  673.         if (buf->state != VIDEOBUF_ACTIVE) {           
  674.             if (fid == last_fid) {  
  675.                 /* 既然你刚开始接收数据, 那么FID应该是一个新的值,不应该等于原来的last_fid */  
  676.                 continue;  
  677.             }  
  678.   
  679.             /* 表示开始接收第1个数据 */  
  680.             buf->state = VIDEOBUF_ACTIVE;  
  681.         }  
  682.   
  683.         /* fid表示当前的fid。 
  684.          * fid != last_fid 表示开始新一帧了,当前的buffer已经被填充完了。 
  685.          * 这个地方是从fid来判断是否一帧数据已经结束,下面还有从数据是否填充不下了来 
  686.          * 强制认为一帧数据已经结束 
  687.          */  
  688.         if (fid != last_fid && buf->buf.bytesused != 0) {  
  689.             buf->state = VIDEOBUF_DONE;  
  690.   
  691.             /* 从队列中删除, 唤醒进程 */  
  692.             list_del(&buf->irq);  
  693.             wake_up(&buf->wait);  
  694.   
  695.             mem = myuvc_queue.mem + buf->buf.m.offset;  
  696.             data_len = buf->buf.bytesused;  
  697.             //printk("wake_up %d : %s %d, start data: %02x %02x, end data: %02x %02x", wake_cnt++, __FUNCTION__, __LINE__, mem[0], mem[1], mem[data_len - 2], mem[data_len - 1]);  
  698.   
  699.             /* 取出下一个buf */  
  700.             if (!list_empty(&myuvc_queue.irqqueue))  
  701.             {  
  702.                 buf = list_first_entry(&myuvc_queue.irqqueue, struct myuvc_buffer, irq);  
  703.             }  
  704.             else  
  705.             {  
  706.                 buf = NULL;  
  707.             }  
  708.             continue;  
  709.         }  
  710.         last_fid = fid;  
  711.   
  712.         dest = myuvc_queue.mem + buf->buf.m.offset + buf->buf.bytesused;  
  713.   
  714.         /* 除去头部后的数据长度 */  
  715.         len -= src[0];  
  716.   
  717.         /* 缓冲区最多还能存多少数据 */  
  718.         maxlen = buf->buf.length - buf->buf.bytesused;  
  719.         nbytes = min(len, maxlen);  
  720.   
  721.         /* 复制数据 */  
  722.         memcpy(dest, src + src[0], nbytes);  
  723.         buf->buf.bytesused += nbytes;  
  724.   
  725.         /* ip2970/ip2977 */  
  726.         if (myuvc_udev->descriptor.idVendor == 0x1B3B)  
  727.         {  
  728.             if(mem_temp == NULL) {  
  729.                 mem_temp = kmalloc(nArrayTemp_Size, GFP_KERNEL);  
  730.             }  
  731.             else if(nArrayTemp_Size <= nbytes){ // 當收到的資料長度大於上一次的資料長度,則重新分配所需的空間+  
  732.                 kfree(mem_temp);  
  733.                 nArrayTemp_Size += 500;  
  734.                 mem_temp = kmalloc(nArrayTemp_Size, GFP_KERNEL);  
  735.             }  
  736.             memset(mem_temp, 0x00, nArrayTemp_Size);  
  737.               
  738.             // 指向資料儲存的記憶體位置  
  739.             point_mem = (unsigned char *)dest;  
  740.             if( *(point_mem) == 0xD8 && *(point_mem + 1) == 0xFF && *(point_mem + 2) == 0xC4){  
  741.                 memcpy( mem_temp + 1, point_mem, nbytes);  
  742.                 mem_temp[0] = 0xFF;  
  743.                 memcpy(point_mem, mem_temp, nbytes + 1);  
  744.             }  
  745.         }  
  746.   
  747.   
  748.   
  749.         /* 判断一帧数据是否已经全部接收到  
  750.          * 如果数据已经满了,就强制认为已经结束了 
  751.          */  
  752.         if (len > maxlen) {  
  753.             buf->state = VIDEOBUF_DONE;  
  754.         }  
  755.           
  756.         /* Mark the buffer as done if the EOF marker is set. */  
  757.         if (src[1] & UVC_STREAM_EOF && buf->buf.bytesused != 0) {  
  758.            // printk("Frame complete (EOF found).\n");  
  759.             //if (len == 0)  
  760.            //     printk("EOF in empty payload.\n");  
  761.             buf->state = VIDEOBUF_DONE;  
  762.         }  
  763.   
  764.         /* 当接收完一帧数据,  
  765.          * 从irqqueue中删除这个缓冲区 
  766.          * 唤醒等待数据的进程  
  767.          */  
  768.         if (buf->state == VIDEOBUF_DONE ||  
  769.             buf->state == VIDEOBUF_ERROR)  
  770.         {  
  771.             list_del(&buf->irq);  
  772.             wake_up(&buf->wait);  
  773.   
  774.             mem = myuvc_queue.mem + buf->buf.m.offset;  
  775.             data_len = buf->buf.bytesused;  
  776.             //printk("wake_up %d : %s %d, start data: %02x %02x, end data: %02x %02x", wake_cnt++, __FUNCTION__, __LINE__, mem[0], mem[1], mem[data_len - 2], mem[data_len - 1]);  
  777.               
  778.             /* 取出下一个buf */  
  779.             if (!list_empty(&myuvc_queue.irqqueue))  
  780.             {  
  781.                 buf = list_first_entry(&myuvc_queue.irqqueue, struct myuvc_buffer, irq);  
  782.             }  
  783.             else  
  784.             {  
  785.                 buf = NULL;  
  786.             }  
  787.         }  
  788.   
  789.     }  
  790.   
  791.   
  792.     /* 再次提交URB */  
  793.     if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {  
  794.         printk("Failed to resubmit video URB (%d).\n", ret);  
  795.     }  
  796. }  
  797.   
  798. /* 参考: uvc_init_video_isoc */  
  799. static int myuvc_alloc_init_urbs(void)  
  800. {  
  801.     u16 psize;  
  802.     u32 size;  
  803.     int npackets;  
  804.     int i;  
  805.     int j;  
  806.   
  807.     struct urb *urb;  
  808.   
  809.     psize = wMaxPacketSize; /* 实时传输端点一次能传输的最大字节数 */  
  810.     size  = myuvc_params.dwMaxVideoFrameSize;  /* 一帧数据的最大长度 */  
  811.     npackets = DIV_ROUND_UP(size, psize);  
  812.     if (npackets > 32)  
  813.         npackets = 32;  
  814.   
  815.     size = myuvc_queue.urb_size = psize * npackets;  
  816.       
  817.     for (i = 0; i < MYUVC_URBS; ++i) {  
  818.         /* 1. 分配usb_buffers */  
  819.           
  820.         myuvc_queue.urb_buffer[i] = usb_buffer_alloc(  
  821.             myuvc_udev, size,  
  822.             GFP_KERNEL | __GFP_NOWARN, &myuvc_queue.urb_dma[i]);  
  823.   
  824.         /* 2. 分配urb */  
  825.         myuvc_queue.urb[i] = usb_alloc_urb(npackets, GFP_KERNEL);  
  826.   
  827.         if (!myuvc_queue.urb_buffer[i] || !myuvc_queue.urb[i])  
  828.         {  
  829.             myuvc_uninit_urbs();  
  830.             return -ENOMEM;  
  831.         }  
  832.   
  833.     }  
  834.   
  835.   
  836.     /* 3. 设置urb */  
  837.     for (i = 0; i < MYUVC_URBS; ++i) {  
  838.         urb = myuvc_queue.urb[i];  
  839.           
  840.         urb->dev = myuvc_udev;  
  841.         urb->context = NULL;  
  842.         urb->pipe = usb_rcvisocpipe(myuvc_udev,myuvc_bEndpointAddress);  
  843.         urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;  
  844.         urb->interval = 1;  
  845.         urb->transfer_buffer = myuvc_queue.urb_buffer[i];  
  846.         urb->transfer_dma = myuvc_queue.urb_dma[i];  
  847.         urb->complete = myuvc_video_complete;  
  848.         urb->number_of_packets = npackets;  
  849.         urb->transfer_buffer_length = size;  
  850.           
  851.         for (j = 0; j < npackets; ++j) {  
  852.             urb->iso_frame_desc[j].offset = j * psize;  
  853.             urb->iso_frame_desc[j].length = psize;  
  854.         }  
  855.       
  856.     }  
  857.       
  858.     return 0;  
  859. }  
  860.   
  861. /* A11 启动传输  
  862.  * 参考: uvc_video_enable(video, 1): 
  863.  *           uvc_commit_video 
  864.  *           uvc_init_video 
  865.  */  
  866. static int myuvc_vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)  
  867. {  
  868.     int ret;  
  869.       
  870.     /* 1. 向USB摄像头设置参数: 比如使用哪个format, 使用这个format下的哪个frame(分辨率)  
  871.      * 参考: uvc_set_video_ctrl / uvc_get_video_ctrl 
  872.      * 1.1 根据一个结构体uvc_streaming_control设置数据包: 可以手工设置,也可以读出后再修改 
  873.      * 1.2 调用usb_control_msg发出数据包 
  874.      */  
  875.   
  876.     /* a. 测试参数 */  
  877.     ret = myuvc_try_streaming_params(&myuvc_params);  
  878.     printk("myuvc_try_streaming_params ret = %d\n", ret);  
  879.   
  880.     /* b. 取出参数 */  
  881.     ret = myuvc_get_streaming_params(&myuvc_params);  
  882.     printk("myuvc_get_streaming_params ret = %d\n", ret);  
  883.   
  884.     /* c. 设置参数 */  
  885.     ret = myuvc_set_streaming_params(&myuvc_params);  
  886.     printk("myuvc_set_streaming_params ret = %d\n", ret);  
  887.       
  888.     myuvc_print_streaming_params(&myuvc_params);  
  889.   
  890.     /* d. 设置VideoStreaming Interface所使用的setting 
  891.      * d.1 从myuvc_params确定带宽 
  892.      * d.2 根据setting的endpoint能传输的wMaxPacketSize 
  893.      *     找到能满足该带宽的setting 
  894.      */  
  895.     /* 手工确定: 
  896.      * bandwidth = myuvc_params.dwMaxPayloadTransferSize = 800 
  897.      * 观察lsusb -v -d 0x1e4e:的结果: 
  898.      *                wMaxPacketSize     0x0320  1x 800 bytes 
  899.      * bAlternateSetting       5 
  900.      */  
  901.     usb_set_interface(myuvc_udev, myuvc_streaming_intf, myuvc_streaming_bAlternateSetting);  
  902.       
  903.     /* 2. 分配设置URB */  
  904.     ret = myuvc_alloc_init_urbs();  
  905.     if (ret)  
  906.         printk("myuvc_alloc_init_urbs err : ret = %d\n", ret);  
  907.   
  908.     /* 3. 提交URB以接收数据 */  
  909.     for (i = 0; i < MYUVC_URBS; ++i) {  
  910.         if ((ret = usb_submit_urb(myuvc_queue.urb[i], GFP_KERNEL)) < 0) {  
  911.             printk("Failed to submit URB %u (%d).\n", i, ret);  
  912.             myuvc_uninit_urbs();  
  913.             return ret;  
  914.         }  
  915.     }  
  916.       
  917.     return 0;  
  918. }  
  919.   
  920. /* A13 APP通过poll/select确定有数据后, 把缓存从队列中取出来 
  921.  * 参考: uvc_dequeue_buffer 
  922.  */  
  923. static int myuvc_vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *v4l2_buf)  
  924. {  
  925.     /* APP发现数据就绪后, 从mainqueue里取出这个buffer */  
  926.   
  927.     struct myuvc_buffer *buf;  
  928.     int ret = 0;  
  929.   
  930.     if (list_empty(&myuvc_queue.mainqueue)) {  
  931.         ret = -EINVAL;  
  932.         goto done;  
  933.     }  
  934.       
  935.     buf = list_first_entry(&myuvc_queue.mainqueue, struct myuvc_buffer, stream);  
  936.   
  937.     switch (buf->state) {  
  938.     case VIDEOBUF_ERROR:  
  939.         ret = -EIO;  
  940.     case VIDEOBUF_DONE:  
  941.         buf->state = VIDEOBUF_IDLE;  
  942.         break;  
  943.   
  944.     case VIDEOBUF_IDLE:  
  945.     case VIDEOBUF_QUEUED:  
  946.     case VIDEOBUF_ACTIVE:  
  947.     default:  
  948.         ret = -EINVAL;  
  949.         goto done;  
  950.     }  
  951.   
  952.     list_del(&buf->stream);  
  953.     memcpy(v4l2_buf, &buf->buf, sizeof *v4l2_buf);  
  954.       
  955. done:  
  956.     return ret;  
  957. }  
  958.   
  959. /* 
  960.  * A14 之前已经通过mmap映射了缓存, APP可以直接读数据 
  961.  * A15 再次调用myuvc_vidioc_qbuf把缓存放入队列 
  962.  * A16 poll... 
  963.  */  
  964.   
  965. /* A17 停止  
  966.  * 参考 : uvc_video_enable(video, 0) 
  967.  */  
  968. static int myuvc_vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type t)  
  969. {  
  970.     struct urb *urb;  
  971.     unsigned int i;  
  972.   
  973.     /* 1. kill URB */  
  974.     for (i = 0; i < MYUVC_URBS; ++i) {  
  975.         if ((urb = myuvc_queue.urb[i]) == NULL)  
  976.             continue;  
  977.         usb_kill_urb(urb);  
  978.     }  
  979.   
  980.     /* 2. free URB */  
  981.     myuvc_uninit_urbs();  
  982.   
  983.     /* 3. 设置VideoStreaming Interface为setting 0 */  
  984.     usb_set_interface(myuvc_udev, myuvc_streaming_intf, 0);  
  985.       
  986.     return 0;  
  987. }  
  988.   
  989.     /* Control handling */  
  990.   
  991.   
  992. /* Extract the bit string specified by mapping->offset and mapping->size 
  993.  * from the little-endian data stored at 'data' and return the result as 
  994.  * a signed 32bit integer. Sign extension will be performed if the mapping 
  995.  * references a signed data type. 
  996.  */  
  997. static __s32 myuvc_get_le_value(const __u8 *data)  
  998. {  
  999.     int bits = 16;  
  1000.     int offset = 0;  
  1001.     __s32 value = 0;  
  1002.     __u8 mask;  
  1003.   
  1004.     data += offset / 8;  
  1005.     offset &= 7;  
  1006.     mask = ((1LL << bits) - 1) << offset;  
  1007.   
  1008.     for (; bits > 0; data++) {  
  1009.         __u8 byte = *data & mask;  
  1010.         value |= offset > 0 ? (byte >> offset) : (byte << (-offset));  
  1011.         bits -= 8 - (offset > 0 ? offset : 0);  
  1012.         offset -= 8;  
  1013.         mask = (1 << bits) - 1;  
  1014.     }  
  1015.   
  1016.     /* Sign-extend the value if needed. */  
  1017.     value |= -(value & (1 << (16 - 1)));  
  1018.   
  1019.     return value;  
  1020. }  
  1021.   
  1022. /* Set the bit string specified by mapping->offset and mapping->size 
  1023.  * in the little-endian data stored at 'data' to the value 'value'. 
  1024.  */  
  1025. static void myuvc_set_le_value(__s32 value, __u8 *data)  
  1026. {  
  1027.     int bits = 16;  
  1028.     int offset = 0;  
  1029.     __u8 mask;  
  1030.   
  1031.     data += offset / 8;  
  1032.     offset &= 7;  
  1033.   
  1034.     for (; bits > 0; data++) {  
  1035.         mask = ((1LL << bits) - 1) << offset;  
  1036.         *data = (*data & ~mask) | ((value << offset) & mask);  
  1037.         value >>= offset ? offset : 8;  
  1038.         bits -= 8 - offset;  
  1039.         offset = 0;  
  1040.     }  
  1041. }  
  1042.       
  1043.   
  1044.   
  1045. /* 参考:uvc_query_v4l2_ctrl */      
  1046. int myuvc_vidioc_queryctrl (struct file *file, void *fh,  
  1047.                 struct v4l2_queryctrl *ctrl)  
  1048. {  
  1049.     __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;  
  1050.     unsigned int pipe;  
  1051.     int ret;  
  1052.     u8 data[2];  
  1053.   
  1054.     if (ctrl->id != V4L2_CID_BRIGHTNESS)  
  1055.         return -EINVAL;  
  1056.       
  1057.     memset(ctrl, 0, sizeof *ctrl);  
  1058.     ctrl->id   = V4L2_CID_BRIGHTNESS;  
  1059.     ctrl->type = V4L2_CTRL_TYPE_INTEGER;  
  1060.     strcpy(ctrl->name, "MyUVC_BRIGHTNESS");  
  1061.     ctrl->flags = 0;  
  1062.   
  1063.     pipe = usb_rcvctrlpipe(myuvc_udev, 0);  
  1064.     type |= USB_DIR_IN;  
  1065.   
  1066.     /* 发起USB传输确定这些值 */  
  1067.     ret = usb_control_msg(myuvc_udev, pipe, GET_MIN, type, PU_BRIGHTNESS_CONTROL << 8,  
  1068.             ProcessingUnitID << 8 | myuvc_control_intf, data, 2, 5000);  
  1069.     if (ret != 2)  
  1070.         return -EIO;  
  1071.     ctrl->minimum = myuvc_get_le_value(data);    /* Note signedness */  
  1072.   
  1073.   
  1074.     ret = usb_control_msg(myuvc_udev, pipe, GET_MAX, type,  PU_BRIGHTNESS_CONTROL << 8,  
  1075.             ProcessingUnitID << 8 | myuvc_control_intf, data, 2, 5000);  
  1076.     if (ret != 2)  
  1077.         return -EIO;  
  1078.     ctrl->maximum = myuvc_get_le_value(data);    /* Note signedness */  
  1079.   
  1080.     ret = usb_control_msg(myuvc_udev, pipe, GET_RES, type, PU_BRIGHTNESS_CONTROL << 8,  
  1081.              ProcessingUnitID << 8 | myuvc_control_intf, data, 2, 5000);  
  1082.     if (ret != 2)  
  1083.         return -EIO;  
  1084.     ctrl->step = myuvc_get_le_value(data);   /* Note signedness */  
  1085.   
  1086.     ret = usb_control_msg(myuvc_udev, pipe, GET_DEF, type, PU_BRIGHTNESS_CONTROL << 8,  
  1087.             ProcessingUnitID << 8 | myuvc_control_intf, data, 2, 5000);  
  1088.     if (ret != 2)  
  1089.         return -EIO;  
  1090.     ctrl->default_value = myuvc_get_le_value(data);  /* Note signedness */  
  1091.   
  1092.     printk("Brightness: min =%d, max = %d, step = %d, default = %d\n", ctrl->minimum, ctrl->maximum, ctrl->step, ctrl->default_value);  
  1093.       
  1094.     return 0;  
  1095. }  
  1096.   
  1097. /* 参考 : uvc_ctrl_get */  
  1098. int myuvc_vidioc_g_ctrl (struct file *file, void *fh,  
  1099.                 struct v4l2_control *ctrl)  
  1100. {  
  1101.     __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;  
  1102.     unsigned int pipe;  
  1103.     int ret;  
  1104.     u8 data[2];  
  1105.       
  1106.     if (ctrl->id != V4L2_CID_BRIGHTNESS)  
  1107.         return -EINVAL;  
  1108.   
  1109.     pipe = usb_rcvctrlpipe(myuvc_udev, 0);  
  1110.     type |= USB_DIR_IN;  
  1111.   
  1112.     ret = usb_control_msg(myuvc_udev, pipe, GET_CUR, type, PU_BRIGHTNESS_CONTROL << 8,  
  1113.             ProcessingUnitID << 8 | myuvc_control_intf, data, 2, 5000);  
  1114.     if (ret != 2)  
  1115.         return -EIO;  
  1116.     ctrl->value = myuvc_get_le_value(data);  /* Note signedness */  
  1117.       
  1118.     return 0;  
  1119. }  
  1120.   
  1121. /* 参考: uvc_ctrl_set/uvc_ctrl_commit */  
  1122. int myuvc_vidioc_s_ctrl (struct file *file, void *fh,  
  1123.                 struct v4l2_control *ctrl)  
  1124. {  
  1125.     __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;  
  1126.     unsigned int pipe;  
  1127.     int ret;  
  1128.     u8 data[2];  
  1129.       
  1130.     if (ctrl->id != V4L2_CID_BRIGHTNESS)  
  1131.         return -EINVAL;  
  1132.   
  1133.     myuvc_set_le_value(ctrl->value, data);  
  1134.   
  1135.     pipe = usb_sndctrlpipe(myuvc_udev, 0);  
  1136.     type |= USB_DIR_OUT;  
  1137.   
  1138.     ret = usb_control_msg(myuvc_udev, pipe, SET_CUR, type, PU_BRIGHTNESS_CONTROL << 8,  
  1139.             ProcessingUnitID  << 8 | myuvc_control_intf, data, 2, 5000);  
  1140.     if (ret != 2)  
  1141.         return -EIO;  
  1142.       
  1143.     return 0;  
  1144. }  
  1145.   
  1146.   
  1147.   
  1148. static const struct v4l2_ioctl_ops myuvc_ioctl_ops = {  
  1149.         // 表示它是一个摄像头设备  
  1150.         .vidioc_querycap      = myuvc_vidioc_querycap,  
  1151.   
  1152.         /* 用于列举、获得、测试、设置摄像头的数据的格式 */  
  1153.         .vidioc_enum_fmt_vid_cap  = myuvc_vidioc_enum_fmt_vid_cap,  
  1154.         .vidioc_g_fmt_vid_cap     = myuvc_vidioc_g_fmt_vid_cap,  
  1155.         .vidioc_try_fmt_vid_cap   = myuvc_vidioc_try_fmt_vid_cap,  
  1156.         .vidioc_s_fmt_vid_cap     = myuvc_vidioc_s_fmt_vid_cap,  
  1157.           
  1158.         /* 缓冲区操作: 申请/查询/放入队列/取出队列 */  
  1159.         .vidioc_reqbufs       = myuvc_vidioc_reqbufs,  
  1160.         .vidioc_querybuf      = myuvc_vidioc_querybuf,  
  1161.         .vidioc_qbuf          = myuvc_vidioc_qbuf,  
  1162.         .vidioc_dqbuf         = myuvc_vidioc_dqbuf,  
  1163.   
  1164.         /* 查询/获得/设置属性 */  
  1165.         .vidioc_queryctrl     = myuvc_vidioc_queryctrl,  
  1166.         .vidioc_g_ctrl        = myuvc_vidioc_g_ctrl,  
  1167.         .vidioc_s_ctrl        = myuvc_vidioc_s_ctrl,  
  1168.           
  1169.         // 启动/停止  
  1170.         .vidioc_streamon      = myuvc_vidioc_streamon,  
  1171.         .vidioc_streamoff     = myuvc_vidioc_streamoff,     
  1172. };  
  1173.   
  1174. /* A1 */  
  1175. static int myuvc_open(struct file *file)  
  1176. {  
  1177.     return 0;  
  1178. }  
  1179.   
  1180. static void myuvc_vm_open(struct vm_area_struct *vma)  
  1181. {  
  1182.     struct myuvc_buffer *buffer = vma->vm_private_data;  
  1183.     buffer->vma_use_count++;  
  1184. }  
  1185.   
  1186. static void myuvc_vm_close(struct vm_area_struct *vma)  
  1187. {  
  1188.     struct myuvc_buffer *buffer = vma->vm_private_data;  
  1189.     buffer->vma_use_count--;  
  1190. }  
  1191.   
  1192. static struct vm_operations_struct myuvc_vm_ops = {  
  1193.     .open       = myuvc_vm_open,  
  1194.     .close      = myuvc_vm_close,  
  1195. };  
  1196.   
  1197.   
  1198. /* A9 把缓存映射到APP的空间,以后APP就可以直接操作这块缓存  
  1199.  * 参考: uvc_v4l2_mmap 
  1200.  */  
  1201. static int myuvc_mmap(struct file *file, struct vm_area_struct *vma)  
  1202. {  
  1203.     struct myuvc_buffer *buffer;  
  1204.     struct page *page;  
  1205.     unsigned long addr, start, size;  
  1206.     unsigned int i;  
  1207.     int ret = 0;  
  1208.   
  1209.     start = vma->vm_start;  
  1210.     size = vma->vm_end - vma->vm_start;  
  1211.   
  1212.     /* 应用程序调用mmap函数时, 会传入offset参数 
  1213.      * 根据这个offset找出指定的缓冲区 
  1214.      */  
  1215.     for (i = 0; i < myuvc_queue.count; ++i) {  
  1216.         buffer = &myuvc_queue.buffer[i];  
  1217.         if ((buffer->buf.m.offset >> PAGE_SHIFT) == vma->vm_pgoff)  
  1218.             break;  
  1219.     }  
  1220.   
  1221.     if (i == myuvc_queue.count || size != myuvc_queue.buf_size) {  
  1222.         ret = -EINVAL;  
  1223.         goto done;  
  1224.     }  
  1225.   
  1226.     /* 
  1227.      * VM_IO marks the area as being an mmaped region for I/O to a 
  1228.      * device. It also prevents the region from being core dumped. 
  1229.      */  
  1230.     vma->vm_flags |= VM_IO;  
  1231.   
  1232.     /* 根据虚拟地址找到缓冲区对应的page构体 */  
  1233.     addr = (unsigned long)myuvc_queue.mem + buffer->buf.m.offset;  
  1234.     while (size > 0) {  
  1235.         page = vmalloc_to_page((void *)addr);  
  1236.   
  1237.         /* 把page和APP传入的虚拟地址挂构 */  
  1238.         if ((ret = vm_insert_page(vma, start, page)) < 0)  
  1239.             goto done;  
  1240.   
  1241.         start += PAGE_SIZE;  
  1242.         addr += PAGE_SIZE;  
  1243.         size -= PAGE_SIZE;  
  1244.     }  
  1245.   
  1246.     vma->vm_ops = &myuvc_vm_ops;  
  1247.     vma->vm_private_data = buffer;  
  1248.     myuvc_vm_open(vma);  
  1249.   
  1250. done:  
  1251.     return ret;  
  1252. }  
  1253.   
  1254. /* A12 APP调用POLL/select来确定缓存是否就绪(有数据)  
  1255.  * 参考 : uvc_v4l2_poll 
  1256.  */  
  1257. static unsigned int myuvc_poll(struct file *file, struct poll_table_struct *wait)  
  1258. {  
  1259.     struct myuvc_buffer *buf;  
  1260.     unsigned int mask = 0;  
  1261.       
  1262.     /* 从mainqueuq中取出第1个缓冲区 */  
  1263.   
  1264.     /*判断它的状态, 如果未就绪, 休眠 */  
  1265.   
  1266.     if (list_empty(&myuvc_queue.mainqueue)) {  
  1267.         mask |= POLLERR;  
  1268.         goto done;  
  1269.     }  
  1270.       
  1271.     buf = list_first_entry(&myuvc_queue.mainqueue, struct myuvc_buffer, stream);  
  1272.   
  1273.     poll_wait(file, &buf->wait, wait);  
  1274.     if (buf->state == VIDEOBUF_DONE ||  
  1275.         buf->state == VIDEOBUF_ERROR)  
  1276.         mask |= POLLIN | POLLRDNORM;  
  1277.       
  1278. done:  
  1279.     return mask;  
  1280. }  
  1281.   
  1282. /* A18 关闭 */  
  1283. static int myuvc_vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type t);  
  1284. static int myuvc_close(struct file *file)  
  1285. {  
  1286.     myuvc_vidioc_streamoff(NULL, NULL, 0);  
  1287.     return 0;  
  1288. }  
  1289.   
  1290. static const struct v4l2_file_operations myuvc_fops = {  
  1291.     .owner      = THIS_MODULE,  
  1292.     .open       = myuvc_open,  
  1293.     .release    = myuvc_close,  
  1294.     .mmap       = myuvc_mmap,  
  1295.     .ioctl      = video_ioctl2, /* V4L2 ioctl handler */  
  1296.     .poll       = myuvc_poll,  
  1297. };  
  1298.   
  1299. static void myuvc_release(struct video_device *vdev)  
  1300. {  
  1301. }  
  1302.   
  1303.   
  1304. static int myuvc_probe(struct usb_interface *intf,  
  1305.              const struct usb_device_id *id)  
  1306. {  
  1307.     static int cnt = 0;  
  1308.     struct usb_device *dev = interface_to_usbdev(intf);  
  1309.     int ret;  
  1310.   
  1311.     myuvc_udev = dev;  
  1312.   
  1313.     printk("myuvc_probe : cnt = %d\n", cnt++);  
  1314.   
  1315.     if (cnt == 1)  
  1316.     {  
  1317.         myuvc_control_intf = intf->cur_altsetting->desc.bInterfaceNumber;  
  1318.     }  
  1319.     else if (cnt == 2)  
  1320.     {  
  1321.         myuvc_streaming_intf = intf->cur_altsetting->desc.bInterfaceNumber;  
  1322.     }  
  1323.   
  1324.     if (cnt == 2)  
  1325.     {  
  1326.         /* 1. 分配一个video_device结构体 */  
  1327.         myuvc_vdev = video_device_alloc();  
  1328.   
  1329.         /* 2. 设置 */  
  1330.         /* 2.1 */  
  1331.         myuvc_vdev->release = myuvc_release;  
  1332.           
  1333.         /* 2.2 */  
  1334.         myuvc_vdev->fops    = &myuvc_fops;  
  1335.           
  1336.         /* 2.3 */  
  1337.         myuvc_vdev->ioctl_ops = &myuvc_ioctl_ops;  
  1338.   
  1339.         /* 3. 注册 */  
  1340.         video_register_device(myuvc_vdev, VFL_TYPE_GRABBER, -1);  
  1341.   
  1342.         /* 为了确定带宽,使用哪一个setting */  
  1343.         /* a. 测试参数 */  
  1344.         ret = myuvc_try_streaming_params(&myuvc_params);  
  1345.         printk("myuvc_try_streaming_params ret = %d\n", ret);  
  1346.   
  1347.         /* b. 取出参数 */  
  1348.         ret = myuvc_get_streaming_params(&myuvc_params);  
  1349.         printk("myuvc_get_streaming_params ret = %d\n", ret);  
  1350.   
  1351.         /* c. 设置参数 */  
  1352.         ret = myuvc_set_streaming_params(&myuvc_params);  
  1353.         printk("myuvc_set_streaming_params ret = %d\n", ret);  
  1354.           
  1355.         myuvc_print_streaming_params(&myuvc_params);  
  1356.   
  1357.     }  
  1358.       
  1359.       
  1360.     return 0;  
  1361. }  
  1362.   
  1363. static void myuvc_disconnect(struct usb_interface *intf)  
  1364. {  
  1365.     static int cnt = 0;  
  1366.     printk("myuvc_disconnect : cnt = %d\n", cnt++);  
  1367.   
  1368.     if (cnt == 2)  
  1369.     {  
  1370.         video_unregister_device(myuvc_vdev);  
  1371.         video_device_release(myuvc_vdev);  
  1372.     }  
  1373.       
  1374. }  
  1375.   
  1376. static struct usb_device_id myuvc_ids[] = {  
  1377.     /* Generic USB Video Class */  
  1378.     { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },  /* VideoControl Interface */  
  1379.     { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 2, 0) },  /* VideoStreaming Interface */  
  1380.     {}  
  1381. };  
  1382.   
  1383. /* 1. 分配usb_driver */  
  1384. /* 2. 设置 */  
  1385. static struct usb_driver myuvc_driver = {  
  1386.     .name       = "myuvc",  
  1387.     .probe      = myuvc_probe,  
  1388.     .disconnect = myuvc_disconnect,  
  1389.     .id_table   = myuvc_ids,  
  1390. };  
  1391.   
  1392. static int myuvc_init(void)  
  1393. {  
  1394.     /* 3. 注册 */  
  1395.     usb_register(&myuvc_driver);  
  1396.     return 0;  
  1397. }  
  1398.   
  1399. static void myuvc_exit(void)  
  1400. {  
  1401.     usb_deregister(&myuvc_driver);  
  1402. }  
  1403.   
  1404. module_init(myuvc_init);  
  1405. module_exit(myuvc_exit);  
  1406.   
  1407. MODULE_LICENSE("GPL");  
  1408.   
  1409.   
  1410.   
  1411.   
  1412.   
  1413.   
  1414.   
  1415.   
  1416.  

你可能感兴趣的:(自己写的uvc驱动支持IP2977/ip2970)