嵌入式课程设计.docx
《嵌入式课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
![嵌入式课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/23/6e77af82-a249-4638-a078-6a6321abfeb1/6e77af82-a249-4638-a078-6a6321abfeb11.gif)
嵌入式课程设计
课程设计
题目:
嵌入式应用
专业:
电子信息工程
学号:
.......................
姓名:
.......................
指导老师:
..........
时间:
.............
目录
一、设计课题………………………………………………………2
二、设计目的………………………………………………………2
三、设计任务及原理………………………………………………2
四、总体方案设计及工作流程……………………………………3
五、各环节实现分析说明…………………………………………4
六、调试过程及调试记录…………………………………………………………11
七、总结体会………………………………………………………14
一、设计课题:
基于S3C2440的视频采集及其传输
二、设计目的:
1.进一步巩固嵌入式系统的基本知识;
2.掌握嵌入式应用系统的基本结构;
3.掌握嵌入式系统开发环境建立和使用;
4.掌握嵌入式系统中V4L的驱动结构;
5.掌握JPEG图片格式和RGB格式之间的编解码;
6.掌握以太网的Socket程序的设计调试;
7.学会查阅有关专业资料及设计手册;
三、设计任务及原理:
1.掌握嵌入式系统的Linux开发环境建立和使用;
2.掌握Linux下驱动、应用程序的设计和调试;
2.1对进行OV9650驱动程序的设计,通过camera接口进行图像获取
2.2实现YUV422视频格式的压缩与转换
2.3socket通信进行图片传输,将本地图片传输到PC端
3.掌握基于Frambuffer的应用程序设计,将采集的图片显示在本地LCD屏。
总体要求如上述第2点所述,TQ2440采集图像,经过格式转换,在TQ2440平台的LCD上进行显示,同时将采集的图像压缩成,通过以太网将图片传送到电脑平台。
通过电脑平台的操控,可控制嵌入式平台图像的采集参数。
4.控制图像采集的主要参数有:
VIDIOCSWIN:
设置捕捉源的大小
VIDIOCSCAPTURE:
设置目标图像大小(不得超过源大小)
VIDIOCCAPTURE:
设置采集启动停止
5.编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;设计成果应包括各阶段的屏幕截图、运行结果、现象说明和原理分析。
四、总体方案设计及工作流程
本次课程设计要求是基于S3C2440的视频采集及其传输,硬件环境由现成设备搭建无需自己设计,主要包括摄像头、TQ2440实验平台以及PC机。
软件设计包括开发环境搭建、驱动程序设计、应用程序设计及最终调试这几个环节。
其中驱动程序设计主要有:
1、OV9650配置的实现.2、TQ2440摄像头C通道采集的实现.3、OV9650源数据的DMA操作.4、V4L结构及参数的实现。
运用开发设计包含:
1、YUV格式数据的获取.2实现YUV数据到RGB的转换并显示3、同时实现YUV数据的压缩保存为jpej图片.4利用socket编程实现ARM和PC机图片传输。
系统实现工作流程图如下:
五、各环节实现分析说明
1、硬件及开发环境搭建
硬件连接结构
camera控制器:
Preview通道可以将YCbCr4:
2:
2格式的图像转换为RGB(16bit或24bit)格式的数据,并存放于为PreviewDMA分配的内存中,最大分辨率为640*480。
主要用于本地液晶屏显示。
如果将PreviewDMA的内存和Framebuffer内存重叠的话,就可以实现采集直接输出到液晶屏上了。
Codec通道可以输出YCbCr4:
2:
0或YCbCr4:
2:
2格式到为CodecDMA分配的内存中。
最大分辨率为4096*4096。
主要用于图像的编解码处理。
2、驱动及应用软件开发
2.1基于V4L2视频驱动主要涉及到以下几个方面
2.1.1、摄像头
要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。
2.1.2、Camera解码器、控制器
如果摄像头是模拟量输出的,要熟悉解码器的配置。
最后数字视频信号进入camera控制器后,还要熟悉camera控制器的操作。
2.1.3、V4L2的API和数据结构
编写驱动前要熟悉应用程序访问V4L2的方法及设计到的数据结构。
2.1.4、V4L2的驱动架构
最后编写出符合V4L2规范的视频驱动。
视频驱动的整体框架见下图:
(1)、V4L2驱动注册、注销函数
(2)、structvideo_device的构建
(3)、Video核心层的实现
2.2应用软件操作流程
(1)打开设备文件
intfd=open(Devicename,mode);
Devicename:
/dev/video0、/dev/video1……
Mode:
O_RDWR[|O_NONBLOCK]
如果使用非阻塞模式调用视频设备,则当没有可用的视频数据时,不会阻塞,而立刻返回。
(2)取得设备的capability
structv4l2_capabilitycapability;
intret=ioctl(fd,VIDIOC_QUERYCAP,&capability);
看看设备具有什么功能,比如是否具有视频输入特性。
(3)选择视频输入
structv4l2_inputinput;
……初始化input
intret=ioctl(fd,VIDIOC_QUERYCAP,&input);
一个视频设备可以有多个视频输入。
如果只有一路输入,这个功能可以没有。
(4)检测视频支持的制式
v4l2_std_idstd;
do{
ret=ioctl(fd,VIDIOC_QUERYSTD,&std);
}while(ret==-1&&errno==EAGAIN);
switch(std){
caseV4L2_STD_NTSC:
//……
caseV4L2_STD_PAL:
//……
}
(5)设置视频捕获格式
structv4l2_formatfmt;
fmt.type=V4L2_BUF_TYPE_VIDEO_OUTPUT;
fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_UYVY;
fmt.fmt.pix.height=height;
fmt.fmt.pix.width=width;
fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;
ret=ioctl(fd,VIDIOC_S_FMT,&fmt);
if(ret){
perror("VIDIOC_S_FMT\n");
close(fd);
return-1;
}
(6)向驱动申请帧缓存
structv4l2_requestbuffersreq;
if(ioctl(fd,VIDIOC_REQBUFS,&req)==-1){
return-1;
}
v4l2_requestbuffers结构中定义了缓存的数量,驱动会据此申请对应数量的视频缓存。
多个缓存可以用于建立FIFO,来提高视频采集的效率。
(7)获取每个缓存的信息,并mmap到用户空间
typedefstructVideoBuffer{
void*start;
size_tlength;
}VideoBuffer;
VideoBuffer*buffers=calloc(req.count,sizeof(*buffers));
structv4l2_bufferbuf;
for(numBufs=0;numBufsmemset(&buf,0,sizeof(buf));
buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory=V4L2_MEMORY_MMAP;
buf.index=numBufs;
if(ioctl(fd,VIDIOC_QUERYBUF,&buf)==-1){//获取到对应index的缓存信息,此处主要利用length信息及offset信息来完成后面的mmap操作。
return-1;
}
buffers[numBufs].length=buf.length;//转换成相对地址
buffers[numBufs].start=mmap(NULL,buf.length,
PROT_READ|PROT_WRITE,
MAP_SHARED,
fd,buf.m.offset);
if(buffers[numBufs].start==MAP_FAILED){
return-1;
}
(8)开始采集视频
intbuf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
intret=ioctl(fd,VIDIOC_STREAMON,&buf_type);
(9)取出FIFO缓存中已经采样的帧缓存
structv4l2_bufferbuf;
memset(&buf,0,sizeof(buf));
buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory=V4L2_MEMORY_MMAP;
buf.index=0;//此值由下面的ioctl返回
if(ioctl(fd,VIDIOC_DQBUF,&buf)==-1)
{
return-1;
}
根据返回的buf.index找到对应的mmap映射好的缓存,取出视频数据。
(10)将刚刚处理完的缓冲重新入队列尾,这样可以循环采集
if(ioctl(fd,VIDIOC_QBUF,&buf)==-1){
return-1;
}
(11)停止视频的采集
intret=ioctl(fd,VIDIOC_STREAMOFF,&buf_type);
(12)关闭视频设备
close(fd);
2.3、JPEG编解码基本过程
2.3.1、JPEG编码过程:
a、RGB格式转换为YUV格式b、将图像8*8分块c、离散余弦变换(DCT)d、量化(quantization)e、Z字形编码(zigzagscan)f、使用行程长度编码(RLE)对交流系数(AC)进行编码g、熵编码
2.3.2、JPEG解码的主要过程:
a、读入文件的相关信息b、MCU中颜色分量(Y,U,V)
的解码c、直流系数的差分编码d、反量化e、反Zig-zag编码f、反离散余弦变
换f、YCrCb向RGB转换。
2.4、socket编程
socket是网络编程的一种接口,它是一种特殊的I/O,用socket函数建立一个Socket连接,此函数返回一个整型的socket描述符,随后进行数据传输。
通常socket分为三种类型:
流式socket、数据报socket、原始socket。
Socket编程流程图:
本地地址绑定Bind
六、调试过程及调试记录
1、环境搭建:
(1)如图所示搭建硬件连接:
(2)、pc机安装Ubuntu,交叉编译等相关环境的搭建.(3)、TQ2440开发板内核移植,内核版本为
。
交叉编译环境的安装配置步骤:
a、将交叉编译器的压缩包(arm-linux-gcc-4.4.3.tar.gz)拷贝到linux环境下
b、解压缩:
tar-zvxfarm-linux-gcc-4.4.3.tar.gz
c、进入解压文件opt/FriedlyARM/toolschain/4.4.3/bin目录,复制目录路径
d、添加环境变量,进入/etc目录,打开profile(vimprofile)末尾添加
exportPATH=$PATH:
opt/FriedlyARM/toolschain/4.4.3/bin
保存退出
e、执行sourceprofile
f、用arm-linux-gcc-v指令查看是否配置成功
内核移植:
a、解压
b、
c、执行makemenuconfig进行相应配置
d、make生成zImage
e、将zImage下载到开发板
2、驱动的挂载
编译驱动模块:
进入驱动模块所在目录,执行make生成cam_ov9650.ko,将cam_ov9650.ko通过超级终端发送到开发板上。
通过超级终端进入cam_ov9650.ko所在目录,执行insmodcam_ov9650.ko将驱动模块挂载上去。
3、应用程序编译执行及socket服务建立
进入应用程序所在目录,执行make生成名为test的可执行文件,同样用超级终端发送到开发板。
编译socket客户端、服务端程序,将客户端可执行文件发送至开发板上test所在目录。
将ubuntu的IP地址改为和开发的IP地址在同一网段内ifconfigeth0192.168.1.22。
4、启动系统
在ubuntu下运行socket服务端执行./server,开发板上运行test执行./test。
5、调试过程中遇到的问题及解决
(1)调试过程中,第一次编译内核时出错。
经查发现交叉编译器没有搭建,搭建交叉编译器后再次编译内核成功。
(2)内核移植成功后,在挂载驱动时发现不能挂载,请教同学后,做出了如下修改:
目录linux-2.6.25.8/include/asm-arm#vielf.h
添加
#defineR_ARM_V4BX40
目录opt/EmbedSky/linux-2.6.25.8/arch/arm/kernel#
vimmodule.c
(134行添加如下代码)
caseR_ARM_V4BX:
*(u32*)loc&=0xf000000f;
*(u32*)loc|=0x01a0f000;
break;
修改后再次编译移植成功挂载驱动。
(3)网络编程过程中未将机子与开发板的IP地址绑定一致,导致无法成功连接。
后来经过认真分析网络传输过程找到了错误并成功调试。
七、心得体会
这次的课程设计一开始是先将老师给的材料学习一遍做到能够基本的懂得大致的步骤和原理。
首先是驱动程序的设计,然后是视频编解码及Socket编程的实现,最后是软硬件的调试。
通过这次的课程设计掌握了嵌入式开发环境的搭建,对交叉编译器建立、内核移植等相关环境建立、移植操的作更加熟练,对整个嵌入式系统开发流程也有了较好的把握。
学会了驱动模块编写的基本框架以及socket网络编程的相关认识,系统和软件调试查错能力也得到极大的提升。
虽说过程中也暴露出一些问题比如说某些知识掌握不牢、范一些低级错误等,但好在都能及时发现并改正记下以避免下次出现同样问题。