基于arm平台与嵌入式linux的图像采集应用内容摘要:

编译器。 手动添加 S3C2410X 处理器选项:移植后 ifeq($(CONFIG ARCH_ S3C241 0), y) TEXTADDR=0xC0008000 MACHD 咂 =s3e2410 Endif 计算机学院《嵌入式系统》课程设计报告 9 4. 3 根文件系统制作 4. 3. 1 文件系统介绍 文件系统是指在一个物理设备上的任何文件组织和目录,它构成了操作系统上所有数据基础,是系统中庞大复杂且又是最为基本和重要的资源。 嵌入式Linux 下的文件系统结构如图 11 所示 : 图 3 4. 3. 2 构建嵌入式 Linux文件系统 1. busybox 简介 Busybox 是用于制作可执行命令工具集的工具,它被非常形象地称为嵌入式Linux 系统中的 “瑞士军刀”,因为它将许多常用的 UNIX 命令和工具结合到了一个单独的可执行程序中。 虽然与相应的 GNU 工具比较起, busybox 所提供的功能和参数略少,但在嵌入式系统中已经足够了。 2.建立 Linux 文件系统 在 busybox 的编译过程中,可以非常方便地加减它的“插件”,最后的符号链接也可以由编译系统自动生成。 下面详细介绍利用 busybox 建立一个全新的Linux 文件系统的方法。 4. 4 USB 摄像头设备驱动移植 Linux 设备驱动程序概述 计算机学院《嵌入式系统》课程设计报告 10 系统调用是操作系统内核和应用程序之问的接口,没备驱动程 序是操作系统内核和机器硬件之间的接口。 设备驱动程序为应川程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是个设备文件.应用程序可以像操作普通文件样对硬件设备进行操作。 设备驱动程序是内核的部分.它完成以下的功能: 1.对设备初始化和释放。 2.把数据从内核传送到硬件和从硬件读取数据。 3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据。 4.检测和处理设备出现的错误。 4. 4. 2 USB 摄像头驱动程序的移植 目前市场流行的摄像头型号主要是中星微的 ZC0301/ 02/ 03,占据了约90%的市场份额 ,而广大嵌入式爱好者推崇的则是 OmniVision 公司的 OV51 l,主要是因为 2. 4 内核版本以后支持了 OV511 的驱动,以至各种研究学习资料较多,应用也非常方便。 4. 5 图像采集程序设计 1. Vide04Linux 简介 Vide04Linux 是 Linux 中关于视频设备的内核驱动,他为针对视频设备的应用程序编程提供一系列接口函数,配合适当的视频采集设备和相应的驱动程序,可以实现影像采集、 AM/ FM 广播、频道切换等功能 i491,在远程会议、可视电话、视频监控系统中有着广泛的应用。 2.图像采集程序设计 在 Linux 下,视频采集设备的正常使用依赖于对 Vide04 Linux 标准的支持。 如果使用 Vide04Linux,在编译内核时,一定要选中 Multimedia Devices 下的Videofor Linux 选项,本文针对的设备文件是/ dev/ videoO,使用的器件是基于 ZC301 的 USB 摄像头。 Vide04Linux 定义的数据结构及使用函数如下: struct__v41_struct { Int fd; struct video_capability capability; struct video_buffer buffer; struct video_window window; struct video_channel channel[8]; struct video_picture picture; struct video_mmap mmap; struet video_mbuf mbuf; unsigned char *map; }; typedef struct_v41_struet v41_deviee; extem int v41_open(char*, v41_deviee*); extem int v41_elose(v41__deviee*); extem int v41_get_eapability(v41_device*); 计算机学院《嵌入式系统》课程设计报告 11 extem int v41_set_norm(v41_device*, int); extem int v41_get_picture(v41_deviee*); extem int v41_grab_init(v41_deviee*, int,int); extem int v41_grab_frame(v41_device*, int); extem int v41_grab_sync(v41_device*); extem int v41_mmap_init(v41_deviee*); extem int v41_get_mbuf(v41__device*); extern int v41_get_picture(v41_deviee*); extern hat v41_grab_picture(v41_device*, unsigned int); extern int v41 set_buffer(v41_device*); extem int v41get_buffer(v41_device*); extem int v41_switch__ehannel(v41_device*, int); Vide04Linux 中截取图象的方法有两种: 1. mmap(内存映射 )方式 2. 直接读设备方法 利用 mmap 方式截取视频图像的程序设计的主要过程如下: (1)打开视频: intv41_pen(char *dev,v41 一 device *vd) { if(!dev) dev=” / dev/ videoO” ; if((vdfd=open(dev,O_RDWR))O){ pcrror(” v41_open:” ); return1; } if(v41_getcapability(vd)) return1; if(v41_get_picture(vd)) retun1; return 0; } (2)读 videocapability 中信息 int v41_get_capability(v41_device *vd) { if(ioctl(vdfd, VIDIOCGCAP,amp。 (vdcapability))0){ perror(” v41_get_capability:” ); return l; return 0。 } 关闭设备 : Int v41_close(v41_device *vd) { closc(vdfd); retun 0: } 计算机学院《嵌入式系统》课程设计报告 12 5 图形用户界面的实现 5. 1 MiniGLⅡ的特点 MiniGUI 原是由魏永明支持的遵循 GPL 条款发布的一个自由软件项目,其目标是为实时嵌入式系统提供一个轻量级的图形用户界面支持系统。 项目自 1998年底开始到现在已经非常成熟和稳定,并且在许多实际产品和项目中得到应用。 MiniGUI 是一种针对嵌入式设备的、跨操作系统的图形用户界面支持系统,它 是嵌入式图形中间层软件。 它主要运行于 Linux 控制台,实际可以运行在任何一种具有 POSIX 线程支持的 POSIX 兼容系统上。 它为用户定义了一组轻量级的窗口和通信设备接口,利用这些接口,每个应用程序可以建立多个窗口,而且可以在这些窗口中绘制图形,也可以利用 MiniGUI 建立菜单、按钮、列表框等常见的GUI 元素。 与其他基于 Linux 的图形界面支持系统相比, MiniGUI 系统在 API 完备性、系统规模、可移植性、资源消耗等各个方面都具有相对优势,符合嵌入式开发环境对 GUI 系统的轻型、占用资源少、高性能、高可靠性、可 配置等方面的要求,因此在嵌入式领域中有广阔的应用前景。 图 4 计算机学院《嵌入式系统》课程设计报告 13 5. 3 MiniGLⅡ程序开发 5. 3. 1 MiniGUI 体系结构 从整体结构上看, MiniGUl 是分层设计的,体系结构如下图 : 图 5 在最低层, GAL 和 IAL 提供底层图形接口以及输入设备的驱动;中间层是MiniGUl 的核心层,包括窗口系统必不可少的各个模块;最顶层是 API,为用户提供编程接口。 5. 4 应用程序的编写 ⋯⋯⋯⋯⋯ //包含头文件 static void my_notif_proc(HWND hwnd, int id, int nc, DWORDadd_data) //改变颜色子函数 { if(nc===BN_DBLCLK) SetWindowBkColor(hwnd, 3333); //3333 表示颜色值 InvalidateRect(hwnd, NULL, TRUE); } Static int StaticDemoWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM 1Param)//窗口过程函数 { HWND hwnd; switch(message){ case MSG_CREATE: hwnd=CreateWindow(CTRL_BUTTON,” Push me”, WS— VISIBLE| BP_PUSHBUTTON|BS NOTIFY,100, 50, 100, 200, 50, hWnd, 0); SetNotificationCallback(hwnd, my_notif_proc); 计算机学院《嵌入式系统》课程设计报告 14 return 0; case MS_DESTROY: DestroyAllControls(hWnd); rturnO; easeMSG_CLOSE: DestroyMainW39。 mdow(hWnd); PostQuitMessage(hWnd); return 0; ) return DefaultMainWinProc(hWnd, message, wPamm, IParam); } int MiniGUIMain(int argc, cxmst char* argvf[])//主程序入口 { ......... //定义变量 ifdef LITE VERSION SetDesktopRect(0, 0, 1024, 768); endif Createlnfo. dwStyle= Ws_VISIBLE|WS— BORDER l ws cAPTION; hMainWnd=CreateMainWindow(amp。 Createlnfo); //创建主窗口 if OaMainWnd===HWND_INVALID) return 1; ShowWindow(hMainWnd, SW_SHOWNORMAL);∥显示主窗口 „„„ } 6 网络传输功能的实现 6. 1 socket 简介 在网络历史的早期,由国际标准化组织 (ISO)和国际电报电话咨询委员会(cCITT)共同出版了 开发系统互联 (OSI)7 层参考模型,把网络过程包括从应用请求到网络介质按功能分成 7 个分立的层次,如下图所示: 图 6 计算机学院《嵌入式系统》课程设计报告 15 6. 2 网络传输功能的实现 6. 2. 1 socket通信过程 一般在设计网络程序时,会分为服务器端与客户端两部分,而一个网络程序本身就具有 Client/ Server 结构,所以在说明 TCP 网络程序的流程时,可以分为 TCP Client 端及 TCP Server 端。 服务器首先启动,通过调用 socket0,建立一个 socket,然后调用 bind0 将该 socket 和本地网络地址绑定在一起,再调用listen0 使 socket 做好侦听的准备,并规定它的请求队列的长度,之后调用accept0 来接收连接。 客户端在建立 socket 后,就可调用 connect0 和服务器建立连接。 连接建立后,客户机和服务器之间就可以通过调用 send0 和 recv0 来发送和接收数据。 最后,数据传送结束后,双方调用 close0 关闭 socket。 6. 2. 2 socket通信的实现 为实现 PC 机和硬件平台的网络通信,首先在编译内核时必须选中对网络功能的支持,并在制作嵌入式文件系统时加入对网络功能的支持。 然后将新的内核和文件系统烧写到目标板上。 程序实现的流程图如下图所示: 图 7 计算机学院《嵌入式系统》课程设计报告 16 6. 2. 3 运行结果 图 8 可以看到 PC机与硬件平台成功建直了连接,叮以进行通信,达到了预期目标。 以后即。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。