《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第1页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第2页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第3页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第4页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

福建工程学院嵌入式系统课程设计(论文)题目: 基于s3c2440设备驱动及其界面设计 班级: 通信0902 姓名: 学号: 指导老师: 目 录1序言 22实践课题题目 33设计目的 34设计过程 34.1 minigui在pc上的安装34.2 minigui在arm上的移植44.3基于minigui的应用界面编程和基于led驱动程序的应用程序的编写55调试结果及改进 11 5.1调试结果11 5.2改进方案126心得体会 127参考文献 141序言minigui 是一种面向嵌入式系统或者实时系统的图形用户界面支持系统。它主要运行于 linux 控制台,实际可以运行在任何一种具有 posix 线程支持的 posix 兼容系统上。minigui 同时也是国内最早出现的几个自由软件项目之一。minigui 的主要特色有:遵循 lgpl 条款的纯自由软件。提供了完备的多窗口机制。这包括:多个单独线程中运行的多窗口。单个线程中主窗口的附属。对话框和预定义的控件类(按钮、单行和多行编辑框、列表框、进度条、工具栏等)。消息传递机制。多字符集和多字体支持,目前支持 iso8859-1、gb2312、big5 等字符集,并且支持各种光栅字体和 truetype、type 1 等矢量字体。全拼、五笔等汉字输入法支持。bmp、gif、jpeg、pcx、tga 等常见图像文件的支持。windows 的资源文件支持,如位图、图标、光标等。插入符、定时器、加速键等。其他(beep、etc/ini 文件操作等)。小巧。包含全部功能的库文件大小为 300 k左右。可配置。可根据项目需求进行定制配置和编译。高稳定性和高性能。minigui 已经在linux 发行版安装程序、cnc 系统、蓝点嵌入式系统等关键应用程序中得到了实际的应用。可移植性好。目前,minigui 可以在 x window 和 linux 控制台上运行。通过这个课程实践,我们进一步巩固嵌入的基础知识,而且可以复习嵌入式系统的基本结构,开发环境的建立和使用,进一步理解嵌入式基本驱动程序、应用程序的设计调试和编译移植方法,同时新学了minigui在pc上的安装、移植和基于minigui的基本输入输出应用编程编译与移植,从而完成了整个linux初步课程的学习。2实践课题题目基于s3c2440的设备驱动及其界面设计3设计目的3.1进一步巩固嵌入式系统的基本知识3.2掌握嵌入式应用系统的基本结构3.3掌握嵌入式系统开发环境建立和使用3.4掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法3.5学会查阅有关专业资料及设计手册3.6 minigui界面编程4设计过程4.1 minigui在pc上的安装4.1.1准备工作4.1.1.1建立工作目录:mkdir /minigui-free cd /minigui-free4.1.1.2复制源文件到工作目录:cp /mnt/hgfs/d/minigui1.6/* /minigui-free4.1.1.3解压文件:tar zxvf libminigui-1.6.10.tar.gz tar zxvf minigui-res-1.6.10.tar.gz tar zxvf mg-samples-1.6.10.tar.gz tar zxvf mde-1.6.10.tar.gz tar zxvf qvfb-1.1.tar.gz4.1.2 minigui库安装4.1.2.1进入目录:cd libminigui-1.6.10/4.1.2.2配置:./configure 在x86上运行只需默认配置即可,配置完成后即可生成makefile4.1.2.3编译:make 成功后即可生成必要的库文件等。4.1.2.4安装:make install 在x86上安装库文件。4.1.2.5把libminigui加入库搜索路径:找到/etc/ld.so.conf,在这个文件末尾加上/usr/local/lib4.1.2.6把系统共享库缓存刷新,将libminigui加载上,可以使用命令 ldconfig这个命令执行时要花十多秒,耐心等待。当然不使用刷新命令重启系统也可以。4.1.3 minigui资源安装4.1.3.1进入目录:cd minigui-res-1.6.10/4.1.3.2安装:make install 必要资源文件的复制安装等操作。4.1.4 minigui例子编译4.1.4.1进入目录:cd mg-samples-1.6.10/4.1.4.2配置:./configure4.1.4.3编译:make编译src目录下的例子程序,即可在src目录下生成可执行文件,用于验证minigui是否在虚拟机上安装成功。4.1.5安装qvfb4.1.5.1进入目录:cd qvfb 1.14.1.5.2配置:./configure4.1.5.3编译:make4.1.5.4安装:make install apt-get install qt3-dev-tools-embedded4.1.6配置minigui.cfgvi /usr/local/etc/minigui.cfg 修改如下部分为system# gal engine and default optionsgal_engine=qvfbdefaultmode=800x480-16bpp# ial engineial_engine=qvfbmdev=/dev/input/micemtype=imps2fbcondefaultmode=800x480-16bppqvfbdefaultmode=800x480-16bppdisplay=04.1.7运行minigui例子程序4.1.7.1打开qvfb:qvfb -width 800 -height 480 &4.1.7.2运行helloword:./helloworld出现此窗口说明运行成功。4.2 minigui在arm上的移植4.2.1综述:实际上过程与minigui在虚拟机上的安装过程类似,只不过是使用交叉编译器来编译而已,以下为老师提供的脚本文件,内容中指定了交叉编译器和需要连接的一些库以及要运行的命令,为我们后续的交叉编译提供了极大的方便!libcross.sh minigui库 交叉编译脚本rescross.sh minigui资源 交叉编译脚本samplecorss.sh minigui例子交叉编译脚本mdecorss.sh minigui例子交叉编译脚本libreduce.sh minigui库裁剪脚本4.2.2将libcross.sh考到minigui的lib库的解压文件夹中将rescross.sh 考到minigui的res资源解压文件夹中 将samplecorss.sh 考到sample例子解压文件夹中将mdecorss.sh 考到mde例子解压文件夹中4.2.3依次运行libcross.sh,rescross.sh,samplecorss.sh,mdecorss.sh4.2.4到nfsroot的,目录下,将libreduce.sh考到这个目录下,运行libreduce.sh4.2.5修改nfsroot下的etc下的minigui的配置文件4.2.6可以使用nfs等通信方式将minigui的库文件和资源文件和配置文件传送到开发板,将minigui.cfg移到开发板的/etc目录下,将minigui的库文件移至开发板的/lib和/usr/lib下,将minigui的资源文件移至开发板的/usr/local/下。4.2.7验证移植是否成功:将mg-samples-1.6.10/src下经过交叉编译的可执行程序(例如helloworld)传送至开发板上,并运行:./helloworld。可能会出现权限不够的情况,则需要运行chmod 777 helloworld,然后再次运行:./helloworld。传送之前应使用file helloworld,若出现arm字样,即说明可运行于arm处理器上。4.3基于minigui的应用界面编程和基于led驱动程序的应用程序的编写4.3.1设计思路我是先看有关minigui的书籍,理解了整体框架后,再在写程序的过程中去使用手册里查阅相关函数,再根据驱动程序里的函数模型来调用函数,将框架和函数搭配在一起。例如:dlgtemplate为对话框模板,定义对话框整体参数。ctrldata为控件模板,定义对话框中的控件的参数。以上两者可以定义整个界面。initdialogboxproc为对话框窗口过程函数,用于对各种消息的处理,包括按键消息,许多函数就是用在这里。initdialogbox (hwnd hwnd)包含dlginitprogress.controls = ctrlinitprogress;和 dialogboxindirectparam (&dlginitprogress, hwnd, initdialogboxproc, 0l);把控件信息告诉对话框模板,再把对话框模板和过程函数对应起来。winproc为主窗口的过程函数,initmainwindow为主窗口的初始化函数,定义主窗口参数,实际上在这个程序中是可以不需要主窗口的。miniguimain为minigui函数的入口点。以上为大致框架,设计过程主要是在于修改initdialogboxproc对话框窗口过程函数。例如:用ioctl(led_fd, a, 3)来控制led的开关。用getwindowtext(getdlgitem(hdlg,idc_edit),usr,22)获取编辑框中的字符串。4.3.2程序注释#include 头文件#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include hwnd hmainwnd; 定义主窗口句柄,在程序中用来指代主窗口 static int led_fd; 设备文件描述符int a=0,b=0,c=0,d=0, num;int q=0,w=0,e=0,r=0;static void draw_circle (hwnd hwnd,int x,int which) 画圆的函数 hdc hdc; 定义设备上下文 int color; color=(which=0)? pixel_blue:pixel_red); 选择圆的颜色,是蓝色还是红色 hdc=beginpaint(hwnd); 获得设备上下文 setbrushcolor(hdc,color); 设置圆的颜色 fillcircle(hdc,x,50,25); 设置圆的位置和半径 endpaint(hwnd,hdc); 终止设备上下文static dlgtemplate dlginitprogress = 对话框模板,定义对话框总体参数 ws_border | ws_caption, 窗口风格 ws_ex_none 扩展风格 0, 0, 400, 330, 左上角的位置和宽和高 led controler, 标题 0, 没有菜单 0, 没有图标 7, 7个控件 null, 指向控件的指针 0 没有附加数据; 定义控件的id#define idc_promptinfo100 静态框的id#define idc_led1 110 按钮led1到led4的id#define idc_led2 120#define idc_led3 130#define idc_led4 140#define idc_edit 150 编辑框的idstatic ctrldata ctrlinitprogress = 控件数据,包含对话框的所有控件 static, 静态框 ws_visible | ss_simple, 控件风格 10, 200, 80, 16, 控件左上角位置和宽和高 idc_promptinfo, 控件id input frequency, 控件标题 0, 没有附加数据 ws_ex_none, 扩展风格 , button, 按钮 ws_visible | ws_tabstop | bs_pushbutton, 15, 140, 50, 20, idc_led1, led1, 0, ws_ex_none , button, 按钮 ws_tabstop | ws_visible | bs_pushbutton, 85, 140, 50, 20, idc_led2, led2, 0, ws_ex_none , button, 按钮 ws_visible | ws_tabstop | bs_pushbutton, 155, 140, 50, 20, idc_led3, led3, 0, ws_ex_none , button, 按钮 ws_visible | ws_tabstop | bs_pushbutton, 225, 140, 50, 20, idc_led4, led4, 0, ws_ex_none , button, 按钮 ws_visible | ws_tabstop | bs_pushbutton, 225, 200, 50, 20, idok, ok, 0, ws_ex_none , edit, 编辑框 ws_visible | ws_tabstop | ws_child | ws_border, 90, 200, 100, 20, idc_edit, , 0, ws_ex_none ;对话框过程函数,用来处理各种消息static int initdialogboxproc (hwnd hdlg, int message, wparam wparam, lparam lparam)char usr20; switch (message) case msg_initdialog: 初始化对话框消息 return 1; case msg_paint: 重绘消息 draw_circle (hdlg,40,0) ; 画圆 draw_circle (hdlg,110,1) ; draw_circle (hdlg,180,1) ; draw_circle (hdlg,250,0) ; break; case msg_command: 按下对应的按键执行相应指令 switch (wparam) case idc_led1:a=(q+)%2; ioctl(led_fd, a, 3); break; 控制led1的开关 case idc_led2:b=(w+)%2; ioctl(led_fd, b, 2); break; 控制led2的开关 case idc_led3:c=(e+)%2; ioctl(led_fd, c, 1); break; 控制led3的开关 case idc_led4:d=(r+)%2; ioctl(led_fd, d, 0); break; 控制led4的开关 case idok: 按下ok键 getwindowtext(getdlgitem(hdlg,idc_edit),usr,22); 获取编辑框中的字符串sscanf(usr,%d,&num); 将字符串转换成整数 num=(int)(1.0/num)*100000);int i=0; 把输入的频率转换成周期for(i=0;i100;i+) 先全部点亮led,延时,再关掉全部led,再延时,闪烁100次ioctl(led_fd, 1, 0); ioctl(led_fd, 1, 1); ioctl(led_fd, 1, 2); ioctl(led_fd, 1, 3); usleep(num); ioctl(led_fd, 0, 0); ioctl(led_fd, 0, 1); ioctl(led_fd, 0, 2); ioctl(led_fd, 0, 3); usleep(num); break; break; case msg_close: 关闭消息 enddialog (hdlg, idcancel); 关闭对话框 break; return defaultdialogproc (hdlg, message, wparam, lparam); 如果没有任何消息则返回默认的过程函数static void initdialogbox (hwnd hwnd) 建立对话框 dlginitprogress.controls = ctrlinitprogress; 把控件信息告诉对话框模板 dialogboxindirectparam (&dlginitprogress, hwnd, initdialogboxproc, 0l); 建立对话框,把对话框模板和过程函数对应起来 主窗口过程函数static int winproc(hwnd hwnd, int message, wparam wparam, lparam lparam) switch (message) case msg_paint: 绘图消息 break; case msg_close: 关闭消息 destroymainwindow (hwnd); 关闭主窗口 postquitmessage (hwnd); 发送退出消息给消息循环 break; default: 返回默认过程函数 return defaultmainwinproc(hwnd, message, wparam, lparam); return(0); int initmainwindow(void) mainwincreate createinfo; 建立主窗口对象createinfo.dwstyle = ws_visible | ws_border | ws_caption; 窗口风格 createinfo.dwexstyle = ws_ex_none; 扩展风格 createinfo.spcaption = hello, world!; 标题 createinfo.hmenu = 0; 无菜单 createinfo.hcursor = getsystemcursor(0); 光标 createinfo.hicon = 0; 无图标 createinfo.mainwindowproc = winproc; 定义窗口过程函数 createinfo.lx = 0; 窗口左上角和宽和高 createinfo.ty = 0; createinfo.rx = 800; createinfo.by = 480; createinfo.ibkcolor = color_lightwhite; 背景色 createinfo.dwadddata = 0; 无附加数据 createinfo.hhosting = hwnd_desktop; 托管句柄 hmainwnd = createmainwindow (&createinfo); 创建主窗口并获得句柄 if (hmainwnd = hwnd_invalid) return (0); 如果没打开主窗口返回0 else return (1); 打开成功返回1int miniguimain (int argc, const char* argv) msg msg; 定义消息变量led_fd = open(/dev/gpio-control, o_rdwr | o_noctty | o_ndelay); 打开led设备if (led_fd 0) perror(open device led); 没打开则输出错误信息exit(1); ioctl(led_fd, a, 0); 先关闭所有ledioctl(led_fd, b, 1); ioctl(led_fd, c, 2); ioctl(led_fd, d, 3); #ifdef _mgrm_processes joinlayer(name_def_layer , helloworld , 0 , 0); #endif initdialogbox (hwnd_desktop); 建立对话框 initmainwindow(); 建立主窗口 showwindow(hmainwnd, sw_shownormal); 显示主窗口 消息循环 while (getmessage(&msg, hmainwnd) 从消息队列中获取消息 translatemessage(&msg); 将按键消息转换为字符消息 dispatchmessage(&msg); 把字符消息关联到过程函数 mainwindowthreadcleanup (hmainwnd); 关闭主窗口 return 0;#ifndef _lite_version 如果不是lite版本则要包含以下头文件#include #endif5调试结果及改进5.1调试结果设计的界面如下基本的功能都能实现:按led1到led4按钮可以控制对应的led的开和关,通过键盘的tab键可以选择每个按钮和编辑框,在编辑框内输入不同数字,按ok键,使led的闪烁频率不同。程序的小缺陷:界面上的蓝色的和红色的圆没有闪烁,这主要是我一开始理解错误,以为那只是一种装饰。5.2改进方案当a=0时,led关,同时在界面上显示蓝色,意味着蓝色代表led灯熄灭。当a=1时,led开,同时在界面上显示红色,意味着红色代表led灯点亮。改动处1:case idc_led1:a=(q+)%2; ioctl(led_fd, a, 3); draw_circle (hdlg,40,a) ;break;case idc_led2:b=(w+)%2; ioctl(led_fd, b, 2); draw_circle (hdlg,110,b) ;break;case idc_led3:c=(e+)%2; ioctl(led_fd, c, 1); draw_circle (hdlg,180,c) ;break;case idc_led4:d=(r+)%2; ioctl(led_fd, d, 0); draw_circle (hdlg,250,d) ; break; 改动处2:for(i=0;i100;i+)ioctl(led_fd, 1, 0); ioctl(led_fd, 1, 1); ioctl(led_fd, 1, 2); ioctl(led_fd, 1, 3); draw_circle (hdlg,40,1) ; draw_circle (hdlg,110,1) ; draw_circle (hdlg,180,1) ; draw_circle (hdlg,250,1) ;usleep(num); ioctl(led_fd, 0, 0); ioctl(led_fd, 0, 1); ioctl(led_fd, 0, 2); ioctl(led_fd, 0, 3);draw_circle (hdlg,40,0) ; draw_circle (hdlg,110,0) ; draw_circle (hdlg,180,0) ; draw_circle (hdlg,250,0) ;usleep(num); 这样当led被控制一次,圆也要重绘一次。6心得体会先罗列我这次设计遇到的问题和解决方案:安装qvfb时配置不成功:运行./configure -prefix=/usr/ -with-qt-dir=/usr/lib/qt3/ -with-qt-includes=/usr/include/qt3 -with-qt-libraries=/usr/lib/qt/让minigui可执行程序在虚拟机上运行:在mg-samples-1.6.10目录下运行./configure和make即可,再运行qvfb&,修改参数,再运行./dialogbox(可以运行file dialogbox,查看文件格式,好像是有intel字样,表示可以在虚拟机上运行)。交叉编译:直接修改mg-samples-1.6.10/src下的dialogbox.c,改成自己想写的程序代码,运行make clean,再回到上一级目录就是mg-samples-1.6.10,将脚本文件simplecorss.sh复制到此目录下,运行./ simplecorss.sh,再运行make,回到mg-samples-1.6.10/src下查看是否有dialogbox可执行程序,同时运行file dialogbox,查看文件格式,是否有arm字样,如果有则交叉编译成功。脚本文件simplecorss.sh包含了需要用到的库并指定了交叉编译器,使用起来较为方便,感谢老师为我们提供的方便。将交叉编译的可执行程序dialogbox传送到开发板后,运行./dialogbox,出现permission denied:运行:chmod 777 dialogbox./dialogbox在开发板上无法点击最上层的界面:注销qt使用鼠标或键盘作为输入设备:修改配置文件minigui.cfg驱动设备无法启动:led_fd = open(/dev/gpio-control, o_rdwr | o_noctty | o_ndelay); 其中设备名要和开发板上/dev/目录下的设备名一致,打开方式应为可读可写,而不是只读。关掉开发板上的led-player进程,使led完全受我的minigui可执行程序控制:在运行dialogbox前,先在超级终端里输入ps,查看

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论