嵌入式系统linux下触摸屏实验报告Word文件下载.docx
- 文档编号:17962864
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:27
- 大小:275.49KB
嵌入式系统linux下触摸屏实验报告Word文件下载.docx
《嵌入式系统linux下触摸屏实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式系统linux下触摸屏实验报告Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
•重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统。
需要补充的代码:
接收串口数据并做相应处理
while
(1)
{
打印菜单并等待用户输入;
switch(ch)//根据用户输入做相应处理
{
case'
1'
:
imgsize=xmodem_receive((char*)KERNEL_BASE,MAX_KERNEL_SIZE);
if(imgsize==0)//下载出错;
else//下载成功;
break;
3'
nand_read((unsignedchar*)KERNEL_BASE,0x00030000,4*1024*1024);
2'
BootKernel();
//这里是不会返回的,否则出错;
default:
}
}
打印菜单:
Uart_puts("
Menu:
\n\r"
);
Uart_puts("
1.LoadkernelviaXmodem;
2.Bootlinux;
\n\r"
3.Loadkernelfromflashandboot;
Makeyourchoice.\n\r"
do{
ch=Uart_getc();
}while(ch!
='
&
&
ch!
串口读写:
voidUart_putc(charc)
while(!
SERIAL_WRITE_READY());
((UTXH0)=(c));
unsignedcharUart_getc()
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_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!
returnret;
uart=ioremap(S3C2410_PA_UART1,0x4000);
device_init();
ret=request_irq(IRQ_S3CUART_RX1,irq_rev_uart,IRQF_DISABLED,"
NULL);
Requestirqfailed!
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);
串口设备读函数
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<
size);
returnsize;
串口设备写函数
inti;
charwmem[UART_SIZE];
=UART_SIZE)return-EIO;
UART_SIZE)
size=UART_SIZE-*ppos;
copy_from_user(wmem,buf,size);
for(i=0;
i<
size;
i++){
while(!
(__raw_readl(uart+S3C2410_UTRSTAT)&
0x4));
__raw_writel(*(wmem+i),uart+S3C2410_UTXH);
串口访问应用程序
#include<
stdio.h>
fcntl.h>
intmain()
{
intuart_fd,i;
uart_fd=open("
/dev/uart"
O_RDWR);
if(uart_fd<
0)
{printf("
Opendeviceerror!
return-1;
for(i=0;
50;
read(uart_fd,&
printf("
%c"
c);
write(uart_fd,&
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"
if(fb_fd<
0){
Openfbdeviceerror!
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<
length;
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中增加简单图形系统绘制函数,绘制数字键盘,对触摸屏设备数据进行校正,实现触摸键盘的功能。
触摸屏设备初始化函数
dev_tdevno=MKDEV(ts_major,0);
if(ts_major){
ret=register_chrdev_region(devno,1,“ts_ads7843"
ts_ads7843"
ts_major=MAJOR(devno);
ts_cdev,&
ts_fops);
ts_cdev,devno,1);
spi0_base=ioremap(S3C2410_PA_SPI,0x20);
init_waitqueue_head(&
wq);
ret=request_irq(IRQ_EINT5,ts_isr,IRQF_DISABLED,"
ts_ads7843"
TS_OPEN_INT();
ts_time=jiffies;
Ts_ads7843moduleinit.\n"
触摸屏设备释放函数
free_irq(IRQ_EINT5,NULL);
ts_cdev);
unregister_chrdev_region(MKDEV(ts_major,0),1);
Ts_ads7843moduleexit.\n"
触摸屏设备中断处理函数
if(jiffies<
ts_time+HZ/20)
if((s3c2410_gpio_getpin(S3C2410_GPF5)
ADS7843_PIN_PEN)==0)
udelay(10);
get_XY();
wake_up_interruptible(&
udelay
(2);
}
触摸屏设备读函数
structts_retts_ret;
intsize=0;
while(count>
=sizeof(structts_ret))
interruptible_sleep_on(&
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);
}
触摸屏访问应用程序
intts_fd,i;
structts_retts_ret;
ts_fd=open("
/dev/ts_ads7843"
if(ts_fd<
0){
printf("
Opentsdeviceerror!
if(read(ts_fd,&
ts_ret,sizeof(structts_ret))){
if(ts_ret.x<
Xmin)ts_ret.x=Xmin;
if(ts_ret.x>
Xmax)ts_ret.x=Xmax;
if(ts_ret.y<
Ymin)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);
•试验五:
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
1、查询无线模块状态:
发送:
AT<
CR>
,应答:
OK
2、主叫电话:
•发送ATD+Dial电话号码<
;
应答:
如连接不成功:
NOCARRIER
•举例:
发送“atd\r”即主叫该号码;
3、接电话:
•发送:
ATA<
连接成功:
OK,否则:
4、挂断电话:
ATH<
,应答:
5、发短消息:
•发送AT+CMGF=1<
设置短信为文本模式,应答:
OK.
•或发送AT+CMGF=0<
设置短信为PDU模式,应答:
OK.
•发送AT+CMGS=电话号码<
短信内容<
CTRL+Z>
•举例:
(1)发送“at+cmgf=1\r”,设为文本模式;
(2)发送“at+cmgs=\r”.
(3)发送短信内容:
“hello…”内容以ctrl+z结束(发送字符码26,表示结束).
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 linux 触摸屏 实验 报告