嵌入式系统linux下触摸屏实验报告_第1页
嵌入式系统linux下触摸屏实验报告_第2页
嵌入式系统linux下触摸屏实验报告_第3页
嵌入式系统linux下触摸屏实验报告_第4页
嵌入式系统linux下触摸屏实验报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、 24 / 24文档可自由编辑打印一 硬件平台 1、处理器:三星S3C2410,200MHZ2、内存:SDRAM,64M3、外存:NAND FLASH,64M4、LCD&触摸屏:SHARP,640×480,TFT5、串口:RS232,RS485二处理器结构1、处理器核心 MMU,DCACHE,ICACHE,JTAG2、系统总线 SDRAM,FLASH,LCD,中断,USB3、外部总线 串口,USB,GPIO试验一:bootloader (ads、引导)1、熟悉ADS 1.2开发工具创建、编译、下载、调试工程2、串口通讯串口控制器初始化、收/发数据3、配置主机端的nfs服务器配

2、置主机端的nfs服务器,以连接linux核心4、下载并运行linux核心使用自己的串口程序下载并运行linux核心主要内容: 编写串口接收数据函数 编写串口发送数据函数 打印菜单,等待用户输入 下载并运行linux核心 配置主机的nfs服务器,与linux核心连接其他部分代码从教师用机中拷贝linux核心从教师机中拷贝主要步骤: 修改bootloader:菜单、串口收发、命令行; 使用ads1.2编译bootloader; 使用uarmjtag下载、调试bootloader; 使用axd查看变量、内存,单步跟踪; 配置超级终端,与bootloader通讯; 使用超级终端下载Linux核心映像;

3、 启动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; ca

4、se '3': nand_read(unsigned char *)KERNEL_BASE, 0x00030000, 4*1024*1024); case '2': BootKernel(); /这里是不会返回的,否则出错; break; default: break; 打印菜单:Uart_puts("Menu:nr");Uart_puts("1.Load kernel via Xmodem;nr");Uart_puts("2.Boot linux; nr");Uart_puts("3.Loa

5、d kernel from flash and boot; nr");Uart_puts("Make your choice.nr");doch=Uart_getc();while(ch!='1' && ch!='2' && ch!='3');串口读写:void Uart_putc(char c)while(!SERIAL_WRITE_READY(); (UTXH0) = (c); unsigned char Uart_getc( ) while(!SERIAL_CHAR_READY(

6、);return URXH0;设置Linux核心启动命令行char *linux_cmd="noinitrd init=/init root=/dev/nfs nfsroot=172.16.68.25:/rootfs,tcp ip=172.16.68.24 console=ttySAC0"nfs服务器设置编辑/etc/export文件:/home/arm_os/ 目标板ip(rw,sync)/home/arm_os/ 主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfs-kernel-server restart测试nfs服务器:mount 主机ip:

7、/home/arm_os/ /mnt 试验二:linux kernel (gcc、make)1、熟悉基本的linux命令文件操作、文件编辑串口工具、程序开发2、配置linux核心make menuconfig3、交叉编译linux核心make zImage主要工作 熟悉基本的linux命令 配置linux核心 交叉编译linux核心 调试自己编译的核心 挂载nfs上的root(根目录) 编写一个小程序在目标板上运行主要步骤: 用root用户登录ubuntu (合理使用权限); 解压缩源码包到/home/下; 察看解压缩后的/home/arm_os目录:Linux核心、编译器、root等; 配置

8、并测试nfs; 配置cutecom:115200,XModem,No line end; 配置核心:make menuconfig; 编译核心:make; 下载并运行核心,加载root文件系统; 重新设置cutecom为LF line end; 熟悉基本的Linux命令; 编写一个小程序在目标板上运行,察看结果。 试验三:linux driver (uart)1、Linux驱动编程 基本接口 常用函数2、串口驱动 申请中断处理 串口数据读、写主要工作: 编写串口驱动初始化、释放函数; 编写串口驱动接收数据函数; 编写串口驱动发送数据函数; 编写串口驱动中断处理函数; 编写串口访问应用程序; 使

9、用模块方式编译驱动; 使用模块方式调试驱动; 实现基本的串口数据收发。主要步骤: 填写函数: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发过来的串口数

