1、嵌入式系统linux下触摸屏实验报告一 硬件平台 1、处理器:三星S3C2410,200MHZ2、内存:SDRAM,64M3、外存:NAND FLASH,64M4、LCD&触摸屏:SHARP,640480,TFT5、串口:RS232,RS485二处理器结构1、处理器核心 MMU,DCACHE,ICACHE,JTAG2、系统总线 SDRAM,FLASH,LCD,中断,USB3、外部总线 串口,USB,GPIO试验一:bootloader (ads、引导)1、熟悉ADS 1.2开发工具 创建、编译、下载、调试工程2、串口通讯 串口控制器初始化、收/发数据3、配置主机端的nfs服务器 配置主机端的n
2、fs服务器,以连接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; case 3: nand
4、_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.Load kernel from flash and boot; nr); Uart_puts(Make your choice.nr); do
5、 ch=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(); return URXH0; 设置Linux核心启动命令行char *linux_cmd=noinitrd init=/init root=/dev/nfs nfsroot=,tcp ip= console=ttySAC0;nfs服务器设置编辑/etc/e
6、xport文件:/home/arm_os/filesystem/rootfs 目标板ip(rw,sync)/home/arm_os/filesystem/rootfs 主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfs-kernel-server restart测试nfs服务器:mount 主机ip:/home/arm_os/filesystem/rootfs /mnt 试验二:linux kernel (gcc、make)1、熟悉基本的linux命令 文件操作、文件编辑 串口工具、程序开发2、配置linux核心 make menuconfig3、交叉编译linux核心
7、 make zImage主要工作 熟悉基本的linux命令 配置linux核心 交叉编译linux核心 调试自己编译的核心 挂载nfs上的root(根目录) 编写一个小程序在目标板上运行主要步骤: 用root用户登录ubuntu (合理使用权限); 解压缩源码包到/home/下; 察看解压缩后的/home/arm_os目录:Linux核心、编译器、root等; 配置并测试nfs; 配置cutecom:115200,XModem,No line end; 配置核心:make menuconfig; 编译核心:make; 下载并运行核心,加载root文件系统; 重新设置cutecom为LF lin
8、e end; 熟悉基本的Linux命令; 编写一个小程序在目标板上运行,察看结果。 试验三:linux driver (uart)1、Linux驱动编程 基本接口 常用函数2、串口驱动 申请中断处理 串口数据读、写主要工作: 编写串口驱动初始化、释放函数; 编写串口驱动接收数据函数; 编写串口驱动发送数据函数; 编写串口驱动中断处理函数; 编写串口访问应用程序; 使用模块方式编译驱动; 使用模块方式调试驱动; 实现基本的串口数据收发。主要步骤: 填写函数:uart_init、uart_exit、uart_open、uart_ release,实现串口设备初始化、释放、打开、关闭; 填写函数:
9、irq_rev_uart、uart_write、uart_read,实现串口设备中断处理、读、写; 用模块方式编译Linux核心,生成uart.ko,启动目标板Linux核心,用insmod、rmmod等命令操作模块; 用printk打印调试串口驱动,包括中断相应,读写等; 编写应用程序:uart.c,实现打开串口设备、读写等,把主机端由comcute发过来的串口数据回传给主机; 将目标板上串口线连到串口1; 编译应用程序uart.c,实现和主机间的串口通讯。部分代码:串口设备初始化函数int ret;dev_t devno = MKDEV(uart_major, 0);if(uart_maj
10、or) ret = register_chrdev_region(devno, 1, uart);else ret = alloc_chrdev_region(&devno, 0, 1, uart); uart_major = MAJOR(devno);if(ret = UART_SIZE) return -EIO;if(*ppos + size UART_SIZE) size = UART_SIZE - *ppos;do char c; if(!loop_buffer_del(&readb, &c) copy_to_user(buf+i, &c, 1); i+; else schedule_
11、timeout(10); while(i = UART_SIZE) return -EIO;if(*ppos + size UART_SIZE) size = UART_SIZE - *ppos;copy_from_user(wmem, buf, size);for(i=0; isize; i+) while(!(_raw_readl(uart + S3C2410_UTRSTAT) & 0x4); _raw_writel(*(wmem + i), uart + S3C2410_UTXH); return size;串口访问应用程序#include #include int main() int
12、 uart_fd, i; char c; uart_fd = open(/dev/uart, O_RDWR); if(uart_fd 0) printf(Open device error!n); return -1; for(i=0; i50; 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、触摸屏、图形系统协调工作 触摸屏校准 拨号键
13、盘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的首地址;
14、 rLCDADDR2=0x00096000; / FrameBuffer的尾地址; rLCDADDR3= 0x00000300; /虚屏行宽为640; rLCDCON1 += 1; /使能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,
15、fb_fd, 0);memset(LCD_MEM_BASE, 0, SCREEN_WIDTH*SCREEN_HEIGHT*2);画像素函数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 ;画线
16、函数void drawline(int x, int y, int length, int flag, unsigned short color_mask) int i; if (flag=0)/画横线; for (i=0;ilength;i+) drawpixel(x+i,y,color_mask); if (flag=1)/画竖线; ? 画字符函数void draw_char (int x,int y, /字符在屏幕上的坐标 unsigned char c, /字符值 unsigned short color_mask) /字符的颜色主要工作: 编写触摸屏驱动初始化、释放函数; 编写触摸屏
17、驱动读取数据函数; 编写触摸屏驱动中断处理函数; 使用模块方式调试驱动; 编写触摸屏读取应用程序; 编写简单图形系统绘制应用程序,绘制一个数字键盘; 实现基本的触摸键盘程序。主要步骤: 填写函数:ts_init、ts_exit、ts_open、ts_ release,实现触摸屏设备初始化、释放、打开、关闭; 填写函数:ts_isr、ts_read,实现触摸屏读、中断处理 用模块方式编译Linux核心,生成ts_ads7843.ko,启动目标板Linux核心,用insmod、rmmod等操作模块; 用printk打印调试触摸屏驱动,包括中断相应,读等; 编写应用程序:ts_ads7843.c,实
18、现打开触摸屏设备、读等; 在ts_ads7843.c 中增加简单图形系统绘制函数,绘制数字键盘,对触摸屏设备数据进行校正,实现触摸键盘的功能。部分代码:触摸屏设备初始化函数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
19、 chrdev region failed!n); return ret; cdev_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, NU
20、LL);if(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);触摸屏设备中断处理函数if(jiffies = sizeof(struc
21、t ts_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(struct ts_ret); count -= sizeof(struct ts_ret); size += sizeof(struct ts_ret); return size;触摸屏访问应用程序#include #include int main() int ts_fd, i; char c; struct ts
22、_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; i50; i+) if(read(ts_fd, &ts_ret, sizeof(struct ts_ret) if(ts_ret.x Xmax) ts_ret.x = Xmax; if(ts_ret.y Ymax) ts_ret.y = Ymax; x = (ts_ret.x-Xmin) * SCREEN_WIDTH/(Xmax-Xmin); y = (ts_ret
23、.y-Ymin) * SCREEN_HEIGHT/(Ymax-Ymin); close(ts_fd); return 0; 试验五:GPRS综合试验 (framebuffer) 试验六:GPRS综合试验1、GPRS模块控制试验 串口控制GPRS模块 AT命令集2、综合试验 电话拨号 短消息发送串口2初始化寄存器定义:#define OSULCON2 (*(volatile unsigned char *)0x)#define OSUCON2 (*(volatile unsigned char *)0x)#define OSUFCON2 (*(volatile unsigned char *)0
24、x)#define OSUMCON2 (*(volatile unsigned char *)0x5000800C)#define OSUBRDIV2 (*(volatile unsigned short *)0x) 初始化:OSULCON0=0x03; /设置串口数据长度、停止位、奇偶校验OSUCON0=0x85; /设置串口时钟频率、中断类型等OSUFCON0=0x01; /设置串口FIFO工作模式OSUMCON0=0x00; /设置流量控制等OSUBRDIV0=0x149; /设置串口波特率为9600bpsAT命令集1 、查询无线模块状态: 发送:AT,应答:OK 2、主叫电话: 发送ATD+Dial电话号码;应答:如连接不成功:NO CARRIER 举例:发送“atdr”即主叫该号码;3、接电话: 发送:ATA,连接成功:OK,否则:NO CARRIER 4、挂断电话: 发送:ATH ,应答:OK 5、发短消息: 发送AT+CMGF=1 ,设置短信为文本模式,应答:OK. 或发送AT+CMGF=0 ,设置短信为PDU模式, 应答:OK. 发送AT+CMGS=电话号码短信内容 举例:(1)发送“at+cmgf=1r”,设为文本模式;(2) 发送“at+cmgs=r”.(3) 发送短信内容:“hello”内容以ctrl+z结束(发送字符码26,表示结束).
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1