还剩22页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
1.硬件平台
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,中断,U__
3、外部总线串口,U__,GPIO试验一bootloaderads、引导
1、熟悉ADS
1.2__工具创建、编译、下载、调试工程
2、串口通讯串口控制器初始化、收/发数据
3、配置主机端的nfs服务器配置主机端的nfs服务器,以连接linux核心
4、下载并运行linux核心使用自己的串口程序下载并运行linux核心主要内容•编写串口接收数据函数•编写串口发送数据函数•打印菜单,等待用户输入•下载并运行linux核心•配置主机的nfs服务器,与linux核心连接其他部分代码从教师用机中拷贝linux核心从教师机中拷贝主要步骤•修改bootloader菜单、串口收发、命令行;•使用ads
1.2编译bootloader;•使用uarmjtag下载、调试bootloader;•使用axd查看变量、内存,单步跟踪;•配置超级终端,与bootloader通讯;•使用超级终端下载Linux核心映像;•启动Linux核心运行,察看结果;(bootloader调试成功后再继续以下步骤)•主机重起到ubuntu,配置nfs,配置cutecom;•重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统需要补充的代码接收串口数据并做相应处理while1{打印菜单并等待用户输入;switchch//根据用户输入做相应处理{case1:imgsize=xmodem_re__ivechar*KERNEL_BASE__X_KERNEL_SIZE;ifimgsize==0//下载出错;else//下载成功;break;case3:nand_readunsignedchar*KERNEL_BASE0x000300004*1024*1024;case2:BootKernel;//这里是不会返回的,否则出错;break;default:break;}}打印菜单Uart_putsMenu:\n\r;Uart_puts
1.LoadkernelviaXmodem;\n\r;Uart_puts
2.Bootlinux;\n\r;Uart_puts
3.Loadkernelfromflashandboot;\n\r;Uart_puts__keyourchoi__.\n\r;do{ch=Uart_getc;}whilech!=1ch!=2ch!=3;串口读写voidUart_putccharc{while!SERIAL_WRITE_READY;UTXH0=c;}unsignedcharUart_getc{while!SERIAL_CHAR_READY;returnURXH0;}设置Linux核心启动命令行char*linux_cmd=noinitrdinit=/initroot=/dev/nfsnfsroot=
172.
16.
68.25:/rootfstcpip=
172.
16.
68.24console=ttySAC0;nfs服务器设置编辑/etc/export文件/home/arm_os/filesystem/rootfs目标板iprwsync/home/arm_os/filesystem/rootfs主机iprwsync启动nfs服务器/etc/init.d/nfs-kernel-serverrestart测试nfs服务器mount主机ip:/home/arm_os/filesystem/rootfs/mnt•试验二linuxkernel__c、__ke
1、熟悉基本的linux命令文件操作、文件编辑串口工具、程序__
2、配置linux核心__kemenuconfig
3、交叉编译linux核心__kezI__ge主要工作•熟悉基本的linux命令•配置linux核心•交叉编译linux核心•调试自己编译的核心•挂载nfs上的root(根目录)•编写一个小程序在目标板上运行主要步骤•用root用户登录ubuntu(合理使用权限);•解压缩源码包到/home/下;•察看解压缩后的/home/arm_os目录Linux核心、编译器、root等;•配置并测试nfs;•配置cutecom115200,XModem,Nolineend;•配置核心__kemenuconfig;•编译核心__ke;•下载并运行核心,加载root文件系统;•重新设置cutecom为LFlineend;•熟悉基本的Linux命令;•编写一个小程序在目标板上运行,察看结果•试验三linuxdriveruart
1、Linux驱动编程•基本接口•常用函数
2、串口驱动•申请中断处理•串口数据读、写主要工作•编写串口驱动初始化、释放函数;•编写串口驱动接收数据函数;•编写串口驱动发送数据函数;•编写串口驱动中断处理函数;•编写串口访问应用程序;•使用模块方式编译驱动;•使用模块方式调试驱动;•实现基本的串口数据收发主要步骤•填写函数uart_init、uart_exit、uart_open、uart_release,实现串口设备初始化、释放、打开、关闭;•填写函数irq_rev_uart、uart_write、uart_read,实现串口设备中断处理、读、写;•用模块方式编译Linux核心,生成uart.ko,启动目标板Linux核心,用in__od、rmmod等命令操作模块;•用printk打印调试串口驱动,包括中断相应,读写等;•编写应用程序uart.c,实现打开串口设备、读写等,把主机端由comcute发过来的串口数据回传给主机;•将目标板上串口线连到串口1;•编译应用程序uart.c,实现和主机间的串口通讯部分代码串口设备初始化函数intret;dev_tdevno=MKDEVuart___jor0;ifuart___jor{ret=register_chrdev_regiondevno1uart;}else{ret=alloc_chrdev_regiondevno01uart;uart___jor=__JORdevno;}ifret0{printkRegisterchrdevregionfailed!\n;returnret;}cdev_inituart_cdevuart_fops;ret=cdev_adduart_cdevdevno1;ifret{printkAddcdevi__failed!\n;returnret;}uart=iore__pS3C2410_PA_UART10x4000;devi___init;ret=request_irqIRQ_S3CUART_RX1irq_rev_uartIRQF_DISABLEDuartNULL;ifret{printkRequestirqfailed!\n;returnret;}loop_buffer_initreadbUART_SIZE;printkUartmoduleinit.\n;return0;串口设备释放函数loop_buffer_freereadb;free_irqIRQ_S3CUART_RX1NULL;cdev_deluart_cdev;unregister_chrdev_regionMKDEVuart___jor01;printkUartmoduleexit.\n;串口设备中断处理函数charc;while!__raw_readbuart+S3C2410_UTRSTAT0x1;c=char__raw_readluart+S3C2410_URXH;loop_buffer_addreadbc;return0;串口设备读函数inti=0;if*ppos=UART_SIZEreturn-EIO;if*ppos+sizeUART_SIZEsize=UART_SIZE-*ppos;do{charc;if!loop_buffer_delreadbc{copy_to_userbuf+ic1;i++;}elseschedule_timeout10;}whileisize;returnsize;串口设备写函数inti;charwmem[UART_SIZE];if*ppos=UART_SIZEreturn-EIO;if*ppos+sizeUART_SIZEsize=UART_SIZE-*ppos;copy_from_userwmembufsize;fori=0;isize;i++{while!__raw_readluart+S3C2410_UTRSTAT0x4;__raw_writel*wmem+iuart+S3C2410_UTXH;}returnsize;串口访问应用程序#includestdio.h#includefcntl.hint__in{intuart_fdi;charc;uart_fd=open/dev/uartO_RDWR;ifuart_fd0{printfOpendevi__error!\n;return-1;}fori=0;i50;i++{readuart_fdc1;printf%cc;writeuart_fdc1;ifc==qbreak;}closeuart_fd;return0;}•试验四linuxdrivertouchscreen
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/fb0O_RDWR;iffb_fd0{printfOpenfbdevi__error!\n;return-1;}LCD_MEM_BASE=m__pNULLSCREEN_WIDTH*SCREEN_HEIGHT*2PROT_READ|PROT_WRITE__P_SHAREDfb_fd0;memsetLCD_MEM_BASE0SCREEN_WIDTH*SCREEN_HEIGHT*2;画像素函数voiddrawpixelintxintyunsignedshortcolor___sk{unsignedintbits=SCREEN_WIDTH*y+x*BITS_PER_PIXEL;unsignedshort*tmp;tmp=unsignedshort*LCD_MEM_BASE+bits/16;//计算像素在内存中的地址;*tmp=color___sk;//给象素填充颜色;return;}画线函数voiddrawlineintxintyintlengthintflagunsignedshortcolor___sk{inti;ifflag==0//画横线;fori=0;ilength;i++drawpixelx+iycolor___sk;ifflag==1//画竖线;???}画字符函数voiddraw_charintxinty//字符在屏幕上的坐标unsignedcharc//字符值unsignedshortcolor___sk//字符的颜色主要工作•编写触摸屏驱动初始化、释放函数;•编写触摸屏驱动读取数据函数;•编写触摸屏驱动中断处理函数;•使用模块方式调试驱动;•编写触摸屏读取应用程序;•编写简单图形系统绘制应用程序,绘制一个数字键盘;•实现基本的触摸键盘程序主要步骤•填写函数ts_init、ts_exit、ts_open、ts_release,实现触摸屏设备初始化、释放、打开、关闭;•填写函数ts_isr、ts_read,实现触摸屏读、中断处理•用模块方式编译Linux核心,生成ts_ads
7843.ko,启动目标板Linux核心,用in__od、rmmod等操作模块;•用printk打印调试触摸屏驱动,包括中断相应,读等;•编写应用程序ts_ads
7843.c,实现打开触摸屏设备、读等;•在ts_ads
7843.c中增加简单图形系统绘制函数,绘制数字键盘,对触摸屏设备数据进行校正,实现触摸键盘的功能部分代码触摸屏设备初始化函数intret;dev_tdevno=MKDEVts___jor0;ifts___jor{ret=register_chrdev_regiondevno1“ts_ads7843;}else{ret=alloc_chrdev_regiondevno01ts_ads7843;ts___jor=__JORdevno;}ifret0{printkRegisterchrdevregionfailed!\n;returnret;}cdev_initts_cdevts_fops;ret=cdev_addts_cdevdevno1;ifret{printkAddcdevi__failed!\n;returnret;}spi0_base=iore__pS3C2410_PA_SPI0x20;devi___init;init_waitqueue_headwq;ret=request_irqIRQ_EINT5ts_isrIRQF_DISABLEDts_ads7843NULL;ifret{printkRequestirqfailed!\n;returnret;}TS_OPEN_INT;ts_time=jiffies;printkTs_ads7843moduleinit.\n;return0;触摸屏设备释放函数free_irqIRQ_EINT5NULL;cdev_delts_cdev;unregister_chrdev_regionMKDEVts___jor01;printkTs_ads7843moduleexit.\n;触摸屏设备中断处理函数ifjiffiests_time+HZ/20return0;ifs3c2410_gpio_getpinS3C2410_GPF5ADS7843_PIN_PEN==0{udelay10;get_XY;ts_time=jiffies;wake_up_interruptiblewq;udelay2;}return0;触摸屏设备读函数structts_retts_ret;intsize=0;whilecount=sizeofstructts_ret{interruptible_sleep_onwq;ts_ret.x=x;ts_ret.y=y;ts_ret.pressure=PEN_DOWN;copy_to_userbufferchar*ts_retsizeofstructts_ret;count-=sizeofstructts_ret;size+=sizeofstructts_ret;}returnsize;触摸屏访问应用程序#includestdio.h#includefcntl.hint__in{intts_fdi;charc;structts_retts_ret;ts_fd=open/dev/ts_ads7843O_RDWR;ifts_fd0{printfOpentsdevi__error!\n;return-1;}fori=0;i50;i++{ifreadts_fdts_retsizeofstructts_ret{ifts_ret.xXmints_ret.x=Xmin;ifts_ret.xX__xts_ret.x=X__x;ifts_ret.yYmints_ret.y=Ymin;ifts_ret.yY__xts_ret.y=Y__x;x=ts_ret.x-Xmin*SCREEN_WIDTH/X__x-Xmin;y=ts_ret.y-Ymin*SCREEN_HEIGHT/Y__x-Ymin;}}closets_fd;return0;}•试验五GPRS综合试验framebuffer•试验六GPRS综合试验
1、GPRS模块控制试验•串口控制GPRS模块•AT命令集
2、综合试验•__拨号•短消息发送串口2初始化寄存器定义#defineOSULCON2*volatileunsignedchar*0x50008000#defineOSUCON2*volatileunsignedchar*0x50008004#defineOSUFCON2*volatileunsignedchar*0x50008008#defineOSUMCON2*volatileunsignedchar*0x5000800C#defineOSUBRDIV2*volatileunsignedshort*0x50008028初始化OSULCON0=0x03;//设置串口数据长度、停止位、奇偶校验OSUCON0=0x85;//设置串口时钟频率、中断类型等OSUFCON0=0x01;//设置串口FIFO工作模式OSUMCON0=0x00;//设置流量控制等OSUBRDIV0=0x149;//设置串口波特率为9600bpsAT命令集
1、查询无线模块状态发送ATCR,应答OK
2、主叫__•发送ATD+Dial__号码CR;应答如连接不成功NOCARRIER•举例发送“atd1347604__72\r”即主叫该号码;
3、接__•发送:ATACR连接成功OK否则NOCARRIER
4、挂断__发送ATHCR,应答OK
5、发短消息•发送AT+CMGF=1CR设置__为文本模式,应答OK.•或发送AT+CMGF=0CR设置__为PDU模式应答OK.•发送AT+CMGS=__号码CR__内容CTRL+Z•举例:1发送“at+cmgf=1\r”设为文本模式;2发送“at+cmgs=1347604__72\r”.3发送__内容“hello…”内容以ctrl+z结束发送字符码26,表示结束).上述例子表示向134….发送短消息,内容为hello…注意发送AT命令给无线模块时,中间应有一定的时间延时主程序#includestdio.h#includesys/types.h#includesys/stat.h#includesys/ioctl.h#includefcntl.h#includeunistd.h#includestdio.h#includestring.h#includestdlib.h#includelimits.h#includelinux/fb.h#includelinux/kd.h#includesys/m__n.h#includesys/types.h#includelinux/vt.h#includeassert.h#includelcd.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#defineRED_COLOR0xf800#defineOFFSET_X120#defineOFFSET_Y80intXmin=318X__x=3381Ymin=420Y__x=3600;intstart_x[]={8081126248366480};intstart_y[]={808192172252332344};unsignedshort*LCD_MEM_BASE;intfb_fdts_fduart_fd;intxy;staticintcur_x=0;staticintcur_y=0;staticstructts_ret{unsignedintpressure;unsignedintx;unsignedinty;}ts_ret;staticstructphonenum{charbuffer
[100];unsignedinttail;}phonenum;staticvoiddrawpixelintxintyunsignedshortcolor___sk{unsignedintbits;unsignedshort*tmp;ifx=SCREEN_WIDTH||y=SCREEN_HEIGHTreturn;bits=SCREEN_WIDTH*y+x*BITS_PER_PIXEL;tmp=LCD_MEM_BASE+bits/16;*tmp=color___sk;return;}voiddrawlineintxintyintlengthintflagunsignedshortcolor___sk{inti;ifflagfori=0;ilength;i++drawpixelx+iycolor___sk;elsefori=0;ilength;i++drawpixelxy+icolor___sk;}voiddraw_charintxintyunsignedcharcunsignedshortcolor___sk{intijt;unsignedshort*p=helvB12_bits+c-0x20*14;fori=0;iCHAR_HEIGHT;i++{unsignedshorttmp=p[i];forj=0;jCHAR_WIDTH;j++{iftmp0x8000{fort=0;t4;t++{drawpixelx+j*4+ty+i*4color___sk;drawpixelx+j*4+ty+i*4+1color___sk;drawpixelx+j*4+ty+i*4+2color___sk;drawpixelx+j*4+ty+i*4+3color___sk;}}tmp=tmp1;}}}voiddraw_keyboardvoid{inti;fori=0;i5;i++{drawlinestart_x
[0]start_y
[0]+i*OFFSET_YSCREEN_HEIGHT1WHITE_COLOR;drawlinestart_x
[0]start_y
[1]+i*OFFSET_YSCREEN_HEIGHT1WHITE_COLOR;}fori=0;i5;i++{drawlinestart_x
[0]+i*OFFSET_Xstart_y
[0]SCREEN_WIDTH/20WHITE_COLOR;drawlinestart_x
[1]+i*OFFSET_Xstart_y
[0]SCREEN_WIDTH/20WHITE_COLOR;}fori=0;i3;i++{draw_charstart_x
[2]+i*OFFSET_Xstart_y
[2]1+iBLUE_COLOR;draw_charstart_x
[2]+i*OFFSET_Xstart_y
[3]4+iBLUE_COLOR;draw_charstart_x
[2]+i*OFFSET_Xstart_y
[4]7+iBLUE_COLOR;}draw_charstart_x
[2]start_y
[5]0BLUE_COLOR;draw_charstart_x
[3]start_y
[6]*BLUE_COLOR;draw_charstart_x
[4]start_y
[5]#BLUE_COLOR;draw_charstart_x
[5]start_y
[2]%GREEN_COLOR;draw_charstart_x
[5]start_y
[3]RED_COLOR;draw_charstart_x
[5]start_y
[4]$WHITE_COLOR;draw_charstart_x
[5]start_y
[5]RED_COLOR;}voiddraw_stringlinechar*sunsignedshortcolor___sk{unsignedchar*tmp=unsignedchar*s;while*tmp{draw_charline*tmpcolor___sk;tmp++;}}voiddraw_charlineunsignedcharcunsignedshortcolor___sk{intiknxy;unsignedlongoffset*tmpnew;unsignedshort*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=unsignedlong*LCD_MEM_BASE;fori=0;in;i++tmpnew++;ifc==\n||c==\r{cur_x=0;cur_y+=LINE_HEIGHT;return;}else{ifcur_y=SCREEN_HEIGHT-6{fori=n;in+offset;i++*tmpnew++=0x1f001f;cur_x=0;cur_y=SCREEN_HEIGHT-LINE_HEIGHT-6;}x=cur_x;y=cur_y;fori=0;iCHAR_HEIGHT;i++{unsignedshorttmp=p[i];fork=0;kCHAR_WIDTH;k++{iftmp0x8000{drawpixelx+ky+i*2color___sk;drawpixelx+ky+i*2+1color___sk;}tmp=tmp1;}}cur_x+=helvB12_width[c-0x20]+1;return;}}chargetkeyintxinty{charkey;charaddr
[4]
[4]={{0741}{*852}{#963}{SHC}};x=x-80/120;y=y-80/80;ifx0x=0;ifx3x=3;ify0y=0;ify3y=3;key=addr[x][y];draw_charlinekeyRED_COLOR;returnkey;}chardialingvoid{charkeyctlcr;ctl=26;cr=13;key=getkeyxy;printfkey=%c\nkey;ifkey!=Skey!=Hkey!=Ckey!=phonenum.buffer[phonenum.tail++]=key;ifkey==C{writeuart_fdatdstrlenatd;usleep1000;writeuart_fdphonenum.bufferphonenum.tail;usleep1000;writeuart_fd;\rstrlen;\r;phonenum.tail=0;}elseifkey==S{writeuart_fdat\rstrlenat\r;usleep1000;writeuart_fdat\rstrlenat\r;usleep1000;writeuart_fdat+cmgf=1\rstrlenat+cmgf=1\r;usleep1000;writeuart_fdat+cmgs=strlenat+cmgs=;usleep1000;writeuart_fdphonenum.bufferphonenum.tail;usleep1000;writeuart_fdcr1;usleep1000;writeuart_fdhello!strlenhello!;usleep1000;writeuart_fdctl1;phonenum.tail=0;}elseifkey==H{writeuart_fdath\rstrlenath\r;printfOpenfbdevi__error!\n;phonenum.tail=0;}elseifkey=={ifphonenum.tail0phonenum.tail--;}}int__in{fb_fd=open/dev/fb0O_RDWR;iffb_fd0{printfOpenfbdevi__error!\n;return-1;}ts_fd=open/dev/ts_ads7843O_RDWR;ifts_fd0{printfOpentsdevi__error!\n;return-1;}uart_fd=open/dev/uartO_RDWR;ifuart_fd0{printfOpenuartdevi__error!\n;return-1;}LCD_MEM_BASE=m__pNULLSCREEN_WIDTH*SCREEN_HEIGHT*2PROT_READ|PROT_WRITE__P_SHAREDfb_fd0;memsetLCD_MEM_BASE0SCREEN_WIDTH*SCREEN_HEIGHT*2;phonenum.tail=0;draw_keyboard;for;;{ifreadts_fdts_retsizeofstructts_ret{ifts_ret.xXmints_ret.x=Xmin;ifts_ret.xX__xts_ret.x=X__x;ifts_ret.yYmints_ret.y=Ymin;ifts_ret.yY__xts_ret.y=Y__x;x=ts_ret.x-Xmin*SCREEN_WIDTH/X__x-Xmin;y=ts_ret.y-Ymin*SCREEN_HEIGHT/Y__x-Ymin;dialing;}}closefb_fd;closets_fd;closeuart_fd;return0;}实验体会通过这次实验,我对嵌入式有了实质性的认识,也有了一定的实践经验实验的课时是很多的,通过这六次实验,我__到使用linux嵌入式系统的乐趣,对此有了一定的理解美中不足的是,每次实验都是按老师说的一步一步做,没有对实验原理深刻的理解,没有时间思考实验原理,每次都是按部就班的做如果说什么建议,我希望以后这课实验的时候之前多一点时间给我们准备思考,深刻想一想实验之中的道理和问题通过这实验,我相信大家都会多多少少有些收获,更深刻的了解了嵌入式,了解它的实验平台,最后出成果时,看到这么一台机子就能简单模拟__来发送__和打__,还是触摸屏的心里还是异常欣喜的触摸屏工作原理CPUSPI控制器中断控制器ADS7843模/数转换芯片数据中断LCD触摸屏注意在该工作方式中,CPU采用中断方式,使用SPI口控制模/数芯片读取数据,而不是直接使用CPU内部的模/数控制器xyADS7843模/数转换芯片
①触摸屏xy方向的模拟__
④转化为数字__后通过SPI口发给CPU
②ADS7843使用EINT5外部中断通知CPU触摸屏__
③CPU通过SPI口控制ADS7843将模拟__转化为数字__触摸屏校准算法SIM卡使用串口传送AT命令AT命令拨号、__LCD触摸屏#*0987654321at+cmgs=1347604__72图形系统发送键值While(){等待键盘消息;…收到消息;根据键值发送AT命令到串口;}中断处理,发送消息GPRS模块无线__天线产生中断RS485总线IrDA红外通信UART2168Pin总线其他可复用资源扩展插槽外挂GPRS/GPS扩展板触摸屏接口SPI640*480TFT16bitLCD液晶屏RS232串口0UART02410核心CPUSDRAMFLASH。