基于linux的基本绘图程序的编写.docx
- 文档编号:9383369
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:22
- 大小:542.80KB
基于linux的基本绘图程序的编写.docx
《基于linux的基本绘图程序的编写.docx》由会员分享,可在线阅读,更多相关《基于linux的基本绘图程序的编写.docx(22页珍藏版)》请在冰豆网上搜索。
基于linux的基本绘图程序的编写
计算机与信息技术学院设计性实验报告
专业:
计算机科学与技术年级/班级:
09级计科2班2011—2012学年第二学期
课程名称
嵌入式系统设计
指导教师
王鲜芳
学号姓名
0908114019王帅乐
实验地点
计科楼机房214
实验时间
2012-06-088:
00-11:
00
项目名称
基于linux的基本绘图程序的编写
实验类型
设计性
一.实验目的
1.学习linux下驱动程序及应用程序的编写流程
2.学习linux下LCD驱动程序的编写,加载及卸载方法
3.学习linux下应用程序的编写方法
4.掌握驱动程序添加到内核的流程
5.熟悉嵌入式计算机的工作原理
6.锻炼大家的上机动手操作能力
二.实验仪器
PentiumII以上的PC机,ARM-TFT挂箱,串口线,Linux操作系统,交叉网线,公母头串口.
三.实验内容
本实验是实验指导书中实验六与实验八的综合,先按照步骤编写简单的LCD驱动程序,待驱动之后再编写LCD应用程序,以实现在LCD上的基本操作,如:
绘制基本图形显示,控制颜色变换等。
四.实验流程图
五.总体设计
1.linux驱动程序的编写流程
(1)设备驱动程序的file_operations结构
(2)设备驱动程序编写的具体内容
(3)将设备驱动加到linux内核中
(4)将设备驱动编译成驱动模块
2.linux应用程序的编写、添加、调试
helloworld应用程序是最简单的应用程序,以它为例建立helloworld应用程序步骤如下:
创建一个文件夹,名称建议用hello
(1)编写Helloworld程序
编写helloworld.c文件,代码在/home/nfs/hello文件内保存在hello目录下。
(2)编写Makefile文件
编写Makefile文件,代码/home/nfs/hello文件内一定要注意格式,格式不正确,编译会出错。
Makefile文件同样放在hello目录下。
(3)编译
在虚拟机LINUX终端下,把目录切换到/home/nfs/hello目录下,使用命令
make
然后,如果编译通过,则在hello目录下生成可执行文件hello
(4)运行
3.LCD的驱动程序
LCD的设备驱动程序属于字符设备的驱动,因此,按照字符设备的规则编写。
驱动程序名为Lcd_driver.c,首先是
(1)LCD设备文件的file_operations结构
/*
************************************************************************
-函数名称:
structfile_operationsLCD_fops
-函数说明:
文件结构
-输入参数:
无
-输出参数:
无
************************************************************************
*/
structfile_operationsLCD_fops={
open:
LCD_Open,//打开设备文件
ioctl:
LCD_Ioctl,//设备文件其他操作
release:
LCD_Close,//关闭设备文件
};//其他选项省略
/*
************************************************************************
-函数名称:
staticintLCDIoctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
-函数说明:
LCD控制输出
-输入参数:
-输出参数:
0
************************************************************************
*/
staticintLCDIoctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
{
charcolor;
structpara
{
unsignedlonga;
unsignedlongb;
unsignedlongc;
unsignedlongd;
}*p_arg;
switch(cmd)//得到的命令
{
case0:
printk("setcolor\n");
Set_Color(arg);
printk("LCD_COLOR=%x\n",LCD_COLOR);
return1;
case1:
printk("drawh_line\n");
p_arg=(structpara*)arg;
LCD_DrawHLine(p_arg->a,p_arg->b,p_arg->c);//drawh_line
LCD_DrawHLine(p_arg->a,p_arg->b+15,p_arg->c);//drawh_line
LCD_DrawHLine(p_arg->a,p_arg->b+30,p_arg->c);//drawh_line
return1;
case2:
printk("drawv_line\n");
p_arg=(structpara*)arg;
LCD_DrawVLine(p_arg->a,p_arg->b,p_arg->c);//drawv_line
LCD_DrawVLine(p_arg->a+15,p_arg->b,p_arg->c);//drawv_line
LCD_DrawVLine(p_arg->a+30,p_arg->b,p_arg->c);//drawv_line
return1;
case3:
printk("drwacircle\n");
p_arg=(structpara*)arg;
LCD_DrawCircle(p_arg->a,p_arg->b,p_arg->c);//drawcircle
return1;
case4:
printk("drawrect\n");
p_arg=(structpara*)arg;
LCD_FillRect(p_arg->a,p_arg->b,p_arg->c,p_arg->d);//drawrect
return1;
case5:
printk("drawfillcircle\n");
p_arg=(structpara*)arg;
LCD_FillCircle(p_arg->a,p_arg->b,p_arg->c);//drawfillcircle
return1;
case6:
printk("LCDisclear\n");
LCD_Clear(0,0,319,239);//clearscreen
return1;
case7:
printk("drawrect\n");
p_arg=(structpara*)arg;
LCD_FillRect(p_arg->a,p_arg->b,p_arg->c,p_arg->d);//drawrect
return1;
default:
return-EINVAL;
}
return1;
}
/*
************************************************************************
-函数名称:
voidCloseLCD(structinode*inode,structfile*file)
-函数说明:
LCD关闭
-输入参数:
structinode*inode,structfile*file
-输出参数:
0
************************************************************************
*/
staticvoidCloseLCD(structinode*inode,structfile*file)
{
printk("LCDisclosed\n");
return;
}
/*
************************************************************************
-函数名称:
staticintOpenLCD(structinode*inode,structfile*file)
-函数说明:
LCD打开
-输入参数:
structinode*inode,structfile*file
-输出参数:
0
************************************************************************
*/
staticintOpenLCD(structinode*inode,structfile*file)
{
printk("LCDisopen\n");
return0;
}
/*LCD设备的硬件初始化函数*/
/*注册LCD设备,调用初始化函数*/
/*
**********************************************************************
-函数名称:
intLCDInit(void)
-函数说明:
注册LCD设备
-输入参数:
无
-输出参数:
0,或-EBUSY
**********************************************************************
*/
int__initLCD_Init(void)
{
intresult;
Setup_LCDInit();
printk("RegisteringS3C2410LCDDevice\t--->\t");
result=register_chrdev(LCD_MAJOR,"S3C2410LCD",&LCD_fops);//注册设备
if(result<0)
{
printk(KERN_INFO"[FALLED:
CannotregisterS3C2410LCD_driver!
]\n");
return-EBUSY;
}
else
printk("[OK]\n");
printk("InitializingS3C2410LCDDevice\t--->\t");
printk("[OK]\n");
printk("S3C2410LCDDriverInstalled.\n");
return0;
}
/*
**********************************************************************
-函数名称:
LCD_Exit
-函数说明:
卸载lcd设备
-输入参数:
无
-输出参数:
无
**********************************************************************
*/
void__exitLCDdriver_Exit(void)
{
Lcd_CstnOnOff(0);
unregister_chrdev(LCD_MAJOR,"S3C2410LCD");
printk("YouhaveuninstallTheLCDDriversuccesfully,\nifyouwanttoinstallagain,pleaseusetheinsmodcommand\n");
}
module_init(LCD_Init);
module_exit(LCDdriver_Exit);
(2)将设备驱动编译成驱动模块
使用同一个驱动程序的源代码,要定义如下一些函数int__initdevice_init(void);void__exitdevice_exit(void);module_init(device_init);module_exit(device_exit);在光盘资料/实验程序/linux/lcddriver/driver目录下,存放驱动程序的源码和Makefile文件以及驱动的目标代码,Makefile文件中已编写好交叉编译选项,在linux环境下,在终端里,切换到该目录下,使用make命令,就能把Lcd_driver.c编译成Lcd_driver.o动态驱动模块。
(3)将设备驱动编译进内核
在虚拟机LINUX终端下,把目录切换到相应目录下,使用命令make命令,
然后,如果编译通过,则在相应目录下生成相应的可执行文件.
4.LCD的应用程序
应用程序名为app_lcd.c,详细代码说明
#include
#include
#include
#include
intmain()
{
intfd,i;
intrt;
intcmd,arg0;
charenter_c;
unsignedlongarg_G,arg_B,arg_R,arg_Y,arg_W,arg_K,arg_CY;
structarg
{
unsignedlonga;
unsignedlongb;
unsignedlongc;
unsignedlongd;
};
structargarg1={0,120,300,0};
structargarg2={140,0,239,0};
structargarg3={100,100,50,0};
structargarg4={0,0,319,239};
structargarg5={240,100,60,0};
structargarg6={0,0,319,239};
structargarg7={40,170,100,200};
arg_G=0x00FF00;
arg_R=0xFF0000;
arg_B=0x0000FF;
arg_Y=0xAAAA00;
arg_W=0xFFFFFF;
arg_K=0x000000;
arg_CY=0x808080;
if((fd=open("/dev/S3C2410LCD",0))<0)
{
printf("cannotopen/dev/S3C2410LCD\n");
exit(0);
};
do{
cmd=getchar();
switch(cmd)
{
case49:
enter_c=getchar();
rt=ioctl(fd,0,arg_R);//setRED
cmd=0;
break;
case50:
enter_c=getchar();
rt=ioctl(fd,0,arg_G);//setGREEN
break;
case51:
enter_c=getchar();
rt=ioctl(fd,0,arg_B);//setBLUE
cmd=0;
break;
case52:
enter_c=getchar();
rt=ioctl(fd,0,arg_Y);//setYELLOW
cmd=0;
break;
case53:
enter_c=getchar();
rt=ioctl(fd,0,arg_W);//setWHITE
cmd=0;
break;
case54:
enter_c=getchar();
rt=ioctl(fd,0,arg_K);//setBLACK
cmd=0;
break;
case55:
enter_c=getchar();
rt=ioctl(fd,0,arg_CY);//setCYNE
cmd=0;
break;
case'a':
enter_c=getchar();
rt=ioctl(fd,1,(unsignedlong)&arg1);//drawh_line
cmd=0;
break;
case'b':
enter_c=getchar();
rt=ioctl(fd,2,(unsignedlong)&arg2);//drawv_line
cmd=0;
break;
case'c':
enter_c=getchar();
rt=ioctl(fd,3,(unsignedlong)&arg3);//drawcircle
cmd=0;
break;
case'd':
enter_c=getchar();
rt=ioctl(fd,4,(unsignedlong)&arg4);//drawrect
cmd=0;
break;
case'e':
enter_c=getchar();
rt=ioctl(fd,5,(unsignedlong)&arg5);//drawfillcircle
cmd=0;
break;
case'f':
enter_c=getchar();
rt=ioctl(fd,6,(unsignedlong)&arg6);//clearscreen
cmd=0;
break;
case'g':
enter_c=getchar();
rt=ioctl(fd,7,(unsignedlong)&arg7);//drawrect
cmd=0;
break;
default:
break;
}
}while(cmd!
='q');//"q"isquitcommand
close(fd);
}
该程序从linux终端中输入字符,在LCD屏上显示不同的颜色、显示画圆、画线、画点、填充圆、填充矩形等基本的LCD操作。
5.注意事项
LCD的应用程序,应该在加入LCD驱动之后使用,否则,无法正常运行!
当动态加载好驱动或把驱动编进内核中去后,也可以使用两种方法运行应用程序。
本方法使用动态调试法。
六.操作步骤
用交叉网线和直接串口线将PC机与ARM板连接好,启动虚拟机的LINUX
(1)打开WINDOWS下的超级终端。
具体参数设置如下:
(2))打开实验箱上的电源,在WINDOWS下的超级终端显示通过串口打印出来的数据,按reset键,会出现如下图界面,表示实验系统的文件系统已经启动起来了!
(3)配置实验箱ARM板的IP地址。
WINDOWS下的超级终端输入:
ifconfigeth0192.168.0.21
(4)建立实验箱与虚拟机LINUX共享。
WINDOWS下的超级终端输入:
mount192.168.0.121:
/home/nfs/mnt/yaffs,然后回车
(5)(6)进入实验箱的共享目录。
WINDOWS下的超级终端输入:
cd/mnt/yaffs然后回车;接着输入:
cdlcddriver/driver,然后回车.
之后会看到屏幕变绿.
(7)使用挂载驱动模块的命令insmodLcd_driver.o当终端上输出
RegisteringS3C2410LCDDevice--->[OK]
InitializingS3C2410LCDDevice--->[OK]
S3C2410LCDDriverInstalled.
则说明驱动模块正常加载。
(8)进入相应目录:
cd../app_lcd
(9)创建设备文件,输入命令:
mknod/dev/S3C2410LCDc600
(10)键入执行命令./app_lcdd,则主机终端有LCDisopen输出。
之后,就可以输入控制命令,在LCD屏开始显示。
(11)在WINDOWS下的超级终下先输入1,2,3,4,5,6,7,中的一个,然后回车。
之后,再输入画实体的字符,回车,观察实验效果,然后输入改变颜色的字符,回车,再输入相同的画实体字符,观察颜色是否改变。
输入字符“q”,则退出应用程序。
说明:
选择要进行绘画的颜色,1对应着红,2对应着绿,3对应着蓝,4对应着黄,5对应着白,6对应着黑,7对应着浅蓝。
输入”a”,”b”,”c”,”d”,”e”,”f”,”g”,则显示要画的实体。
a对应着画水平线,ba对应着画竖直线,c对应着画圆,d对应着填充全屏,e对应着填充圆,f对应着清屏,g对应着填充矩形。
“q”则退出应用程序。
(12)将应用程序加入文件系统
编译成功后,把可执行文件,放到存放文件系统root_tech的usr/sbin目录或者usr/bin目录下.之后,使用mkcramfs制作工具,利用命令MKCRAMFSroot_techrootfs.cramfs来生成新的文件系统。
之后把它通过网口烧下载到flash中,当系统启动后,就可在usr/sbin目录或者usr/bin目录下,执行可执行程序。
(13)在终端下,使用卸载驱动模块的命令rmmodLcd_driver.当终端上输出YouhaveuninstallTheLCDDriversuccesfully,ifyouwantt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 linux 基本 绘图 程序 编写
![提示](https://static.bdocx.com/images/bang_tan.gif)