福建工程学院《嵌入式系统》课程设计(论文)题目:基于S3C2440设备驱动及其界面设计班级:姓名:学号:指导老师:福建工程学院电子信息与电气工程系2010.01.15《嵌入式系统》课程设计一、设计课题:基于S3C2440的设备驱动及其界面设计二、设计目的:1、进一步巩固嵌入式系统的基本知识;2、掌握嵌入式应用系统的基本结构;3、掌握嵌入式系统开发环境建立和使用;4、掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;5、学会查阅有关专业资料及设计手册;6、MiniGUI界面编程。三、设计任务及要求:1、掌握嵌入式系统开发环境建立和使用;2、掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;3、MiniGUI在PC上的安装、移植4、Linux基本输入输出驱动程序设计编译与移植5、基于MiniGUI的基本输入输出应用编程编译与移植6、编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;7、绘制有关图纸.四、设计内容:1、MiniGUI在X86上安装和运行1.1、准备工作①建立工作目录:mkdir/minigui-freecd/minigui-freemkdir/src②复制源文件到工作目录:cp/media/disk/src/*./cp/mnt/hgfs/linux/src/*/minigui-free③解压文件:tarzxvflibminigui-1.6.10.tar.gztarzxvfminigui-res-1.6.10.tar.gztarzxvfmg-samples-1.6.10.tar.gz1.2、MiniGUI库安装①进入目录:cdlibminigui-1.6.10/②配置:./configure在x86上运行只需默认配置即可,配置完成后即可生成Makefile③编译:make成功后即可生成必要的库文件等。④安装:makeinstall在x86上安装库文件。5.把libminigui加入库搜索路径:进入/etc/ld.so.conf.d建一个minigui.conf,写上/usr/local/lib可以使用命令完成:[root@fedora7]#echo/usr/local/lib/etc/ld.so.conf.d/minigui.conf(如果你使用的不是fedora7可能没有/etc/ld.so.conf.d这个目录,只有一个/etc/ld.so.conf,不过作用是一样的,在这个文件末尾加上/usr/local/lib)(4)最后要把系统共享库缓存刷新,将libminigui加载上,可以使用命令[root@fedora7]#ldconfig这个命令执行时要花十多秒,耐心等待。当然不使用刷新命令重启系统也可以。1.3、MiniGUI资源安装①进入目录:cdminigui-res-1.6.10/②安装:makeinstall必要资源文件的复制安装等操作。1.4、MiniGUI例子编译①进入目录:cdmg-samples-1.6.10/②./configure③编译:make编译src目录下的例子程序,用于验证MiniGUI是否安装成功。即可在src目录下生成可执行文件1.5、安装qvfb使用qt的qvfbcdqvfb1.1./configuremakemakeinstallapt-getinstallqt3-dev-tools-embedded1.6、配置MiniGUI.cfgvi/usr/local/etc/MiniGUI.cfg修改如下部分为[system]#GALengineanddefaultoptionsgal_engine=qvfbdefaultmode=800x480-16bpp#IALengineial_engine=qvfbmdev=/dev/input/micemtype=IMPS2[fbcon]defaultmode=800x480-16bpp[qvfb]defaultmode=800x480-16bppdisplay=01.6、运行MiniGUI例子程序①打开qvfb:qvfb-width800-height480&②运行helloword:src/helloworld出现此窗口说明运行成功。1.7、问题①错误1:InitGUI:Cannotinitializecolorsofwindowelement!InitGUIfailurewhenusing/usr/local/etc/MiniGUI.cfgascfgfile.解决方法:正确配置MiniGUI.cfg文件②错误2:Permissiondenied解决方法:权限不够,使用root用户登录。③错误3:编译出错未找到jpeg,png等解决方法:安装zlib,png,jpeg库。④错误4:⑤错误5:出现符号未找到等编译错误解决方法:makeclean后在make2、控制面板界面编程1.建立新的zc.c文件,在makefile.am文档里添加zc.source=zc.c2.重新命名helloworld.c文件,将程序写进去,并在/minigui-free/mg-samples-1.6.10目录下执行./configure;再执行make命令。①选用对话框方式编程,结构DLGTEMPLATE用来定义对话框本身,结构CTRLDATA用来定义控件。staticDLGTEMPLATEDlgYourTaste={WS_BORDER|WS_CAPTION,WS_EX_NONE,0,0,720,480,Contrl,0,0,8,NULL,0};分别对对话框属性进行定义。staticCTRLDATACtrlYourTaste[]={{button,WS_VISIBLE|BS_DEFPUSHBUTTON|WS_TABSTOP|WS_GROUP,B1_X,B_Y,B_W,B_H,IDC_LED1,LED1,0},…………………………等等};在此结构中定义控件,其中包括4个按钮用来控制LED,3个静态文本框用来显示提示消息,不允许用户更改,1个编辑框用来输入频率。部分代码省略。②主函数操作:打开设备获得文件描述符,函数连接等。led_fd=open(/dev/led,O_RDONLY);if(led_fd0){perror(openlederror!);exit(1);}DlgYourTaste.controls=CtrlYourTaste;DialogBoxIndirectParam(&DlgYourTaste,HWND_DESKTOP,DialogBoxProc,0L);③回调函数:包括对话框回调函数、文本框回调函数。staticvoidmy_notif_proc(HWNDhwnd,intid,intnc,DWORDadd_data){if(id==IDC_EDIT&&nc==EN_CHANGE){}}staticintDialogBoxProc(HWNDhDlg,intmessage,WPARAMwParam,LPARAMlParam){switch(message){caseMSG_INITDIALOG:{}return1;caseMSG_PAINT:{}return1;caseMSG_TIMER:{}caseMSG_COMMAND:switch(wParam){}break;caseMSG_CLOSE:break;}returnDefaultDialogProc(hDlg,message,wParam,lParam);}使用的几个消息:MSG_INITDIALOG:建立对话框和控件之后,发送到回调函数的MSG_PAINT:窗口重绘时发送到窗口过程。MSG_TIMER:timer专用。MSG_COMMAND:传递wParam参数。MSG_CLOSE:关闭时发送。文本框回调函数用于频率的获取。④自定义函数:实现绘图功能。staticvoiddraw_circle_s(HWNDhDlg,intx,intwhich){HDChdc;intcolor;color=((which==0)?PIXEL_blue:PIXEL_red);hdc=BeginPaint(hDlg);SetBrushColor(hdc,color);FillCircle(hdc,x,100,25);EndPaint(hDlg,hdc);}根据传递的参数绘制不同颜色的圆。⑤必须深刻理解消息回调机制,每一个消息产生各自的动作。3、驱动程序设计3.1LED驱动通过不同的参数实现不同LED的亮灭情况即可。staticinteduk4_led_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){unsignedcharstatus=0xff;switch(cmd){case0:case1:if(arg4){return-EINVAL;}status=inb(LED_BASE);if(0==cmd){status&=~(0x1arg);}elseif(1==cmd){status|=(0x1arg);}outb(status,LED_BASE);return0;default:return-EINVAL;}}3.2键盘驱动首先必须实现键值的读取,使用基本的行列扫描法。为提高驱动效率使用到了系统定时器,FIFO,队列,阻塞读取等。为了和IAL结合,必须在驱动中实现状态信息的传递,使用1bit表示如1表示弹起,0表示按下。实现方法:当上一次键值和当前键值相等时表示一直按着回一直放开。当上一次键值比当前键值小时表示按下,直接返回键值,当上一次键值比当前键值大时表示松开按键,键值最高为置1后返回。具体见代码。3.3驱动编译必须先编译开发板所使用的linux内核,生成模块后才能,编译驱动,具体步骤如下:makezImagemakemodules驱动最好写个Makefile文件,来编译。然后make4、IAL移植主要完成INPUT结构体的填充。input-update_mouse=NULL;input-get_mouse_xy=NULL;input-set_mouse_xy=NULL;input-get_mouse_button=NULL;input-set_mouse_range=NULL;input-update_keyboard=keyboard_update;input-get_keyboard_state=keyboard_get_state;input-suspend_keyboard=NULL;input-resume_keyboard=NULL;input-set_leds=NULL;input-wait_event=wait_event;只需实现keyboard的相关函数即可,mouse设备不需实现。keyboard_update函数实现state[NR_KEYS]数组的更新,使之映射为MiniGUI所提供的键盘定义。staticintkeyboard_update(void){char*statinfo;intstatus;intkey;statinfo=(btn_state&KEY_RELEASED)?UP:DOWN;status=(btn_state&KEY_RELEASED)?0:1;key=btn_state&KEY_NUM;switch(key){case0:state[SCANCODE_0]=status;break;case1:state[SCANCODE_1]=status;break;case2:state[SCANCODE_2]=status;break;case3:state[SCANCODE_3]=status;break;case4:state[SCANCODE_4]=status;break;}returnNR_KEYS;}key即为去掉按键状态信息的键值。SCANCODE_x为系统提供的键值,