嵌入式系统linux下触摸屏实验报告.docx
- 文档编号:5009387
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:27
- 大小:275.49KB
嵌入式系统linux下触摸屏实验报告.docx
《嵌入式系统linux下触摸屏实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统linux下触摸屏实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
嵌入式系统linux下触摸屏实验报告
一.硬件平台
1、处理器:
三星S3C2410,200MHZ
2、内存:
SDRAM,64M
3、外存:
NANDFLASH,64M
4、LCD&触摸屏:
SHARP,640×480,TFT
5、串口:
RS232,RS485
二.处理器结构
1、处理器核心
MMU,DCACHE,ICACHE,JTAG
2、系统总线
SDRAM,FLASH,LCD,中断,USB
3、外部总线
串口,USB,GPIO
试验一:
bootloader(ads、引导)
1、熟悉ADS1.2开发工具
创建、编译、下载、调试工程
2、串口通讯
串口控制器初始化、收/发数据
3、配置主机端的nfs服务器
配置主机端的nfs服务器,以连接linux核心
4、下载并运行linux核心
使用自己的串口程序下载并运行linux核心
主要内容:
•编写串口接收数据函数
•编写串口发送数据函数
•打印菜单,等待用户输入
•下载并运行linux核心
•配置主机的nfs服务器,与linux核心连接
其他部分代码从教师用机中拷贝
linux核心从教师机中拷贝
主要步骤:
•修改bootloader:
菜单、串口收发、命令行;
•使用ads1.2编译bootloader;
•使用uarmjtag下载、调试bootloader;
•使用axd查看变量、内存,单步跟踪;
•配置超级终端,与bootloader通讯;
•使用超级终端下载Linux核心映像;
•启动Linux核心运行,察看结果;(bootloader调试成功后再继续以下步骤)
•主机重起到ubuntu,配置nfs,配置cutecom;
•重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统。
需要补充的代码:
接收串口数据并做相应处理
while
(1)
{
打印菜单并等待用户输入;
switch(ch)//根据用户输入做相应处理
{
case'1':
imgsize=xmodem_receive((char*)KERNEL_BASE,MAX_KERNEL_SIZE);
if(imgsize==0)//下载出错;
else//下载成功;
break;
case'3':
nand_read((unsignedchar*)KERNEL_BASE,0x00030000,4*1024*1024);
case'2':
BootKernel();//这里是不会返回的,否则出错;
break;
default:
break;
}
}
打印菜单:
Uart_puts("Menu:
\n\r");
Uart_puts("1.LoadkernelviaXmodem;\n\r");
Uart_puts("2.Bootlinux;\n\r");
Uart_puts("3.Loadkernelfromflashandboot;\n\r");
Uart_puts("Makeyourchoice.\n\r");
do{
ch=Uart_getc();
}while(ch!
='1'&&ch!
='2'&&ch!
='3');
串口读写:
voidUart_putc(charc)
{
while(!
SERIAL_WRITE_READY());
((UTXH0)=(c));
}
unsignedcharUart_getc()
{
while(!
SERIAL_CHAR_READY());
returnURXH0;
}
设置Linux核心启动命令行
char*linux_cmd="noinitrdinit=/initroot=/dev/nfsnfsroot=,tcpip=console=ttySAC0";
nfs服务器设置
编辑/etc/export文件:
/home/arm_os/filesystem/rootfs目标板ip(rw,sync)
/home/arm_os/filesystem/rootfs主机ip(rw,sync)
启动nfs服务器:
/etc/init.d/nfs-kernel-serverrestart
测试nfs服务器:
mount主机ip:
/home/arm_os/filesystem/rootfs/mnt
•试验二:
linuxkernel(gcc、make)
1、熟悉基本的linux命令
文件操作、文件编辑
串口工具、程序开发
2、配置linux核心
makemenuconfig
3、交叉编译linux核心
makezImage
主要工作
•熟悉基本的linux命令
•配置linux核心
•交叉编译linux核心
•调试自己编译的核心
•挂载nfs上的root(根目录)
•编写一个小程序在目标板上运行
主要步骤:
•用root用户登录ubuntu(合理使用权限);
•解压缩源码包到/home/下;
•察看解压缩后的/home/arm_os目录:
Linux核心、编译器、root等;
•配置并测试nfs;
•配置cutecom:
115200,XModem,Nolineend;
•配置核心:
makemenuconfig;
•编译核心:
make;
•下载并运行核心,加载root文件系统;
•重新设置cutecom为LFlineend;
•熟悉基本的Linux命令;
•编写一个小程序在目标板上运行,察看结果。
•试验三:
linuxdriver(uart)
1、Linux驱动编程
•基本接口
•常用函数
2、串口驱动
•申请中断处理
•串口数据读、写
主要工作:
•编写串口驱动初始化、释放函数;
•编写串口驱动接收数据函数;
•编写串口驱动发送数据函数;
•编写串口驱动中断处理函数;
•编写串口访问应用程序;
•使用模块方式编译驱动;
•使用模块方式调试驱动;
•实现基本的串口数据收发。
主要步骤:
•填写函数:
uart_init、uart_exit、uart_open、uart_release,实现串口设备初始化、释放、打开、关闭;
•填写函数:
irq_rev_uart、uart_write、uart_read,实现串口设备中断处理、读、写;
•用模块方式编译Linux核心,生成uart.ko,启动目标板Linux核心,用insmod、rmmod等命令操作模块;
•用printk打印调试串口驱动,包括中断相应,读写等;
•编写应用程序:
uart.c,实现打开串口设备、读写等,把主机端由comcute发过来的串口数据回传给主机;
•将目标板上串口线连到串口1;
•编译应用程序uart.c,实现和主机间的串口通讯。
部分代码:
串口设备初始化函数
intret;
dev_tdevno=MKDEV(uart_major,0);
if(uart_major){
ret=register_chrdev_region(devno,1,"uart");
}else{
ret=alloc_chrdev_region(&devno,0,1,"uart");
uart_major=MAJOR(devno);
}
if(ret<0){printk("Registerchrdevregionfailed!
\n");returnret;}
cdev_init(&uart_cdev,&uart_fops);
ret=cdev_add(&uart_cdev,devno,1);
if(ret){printk("Addcdevicefailed!
\n");returnret;}
uart=ioremap(S3C2410_PA_UART1,0x4000);
device_init();
ret=request_irq(IRQ_S3CUART_RX1,irq_rev_uart,IRQF_DISABLED,"uart",NULL);
if(ret){printk("Requestirqfailed!
\n");returnret;}
loop_buffer_init(&readb,UART_SIZE);printk("Uartmoduleinit.\n");
return0;
串口设备释放函数
loop_buffer_free(&readb);
free_irq(IRQ_S3CUART_RX1,NULL);
cdev_del(&uart_cdev);
unregister_chrdev_region(MKDEV(uart_major,0),1);
printk("Uartmoduleexit.\n");
串口设备中断处理函数
charc;
while(!
(__raw_readb(uart+S3C2410_UTRSTAT)&0x1));
c=(char)__raw_readl(uart+S3C2410_URXH);
loop_buffer_add(&readb,c);
return0;
串口设备读函数
inti=0;
if(*ppos>=UART_SIZE)return-EIO;
if(*ppos+size>UART_SIZE)size=UART_SIZE-*ppos;
do
{
charc;
if(!
loop_buffer_del(&readb,&c))
{
copy_to_user(buf+i,&c,1);
i++;
}
else
schedule_timeout(10);
}while(i returnsize; 串口设备写函数 inti;charwmem[UART_SIZE]; if(*ppos>=UART_SIZE)return-EIO; if(*ppos+size>UART_SIZE) size=UART_SIZE-*ppos; copy_from_user(wmem,buf,size); for(i=0;i while(! (__raw_readl(uart+S3C2410_UTRSTAT)&0x4)); __raw_writel(*(wmem+i),uart+S3C2410_UTXH); } returnsize; 串口访问应用程序 #include #include intmain() { intuart_fd,i;charc; uart_fd=open("/dev/uart",O_RDWR); if(uart_fd<0) {printf("Opendeviceerror! \n");return-1;} for(i=0;i<50;i++){ read(uart_fd,&c,1);printf("%c",c); write(uart_fd,&c,1); if(c=='q')break; } close(uart_fd); return0; } •试验四: linuxdriver(touchscreen) 1、触摸屏驱动 •初始化 •坐标值 2、触摸屏、图形系统协调工作 •触摸屏校准 •拨号键盘 LCD初始化 初始化GPIO(通用输入/输出): rGPCUP=0xffffffff; rGPCCON=0xaaaaaaaa; rGPDUP=0xffffffff; rGPDCON=0xaaaaaaaa; 该步骤主要配置CPU引脚的输入输出方向和工作模式 初始化LCD控制寄存器: rLCDCON1=0x00000178;//配置成为16位颜色,TFT(真彩)模式; rLCDCON2=0x2077c241;//行数为480; rLCDCON3=0x017A7F0F;//行宽为640; 设置LCD在内存中的起始地址: rLCDADDR1=0x1904b000;//FrameBuffer的首地址; rLCDADDR2=0x00096000;//FrameBuffer的尾地址; rLCDADDR3=0x00000300;//虚屏行宽为640; rLCDCON1+=1;//使能LCD,开始显示; Linuxframebuffer设备操作 fb_fd=open("/dev/fb0",O_RDWR); if(fb_fd<0){ printf("Openfbdeviceerror! \n"); return-1; } LCD_MEM_BASE=mmap(NULL, SCREEN_WIDTH*SCREEN_HEIGHT*2,PROT_READ|PROT_WRITE, MAP_SHARED,fb_fd,0); memset(LCD_MEM_BASE,0, SCREEN_WIDTH*SCREEN_HEIGHT*2); 画像素函数 voiddrawpixel(intx,inty,unsignedshortcolor_mask) { unsignedintbits= (SCREEN_WIDTH*y+x)*BITS_PER_PIXEL; unsignedshort*tmp; tmp=(unsignedshort*)LCD_MEM_BASE+bits/16; //计算像素在内存中的地址; *tmp=color_mask;//给象素填充颜色; return; } 画线函数 voiddrawline(intx,inty,intlength, intflag,unsignedshortcolor_mask) { inti; if(flag==0)//画横线; for(i=0;i drawpixel(x+i,y,color_mask); if(flag==1)//画竖线; ? ? ? } 画字符函数 voiddraw_char (intx,inty,//字符在屏幕上的坐标 unsignedcharc,//字符值 unsignedshortcolor_mask)//字符的颜色 主要工作: •编写触摸屏驱动初始化、释放函数; •编写触摸屏驱动读取数据函数; •编写触摸屏驱动中断处理函数; •使用模块方式调试驱动; •编写触摸屏读取应用程序; •编写简单图形系统绘制应用程序,绘制一个数字键盘; •实现基本的触摸键盘程序。 主要步骤: •填写函数: ts_init、ts_exit、ts_open、ts_release,实现触摸屏设备初始化、释放、打开、关闭; •填写函数: ts_isr、ts_read,实现触摸屏读、中断处理 •用模块方式编译Linux核心,生成ts_ads7843.ko,启动目标板Linux核心,用insmod、rmmod等操作模块; •用printk打印调试触摸屏驱动,包括中断相应,读等; •编写应用程序: ts_ads7843.c,实现打开触摸屏设备、读等; •在ts_ads7843.c中增加简单图形系统绘制函数,绘制数字键盘,对触摸屏设备数据进行校正,实现触摸键盘的功能。 部分代码: 触摸屏设备初始化函数 intret; dev_tdevno=MKDEV(ts_major,0); if(ts_major){ ret=register_chrdev_region(devno,1,“ts_ads7843"); }else{ ret=alloc_chrdev_region(&devno,0,1,"ts_ads7843"); ts_major=MAJOR(devno); } if(ret<0){printk("Registerchrdevregionfailed! \n");returnret;} cdev_init(&ts_cdev,&ts_fops); ret=cdev_add(&ts_cdev,devno,1); if(ret){printk("Addcdevicefailed! \n");returnret;} spi0_base=ioremap(S3C2410_PA_SPI,0x20); device_init(); init_waitqueue_head(&wq); ret=request_irq(IRQ_EINT5,ts_isr,IRQF_DISABLED,"ts_ads7843",NULL); if(ret){printk("Requestirqfailed! \n");returnret;} TS_OPEN_INT();ts_time=jiffies; printk("Ts_ads7843moduleinit.\n"); return0; 触摸屏设备释放函数 free_irq(IRQ_EINT5,NULL); cdev_del(&ts_cdev); unregister_chrdev_region(MKDEV(ts_major,0),1); printk("Ts_ads7843moduleexit.\n"); 触摸屏设备中断处理函数 if(jiffies return0; if((s3c2410_gpio_getpin(S3C2410_GPF5) &ADS7843_PIN_PEN)==0) { udelay(10); get_XY(); ts_time=jiffies; wake_up_interruptible(&wq); udelay (2); } return0; 触摸屏设备读函数 structts_retts_ret; intsize=0; while(count>=sizeof(structts_ret)) { interruptible_sleep_on(&wq); ts_ret.x=x; ts_ret.y=y; ts_ret.pressure=PEN_DOWN; copy_to_user(buffer,(char*)&ts_ret,sizeof(structts_ret));count-=sizeof(structts_ret); size+=sizeof(structts_ret); } returnsize; 触摸屏访问应用程序 #include #include intmain() { intts_fd,i;charc;structts_retts_ret; ts_fd=open("/dev/ts_ads7843",O_RDWR); if(ts_fd<0){ printf("Opentsdeviceerror! \n");return-1;} for(i=0;i<50;i++){ if(read(ts_fd,&ts_ret,sizeof(structts_ret))){ if(ts_ret.x if(ts_ret.x>Xmax)ts_ret.x=Xmax; if(ts_ret.y if(ts_ret.y>Ymax)ts_ret.y=Ymax; x=(ts_ret.x-Xmin)*SCREEN_WIDTH/(Xmax-Xmin); y=(ts_ret.y-Ymin)*SCREEN_HEIGHT/(Ymax-Ymin);}} close(ts_fd); return0; } •试验五: GPRS综合试验(framebuffer) •试验六: GPRS综合试验 1、GPRS模块控制试验 •串口控制GPRS模块 • AT命令集 2、综合试验 •电话拨号 •短消息发送 串口2初始化 寄存器定义: #defineOSULCON2(*(volatileunsignedchar*)0x) #defineOSUCON2(*(volatileunsignedchar*)0x) #defineOSUFCON2(*(volatileunsignedchar*)0x) #defineOSUMCON2(*(volatileunsignedchar*)0x5000800C) #defineOSUBRDIV2(*(volatileunsignedshort*)0x) 初始化: OSULCON0=0x03;//设置串口数据长度、停止位、奇偶校验 OSUCON0=0x85;//设置串口时钟频率、中断类型等 OSUFCON0=0x01;//设置串口FIFO工作模式 OSUMCON0=0x00;//设置流量控制等 OSUBRDIV0=0x149;//设置串口波特率为9600bps AT命令集 1、查询无线模块状态: 发送: AT OK 2、主叫电话: •发送ATD+Dial电话号码 如连接不成功: NOCARRIER •举例: 发送“atd\r”即主叫该号码; 3、接电话: •发送: ATA OK,否则: NOCARRIER 4、挂断电话: 发送: ATH OK 5、发短消息: •发送AT+CMGF=1 OK. •或发送AT+CMGF=0 OK. •发送AT+CMGS=电话号码 •举例: (1)发送“at+cmgf=1\r”,设为文本模式; (2)发送“at+cmgs=\r”. (3)发送短信内容: “hello…”内容以ctrl+z结束(发送字符码26,表示结束).
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 linux 触摸屏 实验 报告