嵌入式Linux系统usb摄像头图像采集及图片处理毕业设计论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式Linux系统usb摄像头图像采集及图片处理毕业
设计论文
……………………. ………………. …………………
山东农业大学
毕业论文
嵌入式Linux系统摄像头图像采集及处理
装
订
线
……………….……. …………. …………. ………
目录
摘要I
Asbtract II
引言 1
1.硬件开发平台环境 1
1.1 ARM920T简介 1
1.2硬件平台是min2440开发板简介 2
1.3 353摄像头简介 2
2.嵌入式系统和相关实现 3
2.1 嵌入式系统组成简介 3
2.2 USB设备基础 3
2.3 USB 驱动加载 4
2.4 UVC设备驱动 5
2.5 API接口V4l2介绍: 6
3.图像采集及处理 10
3.1 应用程序采集数据10
3.2图像格式简介10
3.2.1YUV格式详解 10
3.2.2 RGB格式详解11
3.2.3YUV格式转换成RGB格式12
3.3保存bmp文件格式13
4 TFT液晶屏显示驱动程序14
4.1 LCD驱动简介14
4.2 LCD驱动分析17
4.3用户程序图像在液晶屏上显示25 4.4s3c2440 lcd移植步骤: 25
结论29
参考文献30
致谢31
Contents
Abstract II
Perface 1
1. Hardware development platform environment 1
1.1 ARM920TProfile 1
1.2The hardware platform introduces 2
1.3 353camera profile 2
2. The embedded system and realizes related 3
2.1 Embedded system composition synopsis 3
2.2 USBdevices are built 3
2.3 USB actuation load 4
2.4 UVC equipment 5
2.5 APIinterface V4l2 profile 6
3. Image acuisition and actuation 10
3.1 Application data collected 10
3.2Image on the format 10
3.2.1YUV Format to labour 10
3.2.2 RGB Format to labour 11
3.2.3YUV format conversion RGB format 12
3.3Preserves the bmp document format 13
4 TFT Liquid crystal box demonstration driver 14 4.1 LCD driver profile 14
4.2 LCD Driver analysis 17
4.3 The user program image demonstrated 25
4.4 s3c2440 lcd Transplant steps 25
Conclusion 29
References 30
Acknowledgement 31
嵌入式linux系统摄像头图像采集及处理
作者:华耀军,指导教师:侯加林
(山东农业大学机电学院教授)
【摘要】本文的研究内容是设计开发一个基于USB摄像头的嵌入式图像采集系统。
这个图像采集系统由USB摄像头驱动程序模块、上层图像采集程序模块、bmp文件生成程序模块构成,及在TFT液晶屏上面显示。
采用的嵌入式摄像头是中星微的353摄像头,并网上下载UVC摄像头驱动达到采集图片信息的效果,并将图片保存在NandFlash里,用BMP图片格式,最后将图片在LCD液晶上面显示,本文设计开发的嵌入式图像采集系统能够在基于S3C2440微处理器和linux 操作系统的平台下稳定运行,并能达到预期的目标。
关键词:S3C2440微处理器; USB摄像头;linux
Embedded Linux System Camera Image Acquisition And Processing
Author:Hua Yaojun,Supervisor:Hou Jialin
(Shandong Agricultural University Position:professor)
Abstract ln recent years the high performance, the low power loss's ARM processor became the embedded application the mainstream; Opens the
source the embedded Linux operating system, because the system is stable, the compatibility and the portability are good, the network function strong and so on merits also become one of first choice embedded operating systems, the use existing USB camera must develop the related driver, because uses the core micro company's USB camera's to be very high in market percentage, but compresses after highly effective, outputs the JPEG image, therefore this article designed in view of this kind of USB camera has processed the platform based on microprocessor S3C2440A0 processor's image gathering, has realized JPEG image gathering and the network transmission. This article research content is the design develops one based on the USB camera's embedded image gathering system. This image gathering system by USBKeywords: S3C2440 microcontroller; usb Cameras;Linux;
引言
USB2.0摄像头微处理器支持高速USB2.0接口,内嵌强劲的图像后处理单元,JPEG高速编译码器,支持高达200万像素的CMOS传感器接口和CCD传感器接口,处理器设计的产品可以实现独特的运动监测功能与脸部追踪功能,这不仅大大加强了显示效果,提高了画面的品质,更拓展了PC摄像头的应用领域,如增强的实时视频聊天功能和门禁监测系统。
主要功能:USB2.0高速传输并兼容USB1.1;高速图像后处理单元;JPEG高速编译码器;VGA下30帧/秒高速传输;CMOS/CCD接口;内置8比特微控制器。
不仪具备以上的先进特性,还拥有以下多种可扩展性:多个GPIO接口为
增加连拍、LED指示灯、快捷键等功能提供了无限可能;USB2.0兼容USB1.1,为摄像头的广泛的使用增加了保障;支持多种操作系统,如64-bit Window,Windows XP,Linux,Mac,VxWorks,WinCE等等。
以下就是对USB2.0摄像头微处理器的硬件设计方法及外围电路分布的介绍。
1.硬件开发平台环境
1.1 ARM920T简介
三星公司推出的16/32位RISC微处理器S3C2440A,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。
为了降低整体系统成本,S3C2440A提供了一下丰富的内部设备,S3C2440A采用了ARM920t的内核,0.13um的CMOS标准宏单元和存储器单元。
其低功耗,简单,优雅,且全静态设计特别适合于对成本和功率敏感型的应用。
它采用了新的总线架构,Advanced Micro controller Bus ArchitectureAMBA.。
S3C2440A的杰出的特点是其核心处理器CPU,是一个由Advanced RISC Machines有限公司设计的16/32位ARM920T 的RISC处理器。
ARM920T实现了MMU,AMBA BUS和Harvard高速缓冲体系结构构。
这一结构具有独立的16KB指令Cache和16KB数据Cache。
每个都是由具有8字长的行组成。
通过提供一套完整的通用系统外设,S3C2440A减少整体系统成本和无需配置额外的组件。
为手持设备和通用嵌入式应用提供片上集成系统解决方案。
16/32位RISC体系结构和ARM920T内核强大的指令集。
加强的ARM体系结构MMU用于支持WinCE,EPOC 32和Linux。
指令高速存储缓冲器(I-Cache),数据高速存储缓冲器(D-Cache),写址TAG RAM减少主存带宽和响应性带来的影响。
采用ARM920T CPU内核支持ARM调试体系结构。
内部高级微控制总线(AMBA)体系结构AMBA2.0,AHB/APB。
1.2硬件平台是min2440开发板简介
Mini2440是一款真正低价实用的ARMS开发板,是目前国内性价比最高的一款学习板;它采用Samsung S3C2440为微处理器,mini2440的PCB采用沉金工艺的四层板设计,并采用专业稳定的CPU内核电源芯片和复位芯片来保证系统运行时的稳定性。
这次设计用到的资源介绍:
SDRAM内存
FLASH存储
在板256M Nand Flash,掉电非易失
在板2M Nor Flash,掉电非易失,已经安装BIOS
LCD显示
-板上集成4线电阻式触摸屏接口,可以直接连接四线电阻触摸屏
-支持黑白、4级灰度、16级灰度、256色、64K色、真彩色TFT液晶屏,尺寸从3.5寸到12.1寸,屏幕分辨率可以达到1024x768象素
-标准配置为统宝3.5”真彩LCD,分别率240x320,带触摸屏
1个USB Host
1个USB Slave B型接口
1.3 353摄像头简介
353摄像头技术参数:图像传感器,30万像素usb摄像头,视像解像度,640水平 x 480垂直像素。
RM9开发板中的LINUX系统专用的30万像素USB摄像本
摄像头可配S3C-2440等ARM9开发板使用,获取图像清晰,遵守USB标准1.1和2.0协议, 即插即用和自动电源控。
2.嵌入式系统和相关实现
2.1 嵌入式系统组成简介
内部集成了多种外设控制模块,在实际使用时可以根据需要进行裁减。
开发板上提供了64M SDRAM、32M Flash、640×480 TFT LCD触摸屏,以及外扩的USB主口控制器等,它们构成了一个嵌入式多媒体开发平台,可以满足复杂计算和图形显示的需求。
采用353芯片的摄像头支持多种制式,CIF352×288格式帧率达30fps,可实现真正的实时视频捕获,VGA640×480格式帧率为26fps,具有完善的自动亮度、白平衡控制,提供色彩饱和度、对比度、边缘增强、伽马表等高级数码影像控制功能。
它与TWAIN标准兼容,提供640×480格式的高清晰静止图像捕获模式,具有多种视频和输出格式供选择。
USB总线控制器采用Cypress 公司的一款专为嵌入式领域研制的USB控制芯片CY67300,该芯片可作为主口控制,也可作为从口控制芯片,内嵌有8051微控制器和RAM,支持全速和高速两种模式。
JTAG口用于Flash的擦写,UART用于系统调试。
以太网口可使现网络传输,也可作NFS调试用。
2.2 USB设备基础
Liunx系统中对USB设备的支持是通过如图2-1所示的结构实现的。
图2-1 USB系统结构图
Linux内核中的USB Core为设备和主控制器提供API接口。
USB Core 包含所有的USB设备和主控制器的一些通用操作,为向上和向下操作提供一个接口。
其中,字符设备面向字符I/O操作,没有缓冲,顺序读取;而块设备面向数据块,
所有操作都通过内核地址空间的I/O缓冲区完成,支持随机存取操作。
USB设备通过快速串行通信的方式工作,应作为字符设备来处理。
系统加载设备驱动的方式有模块加载和内核初始化加载两种:前者通过用户使用insmod命令动态加载到内核中,通过rmmod命令卸载驱动模块;后者是把驱动编进内核,在内核初始化时自动加载。
USB主口程序由HCD主机控制器驱动、USBD USB驱动程序以及客户程序组成。
其中USBD负责管理所有HCD、设备驱动和所有连接到USB总线上的设备,是USB主机软件的核心。
如图2所示,Linux系统中USB子系统采用分层结构,其中USBD和HCD提供了支持设备驱动程序开发的API。
USB设备驱动程序不是通过I/O操作访问设备,而是通过USB Core提供的标准接口与设备交互,它采用由管道组成的通道与设备进行通信。
设备驱动程序根据USBD创建所需的管道,并为其分配传输所需的缓冲空间。
USB的传输分为控制传输、中断传输、批量传输以及等时传输四种模式。
对于时间性极强但是准确性不高的视频捕捉应用来说,摄像头应采用等时传输模式。
Linux系统中,任何USB传输都需要通过URBUSB请求块来实现。
为了尽可能快地得到图像数据,需要加大URB的缓冲,这样可以降低每个USB事务中握手信息所占的比例,提高有效数据传输比例。
由于每次USB传输都要包括URB的建立、发送、回收、数据整理,而在这些阶段中不产生有效数据,因此可建立两个URB 交替工作,一个URB在等待回收时初始化另一个URB。
2.3 USB 驱动加载
Make menuconfig ARCHarm
1先加载usb作为主设备,添加如下图:
图2-2 USB作为主设备图
2加载usb主控制器驱动(UHCI OHCI EHCI)
添加主控制器支持如下图:
图2-3 USB支持主控制器协议图
3加载usb设备驱动,添加的是UVC摄像头驱动,添加如下图:
图2-3 USB摄像头UVC驱动图
2.4 UVC设备驱动
UVC摄像头内核驱动和应用程序可以到下面这个luvcview官网网址下载 //0>./software/linux/v4l2-software/luvcview/
static int __init uvc_initvoid
初始化uvc驱动,将这个uvc驱动加载时入内核
uvc_ctrl_init;
注册一个usb驱动,里面包含大量的函数操作及访问:
result usb_register&uvc_driver.driver;
注册入驱动的函数
struct uvc_driver uvc_driver
probe uvc_probe,热插拔时调用,包括匹配时的登记设备及初始化设备 disconnect uvc_disconnect,拔出时,放开设备,放开kref包
suspend uvc_suspend,
resume uvc_resume,
reset_resume uvc_reset_resume,
supports_autosuspend 1,
,
.id_table uvc_ids如下定义,里面包含厂商ID创建usb版本信息
static struct usb_device_id uvc_ids[]
match_flags USB_DEVICE_ID_MATCH_DEVICE,
idVendor 0x045e,
idProduct 0x00f8,
bInterfaceClass USB_CLASS_VIDEO,
bInterfaceSubClass 1,
bInterfaceProtocol 0,
driver_info UVC_QUIRK_PROBE_MIN ,
查看usb接口是否符合,并找到该接口
list_for_each_entryterm, &dev-entities, list
uvc_scan_chain&dev-video 0
list_for_each_entrystreaming, &dev-streaming, list
初始化该usb接口uvc_video_init&dev-video;
登记并分配一个 struct video_device 里面包含对v4l2的种操作函数 struct video_device vdev video_device_alloc;
这是建立了一个V4L2设备,下面将对V4L2设备介绍。
2.5 API接口V4l2介绍:
Video4linux2(简称V4L2,是linux中关于视频设备的内核驱动。
V4L2较V4L有较大的改动,并已成为2.6的标准接口,函盖video\dvb\FM,多数驱动都在向V4l2迁移。
更好地了解V4L2先从应用入手,然后再深入到内核中结合物理设备/接口的规范实现相应的驱动。
V4L2采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioctl函数来实现。
Linux系统中一般的文件操作是通过read、write等系统调用完成,但这些系统调用是通过内核态与用户态之间相互进行数据拷贝实现的。
对于图像数据来说,进行拷贝必然会增加时间开销,因此需要使用内存映射的办法来加以解决。
在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。
UVC一般操作流程:(重要函数在uvc_v4l2.c中有定义)
1打开设备文件。
int fdopen”/dev/video0〃,O_RDWR;
2取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。
VIDIOC_QUERYCAP,struct v4l2_capability 3选择视频输入,一个视频设备可以有多个视频输入。
VIDIOC_S_INPUT,struct v4l2_input
4设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format 5向驱动申请帧缓冲,一般不超过5个。
struct v4l2_requestbuffers 6将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制,直接mmap。
7将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer
8开始视频的采集。
VIDIOC_STREAMON
9出队列以取得已采集数据的帧缓冲,取得原始采集数据。
VIDIOC_DQBUF 10将缓冲重新入队列尾,这样可以循环采集。
VIDIOC_QBUF
11停止视频的采集。
VIDIOC_STREAMOFF
12关闭视频设备。
closefd;
struct video_device //struct video_device该结构体重要函数各种操作v4l2的函数
const struct v4l2_file_operations *fops;
struct device dev;/* v4l device */
struct cdev *cdev;/* character device */
包含了大量操作v4l2的命令
const struct v4l2_ioctl_ops *ioctl_ops;
;
首先应申请足够大的内核态内存作为图像数据缓存,将URB带来的数据暂存;然后将其用remap_page_range函数映射到用户态空间。
这样,用户态空间的图像处理程序就可以使用mmap函数,直接读写内核态帧缓冲区,减少了额外开销。
要进行视频捕捉必须用到VIDIOCMCAPTURE 和VIDIOCSYNC这两个ioctl函数。
VIDIOCGMBUF包含有所用缓冲器的设置与地址。
VIDIOCMCAPTURE用于开始捕捉;VIDIOCSYNC用于等待捕捉完成。
为加快数据处理速度,一般使用双缓冲设置,即buffer0捕捉数据时,buffer1传输数据;buffer1捕捉数据时,buffer0传输数
据。
const struct v4l2_file_operations uvc_fops
open uvc_v4l2_open,当用户空间打开v4l2设备时调用此函数
ioctl uvc_v4l2_ioctl,命令操作函数
read uvc_v4l2_read,
mmap uvc_v4l2_mmap,将v4l2数据映射到用户空间
poll uvc_v4l2_poll,
;
当用户空间打开v4l2设备时调用此函数
static int uvc_v4l2_openstruct file *file
usb_autopm_get_interfacevideo-dev-intf; 获取usb接口
/* 创建一个struct uvc_fh *handle; */
handle kzallocsizeof *handle, GFP_KERNEL;
file-private_data handle;将struct uvc_fh结构给文件私有数据指针
kref_get&video-dev-kref;
将v4l2数据映射到用户空间
static int uvc_v4l2_mmapstruct file *file,struct vm_area_struct *vma
struct uvc_video_device *video video_drvdatafile;
struct uvc_buffer *uninitialized_varbuffer;
vma-vm_flags | VM_IO;
addr unsigned longvideo-queue.mem + buffer-//.set;
vma-vm_private_data buffer;
uvc_vm_openvma;
long uvc_v4l2_do_ioctl包含了用户空间操作V4l2命令
V4l2命令通过使用ioctl来设定属性及采集方式:
打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。
这一步是可选的。
在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理:
在进行V4L2开发中,常用的ioctl命令标志符如下some are optional: VIDIOC_REQBUFS:分配内存
VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
VIDIOC_QUERYCAP:查询驱动功能
VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式
VIDIOC_S_FMT:设置当前驱动的频捕获格式
VIDIOC_G_FMT:读取当前驱动的频捕获格式
VIDIOC_TRY_FMT:验证当前驱动的显示格式
VIDIOC_CROPCAP:查询驱动的修剪能力
VIDIOC_S_CROP:设置视频信号的边框
VIDIOC_G_CROP:读取视频信号的边框
VIDIOC_QBUF:把数据从缓存中读取出来
VIDIOC_DQBUF:把数据放回缓存队列
VIDIOC_STREAMON:开始视频显示函数
VIDIOC_STREAMOFF:结束视频显示函数
VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。
这些命令还调用了这些函数:
uvc_query_v4l2_ctrlvideo, arg
usb_rcvctrlpipedev-udev, 0 //创建一个管道
urb usb_alloc_urb0, GFP_NOIO;//分配一个urb,并初始化一个urb usb_fill_control_urb;
usb_submit_urburb, GFP_NOIO;//提交一个urb
用户空间的ioctl使用VIDIOC_REQBUFS,申请buffer,并使用VIDIOC_QUERYBUF查询这个buffer,最后mmap到用户空间上。
3.图像采集及处理
3.1 应用程序采集数据
首先初始化camera将图片参数大小格式等传到驱动中去InitCamera&videoIn0,"/dev/video0", width,height, V4L2_PIX_FMT_YUYV, 1;里面包括了设置,传递格式,图片大小等参数
case V4L2_PIX_FMT_YUYV:YUV格式
memcpyvd-framebuffer,vd-mem[vd-buf.index],
size_tvd-framesizeIn;
从上面可以看出采集出来数据格式是YUV格式的。
3.2图像格式简介
3.2.1YUV格式详解
YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。
前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。
表2.3中的YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。
(注意:在介绍各种具体格式时,YUV各分量都会带有下标,如Y0、U0、V0表示第一个像素的YUV分量,Y1、U1、V1表示第二个像素的YUV分量,以此类推。
) 下面区分一下YUV和YCbCr
YUV色彩模型来源于RGB模型,该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。
应用:模拟领域
Y' 0.299*R' + 0.587*G' + 0.114*B'
U' -0.147*R' - 0.289*G' + 0.436*B' 0.492*B'- Y'
V' 0.615*R' - 0.515*G' - 0.100*B' 0.877*R'- Y'
R' Y' + 1.140*V'
G' Y' - 0.394*U' - 0.581*V'
B' Y' + 2.032*U'
YCbCr模型来源于YUV模型。
YCbCr是 YUV 颜色空间的偏移版本.
应用:数字视频,ITU-R BT.601建议
Y’ 0.257*R' + 0.504*G' + 0.098*B' + 16
Cb' -0.148*R' - 0.291*G' + 0.439*B' + 128
Cr' 0.439*R' - 0.368*G' - 0.071*B' + 128
R' 1.164*Y’-16 + 1.596*Cr'-128
G' 1.164*Y’-16 - 0.813*Cr'-128 - 0.392*Cb'-128
B' 1.164*Y’-16 + 2.017*Cb'-128
PS: 上面各个符号都带了一撇,表示该符号在原值基础上进行了伽马校正,伽马校正有助于弥补在抗锯齿的过程中,线性分配伽马值所带来的细节损失,使图像细节更加丰富。
在没有采用伽马校正的情况下,暗部细节不容易显现出来,而采用了这一图像增强技术以后,图像的层次更加明晰了。
所以说H264里面的YUV应属于YCbCr.
3.2.2 RGB格式详解
对一种颜色进行编码的方法统称为“颜色空间”或“色域”。
用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。
RGB(红、绿、蓝)只是众多颜色空间的一种。
采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。
记录及显示彩色图像时,RGB是最常见的一种方案。
但是,它缺乏与早期黑白显示系统的良好兼容性。
因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV 颜色空同,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。
RGB565:
RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。
程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。
当读出一个像素后,这个字的各个位意义如下:
高字节低字节 R R R R R G G G G G G B B B B B
可以组合使用屏蔽字和移位操作来得到RGB各分量的值: #define RGB565_MASK_RED 0xF800
#define RGB565_MASK_GREEN 0x07E0
#define RGB565_MASK_BLUE 0x001F
R wPixel & RGB565_MASK_RED 11; 取值范围0-31
G wPixel & RGB565_MASK_GREEN 5; 取值范围0-63
B wPixel & RGB565_MASK_BLUE; 取值范围0-31
该代码可以解决24位与16位相互转换的问题
RGB24:
RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。
注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。
通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:
typedef struct tagRGBTRIPLE
BYTE rgbtBlue; // 蓝色分量
BYTE rgbtGreen; // 绿色分量
BYTE rgbtRed; // 红色分量
RGBTRIPLE;
3.2.3YUV格式转换成RGB格式
图片yuv422到rgb24格式转换:
Pyuv422torgb24unsigned char * input_ptr, unsigned char * output_ptr, unsigned int image_width, unsigned int image_height
unsigned int i, size;
unsigned char Y, Y1, U, V;
unsigned char *buff input_ptr;
unsigned char *output_pt output_ptr;
size image_width * image_height /2;
for i size; i 0; i--
Y buff[0] ;
U buff[1] ;
Y1 buff[2];
V buff[3];
buff + 4;
*output_pt++ R_FROMYVY,V;
*output_pt++ G_FROMYUVY,U,V;
*output_pt++ B_FROMYUY,U;
*output_pt++ R_FROMYVY1,V;
*output_pt++ G_FROMYUVY1,U,V;
*output_pt++ B_FROMYUY1,U;
3.3保存bmp文件格式
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
bmp文件头bmp file header:提供文件的格式、大小等信息位图信息头bitmap information:提供图像数据的尺寸、位平面数、压
缩方式、颜色索引等信息
调色板color palette:可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
位图数据bitmap data:就是图像数据啦
Bmp文件头
typedef struct tagBITMAPFILEHEADER unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
BITMAPFILEHEADER;
Bmp文件信息
typedef struct tagBITMAPINFOHEADER /* bmih */
unsigned int biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
BITMAPINFOHEADER;
保存bmp图片:
先写Bmp文件头
fwrite&bmp_file_head,12,1,foutpict;
再写写Bmp文件信息,由于是rgb24位格式不用写调色板 fwrite&bmp_tupian_info,40,1,foutpict;
最后写RGB数据到文件
fwritepicture, sizeof char, width * height * 3, foutpict;
4 TFT液晶屏显示驱动程序
4.1 LCD驱动简介
LCD 控制器的功能是产生显示驱动信号,驱动LCD显示器。
用户只需要通过读写一系列的寄存器,完成配制和显示控制。
MX1中的LCD控制器可支持单色/彩色 LCD显示器。
支持彩色TFT时,可提供4/8/12/16位颜色模式,其中16位颜色模式下可以显示65536种颜色。
配置LCD控制器重要的一步是指定显示缓冲区,显示的内容就是从缓冲区中读出的,其大小由屏幕分辨率和显示颜色数决定。
1LCD工作的硬件需求:
要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。
在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。
通过LCD控制器就可以产
生LCD驱动器所需要的控制信号来控制STN/TFT屏了。
2S3C2440内部LCD控制器结构图:
我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成;
b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的;
c:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上;
d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器;
e:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的LCD驱动器即不同的STN/TFT屏。
3常见TFT屏工作时序分析: (如下图4-1)
图4-1 TFT LCD时序图
LCD提供的外部接口信号: VSYNC/VFRAME/STV: 垂直同步信号TFT/帧同步信号STN/SEC TFT信号;
HSYNC/VLINE/CPV:水平同步信号TFT/行同步脉冲信号STN/SEC TFT信
号;
VCLK/LCD_HCLK:象素时钟信号TFT/STN/SEC TFT信号;
VD[23:0]:LCD像素数据输出端口TFT/STN/SEC TFT;
VDEN/VM/TP:数据使能信号TFT/LCD驱动交流偏置信号STN/SEC TFT信号;
LEND/STH:行结束信号TFT/SEC TFT信号;
LCD_LPCOE:SEC TFT OE信号;
LCD_LPCREV:SEC TFT REV信号;
LCD_LPCREVB:SEC TFT REVB信号。
所有显示器显示图像的原理都是从上到下,从左到右的。
这是什么意思呢?这么说吧,一副图像可以看做是一个矩形,由很多排列整齐的点一行一行组成,这些点称之为像素。
那么这幅图在LCD上的显示原理就是:(如图4-2) 图4-1 TFT LCD显示器扫描图
A:显示指针从矩形左上角的第一行第一个点开始,一个点一个点的在LCD上显示,在上面的时序图上用时间线表示就为VCLK,我们称之为像素时钟信号;
B:当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为1 Line;
C:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换;
D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图显示完成。
因此,这一行一行的显示在时间线上看,就是时序图上的HSYNC;
E: 然而,LCD的显示并不是对一副图像快速的显示一下,为了持续和稳定的在LCD上显示,就需要切换到另一幅图上另一幅图可以和上一副图一样或者不一样,目的只是为了将图像持续的显示在LCD上。
那么这一副一副的图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行;
F:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC。
4.2 LCD驱动分析
4.2.1 帧缓冲设备接口简介
帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
这种操作是抽象的,统一的。
用户不必关心物理显存的位置、换页机制等等具体细节。
这些都是由Framebuffer设备驱动来完成的。
帧缓冲驱动的应用广泛,在linux的桌面系统中,Xwindow服务器就是利用帧缓冲进行窗口的绘制。
尤其是通过帧缓冲可显示汉字点阵,成为Linux汉化的唯一可行方案。
读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。
例如用cp /dev/fb0 tmp命令可将当前屏幕的内容拷贝到一个文件中,而命令cp tmp /dev/fb0 则将图形文件tmp显示在屏幕上。
映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。
为此,Linux在文件操作 file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。
对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到
用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。
由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多。
I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。
ioctl的操作是由底层的驱动程序来完成的。
在应用程序中,操作/dev/fb的一般步骤如下:
打开/dev/fb设备文件。
用ioctl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。
根据屏幕参数可计算屏幕缓冲区的大小。
将屏幕缓冲区映射到用户空间。
映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。
文档/documentation/fb的索引文件
framebuffer.txt--- frame buffer 设备介绍
internals.txt----frame buffer设备内部快速浏览
帧缓冲设备提供了显卡的抽象描述。
他同时代表了显卡上的显存,应用程序通过定义好的接口可以访问显卡,而不需要知道底层的任何操作。
该设备使用特殊的设备节点,通常位于/dev目录,如/dev/fb*。
1用户角度的/dev/fb*
从用户的角度看,帧缓冲设备和其他位于/dev下面的设备类似。
他是一个字符设备,通常。