工控嵌入式系统技术之Linux与S3C2410并驾齐驱共铸图象传输系统奇迹
在探索如何更高效地获取监控现场图象数据的征途中,传统的CCD摄像机方案虽易于实施,但成本较高。随着ARM处理器应用广泛与Linux嵌入式技术迅猛发展,利用TCP/IP协议实现远程监控已成为可能。本文提出了一种基于常见中星微USB摄像头采集图象数据,并通过Linux内核Video4Linux编程接口函数实现数据采集,再通过互联网传输至PC端上,进行图象保存与显示。
系统硬件功能框图如所示,CPU采用三星S3C2410处理器,这款处理器搭载了ARM920T核心,拥有独立Cache、LCD、RAM、NAND闪存等,并具备多种通信接口,如UART、DMA、高精度ADC等。在此基础上,我们配置了16MB Flash和32MB SDRAM,以及DM9000E网络扩展模块,以支持网口通信。此外,还引出了一个RS232串口和HOST USB接口,便于与宿主机通讯以及连接USB摄像头,将采集到的图象数据输入到缓冲区并发送至Internet。
软件设计采用客户机/服务器模式,其中S3C2410平台作为服务器,与PC作为客户端。服务器任务是将图象数据上传至Internet,而客户端则负责从Internet下载并保存为文件。以下详细介绍两者的具体实现。
服务器端软件系统设计
建立宿主机开发环境
我们选择RedHat9.0作为宿主机操作系统,并配置交叉编译环境及NFS/TFTP服务,以便于嵌入式系统的开发调试。使用arm-linux-gcc交叉编译工具链生成可执行二进制代码,然后通过NFS mount或ramdisk方式下载到目标板运行。
摄像头驱动程序实现
我们选用ZC0301P型号的USB摄像头,该设备具有硬件JPEG编码能力。驱动程序重点包括提供基本I/O操作接口函数open/read/write/close,以及对中断处理、内存映射及I/O通道控制接口函数ioctl的定义。在file_operations结构中定义这些函数,使得当应用程序调用时,可直接访问驱动提供的功能。如果遇到现成驱动补丁问题,可手动添加失败部分到Config.in和Makefile中解决。
Linux内核配置
在配置内核时,我们需要选中Video for Linux并直接编译进内核,不以模块形式加载;同时需选取USB Support/OHCI/UHCI以及相关摄像头支持;最后完成make dep/make zImage/make module步骤生成spca5xx.o文件,可以通过NFS mount或ramdisk方式加载至目标板上。
服务器端应用程序编写
完成驱动与内核配置后,我们开始撰写应用程序。首先使用交叉编译器在宿主机上进行编译连接生成可执行文件,然后通过NFS mount调试成功后固化至ramdisk。这一过程主要包含初始化设备信息、打开设备文件读取信息设置video_mmap分配缓冲区创建线程互斥量创建视频获取线程实现死循环读取设备数据锁定解锁创建socket监听接受连接建立发送线程同步资源释放等内容。三个关键部分分别涉及图片采集网络发送多线程控制,每个部分详细介绍其主要内容。