嵌入式系统linux下触摸屏实验报告.docx

上传人:b****4 文档编号:5009387 上传时间:2022-12-12 格式:DOCX 页数:27 大小:275.49KB
下载 相关 举报
嵌入式系统linux下触摸屏实验报告.docx_第1页
第1页 / 共27页
嵌入式系统linux下触摸屏实验报告.docx_第2页
第2页 / 共27页
嵌入式系统linux下触摸屏实验报告.docx_第3页
第3页 / 共27页
嵌入式系统linux下触摸屏实验报告.docx_第4页
第4页 / 共27页
嵌入式系统linux下触摸屏实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

嵌入式系统linux下触摸屏实验报告.docx

《嵌入式系统linux下触摸屏实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统linux下触摸屏实验报告.docx(27页珍藏版)》请在冰豆网上搜索。

嵌入式系统linux下触摸屏实验报告.docx

嵌入式系统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,设置短信为PDU模式,应答:

OK.

•发送AT+CMGS=电话号码短信内容

•举例:

(1)发送“at+cmgf=1\r”,设为文本模式;

(2)发送“at+cmgs=\r”.

(3)发送短信内容:

“hello…”内容以ctrl+z结束(发送字符码26,表示结束).

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1