版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课 程 实 验 报 告实验名称:嵌入式系统实验专业班级:计算机科学与技术x班学 号: Ux 姓 名: x 合 作 者: x 实验时间: xxxx年xx月xx日 计算机科学与技术学院试验一:bootloader (ads、引导)一、实验任务1、熟悉ADS 1.2开发工具创建、编译、下载、调试工程2、串口通讯串口控制器初始化、收/发数据3、配置主机端的nfs服务器配置主机端的nfs服务器,以连接linux核心4、下载并运行linux核心使用自己的串口程序下载并运行linux核心二、实验内容编写串口接收数据函数编写串口发送数据函数学习ads、jtag调试、flash烧写打印菜单,等待用户输入下载并运
2、行linux核心配置主机的nfs服务器,与linux核心连接三、实验步骤1.编写串口接收数据函数编写串口发送数据函数修改bootloader:菜单、串口收发、命令行;接收串口数据并做相应处理:while(1) 打印菜单并等待用户输入; switch(ch)/根据用户输入做相应处理 case '1': imgsize=xmodem_receive(char *)KERNEL_BASE, MAX_KERNEL_SIZE); if(imgsize=0)/下载出错; else/下载成功; break; case '3': nand_read(unsigned char
3、*)KERNEL_BASE, 0x00030000, 4*1024*1024); case '2': BootKernel(); /这里是不会返回的,否则出错; break; default: break; Bootloader的main()函数打印菜单:int main(void)ARMTargetInit(); /目标板初始化;/接收用户命令,传递linux核心; Uart_puts("Menu:nr");Uart_puts("1.Load kernel via Xmodem;nr");Uart_puts("2.Boot l
4、inux; nr");Uart_puts("3.Load kernel from flash and boot; nr");Uart_puts("Make your choice.nr");doch=Uart_getc();while(ch!='1' && ch!='2' && ch!='3'); return 0;串口读写:void Uart_putc(char c)while(!SERIAL_WRITE_READY(); (UTXH0) = (c); unsig
5、ned char Uart_getc( ) while(!SERIAL_CHAR_READY();return URXH0; 2.使用ads1.2编译bootloader;3.使用uarmjtag下载、调试bootloader;4.使用axd查看变量、内存,单步跟踪; 5.配置超级终端,与bootloader通讯;6.配置nfs; 编辑/etc/export文件:/home/arm_os/filesystem/rootfs 目标板ip(rw,sync)/home/arm_os/filesystem/rootfs 主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfs res
6、tart测试nfs服务器是否正常运行:mount 主机ip:/home/arm_os/filesystem/rootfs /mnt 7.以root用户启动cutecom,将cutecom配置改为115200 bps,8位,1位停止位,无校验,xmodem,no line end;8.使用bootloader重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统;9.启动Linux核心运行,察看结果;10.linux核心能够运行到加载root步骤,说明bootloader正常运行;11.将bootloader烧写到flash中,重启目标板电源,察看bootload
7、er是否烧写正常,下载核心测试;目标板linux系统正常运行到命令行模式下,能够正常输入linux命令,说明实验成功。 四、实验过程中遇到的问题及解决方案问题一 :打开dubug,下载zImage失败,调试时发现下载失败原因是发生错误程序写为无限循环。解决方法:重新做了很多遍,仍然失败,最终发现同样的bootloader初始化及同样的下载操作在别的机器中能够正常运行,最终换了试验台终于成功地下载了核心映像。问题二 :实验中虽然下载完成,但是在cutecom中并没有显示成功下载映像,没有出现#号不能进入命令行模式,不能够进行后续的操作。解决方法: 因为不明白错误出现的原因,向老师提出疑问,经老师
8、指点,发现linux系统中网络连接处没有网络连接,通过重新配置了ip地址,最终成功下载了核心映像。试验二:linux kernel (gcc、make)一、实验任务1、熟悉基本的linux命令文件操作、文件编辑串口工具、程序开发2、配置linux核心make menuconfig 3、 交叉编译linux核心make zImage 二、实验内容熟悉基本的linux命令配置linux核心交叉编译linux核心调试自己编译的核心挂载nfs上的root(根目录)编写一个小程序在目标板上运行三、实验步骤1.登陆linux系统,在终端进入管理员模式;2.解压缩源码包到/home/下; 3.察看解压缩后的
9、/home/arm_os目录:Linux核心、编译器、rootfs等;4.配置并测试nfs;5.配置cutecom:115200,XModem,No line end;6.配置核心:make menuconfig;7.编译核心:make;8.下载并运行核心,加载root文件系统;9.重新设置cutecom为LF line end;熟悉基本的Linux命令;10.编写一个小程序hello.c在目标板上运行,察看结果。#include<stdio.h>Int main()Printf(“hello”);Return 0;四、实验中遇到的主要问题及解决方法问题1:写成的hello.c程序
10、用gcc编译之后不能在目标板上运行。解决方法:通过请教老师才知道编译的命令不对,此实验板需要通过用arm-gcc-linux进行交叉编译,而不是用gcc,得到的可执行文件可以用命令./hello成功运行。试验三:linux driver (uart)一、实验任务1、 Linux驱动编程基本接口常用函数2、 串口驱动申请中断处理串口数据读、写二、实验内容编写串口驱动初始化、释放函数;编写串口驱动接收数据函数;编写串口驱动发送数据函数;编写串口驱动中断处理函数;编写串口访问应用程序; 使用模块方式编译驱动;使用模块方式调试驱动;实现基本的串口数据收发。 三、实验步骤1编写初始化、释放函数:uart
11、_init、uart_exit、uart_open、uart_ release分别实现串口设备初始化、释放、打开、关闭串口设备初始化函数: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(&q
12、uot;Register 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_uar
13、t, IRQF_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_chr
14、dev_region(MKDEV(uart_major,0),1);printk("Uart module exit.n");2.编写串口驱动接收数据函数、发送数据函数、中断处理函数: irq_rev_uart、uart_write、uart_read,实现串口设备中断处理、读、写;串口设备中断处理函数:char c;while(!(_raw_readb(uart + S3C2410_UTRSTAT) & 0x1);c = (char)_raw_readl(uart + S3C2410_URXH);loop_buffer_add(&readb, c);ret
15、urn 0; 串口设备读函数:int i = 0;if(*ppos >= UART_SIZE) return -EIO;if(*ppos + size > UART_SIZE)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
16、>= UART_SIZE)return -EIO;if(*ppos + size > 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);return size;串口访问应用程序:#include <stdio.h> #include <
17、fcntl.h> int main() int 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; i<50; i+) read(uart_fd, &c, 1); printf("%c", c); write(uart_fd, &c, 1); if(c = 'q')break; close(uar
18、t_fd); return 0; 3.用模块方式编译Linux核心,生成uart.ko,启动目标板Linux核心,用insmod、rmmod等命令操作模块;用printk打印调试串口驱动,包括中断相应,读写等;4.编写应用程序:uart.c,实现打开串口设备、读写等,把主机端由cutecom发过来的串口数据回传给主机;5.将目标板上串口线连到串口1;6.编译应用程序uart.c,实现和主机间的串口通讯。 四、实验中遇到的问题及解决方法问题1:由于模块化编译方法不太了解,对其过程不清楚。解决方法:向老师提出疑问后才知道首先修改uart.c中的波特率,然后拷贝驱动:/home/arm_os/tes
19、t/st/test3/driver/下的makefile和uart.c拷贝到:/home/arm_os/kernel/linux-2.6.29.8/driver/char下,再拷贝应用程序:把:/home/arm_os/test/st/tesT3/下的makefile和uart.c拷贝到自己的文件夹,用于测试。问题2:前面步骤都照常执行但是发送接收始终不能够成功。解决方法:通过问老师仍然查不出错误,于是换了试验台再次尝试后能够成功,同样是实验台的问题。试验四:linux driver (touchscreen)一、实验任务1、 触摸屏驱动初始化坐标值2、 触摸屏、图形系统协调工作触摸屏校准拨号
20、键盘二、实验内容l 编写触摸屏驱动初始化、释放函数;l 编写触摸屏驱动读取数据函数;l 编写触摸屏驱动中断处理函数;l 使用模块方式调试驱动;l 编写触摸屏读取应用程序; l 编写简单图形系统绘制应用程序,绘制一个数字键盘;l 实现基本的触摸键盘程序。 三、实验步骤1.填写函数:ts_init、ts_exit、ts_open、ts_ release,实现触摸屏设备初始化、释放、打开、关闭;触摸屏设备初始化函数:int ret;dev_t devno = MKDEV(ts_major, 0);if(ts_major) ret = register_chrdev_region(devno, 1,
21、“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_init(&ts_cdev, &ts_fops);ret = cdev_add(&ts_cdev, devno, 1);if(ret)printk("Add c d
22、evice 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);if(ret)printk("Request irq failed!n"); return ret; TS_OPEN_INT();ts_time = jiffies;printk(
23、"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");2.填写函数:ts_isr、ts_read,实现触摸屏读、中断处理触摸屏设备中断处理函数:if(jiffies < ts_time + HZ/20)return 0;if(s3c2410_gpio_
24、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_sleep_on(&wq);ts_ret.x = x;ts_ret.y = y;ts_ret.pressure = PEN_D
25、OWN;copy_to_user(buffer, (char *)&ts_ret, sizeof(struct ts_ret); count -= sizeof(struct ts_ret);size += sizeof(struct ts_ret); return size;3.用模块方式编译Linux核心,生成ts_ads7843.ko,启动目标板Linux核心,用insmod、rmmod等操作模块;4.用printk打印调试触摸屏驱动,包括中断相应,读等;5.编写应用程序:ts_ads7843.c,实现打开触摸屏设备、读等;触摸屏访问应用程序:#include <stdio
26、.h> #include <fcntl.h> int main() int ts_fd, i;char c;struct 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
27、_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); return 0; 6.触摸屏校准通过多次点击触摸屏四个边界点得到几组坐标,取平均值来得到屏幕Xmin,Xmax,
28、Ymin,Ymax,在ts_ads7843.c 修改程序,将这四个值代入函数中,并将SCREEN_WIDTH,SCREEN_HEIGHT设置为640*480,修改后的ts_ads7843.c程序如下:#include <stdio.h>#include <fcntl.h>#define Xmin 500#define Xmax 2200#define Ymin 1400#define Ymax 3000static struct ts_ret unsigned int pressure;unsigned int x;unsigned int y; ts_ret;int
29、main() int x,y; int ts_fd, i; char c; struct 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 < Ymin) ts_ret.y = Ymin; if(ts_ret.y > Ymax) ts_ret.y = Ymax; x = (ts_ret.x-Xmin) * 640/(Xmax-Xmin); y = (ts_ret.y-Ymin) * 480/(Ymax-Ymin); printf("%d,%d,%dn",x,y,ts_ret.pressure); close(ts_fd);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络游戏推广代理合同
- 网络游戏平台玩家安全保障措施
- 绿色物流园区绿色物流园区可持续发展策略研究
- 2024年限时汽车展览场地租赁协议
- 智能建筑系统集成及维护服务合同
- 智能制造设备维护保养服务合同
- 智能停车场管理系统开发合同
- 房地产项目化开发与投资协议范本
- 健康医疗智慧医疗设备及健康管理平台设计
- 人工智能辅助设计软件定制开发合同
- (2024年)传染病培训课件
- 船舶管理教案
- 北科大岩石力学课件李长洪1.1岩石的力学性质(qiangdu).ppt
- 供应商QPA稽核点检表(线材)
- 标记有丝分裂百分率法计算
- HCGE2P孕三项化验单模板
- QA软件过程检查单(XXJSTZPPQAChecklist)
- BA88半自动生化分析仪维修手册
- 各系统调试报告
- 《质量管理体系文件》ISO9001_2015_中英文对照
- 漂流项目规划设计书
评论
0/150
提交评论