10、据回传给主机; 将目标板上串口线连到串口1; 编译应用程序uart.c,实现和主机间的串口通讯。部分代码:串口设备初始化函数int ret;dev_t devno = 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("Reg

11、ister chrdev region failed!n");return ret; cdev_init(&uart_cdev, &uart_fops);ret = cdev_add(&uart_cdev, devno, 1);if(ret)printk("Add c device failed!n");return ret; uart = ioremap(S3C2410_PA_UART1, 0x4000);device_init();ret = request_irq(IRQ_S3CUART_RX1, irq_rev_uart, IRQF

12、_DISABLED, "uart", NULL);if(ret)printk("Request irq failed!n"); return ret; loop_buffer_init(&readb, UART_SIZE);printk("Uart module init.n");return 0;串口设备释放函数loop_buffer_free(&readb);free_irq(IRQ_S3CUART_RX1, NULL);cdev_del(&uart_cdev);unregister_chrdev_regi

13、on(MKDEV(uart_major,0),1);printk("Uart module exit.n");串口设备中断处理函数char c;while(!(_raw_readb(uart + S3C2410_UTRSTAT) & 0x1);c = (char)_raw_readl(uart + S3C2410_URXH);loop_buffer_add(&readb, c);return 0;串口设备读函数int i = 0;if(*ppos >= UART_SIZE) return -EIO;if(*ppos + size > UART_S

14、IZE)size = UART_SIZE - *ppos;dochar c;if(!loop_buffer_del(&readb, &c)copy_to_user(buf+i, &c, 1);i+;elseschedule_timeout(10); while(i < size);return size;串口设备写函数int i;char wmemUART_SIZE;if(*ppos >= UART_SIZE)return -EIO;if(*ppos + size > UART_SIZE) size = UART_SIZE - *ppos;copy_f

15、rom_user(wmem, buf, size); for(i=0; i<size; i+)while(!(_raw_readl(uart + S3C2410_UTRSTAT) & 0x4);_raw_writel(*(wmem + i), uart + S3C2410_UTXH);return size;串口访问应用程序#include <stdio.h>#include <fcntl.h>int main()int uart_fd, i;char c;uart_fd = open("/dev/uart", O_RDWR);if(u

16、art_fd < 0)printf("Open device error!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);return 0; 试验四:linux driver (touchscreen)1、触摸屏驱动 初始化 坐标值2、触摸屏、图形系统协调工作 触摸屏校准 拨号键盘触摸屏工作原理CPUSPI控制器中

17、断控制器ADS7843模/数转换芯片数据中断LCD&触摸屏注意:在该工作方式中,CPU采用中断方式,使用SPI口控制模/数芯片读取数据,而不是直接使用CPU内部的模/数控制器。(x,y)ADS7843模/数转换芯片触摸屏x,y方向的模拟信号转化为数字信号后通过SPI口发给CPU ADS7843使用EINT5外部中断通知CPU触摸屏事件 CPU通过SPI口控制ADS7843将模拟信号转化为数字信号触摸屏校准算法LCD初始化初始化GPIO(通用输入/输出):rGPCUP=0xffffffff; rGPCCON=0xaaaaaaaa;rGPDUP=0xffffffff; rGPDCON=0x

18、aaaaaaaa; 该步骤主要配置CPU引脚的输入输出方向和工作模式初始化LCD控制寄存器: rLCDCON1=0x00000178; /配置成为16位颜色,TFT(真彩)模式; rLCDCON2= 0x2077c241; /行数为480; rLCDCON3=0x017A7F0F; /行宽为640;设置 LCD在内存中的起始地址: rLCDADDR1=0x1904b000; /FrameBuffer的首地址; rLCDADDR2=0x00096000; / FrameBuffer的尾地址; rLCDADDR3= 0x00000300; /虚屏行宽为640; rLCDCON1 += 1; /使能

19、LCD,开始显示;Linux framebuffer设备操作fb_fd = open("/dev/fb0", O_RDWR);if(fb_fd < 0)printf("Open fb device error!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);画像素函

20、数void drawpixel(int x, int y, unsigned short color_mask)unsigned int bits =(SCREEN_WIDTH*y+x)*BITS_PER_PIXEL;unsigned short *tmp;tmp = (unsigned short *)LCD_MEM_BASE+bits/16; /计算像素在内存中的地址;*tmp = color_mask; /给象素填充颜色;return ;画线函数void drawline(int x, int y, int length, int flag, unsigned short color_m

21、ask)int i;if (flag=0)/画横线;for (i=0;i<length;i+)drawpixel(x+i,y,color_mask);if (flag=1)/画竖线;?画字符函数void draw_char(int x,int y, /字符在屏幕上的坐标unsigned char c, /字符值unsigned short color_mask) /字符的颜色主要工作: 编写触摸屏驱动初始化、释放函数; 编写触摸屏驱动读取数据函数; 编写触摸屏驱动中断处理函数; 使用模块方式调试驱动; 编写触摸屏读取应用程序; 编写简单图形系统绘制应用程序,绘制一个数字键盘; 实现基本的

22、触摸键盘程序。主要步骤: 填写函数: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 中增加简单图形系统绘制函数,绘制数字键盘,对触摸屏设备数据进行校正,实现触摸键盘的功能。部分代码:触摸屏设

23、备初始化函数int ret;dev_t devno = 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("Register chrdev region failed!n");return ret; cdev_

24、init(&ts_cdev, &ts_fops);ret = cdev_add(&ts_cdev, devno, 1);if(ret)printk("Add c device failed!n");return ret; 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);i

25、f(ret)printk("Request irq failed!n"); return ret; TS_OPEN_INT();ts_time = jiffies;printk("Ts_ads7843 module init.n");return 0;触摸屏设备释放函数free_irq(IRQ_EINT5, NULL); cdev_del(&ts_cdev);unregister_chrdev_region(MKDEV(ts_major,0),1);printk("Ts_ads7843 module exit.n");触摸屏设

26、备中断处理函数if(jiffies < ts_time + HZ/20)return 0;if(s3c2410_gpio_getpin(S3C2410_GPF5) & ADS7843_PIN_PEN) = 0)udelay(10);get_XY();ts_time = jiffies; wake_up_interruptible(&wq);udelay(2);return 0;触摸屏设备读函数struct ts_ret ts_ret;int size = 0;while(count >= sizeof(struct ts_ret)interruptible_slee

27、p_on(&wq);ts_ret.x = x;ts_ret.y = y;ts_ret.pressure = PEN_DOWN;copy_to_user(buffer, (char *)&ts_ret, sizeof(struct ts_ret); count -= sizeof(struct ts_ret);size += sizeof(struct ts_ret); return size;触摸屏访问应用程序#include <stdio.h>#include <fcntl.h>int main()int ts_fd, i;char c;struct

28、ts_ret ts_ret;ts_fd = open("/dev/ts_ads7843", O_RDWR);if(ts_fd < 0)printf("Open ts device error!n");return -1;for(i=0; i<50; i+)if(read(ts_fd, &ts_ret, sizeof(struct ts_ret) if(ts_ret.x < Xmin) ts_ret.x = Xmin;if(ts_ret.x > Xmax) ts_ret.x = Xmax;if(ts_ret.y < Y

29、min) ts_ret.y = Ymin;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);return 0; 试验五:GPRS综合试验 (framebuffer) 试验六:GPRS综合试验1、GPRS模块控制试验 串口控制GPRS模块 AT命令集2、综合试验 电话拨号 短消息发送SIM卡使用串口传送AT命令AT命令:拨号、短信LCD &

30、触摸屏#*0987654321 at+cmgs 图形系统发送键值While() 等待键盘消息; 收到消息; 根据键值发送AT 命令到串口;中断处理,发送消息GPRS模块无线信号天线产生中断RS485总线IrDA红外通信UART2168Pin总线其他可复用资源扩展插槽外挂GPRS/GPS扩展板触摸屏接口SPI640*480 TFT 16bit LCD 液晶屏RS232串口0UART02410核心CPUSDRAMFLASH串口2初始化寄存器定义:#define OSULCON2 (*(volatile unsigned char *)0x50008000)#define OSUCON2 (*(vo

31、latile unsigned char *)0x50008004)#define OSUFCON2 (*(volatile unsigned char *)0x50008008)#define OSUMCON2 (*(volatile unsigned char *)0x5000800C)#define OSUBRDIV2 (*(volatile unsigned short *)0x50008028)初始化:OSULCON0=0x03; /设置串口数据长度、停止位、奇偶校验OSUCON0=0x85;/设置串口时钟频率、中断类型等OSUFCON0=0x01;/设置串口FIFO工作模式OSUM

32、CON0=0x00;/设置流量控制等OSUBRDIV0=0x149;/设置串口波特率为9600bpsAT命令集1 、查询无线模块状态: 发送:AT<CR>,应答:OK 2、主叫电话: 发送ATD+Dial电话号码<CR>;应答:如连接不成功:NO CARRIER 举例:发送“atdr”即主叫该号码;3、接电话: 发送:ATA<CR>,连接成功:OK,否则:NO CARRIER 4、挂断电话: 发送:ATH <CR> ,应答:OK 5、发短消息: 发送AT+CMGF=1 <CR>,设置短信为文本模式,应答:OK. 或发送AT+CMGF=

33、0 <CR>,设置短信为PDU模式, 应答:OK. 发送AT+CMGS=电话号码<CR>短信内容<CTRL+Z> 举例:(1)发送“at+cmgf=1r”,设为文本模式;(2) 发送“at+cmgs=r”.(3) 发送短信内容:“hello”内容以ctrl+z结束(发送字符码26,表示结束). 上述例子表示向134.发送短消息,内容为:hello注意:发送AT命令给无线模块时,中间应有一定的时间延时。主程序:#include <stdio.h>#include <sys/types.h>#include <sys/stat.h&

34、gt;#include <sys/ioctl.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <limits.h>#include <linux/fb.h>#include <linux/kd.h>#include <sys/mman.h>#include <sys/types.h>#include <

35、;linux/vt.h>#include <assert.h>#include "lcd.h"#defineBITS_PER_PIXEL16#defineSCREEN_WIDTH640#defineSCREEN_HEIGHT480#defineCHAR_WIDTH16#defineCHAR_HEIGHT14#defineLINE_WIDTH#defineLINE_HEIGHTCHAR_HEIGHT*2+4#defineWHITE_COLOR0xffff#defineBLUE_COLOR0x7bf#defineGREEN_COLOR0x7e0#defineR

36、ED_COLOR0xf800#define OFFSET_X120#defineOFFSET_Y80int Xmin = 318, Xmax = 3381, Ymin = 420, Ymax = 3600;int start_x = 80,81,126,248,366,480;int start_y = 80,81,92,172,252,332,344;unsigned short *LCD_MEM_BASE;int fb_fd, ts_fd, uart_fd;int x,y;static int cur_x = 0;static int cur_y = 0;static struct ts_

37、ret unsigned int pressure; unsigned int x; unsigned int y; ts_ret;static struct phonenum char buffer100;unsigned int tail; phonenum;static void drawpixel(int x, int y, unsigned short color_mask)unsigned int bits;unsigned short *tmp;if(x>=SCREEN_WIDTH)|(y>=SCREEN_HEIGHT) return;bits = (SCREEN_W

38、IDTH*y+x)*BITS_PER_PIXEL;tmp = LCD_MEM_BASE + bits/16; *tmp = color_mask;return;void drawline(int x, int y, int length, int flag, unsigned short color_mask)int i;if (flag)for (i=0;i<length;i+)drawpixel(x+i,y,color_mask);elsefor (i=0;i<length;i+)drawpixel(x,y+i,color_mask);void draw_char(int x,

39、 int y, unsigned char c, unsigned short color_mask)int i, j, t;unsigned short *p = helvB12_bits + (c - 0x20)*14;for (i=0; i<CHAR_HEIGHT; i+)unsigned short tmp = pi;for (j=0; j<CHAR_WIDTH; j+)if (tmp & 0x8000)for (t=0; t<4; t+)drawpixel(x+j*4+t, y+i*4, color_mask);drawpixel(x+j*4+t, y+i*

40、4+1, color_mask);drawpixel(x+j*4+t, y+i*4+2, color_mask);drawpixel(x+j*4+t, y+i*4+3, color_mask);tmp = tmp << 1;void draw_keyboard(void)int i;for (i=0;i<5;i+)drawline(start_x0,start_y0+i*OFFSET_Y,SCREEN_HEIGHT,1,WHITE_COLOR);drawline(start_x0,start_y1+i*OFFSET_Y,SCREEN_HEIGHT,1,WHITE_COLOR)

41、;for (i=0;i<5;i+)drawline(start_x0+i*OFFSET_X,start_y0,SCREEN_WIDTH/2,0,WHITE_COLOR);drawline(start_x1+i*OFFSET_X,start_y0,SCREEN_WIDTH/2,0,WHITE_COLOR);for (i=0;i<3;i+)draw_char(start_x2+i*OFFSET_X,start_y2,'1'+i,BLUE_COLOR);draw_char(start_x2+i*OFFSET_X,start_y3,'4'+i,BLUE_CO

42、LOR);draw_char(start_x2+i*OFFSET_X,start_y4,'7'+i,BLUE_COLOR);draw_char(start_x2,start_y5,'0',BLUE_COLOR);draw_char(start_x3,start_y6,'*',BLUE_COLOR);draw_char(start_x4,start_y5,'#',BLUE_COLOR);draw_char(start_x5,start_y2,'%', GREEN_COLOR);draw_char(start_x5,s

43、tart_y3,'&',RED_COLOR);draw_char(start_x5,start_y4,'$',WHITE_COLOR);draw_char(start_x5,start_y5,'(',RED_COLOR);void draw_stringline(char *s, unsigned short color_mask)unsigned char *tmp = (unsigned char *)s;while (*tmp)draw_charline(*tmp,color_mask);tmp +;void draw_charli

44、ne(unsigned char c, unsigned short color_mask)int i,k,n,x,y;unsigned long offset,*tmpnew;unsigned short *p = helvB12_bits+(c-0x20)*14;offset = SCREEN_WIDTH*(LINE_HEIGHT)*BITS_PER_PIXEL/32;n = SCREEN_WIDTH*(SCREEN_HEIGHT-LINE_HEIGHT-6)*BITS_PER_PIXEL/32;tmpnew = (unsigned long *)LCD_MEM_BASE;for (i=0

45、;i<n;i+) tmpnew+;if (c = 'n' | c = 'r')cur_x = 0;cur_y += LINE_HEIGHT;return;else if (cur_y>=SCREEN_HEIGHT-6)for (i=n;i<n+offset;i+)*tmpnew+=0x1f001f;cur_x = 0;cur_y = SCREEN_HEIGHT-LINE_HEIGHT-6;x=cur_x;y=cur_y;for (i=0;i<CHAR_HEIGHT;i+)unsigned short tmp = pi;for (k=0;k

46、<CHAR_WIDTH;k+)if (tmp & 0x8000)drawpixel(x+k,y+i*2,color_mask);drawpixel(x+k,y+i*2+1,color_mask);tmp = tmp << 1;cur_x += helvB12_widthc-0x20 + 1;return;char getkey(int x, int y)char key;char addr44 = '0','7','4','1','*','8','5',&#

47、39;2','#','9','6','3','S',' ','H','C'x = (x - 80) / 120;y = (y - 80) / 80;if(x < 0) x = 0;if(x > 3) x = 3;if(y < 0) y = 0;if(y > 3) y = 3;key = addrxy;draw_charline(key, RED_COLOR);return key;char dialing(void)char key,

48、ctl, cr;ctl = 26;cr = 13; key = getkey(x, y);printf("key = %cn", key); if(key!='S' & key!='H' & key!='C' & key!=' ') phonenum.bufferphonenum.tail+ = key;if(key = 'C') write(uart_fd, "atd", strlen("atd");usleep(1000);wr

49、ite(uart_fd, phonenum.buffer, phonenum.tail);usleep(1000);write(uart_fd, "r", strlen("r"); phonenum.tail = 0;else if(key = 'S')write(uart_fd, "atr", strlen("atr");usleep(1000);write(uart_fd, "atr", strlen("atr");usleep(1000);write(uart_fd, "at+cmgf=1r", strlen("at+cmgf=1r");usleep(1000);write(uart_fd, "at+cmgs=", strlen("at+cmgs=&

温馨提示

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

评论

0/150

提交评论