Linux 下 USB摄像头驱动的实现
Linux下OTG支持USB摄像头
Linux下OTG⽀持USB摄像头⼀、USB和OTG简介1、USB不⽀持P2P(Peer to Peer)的传输,因此必需是Master/Slave2、⽐如U盘等⽆源设备插⼊电脑,电脑为host,U盘为device3.在没有电脑的情况下,两个device要传输,仍然需要满⾜Master/Slave架构,因此就有了OTG这个技术,使得device间可籍由协议(HNP,Host negotiation protocol)的沟通决定谁是host/device。
echo 1 > /sys/bus/platform/drivers/usb20_otg/force_usb_mode⼆、内核配置CONFIG_VIDEO_DEV=yCONFIG_VIDEO_V4L2_COMMON=yCONFIG_VIDEO_MEDIA=yCONFIG_USB_VIDEO_CLASS=yCONFIG_V4L_USB_DRIVERS=yCONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y三、验证编译内核,烧录。
这时内核有如下打印:[ 2468.668465] usb 1-1: new high-speed USB device number 3 using dwc2[ 2468.877999] uvcvideo: Found UVC 1.00 device USB2.0 UVC PC Camera (05e3:0510)[ 2468.911102] input: USB2.0 UVC PC Camera as /devices/platform/b/usb1/1-1/1-1:1.0/input/input2说明USB摄像头(UVC)驱动加载正常,接着在/dev/⽬录下将会⽣成对应的设备节点:/dev/videoX。
另,运⾏mjpg_streamer⼯具,在PC的浏览器可以看到摄像头实时图像。
基于嵌入式Linux的USB摄像头驱动开发
-1885-0引言USB 接口的普通摄像头由于价格低廉,性能较好,被应用在很多方面,比如可视电话、视频聊天和普通的视频监控。
Dihom (digital house monitor )就是摄像头在视频监控应用的一个例子。
摄像头由主控芯片和传感芯片组成。
主控芯片负责图像采集、压缩以及和主机的通信,通信协议一般采用USB1.1。
在我们的系统中,前端采用摄像头进行图像采集,摄像头连接到嵌入式模块,通过嵌入式模块上的无线网卡发送到远端。
嵌入式模块上采用linux 系统,因此我们需要在其上开发摄像头驱动。
我们使用的摄像头主控芯片型号为Sonix 公司的SN9C101,传感芯片是PAS106。
本文有重点地分析USB 协议驱动模块的分层结构,描述驱动程序的实现,介绍驱动的移植和测试工作。
1USB 协议USB 是一种分层总线结构,并且由一个主机来控制。
主机用主/从协议来和外部USB 设备通信。
USB 上的通信主要有两个方向,分别是主机到设备的下行方向和设备到主机的上行方向,不支持设备之间的直接通信。
每个USB 设备都会有一个或者多个逻辑连接点,称为端点。
每个端点有4种传输方式:控制传输、等时传输、成批传输和中断传输。
但是端点0缺省用来传送配置和控制信息。
同样性质的一组端点的组合叫做接口,而同种类型的接口组合称为配置。
不同配置用于改变整个设备的设置,比如电源消耗等。
每次只能有一个配置处于激活状态,一旦某个配置被激活,里面的接口和端点都可同时使用。
配置、接口和端点的信息存放在称为描述符的数据结构中。
2驱动模块层次结构USB 驱动程序由主控制器驱动、USB 核心驱动和USB 设备驱动程序组成。
通常操作系统本身带有前面两个驱动程序,而开发者只需完成USB 设备驱动的开发工作。
它们之间的层次关系如图1所示。
USB 核心子系统连接USB 设备驱动和主控制器驱动,它通过定义一些数据结构、宏和功能函数来抽象下层硬件设备。
USB 核心子系统为硬件处理供下层接口(lowerAPI ),同时通过上层接口(upperAPI )为USB 设备驱动提供服务。
基于Linux系统的USB摄像头视频播放实现
基于Linux系统的USB摄像头视频播放实现作者:陈亮裴海龙伍越来源:《现代电子技术》2008年第24期摘要:随着USB摄像头的普及以及Linux系统桌面应用的推广,基于Linux系统的视频播放程序设计有着现实应用的意义。
采用应用编程接口Video4Linux2所提供的数据结构、应用函数等,实现在Linux环境下USB摄像头图像数据的采集功能,并运用GTK库显示和播放其视频图像。
运用Linux标准库函数实现了数字图像的采集,对基于Linux内核的后续图像应用开发具有实用意义。
该程序采用Linux系统下新的视频编程接口和标准库函数,以模块化结构实现所需功能,具有良好移植性,基于此平台可方便加入图像处理等其他应用模块。
关键词:Video4Linux2;图像采集;摄像头;GTK;显示播放中图分类号:文献标识码:B文章编号:1004-373X(2008)24-093-03Programming for the Display of USB Camera on the Linux SystemCHEN Liang,PEI Hailong,WU Yue(College of Automation Science and Engineering,South China University ofTechnology,Guangzhou,510640,China)Abstract:With widely and rapidly using of USB camera and the popularization of Linux system desktop,it′s meaning to program for the display video on the Linux system.This paper makes use of the data configuration and the application function which belongs to Video4Linux2 application programming interface,capturing the video picture of the USB camera on the Linux system,and displaying it with GTK are implemented.Programming for the capture of image data on the standard library of Linux,it is usefully significative to exploit the application of image on the Linux kernel.This program uses new API of video and standard library on the Linux,the function is achieved by modularize structure so that it can be transplanted easily and added to other application module such as image processing.Keywords:Video4Linux2;image acquisition;camera;GTK;display所述程序基于Linux系统平台,结合Video4Linux2应用编程接口进行USB摄像头视频图像采集,并运用GTK函数库将视频图像实时显示播放,在此程序基础上可以方便地进行图像识别、视觉导航等应用的二次开发。
Linux下的硬件驱动——USB设备
Linux下的硬件驱动——USB设备什么是USB设备?USB即Universal Serial Bus,翻译过来就是通用串行总线。
它是一种规范化的、快速的、热插拔的串行输入/输出接口。
USB接口常被用于连接鼠标、键盘、打印机、扫描仪、音频设备、存储设备等外围设备。
Linux下的USB驱动在Linux系统中,每个USB设备都需要一个相应的驱动程序来驱动。
从Linux 2.4开始,内核提供了完整的USB设备支持。
对于每个USB设备,内核都会自动加载对应的驱动程序。
Linux下的USB设备驱动程序主要分为以下几个部分:USB核心驱动程序USB核心驱动程序是操作系统内核中处理USB设备的核心模块,负责与各种类型的USB设备进行通信,包括主机控制器、USB总线、USB设备等。
它与驱动程序和应用程序之间起到了桥梁的作用,为驱动程序提供了USB设备的基础支持。
USB设备驱动程序USB设备驱动程序是与特定USB设备相对应的驱动程序,为USB设备提供具体的读写功能和其他控制功能。
USB核心驱动程序和USB设备驱动程序之间的接口USB核心驱动程序和USB设备驱动程序之间的接口是指USB层和应用程序层之间的接口,负责传递各种USB操作的命令和数据。
如何编译一个USB设备驱动编译一个USB设备驱动程序需要按照以下步骤进行:步骤一:安装必要的软件包首先需要安装编译和调试USB设备驱动所需的软件包,包括编译工具链、内核源代码、内核头文件等。
sudo apt-get install build-essential linux-source linux-headers-`una me -r`步骤二:编写代码现在可以编写USB设备驱动程序的代码,此处不做详细介绍。
步骤三:编译代码在终端窗口中进入USB设备驱动程序所在的目录下,输入以下命令进行编译:make此命令将会编译USB设备驱动程序,并生成一个将驱动程序与内核进行连接的模块文件。
嵌入式Linux下USB摄像头驱动程序开发
[ 1 ] 李松福. 象棋 史话[ M] . 北京 : 人 民体育 出版社 , 1 9 8 1 .
[ 2 ] 郭志菊 , 李树新. 象 棋 文 化 熟 语语 义 解 构 [ J ] . 汉 字 文化 , 2 0 0 2 ( 2 ) . [ 3 ] 丁桂兴. 象棋 运 动 好 处 多[ J ] . 教育与管理, 2 0 0 9 ( 1 2 ) . [ 4 ] 刘 殿 中. 象棋 实战 指 南 / 象棋新编教程[ M] . 北京 : 北京体 育大 学出
版 社 , 2 0 0 3 .
本走法 、 经典棋局 、 大 师风 采 等 方 面 , 能 够 丰 富 人们 的 精 神
生活 , 普及传统文化 , 发 扬 中华 文 明 。 象棋多媒体学 习软件界 面美 观 , 多种 媒体 效果 丰富 , 交互性强 , 内容 易 扩 充 。适 用 于 不 同 年 龄 段 、 不 同就 学 阶 段、 不 同工 作 岗位 的 人 群 , 适用 范围广 。既可用 于象 棋 自
第1 2 卷 第1 期 2 0 l 3 年 1 月
软 件 导 刊
sO f t wa r e Gu i d e
VOI . 1 2N o. 1
嵌入 式 L i n u x下 US B摄 像 头 驱 动 程 序 开 发
郭 旭 , 冉 全
( 武汉 工程 大 学 计 算机科 学与工程 学院 , 湖北 武 汉 4 3 0 2 0 5 )
驱动程序 的实现。
可 以像 操 作 普 通 文 件 一 样 。设 备 驱 动 程 序 被 看 作 是 内 核 的构 成 部 分 , 其 完 成 的功 能 有 : 设 备 的初 始 化 和 释 放 、 数 据
从 内核 到硬 件 、 从硬 件读取数 据 、 接 收 应 用 程 序 传 送 给 设
香橙派OrangePiZero2开发板使用USB摄像头的方法(Linux镜像)
香橙派OrangePiZero2开发板使用USB摄像头的方法(Linux镜像)香橙派Zero2开发板采用全志H616 四核64位处理器,拥有512MB/1GB 内存可选,集成千兆以太网卡、蓝牙5.0+双频WiFi、USB2.0、TF卡槽等端口,并且,Micro-HDMI输出支持4K显示,支持安卓10、Ubuntu和Debian等操作系统。
前面给大家介绍过香橙派Zero2开发板在安卓系统下连接USB摄像头的操作步骤,本篇接着说明下在Linux下使用USB摄像头的方法:1. 首先将 USB 摄像头插入到 Orange Pi 开发板的 USB 接口中2. 然后通过 lsmod 命令可以看到内核自动加载了下面的模块3. 通过 v4l2-ctl(注意 v4l2 中的 l 是小写字母 l,不是数字 1)命令可以看到 USB 摄像头的设备节点信息为/dev/video04. 使用 fswebcam 测试 USB 摄像头a. 安装 fswebcam(图4-a)b. 安装完 fswebcam 后可以使用下面的命令来拍照a) -d 选项用于指定 USB 摄像头的设备节点b) --no-banner 用于去除照片的水印c) -r 选项用于指定照片的分辨率d) -S 选项用设置于跳过前面的帧数e) ./image.jpg 用于设置生成的照片的名字和路径(图4-e)c. 在服务器版的linux 系统中,拍完照后可以使用scp 命令将拍好的图片传到 Ubuntu PC 上镜像观看(图4-c)d. 在桌面版的 linux 系统中,可以通过 HDMI 显示器直接查看拍摄的图片5.使用 motion 测试 USB 摄像头a. 安装摄像头测试软件 motionb. 修改/etc/default/motion 的配置,将start_motion_daemon=no 修改为 start_motion_daemon=yesc. 修改/etc/motion/motion.conf 的配置d. 然后重启 motion 服务e. 使用 motion 前请先确保 Orange Pi 开发板能正常连接网络,然后通过 ifconfig 命令获取开发板的 IP 地址f. 然后在和开发板同一局域网的Ubuntu PC 或者Windows PC 或者手机的火狐浏览器中输入【开发板的 IP 地址:8081】就能看到摄像头输出的视频了(图5-f)。
LinuxUSB驱动开发实例(一)——USB摄像头驱动实现源码分析
LinuxUSB驱动开发实例(一)——USB摄像头驱动实现源码分析Spac5xx的实现是按照标准的USB VIDEO设备的驱动框架编写(其具体的驱动框架可参照/usr/src/linux/drivers/usb/usbvideo.c文件),整个源程序由四个主体部分组成:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)设备模块的初始化模块和卸载模块,上层软件接口模块,数据传输模块。
具体的模块分析如下:一、初始化设备模块该驱动采用了显式的模块初始化和消除函数,即调用module_init 来初始化一个模块,并在卸载时调用moduel-exit函数其具体实现如下:1、模块初始化:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)2、模块卸载:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)关键数据结构 USB驱动结构,即插即用功能的实现总结送免费学习资料(包含视频、技术学习路线图谱、文档等)用两个函数调用spca5xx_probe 和spca5xx_disconnect来支持USB设备的即插即用功能:a -- spca5xx_probe具体实现如下:static void * spca5xx_probe (struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id) { struct usb_interface_descriptor *interface; //USB设备接口描述符struct usb_spca50x *spca50x; //物理设备数据结构 int err_probe; int i; if (dev->descriptor.bNumConfigurations != 1) //探测设备是不是可配置goto nodevice; if (ifnum > 0) goto nodevice; interface = &dev->actconfig->interface[ifnum].altsetting[0];MOD_INC_USE_COUNT; interface = &intf->altsetting[0].desc; if (interface->bInterfaceNumber > 0) goto nodevice; if ((spca50x = kmalloc (sizeof (struct usb_spca50x), GFP_KERNEL)) == NULL) //分配物理地址空间{ err ('couldn't kmalloc spca50x struct'); goto error; } memset (spca50x, 0, sizeof (struct usb_spca50x)); spca50x->dev = dev; spca50x->iface = interface->bInterfaceNumber; if ((err_probe = spcaDetectCamera (spca50x)) < 0) //具体物理设备查找,匹配厂商号,设备号(在子程序中){ err (' Devices not found !! '); goto error; } PDEBUG (0, 'Camera type %s ', Plist[spca50x->cameratype].name) for (i = 0; i < SPCA50X_NUMFRAMES; i++) init_waitqueue_head (&spca50x->frame[i].wq); //初始化帧等待队列init_waitqueue_head (&spca50x->wq); //初始化驱动等待队列if (!spca50x_configure (spca50x)) //物理设备配置(主要完成传感器侦测和图形参数配置),主要思想是给控制寄存器写值,读回其返回值,以此判断具体的传感器型号{ spca50x->user = 0; init_MUTEX (&spca50x->lock); //信号量初始化init_MUTEX (&spca50x->buf_lock); spca50x->v4l_lock = SPIN_LOCK_UNLOCKED; spca50x->buf_state = BUF_NOT_ALLOCATED; } else { err ('Failed to configure camera'); goto error; } /* Init video stuff */ spca50x->vdev = video_device_alloc (); //设备控制块内存分配if (!spca50x->vdev) goto error; memcpy (spca50x->vdev, &spca50x_template, sizeof (spca50x_template)); //系统调用的挂接,在此将驱动实现的系统调用,挂到内核中video_set_drvdata (spca50x->vdev, spca50x); if (video_register_device (spca50x->vdev, VFL_TYPE_GRABBER, video_nr) < 0) { //video设备注册err ('video_register_device failed'); goto error; } spca50x->present = 1; if (spca50x->force_rgb) info ('data format set to RGB'); spca50x->task.sync = 0; spca50x->task.routine = auto_bh; spca50x->task.data = spca50x; spca50x->bh_requested = 0; MOD_DEC_USE_COUNT; //增加模块使用数 return spca50x; //返回数剧结构error://错误处理if (spca50x->vdev) { if (spca50x->vdev->minor == -1) video_device_release (spca50x->vdev); else video_unregister_device (spca50x->vdev); spca50x->vdev = NULL; } if (spca50x) { kfree (spca50x); spca50x = NULL; } MOD_DEC_USE_COUNT; return NULL; nodevice: return NULL; }b -- Spca5xx_disconnect 的具体实现如下:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)static void spca5xx_disconnect (struct usb_device *dev, void *ptr) {struct usb_spca50x *spca50x = (struct usb_spca50x *) ptr;int n; MOD_INC_USE_COUNT; //增加模块使用数if (!spca50x) return;down (&spca50x->lock); //减少信号量spca50x->present = 0; //驱动卸载置0for (n = 0; n < SPCA50X_NUMFRAMES; n++) //标示所有帧ABORTING状态{spca50x->frame[n].grabstate = FRAME_ABORTING;spca50x->curframe = -1; }for (n = 0; n < SPCA50X_NUMFRAMES; n++) //唤醒所有等待进程{if (waitqueue_active (&spca50x->frame[n].wq))wake_up_interruptible (&spca50x->frame[n].wq);if (waitqueue_active (&spca50x->wq))wake_up_interruptible (&spca50x->wq); } spca5xx_kill_isoc(spca50x); //子函数终止URB包的传输PDEBUG (3,'Disconnect Kill isoc done');up (&spca50x->lock); //增加信号量while(spca50x->user) /如果还有进程在使用,进程切换schedule(); down (&spca50x->lock);if (spca50x->vdev) {video_unregister_device (spca50x->vdev); //注销video 设备usb_driver_release_interface (&spca5xx_driver,&spca50x->dev->actconfig->interface[spca50x->iface]); //端口释放spca50x->dev = NULL; }up (&spca50x->lock); #ifdef CONFIG_PROC_FSdestroy_proc_spca50x_cam (spca50x); //注销PROC文件 #endif /* CONFIG_PROC_FS */ if (spca50x && !spca50x->user) //释放内存空间{spca5xx_dealloc (spca50x);kfree (spca50x); spca50x = NULL;} MOD_DEC_USE_COUNT; //减少模块记数PDEBUG (3, 'Disconnect complete'); }二、上层软件接口模块:总结送免费学习资料(包含视频、技术学习路线图谱、文档等)该模块通过file_operations数据结构,依据V4L协议规范,实现设备的关键系统调用,实现设备文件化的UNIX系统设计特点。
Linux摄像头V4L2编程
一、摘要在Linux操作系统下,摄像头的工作都要遵循V4L2的机制,下面介绍如何从无到有,编写代码去使能摄像头拍照。
使用V4L2基本上就是使用内核提供的函数接口,填充相应的函数,主要依靠ioctl()函数填充函数域,然后按照一定操作顺序(工作流程),就能拍照了。
二、操作顺序(工作流程)前奏:1、打开USB摄像头设备文件2、获取驱动信息(VIDIOC_QUERYCAP)3、设置图像格式(VIDIOC_S_FMT)帧缓冲:4、申请帧缓冲(VIDIOC_REQBUFS)5、获取帧缓冲地址长度信息(VIDIOC_QUERYBUF)6、使用mmap吧内核空间的帧缓冲映射到用户空间7、帧缓冲入队列8、开始采集图像(VIDIOC_STREAMON)9、取出帧缓冲(VIDIOC_DQBUF)10、访问帧缓冲(可以读写操作等等)11、帧缓冲入队列,重新入队(VIDIOC_QBUF)写代码的时候按照这个编写就行了。
如果用在嵌入式板子上,只用交叉编译以后就能用了#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <getopt.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#include <malloc.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/time.h>#include <sys/mman.h>#include <sys/ioctl.h>#include <asm/types.h>#include <linux/videodev2.h>struct buffer {void * start;size_t length;};struct buffer *buffers;unsigned long n_buffers;unsigned long file_length;int file_fd;char *dev_name = "/dev/video3"; //这是我摄像头节点,根据自己的节点填写int fd;static int read_frame (void){struct v4l2_buffer buf;/*帧出列*/buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;ioctl (fd, VIDIOC_DQBUF, &buf);write(file_fd,buffers[buf.index].start,buffers[buf.index].length);/*buf入列*/ioctl(fd, VIDIOC_QBUF, &buf);return 1;}int main (int argc,char ** argv){struct v4l2_capability cap;struct v4l2_format fmt;struct v4l2_requestbuffers req;struct v4l2_buffer buf;unsigned int i;enum v4l2_buf_type type;file_fd = open("test.jpg", O_RDWR | O_CREAT, 0777); //用来保存图片 fd = open (dev_name, O_RDWR | O_NONBLOCK, 0);/*获取驱动信息*/ioctl (fd, VIDIOC_QUERYCAP, &cap); //驱动信息保存在cap结构体printf("Driver Name:%s/n Card Name:%s/n Businfo:%s/n/n",cap.driver,cap.card,cap.bus_info);/*设置图像格式*/fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //这是设置传输流类型fmt.fmt.pix.width = 320; //设置分辨率fmt.fmt.pix.height = 240;fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; //图像格式,此处是jpg ioctl (fd, VIDIOC_S_FMT, &fmt) ;/*申请图像缓冲区*/req.count = 4;req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;req.memory = V4L2_MEMORY_MMAP;ioctl (fd, VIDIOC_REQBUFS, &req);buffers = calloc (req.count, sizeof (*buffers));for (n_buffers = 0; n_buffers < req.count; ++n_buffers){/*获取图像缓冲区的信息*/buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;buf.index = n_buffers;ioctl (fd, VIDIOC_QUERYBUF, &buf);buffers[n_buffers].length = buf.length;// 把内核空间中的图像缓冲区映射到用户空间buffers[n_buffers].start = mmap (NULL , //通过mmap建立映射关系buf.length,PROT_READ | PROT_WRITE ,MAP_SHARED ,fd,buf.m.offset);}/*图像缓冲入队*/for (i = 0; i < n_buffers; ++i){buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;buf.index = i;ioctl (fd, VIDIOC_QBUF, &buf);}//开始捕捉图像数据type = V4L2_BUF_TYPE_VIDEO_CAPTURE;ioctl (fd, VIDIOC_STREAMON, &type);fd_set fds;FD_ZERO (&fds);FD_SET (fd, &fds);select(fd + 1, &fds, NULL, NULL, NULL);/*读取一幅图像*/read_frame();for (i = 0; i < n_buffers; ++i)munmap (buffers[i].start, buffers[i].length);close (fd);close (file_fd);printf("Camera Done./n");return 0;}。
基于Linux的USB摄像头的探索使用和编程实现
# tr a xz s c xx一2 6 01 t r. f p a5 00 O5 . a gz
# c s ca xx 20 6 01 d D 5 0 O5 赶 m a CC=a m -lnux ke r i gc ERN — cK
采 集设 备 都 支持 的 )指 令 VI OS 。 DI CFBUF / VI OCG DI FBUF用于 设置/ 获F a Bu e 捕 r me f r 的信 息 , 使用 sr c v d o b fe 数据 结 需 tu t ie — u f r
构实现 。
Stuc v de — r t i o bufer f
较 高 的 摄 像 头 芯 片 是 中 芯 微 公 司 生 产 的 的 API 视 频 应 用程 序 通 过 调 节 即 可操 作 各 ,
ZC0 X系 列 摄 像 头 芯 片 , 町 以 使 用 30 它 h t : mx a r fe .r 提供 的S tp // h ad.re f/ PCA5 XX 驱 动 稃 序 驱 动 ( 驱 动 是 一 支 持 多 种 摄 该 一个 像头的通用驱动程序 ) 。
1e c Dr ve s > ) vi e i r M uli di d x c s 一> t me a e e i < > Vi o de Fo 1i r HUX
基 于Vi e 4 n x的视 频 采 集就 是 对 / d 0 Li u d v/ i e 设备 的 操 作 , 过 程如 图7 所 e vd o 其 —1 3
! 殳:
S cI ence an Techn ogy nn d oI l ovat o H er i in ad
丁技
基于Linux的USB摄像头驱动程序设计
一
个具体 的 U B摄像头 驱动 的分析 , 出了 Ln S 给 i=下 U B摄 t S
1 Ln 中 U BP i= t S C摄 像 头 驱 动 程序
啦
和 ub d】 ie 其 中注册 驱动程 序必须 在初始 s e gt , 【 sr e
—
像头驱动程序编写 的整 体框 架以及具 体实现方案。 U B设备在某种情 况下 整个 设备 只需 要 一个 驱动 程序 S 来进行数据处理 , 但在其他情况下可能每一个接 口( 吐 : h e ) 就需 要一 个 驱动 程序 来进行 数 据处 理。在 Ln it =操作 系统 中, 有一个 叫做“ S U B核 心” 的子 系统 , 的作用 是 提供 支持 它 U B 备驱 动 程序 的 A I 应 用 编 程 接 口) U B 的主 机 S设 P( 和 S ( 0 r驱动程序 。它提供 了许多数据结构 、 H s) 宏定义和功能 函 数来对硬件或设备进行支持 。在 lnx Ju 下编 写 U B设备的驱 S 动程序从严格意义上讲 , 就是使用这些 U B核心 的子 系统定 S 义的数据结构、 和函数来 编写数据的处理功能 。 宏 Ln it U B内核子 系统 中 , =的 S 提供 了几个 与 设备 驱动 程 序开发直接相关 的核心数据结构 , 它们在整个 设备驱 动程序 的框 架中起着灵魂 的作用 , 定义 于 内核 源代码 的 <l u/s. i xub n
度也 日益提高 。2 4 x .. 及其以后版本的 内核对 U B的支持 已 S
比较完 善。但 相对 Wi o s U B设 备 的驱 动 还不 完 善 , n w, S d 以 U B摄 像 头 为 例 , i= 仅 提 供 了 如 P /.S C E T 、 S Ln t HIP 、 R A E I I)IE H等知名 品牌 的摄像 头驱 动。而对于 市场 上 的各 种 LGT C 型号 U B摄像 头 ,it S L =支持 却很 少 , n 如需 在 L t i =下使 用这 n
USB摄像头驱动移植
1通过SMB服务将SDK-H264/server目录拷贝到项目目录下
2解压内核到当前目录
命令#cd /home/guoqian/project/h264/server/kernel
#tar zxvf linux.2.6.29.tar.gz
解压完成后的文件为linux2.6.29
3清理中间文件、配置文件命令#cd linux-2.6.29
#make distclean
4选择参考配置文件
命令#cp config-h264 .config
5配置内核
#make menucofing ARCH=arm CROSS_COMPILE=arm-linux-
要使内核支持USB摄像头驱动,内核必须选上以下配置选项Device drivers→multimedia devices→
Video capture adapters→V4L USB devices→
最后保存退出。
配置文件config-h264已配置了上述选项
6编译内核
命令#make ulmage ARCH=arm CROSS_COMPILE=arm-linux-
编译完成后生成的内核映像ulmage位于arch/arm/boot/目录下。
7将ulmage拷贝到tftp服务目录/tftpboot
命令#cp arch/arm/boot/ulmage /tftpboot/ulmage-h264
至此USB摄像头驱动移植的工作就完成了。
嵌入式Linux下Camera编程--V4L2
最近有个需求,要在ARM Linux上实现USB Camera 拍照功能。
0. 背景知识:首先要确认的是,Kernel是否支持USB Camera。
因为Linux下,USB协议除了电气协议和标准,还有很多Class。
这些Class就是为了支持和定义某一类设备接口和交互数据格式。
只要符合这类标准,则不同厂商的USB设备,不需要特定的driver就能在Linux下使用。
例如:USB Input class,则使所有输入设备都可以直接使用。
还有类似Audio Class,Pring Class,Ma ss Storage Class,video class等。
其中Video Class 就是我们常说的UVC(USB Video Class). 只要USB Camera符合UVC标准。
理论上在2.6 Kernel Linux 就可以正常使用。
网络上有人谈到怎样判断是否UVC Camera设备:#lsusbBus 001 Device 010: ID 046d:0825 Logitech, Inc.#lsusb -d 046d:0825 -v | grep "14 Video"如果出现:bInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 VideobInterfaceClass 14 Video则说明是支持UVC.1. Kernel配置:Device Drivers ---> <*> Multimedia support ---> <M> Video For LinuxDevice Drivers ---> <*> Multimedia support ---> [*] Video captureadapters ---> [*] V4L USB devices ---> <M> USB Video Class (UVC)--- V4L USB devices : 这里还有很多特定厂商的driver.可供选择。
如何在linux下玩转usb摄像头_华清远见
如何在linux下玩转usb摄像头?本篇文章分享给大家,教大家如何在linux下玩转usb摄像头,是很有意思的一章内容,如果感兴趣就往下看吧~linux世界很奇妙。
我们需要准备的材料:硬件平台:PC机一台、usb摄像头。
操作系统:Linux3.0.8交叉编译环境:arm-none-Linux-gnueabi-gcc 4.5.1好了现在到了激动人心的时刻,就是我们的调试步骤:一、linux 内核解压1.1使用linux-3.0.8-FS210_v8.tar.xz内核,将这个内核压缩包拷贝到虚拟机的linux系统上1.2 执行 tar –xvf linux-3.0.8-FS210_v8.tar.xz,得到内核(用来产生镜像文件,烧进 s5pv210 开发板上)1.3 解压之后,进入 linux-3.0.8-FS210_v8 内核,修改该目录下的 makefile,并配置相应的 make menuconfig,如下:修改 MakefileMake menuconfig1.3.1 usb 驱动添加Device Drivers --->SCSI device support ---><*> SCSI disk support<*> SCSI generic support<*> SCSI media changer support[*] USB support ---><*> USB Mass Storage support1.3.2 添加驱动(video)Device Drivers ---><*> Multimedia support ---><*> Video For Linux[*] Video capture adapters --->[*] V4L USB devices ---><*> USB Video Class (UVC)[*] UVC input events device support 1.4 执行 make zImage –j2,报如下错误:修改这个文件将修改为继续编译最后出现1.5 拷贝镜像到相应的目录下开发板通过tftp,下载虚拟机上的镜像,所以执行cpzImage /tftpboot/二、抓拍代码的移植2.1用 arm-none-linux-gnueabi-gcc,编译该文件2.1.1 虚拟机上编译 arm-none-linux-gnueabi-gcc 1.c -o 1,编译之前,需修改应用程序.c文件中的设备节点,默认是/dev/video3。
嵌入式Linux环境下USB摄像头应用程序设计
Ab t a t T e p p r it d c s a meh d t ts a d d vlp a pia o rga y sm l cdn . sr c : h a e nr u e to o e t n e eo p l t n po r m b i pe o i g o ci
itp ee]{ D O P L T' P G,IE _ A E E Y n a t [ VIE _ A E I JE VD O P L Tr _ U l t = E
Tl E V4 0P VI 2 , DEO PALE ' RGB2 4,
_
信息对摄像头的进一步应用 有帮助 。
_
2 程 序 实现
由 结 构 体 的 定 义 可 以看 出 ,不 同种 类 的 摄 像 头其
C S传 感 器 不 同 , 以 采 集 到 的 图像 格 式 也 不 相 同 。首先 MO 所
B s 00 De i e 00 :I u 2 v c 3 D 1 710 0 Ar a Te h oo y Co p 8 :3 6 e c n lg r B sO 2 u O De i e 0 4:I 0 c : 01 Z tr vc 0 D 8 8 3 b -sa Mi r e e ti i C r e o lc rn c o p
K e r : E ed d “nx y wo ds mb d e u :US C mea Drv P cu- F 册 a Co v rin B a r i itl o e t n eso
பைடு நூலகம்1 环 境 准备
( ) 发 板 Ln x内核 版 本 :..8 ; 1开 iu 262 ( ) 发 板 编 译 器 版 本 :r — n x ge431 ; 2 开 am h u  ̄ c . . ( ) 主 机 Ln x版 本 :e oa9 ; 3 宿 iu F dr ()S 4 U B摄 像 头 通 用 驱 动 程 序 :p ax ; sc5x
基于ISP1161的USB摄像头嵌入式Linux设备驱动
【 btat to fipe e t g U B cmead v e d vrf m e dd Ln xi it d cd hp IP 1wt U B Hot A s c】A me do m l n n S a r ei r e o e bd e iu s nr ue .C i S 1 6 i S s r h m i c i r o 1 h
频采集 。
接 口的处理器 需 要单 独 的芯片来 提 供 U B H s 功能 , S ot
P ip 公 司的 IP 1 片就是这 样的芯片 。典 型的基 hl s i S 16 芯 1
2 基 本 原 理
21 I P l 1 摄 像 头 芯 片 组 简 介 . S l6 及
。
【 关键词 】嵌入式 Ln x iu ;设备驱 动;IP 1 1芯片;U B摄像 头 S 16 S
பைடு நூலகம்
【 中图分类号】T 3 1 2T 98 1 P 1. ;N 4. 5 4
【 文献标识码】B
Em b d e n x Drv r f r US me a wih I P1 6 e d d Li u ie o B Ca r t S 1 1
析 Ln x设备驱动原理 以及 IP 11和 U B摄像 头芯片组工 作机 制, iu S 16 S 实现 了 U B摄 像头 的嵌 入武 Ln x设备驱 动 并 在 基 于 It S i u nl e X cl P A 5 sa X 2 5的 S sn 平 台上 实 现 了基 于 U B等 时传 输 模 式 的 图像 数 据 采 集 。 e ia g t S
【 y w rs m ed d Ln x d v e d vr IP 1 S a ea Ke od 】e b d e iu ; ei r e; S 16 ;U B c r c i 1 m
基于Video4Linux 的USB摄像头
块 videodev.o 没有加。 没有加。 3. 出现错误: ov511.o:couldn’t find the kernel version this modules 出现错误: was compiled for。这是试图插入一个不是可装入模块的目标文件。 这是试图插入一个不是可装入模块的目标文件。因为在内核配置 阶段, 阶段,是 把 ov511 模块静态加到内核中的, 模块静态加到内核中的,虽然看起来和可装入模块的文件名 ov511.o 完 全一样, 全一样,但是不能用 insmod 命令加入。 命令加入。 4.如果出现 Ov511.o:unresolved symbol video********,那就<M> 选中 video for linux, 用 新 生 成 的内 核 启 动系 统 , 再 insmod videodev.o,insmod ov511.o 就可以啦。 就可以啦。 1.2 zc301 驱动 摄像头的驱动是从 http://mxhaard.free.fr/下的针对 embeded 环境, 环境, 有专门的 patch,我用的是 usb-2.4.31LE06.patch。 (1)把它放到/HHARM9-EDU/kernel/driver/usb 下,解压, 解压,打补丁。 打补丁。 就会在此目录下看到 spca5xx 文件夹了。 文件夹了。可能会有一些错误, 可能会有一些错误,我的错 误是在 Makefile 和 config.in 文件中, 根据它的提示, 进行相应的修改 文件中, 根据它的提示, 即可。 即可。Patch 时会将修改方法写到 Makefile.rej 和 config.in.rej 文件 中,把这两个文件里的内容加到 Makefile 和 config.in
中就行了。 中就行了。 (2)编译内核, 编译内核,进入/HHARM9-EDU/kernel,make menuconfig。 我采用和上面介绍的 ov511 驱动的方法一样, (M)选中 驱动的方法一样,动态加载。 态加载。 SPCA5XX 这一项 ( 3 ) make dep ; make zImage ; make modules 。就会在 /HHARM9-EDU/kernel/driver/usb/spca5xx 中生成 spca5xx.o,spcadecoder.o,spca_core.o 啦。这就是我们要的驱动。 这就是我们要的驱动。 ( 4 ) 用 新 内 核 启 动 , insmod 这 三 个 .o 文 件 ( 可 以 不 用 加 载 spcadecoder.o) ,摄像头就加载成功啦 ,摄像头就加载成功啦。 摄像头就加载成功啦。
linux usb设备驱动和通信原理
linux usb设备驱动和通信原理Linux USB设备驱动和通信原理一、引言USB(Universal Serial Bus,通用串行总线)是一种用于连接计算机和外部设备的常见接口标准。
在Linux系统中,USB设备驱动是实现计算机与USB设备通信的关键。
本文将介绍Linux USB设备驱动的工作原理、通信过程以及相关概念。
二、USB设备驱动的工作原理1. 设备注册在Linux系统中,USB设备驱动是通过注册机制实现的。
当插入一个USB设备时,系统会自动扫描设备并加载相应的驱动程序。
驱动程序需要向系统注册设备的Vendor ID(厂商识别码)和Product ID(产品识别码),以便系统能够正确识别设备并加载相应的驱动。
2. 设备与驱动的匹配系统通过设备的Vendor ID和Product ID来匹配已注册的驱动程序。
一旦匹配成功,系统就会加载相应的驱动程序,并为设备分配一个唯一的设备文件,例如/dev/usb/0。
3. 驱动初始化驱动程序在加载后会进行初始化操作。
这包括分配内存、注册设备、设置设备的操作接口等。
初始化完成后,驱动程序就可以与设备进行通信。
4. 设备操作驱动程序通过操作设备文件来与USB设备进行通信。
设备文件提供了一组接口函数,可以用于读取设备数据、写入设备数据、控制设备等。
三、USB设备通信原理1. 控制传输控制传输是USB设备通信的基础。
它由主机发起,用于设备的配置和控制。
控制传输分为控制请求和控制数据阶段。
控制请求阶段用于发送控制命令和参数,而控制数据阶段用于传输数据。
2. 中断传输中断传输主要用于传输实时或周期性的数据。
设备会定期向主机发送中断包,主机接收后可以做出相应的处理。
中断传输适用于一些对实时性要求较高的设备,如鼠标、键盘等。
3. 批量传输批量传输用于传输大量的数据,但对实时性要求不高。
批量传输可以分为批量读和批量写两种方式。
批量传输适用于一些需要大量数据传输的设备,如打印机、存储设备等。
linuxusb免驱摄像头模块原理
linuxusb免驱摄像头模块原理摄像头在现代计算机和嵌入式系统中被广泛使用,用于视频会议、视频监控、电子商务、游戏等众多应用。
在Linux系统中,摄像头模块可以直接插入,并自动识别和配置,这就是所谓的免驱动(Plug and Play)功能。
本文将介绍LinuxUSB免驱摄像头模块的原理。
1.摄像头硬件架构摄像头作为一种外部设备,需要与计算机系统进行数据交互。
它通常由图像传感器、图像处理芯片、电源芯片和USB接口等部分组成。
图像传感器负责将图像光信号转换为电信号,然后通过图像处理芯片对图像进行处理,最终通过USB接口将处理后的数据传输给计算机。
摄像头模块通常还包含一些额外的功能,如自动对焦、光圈控制、白平衡等。
2. LinuxUSB框架在Linux操作系统中,USB设备的驱动和管理是通过LinuxUSB框架实现的。
LinuxUSB由两部分组成:USB核心驱动和USB设备驱动。
USB核心驱动负责枚举、配置和通信等底层操作,而USB设备驱动则负责与特定设备进行通信。
3.摄像头驱动摄像头在Linux系统中使用的驱动程序一般是V4L2(Video4Linux2)驱动。
V4L2是Linux中用于支持视频设备的驱动框架,它定义了一套API和数据结构,用于访问和控制支持V4L2的设备。
摄像头驱动通常包括两部分:摄像头传感器驱动和摄像头设备驱动。
摄像头传感器驱动负责和硬件传感器交互,控制图像数据的采集和传输;摄像头设备驱动则负责将采集到的图像数据转换为V4L2支持的格式,并提供给上层应用程序。
4.摄像头模块工作流程当摄像头插入到Linux系统中时,USB核心驱动会自动检测到设备并加载对应的驱动程序。
在驱动加载完成后,摄像头传感器开始采集图像数据,并通过摄像头设备驱动将数据传输给V4L2驱动。
V4L2驱动在应用程序请求时会将摄像头的图像数据提供给应用程序。
应用程序可以使用V4L2提供的API进行图像的捕获、处理和显示。
嵌入式Linux下USB摄像头驱动程序开发
嵌入式Linux下USB摄像头驱动程序开发摘要:介绍了嵌入式Linux系统中USB设备驱动程序开发的基本原理,通过分析USB驱动程序开发的程序框架和重要数据结构,实现了USB摄像头的嵌入式Linux驱动程序,并在S3C2440的平台上实现了图像采集。
关键词:嵌入式Linux;驱动程序;USB摄像头0引言在我们今天的生活中,摄像头广泛应用于视频聊天以及视频实时监控中。
世面上摄像头种类繁多,其中USB接口的摄像头价格便宜,性能也很高,因而更适宜推广使用。
主控和传感芯片是摄像头的重要部件。
主控芯片负责图像采集、压缩以及与主机进行信息传递。
通过摄像头进行图像采集,同时摄像头与嵌入式模块连接,通过嵌入式模块上的无线网卡把采集的图像发送出去。
嵌入式模块上使用的是Linux系统,嵌入式Linux系统的源代码方便开发,内核运行稳定并具有可裁减性,对大多数硬件都可以支持,是嵌入式系统领域最重要的操作系统。
本文重点分析了USB摄像头驱动模块的整体结构及驱动程序的实现。
1Linux设备驱动的基本概念设备驱动程序是一种可以使计算机和设备进行通信的特殊程序,可以说相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。
应用程序把硬件设备看作是一个设备文件,这样它对硬件设备进行操作就可以像操作普通文件一样。
设备驱动程序被看作是内核的构成部分,其完成的功能有:设备的初始化和释放、数据从内核到硬件、从硬件读取数据、接收应用程序传送给设备文件的数据,返回其请求的数据。
Linux内核对外围设备控制操作是通过驱动程序来完成,所以每个设备都需要有驱动程序,否则设备将无法正常工作。
4结语对中国象棋的文化底蕴进行研究,设计并制作象棋多媒体学习软件,内容涉及象棋文化、口诀、技巧、各棋子基本走法、经典棋局、大师风采等方面,能够丰富人们的精神生活,普及传统文化,发扬中华文明。
象棋多媒体学习软件界面美观,多种媒体效果丰富,交互性强,内容易扩充。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux 下USB摄像头驱动的实现
摘要:介绍了Linux体系下USB摄像头驱动的体系结构。
首先介绍了作为Linux视频部分标准的Video4Linux,这是USB摄像头开发的关键部分;然后描述了Linux体系下USB设备驱动的层次结构以及涉及到的几个重要数据结构;最后给出了中星微的ZC0301P摄像头驱动的具体实现。
关键词:USB摄像头;Linux;video4Linux;驱动程序
0引言
USB摄像头由于价格低廉、使用方便、通用性强,被广泛应用于个人电脑、视频监控、图像采集等设备中。
目前,摄像头驱动程序大部分都是基于Windows平台下,而嵌入式系统大都采用Linux 系统,因此需要开发在嵌入式Linux平台下的基于Linux驱动框架的摄像头驱动程序。
摄像头主要由主控芯片和传感芯片两部分组成,景物通过镜头生成的光学图像投射到图像传感器上,然后转为电信号,经过A/D转换后变为数字图像信号,然后送到DSP中处理。
主控芯片负责图像采集、压缩以及和主机的通信。
本文中摄像头芯片采用的是中星微公司的ZC0301P芯片,这是目前应用比较广泛的一款产品。
1Linux下的视频标准Video4Linux
目前的Linux内核已经添加了对音视频设备的支持,这部分的标准是Video4Linux(简称V4L)。
V4L是一些视频系统、视频软件、
音频软件的基础,目前主要应用在图像采集、视频采集等多媒体设备中,比如可视电话、视频监控、Webcam,是嵌入式Linux开发人员经常使用的系统调用接口。
Linux内核通过V4L为用户空间提供了标准的操作接口,各种音频和视频设备相应的驱动程序加载进内核后,V4L就可以通过内核提供的API像对普通文件一样来操作视频和音频设备,从这里可以看出V4L大体分为两层,上层为系统提供的API,底层为音视频设备在内核中的驱动。
这个标准提供了一套标准接口,应用程序、内核、驱动以这个接口进行互相访问。
同时,该标准对USB摄像头也提供非常好的支持。
V4L为Linux音视频设备驱动程序提供了以下几个重要数据结构:①struct video_capabilitycap;/ 包含了摄像头设备的基本信息;
②struct video_picturepic;/包含了摄像头设备采集的图像的各种属性;
③struct video_mmapbuf;/用于实现内存映射;④struct video_mbufvm;/利用video_mmap进行内存映射得到帧的信息。
2Linux下USB驱动体系
USB是英文Universal Serial BUS(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,主要有以下特点:使用简单、支持热插拔、传输速度快、方便扩展,大大简化了不同类型外设与计算机间的连接。
USB是一种分层总线结构,并且由一个主机控制器来控制,USB主机控制器负责询问每一个USB 设备是否有数据需要发送,USB不支持设备的直接通信。
如图1所示,在Linux驱动中,USB驱动处于最底层的是USB
主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。
因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB设备如何与主机通信。
Linux内核USB核心负责USB驱动管理和协议处理的主要工作。
主机控制器驱动和设备驱动之间的USB核心非常重要,其功能包括:通过定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息;完成设备热拔插控制、总线数据传输控制等。
3本文涉及的几个主要数据结构
本文中主要有如下几个数据结构,分别是:
(1)USB设备数据结构usb_device,它保存了一个USB设备的信息,包括设备地址、设备描述符、配置描述符等。
(2)struct usb_driver 是对USB设备的最高层次的抽象,这个结构用于向USBD层注册USB设备驱动程序。
该结构体中有两个重要函数分别是probe和disconnect,当内核中有某设备的驱动程序,而且当该设备连接上时,系统会自动调用probe函数探测。
当拔出该设备时disconnect函数会被调用,移除该设备。
所以这两个函数支持了热拔插操作。
(3)文件系统数据结构。
File_opertions是Linux设备驱动中的
一个重要数据结构。
在Linux系统中设备驱动被当做文件,所以,对设备的操作就是对设备文件的操作。
File_opertions定义了文件操作如open()、read()、write()、chose()等。
当这些函数被调用时,实际与它们关联的函数(数据结构中定义的函数)将会被调用。
4摄像头驱动程序各模块的实现
本文的USB摄像头驱动程序是以模块的形式编译进Linux的内核,所以必须先定义模块操作的函数。
模块初始化函数zc0301_module_init(void)调用函数usb_register(&zc0301_usb_driver)向USB核心子系统注册USB设备驱动,若注册成功则返回0。
部分代码如下:
模块卸载函数zc0301_module_exit(void)调用usb_deregister (&zc0301_usb_driver)向USB核心子系统注销USB设备驱动。
部分代码如下:
zc0301_usb_probe()和zc0301_usb_disconnect()函数是USB 设备驱动中重要、必须的部分,分别用来实现设备的探测和设备断开连接,实现USB设备的热拔插技术。
在函数zc0301_usb_probe中,调用interface_to_usbdev(intf)来获取USB接口对应的USB设备,主要完成如下两项工作:根据USB_interface指针intf获取usb_device 的地址。
获取USB接口对于的USB设备,USB接口对应的USB设备是该接口的父设备。
然后调用kzalloc(sizeof(struct zc0301_device)函数为设备分配内存。
调用mutex_init(&cam->dev_mutex)初始化一个互斥量实现设备的互斥访问。
调用zc0301_init(cam)初始化摄
像头芯片。
最后调用video_register_device(cam->v4ldev,VFL_TYPE_GRABBER,video_nr[dev_nr])函数注册一个视频设备,部分代码如下:
4.3MMAP内存映射机制
Linux中文件的传统访问方式是:首先用open()系统调用打开文件,然后使用read()、write()以及lseek()等调用进行顺序或者随机的I/O访问。
这种方式是非常低效的,每一次I/O操作都需要一次系统调用。
另外,如果若干个进程访问同一个文件,每个进程都要在自己的地址空间维护一个副本,浪费了内存空间,如图2所示。
对大量的图像数据来说,这种频繁拷贝会增加系统开销,特别对资源相对较少的嵌入式系统来说更加明显。
图2Read系统调用
内存映射机制提供了一种很好的解决问题的方法:它是将页面映射到进程的地址空间中,也就是说首先通过简单产生的某些内存管理数据结构完成映射的创建。
当进
程访问页面时产生一个缺页中断,内核将页面读入内存并且更新页表指向该页面。
本文的MMAP映射函数的部分代码如下:5结语
Linux是当前最受欢迎的操作系统之一。
它具有内核小、效率高、源码开放的优点,所以也被广泛应用于嵌入式系统中。
与嵌入式平台相应的驱动程序的发展也日新月异,具有广阔的前景。
本文介绍的在LinuxV4L标准下的USB摄像头驱动程序有很高的实用价值,对于其
它设备驱动的开发具有一定的参考价值。
参考文献:
[1]王鑫.嵌入式Linux下USB通用摄像头驱动程序研究与设计[D].沈阳:东北大学,2006.
[2]宋宝华.Linux设备驱动开发详解:第2版[M].北京:人民邮电出版社,2010.
[3]刘飞,张曦煌.基于嵌入式平台的USB摄像头驱动程序的实现[J].计算机工程与设计,2008(4).
[4]宋丽华,高珂.嵌入式Linux下USB摄像头驱动实现[J].计算机工程,2010(5).。