基于mini2440的mp3播放器_第1页
基于mini2440的mp3播放器_第2页
基于mini2440的mp3播放器_第3页
基于mini2440的mp3播放器_第4页
基于mini2440的mp3播放器_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 2013 届毕业设计(论文) 题 目: 基于mini2440的mp3播放器 学 院: 浦江学院 专 业: 电子信息工程 班 级: 电子 0905 姓 名: 顾驰 指导教师: 李 荣 雨 起讫时间: 2013-02-252013-06-10 2013年6月I基于mini2440的mp3播放器摘 要Mini2440是一款真正低价实用的ARM9开发板,是目前国内性价比最高的一款学习板;它采用Samsung S3C2440为微处理器,并采用专业稳定的CPU内核电源芯片和复位芯片来保证系统运行时的稳定性。本文采用mini2440开发板进行开发,在该平台上设计MP3播放器,操作系统使用Linux操作系统

2、,搭建嵌入式开发环境,建立交叉编译环境。将U-boot进行移植,使其能够在mini2440开发板上进行运行。对linux系统进行移植,然后利用按键中断这一方法开发了mini2440开发板的按键驱动,并对MP3播放器所需要的文件系统进行了制作。最后编写了用户层的MP3应用程序,使此平台能够运行MP3的一些基本功能。调试结果表明,本系统各项标准已达到本设计的所有要求。AbstractMini2440is a truly practical low-costARM9 development board, is currently the most cost-effective a learning

3、board;it uses the Samsung S3C2440microprocessor, and using professional stable CPU core power source chip and reset chip to ensure the system is running stability.In this paper,mini2440 development board to develop,on the platformdesignMP3 player,the operating system uses the Linux operating system

4、on the computer to build embedded development environment,the establishment of cross-compiler environment.Because development board to mount to a virtual machine on a Linux operating system, so to install and configure the TFTP service,install and configure the NFS service.But alsomini2440 developme

5、nt board running linux operating system, so the Linux system for transplant.MP3 player using the keys the operation to be key drivers for the preparation,at run time, the background load key driver modules.Finally write the application to control theMP3 player function is implemented.Test results sh

6、ow that the system has reached the standards for all of the design requirements.目 录摘 要IAbstract II第一章 绪论11.1 前言11.2 选题背景21.3 国内外的研究概况31.4 设计要求31.4.1 基本要求31.4.2 论文结构3第二章 系统硬件设计和软件设计方案42.1 硬件设计方案42.2软件设计方案42.3 mini2440用户按键52.4 音频接口6第三章 搭建嵌入式开发环境73.1 Linux下建立嵌入式开发环境73.1.1 建立交叉编译环境73.1.2安装配置TFTP服务73.1.2

7、 安装配置NFS服务83.2 U-boot在arm9上的移植83.2.1 U-boot介绍83.2.2 U-boot的移植8第四章 LINUX系统移植及按键驱动开发94.1 Linux系统移植94.1.1 获取Linux内核源代码94.1.2 指定交叉编译变量94.1.3 内核配置菜单中的MINI2440选项94.1.4 为内核打上yaffs2补丁114.1.5 配置和编译带YAFFS2支持的内核114.2 按键驱动开发134.2.1 按键驱动原理134.2.1 按键驱动设计思路144.3 根文件系统的制作174.3.1常用的Linux根文件系统类型174.3.2 YAFFS2文件系统的移植1

8、84.3.3 制作根文件系统21第五章 应用程序编写及调试245.1主程序的编写245.1.1 主程序流程图245.1.2 主程序25第六章 总结和展望29参考文献30III南京工业大学本科生毕业设计(论文)第一章 绪论1.1 前言随着计算机技术、微处理器技术、电子技术、通信技术、集成电路技术的发展,嵌入式系统已成为计算机技术和应用领域的一个重要组成部分,嵌入式产品在人们的日常生活中也扮演着越来越重要的角色。目前,计算机和网络已经全面渗透到日常生活的每一个角落。对于我们每个人来说,需要的已经不再仅仅是那种放在桌上处理文档、进行工作管理和生产控制的计算机机器。任何一个普通人都可能拥有从小到大的各

9、种使用嵌入式技术的电子产品,小到MP3、PDA等微型数字化产品,大到网络家电、智能家电、车载电子设备等。目前,各种各样的新型嵌入式系统设备在应用数量上已经远远超过了通用计算机。在工业和服务领域中,使用嵌入式技术的数字机床、智能工具、工业机器人、服务机器人正在逐渐改变着传统的工业生产和服务方式。1工业控制: 基于嵌入式芯片的工业自动化设备将获得长足的发展,目前已经有大量的8、16、32 位嵌入式微控制器在应用中,网络化是提高生产效率和产品质量、减少人力资源主要途径,如工业过程控制、数字机床、电力系统、电网安全、电网设备监测、石油化工系统。就传统的工业控制产品而言,低端型采用的往往是8位单片机。但

10、是随着技术的发展,32位、64位的处理器逐渐成为工业控制设备的核心,在未来几年内必将获得长足的发展。 2交通管理: 在车辆导航、流量控制、信息监测与汽车服务方面,嵌入式系统技术已经获得了广泛的应用,内嵌GPS模块,GSM模块的移动定位终端已经在各种运输行业获得了成功的使用。目前GPS设备已经从尖端产品进入了普通百姓的家庭,只需要几千元,就可以随时随地找到你的位置。 3信息家电: 这将称为嵌入式系统最大的应用领域,冰箱、空调等的网络化、智能化将引领人们的生活步入一个崭新的空间。即使你不在家里,也可以通过电话线、网络进3第一章绪论行远程控制。在这些设备中,嵌入式系统将大有用武之地。 4家庭智能管理

11、系统: 水、电、煤气表的远程自动抄表,安全防火、防盗系统,其中嵌有的专用控制芯片将代替传统的人工检查,并实现更高,更准确和更安全的性能。目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。 5POS网络及电子商务: 公共交通无接触智能卡(Contactless Smartcard, CSC)发行系统,公共电话卡发行系统,自动售货机,各种智能ATM终端将全面走入人们的生活,到时手持一卡就可以行遍天下。 6机器人: 嵌入式芯片的发展将使机器人在微型化,高智能方面优势更加明显,同时会大幅度降低机器人的价格,使其在工业领域和服务领域获得更广泛的应用。 这些应用中,可以着重于在控制方面的应用。就远

12、程家电控制而言,除了开发出支持TCP/IP的嵌入式系统之外,家电产品控制协议也需要制订和统一,这需要家电生产厂家来做。同样的道理,所有基于网络的远程控制器件都需要与嵌入式系统之间实现接口,然后再由嵌入式系统来控制并通过网络实现控制。所以,开发和探讨嵌入式系统有着十分重要的意义。1.2 选题背景MP3本身是一种压缩与解压缩的计算方式,用来处理高比率的声音信息。经过MP3编码软件进行编码后,在音质几乎与高保真的CD没有什么差别的情况下,容量为640MB的普通CD盘(就是你买的MP3音乐光盘啦)能存储十几个小时的声音文件了,每分钟声音的MP3文件只有1MB左右大小,这样每首歌的大小只有数兆字节。然后

13、使用MP3播放工具对MP3文件进行实时的解压缩(解码),把还原后的声音信号输出到扬声器上,高品质的MP3声音就播放出来了。MP3从网络下载几乎免费、音质好、文件小,如今已热门到严重威胁传统唱片市场的地步。 南京工业大学本科生毕业设计(论文)1.3 国内外的研究概况目前国外MP3技术的研发基本在中国完成,我们国内做mp3芯片的厂家珠海炬力上市,也更加证明从芯片解决方案上,国内厂家也有足够的研发能力。mp3属于一个新兴的行业,产业链已经形成,不必靠历史积累下的资源,就能有很好的突破。MP3是嵌入式的最主要应用之一,高端的MP3已经不仅仅着眼于实现音乐播放这一简单功能,而是同时具备了文本浏览、图片浏

14、览、甚至视频播放等强大功能。本文重点讨论了基于mini2440的MP3的功能的实现,包括开发环境建立、内核配置与编译、按键控制等一系列详细过程。1.4 设计要求1.4.1 基本要求(1) 能够在mini2440开发板上播放mp3格式音频文件。(2) 通过按钮操控mp3播放器的播放,暂停,中止,上一首,下一首的功能。1.4.2 论文结构本论文结构如下:第2章 介绍了系统硬件的选择,软件设计的方案。第3章 描述了嵌入式开发环境的搭建。第4章 给出了Linux系统的移植,相关驱动的编写及移植,编译镜像,以及构建文件系统。第5章 介绍了应用程序的编写及测试。第6章 总结描述,自己在设计中的心得和体会。

15、33南京工业大学本科生毕业设计(论文)第二章 系统硬件设计和软件设计方案2.1 硬件设计方案采用mini2440开发板,mini2440是广州友善之臂科技有限公司开发的嵌入式系统开发平台,本开发板采用ARM9系列芯片S3C2440作为主控芯片,搭配3.2英寸液晶触摸屏,以及自带音频解码芯片,配有丰富的硬件接口,是当今最热门的开发开发平台之一。该开发板可以实现车载GPS,以及MP3音乐播放器,MP4视频播放器等高端消费电子产品。用本开发板实现MP3播放器的整体思路是,在移植操作系统的基础上,并且挂载到电脑上面,就能实现文件的快速读取。Mini2440开发板自带UDA1341音频解码芯片,能够胜任

16、mp3音频解码功能。系统框图如图2.1: 按键 mini2440 P C音频解码电路音箱输出 显 示 读 取图2.1 系统框图2.2软件设计方案采用开源的Linux系统。Linux操作系统具有诸多优点,并且内核可裁剪,在满足系统要求的同时,具有高度的可移植性,由于嵌入式设备硬件平台的多样南京工业大学本科生毕业设计(论文)性,CPU芯片的快速更新,嵌入式操作系统要求支持常用的嵌入式CPU,如X86, ARM, MIPS, POWERPC等,并具有良好的可移植性。另外还需要支持种类繁多的外部设备。Linux支持以上几乎所有的主流芯片,并且还在不断的被移植到新的芯片上,嵌入式系统具有成本敏感性,处理

17、器速度较低 ,存储器空间较少,这要求嵌入式OS体积小,速度快。Linux体系结构比较灵活,易于裁减,可以小到2M flash,4M RAM。基于Linux的操作系统结构框图如图1.2所示。系统硬件层 设备驱动系统内核应用层:madplay图1.2 Linux 系统结构框图2.3 mini2440用户按键开发板有六个用户测试用按键,它们均从cpu中断引脚直接引出,属于低电平触发,这些引脚也可以复用为GPIO和特殊功能口,6个按键的定义如表2-1:表2-1K1K2K3K4K5K6对应的中断EINT 8EINT11EINT13EINT14EINT15EINT19复用的GPIOGPG0GPG3GPG5

18、GPG6GPG7GPG11特殊功能口无nSS1SPIMISO1SPIMOSI1SPICLK1TCLK1南京工业大学本科生毕业设计(论文)2.4 音频接口S3C2440内置I2S总线接口,可直接外接8/16比特的立体声CODEC,本开发板采用基于I2S总线的UDA1341芯片实现音频解码系统,该芯片内部寄存器的初始化和设置则是采用L3-bus总线连接控制实现的。在这里我们沿用了三星公板的设计,分别使用CPU的GPB2、GPB3、GPB4端口模拟实现L3-bus规范的L3MODE、L3DATA、L3CLOCK,他们在初始化完UDA1341以后就不再有用了。南京工业大学本科生毕业设计(论文)第三章

19、搭建嵌入式开发环境3.1 Linux下建立嵌入式开发环境3.1.1 建立交叉编译环境使用交叉编译器(ARM-LINUX-GCC-4.3.2)建立步骤:1,下载arm-linux-gcc-4.3.2.tgz到任意的目录下,进入这个文件夹tar xvzf arm-linux-gcc-4.3.2.tgz -c /C后面有个空格,起的是改变目录意义。2.修改环境变量,把交叉编译器的路径加入到PATH,为了可以方便使用arm-linux-gcc编译器系统, 把arm-linux工具链目录加入到环境变量PATH中。3. 在命令行输入arm-linux-gcc v,交叉编译环境安装完成。3.1.2安装配置T

20、FTP服务因为在使用mini2440的时候通常用电脑作为宿主机,需要TFTP和NFS这两种网络服务,所以要配置TFTP服务。安装配置TFTP服务的大致步骤如下:(1) 安装tftphpa,tftpd-hpa和openbsd-inetd程序;(2) 修改配置文件/etc/inetd.conf;(3) 根据配置文件的路径,建立TFTP目录,并且修改目录权限;(4) 重启TFTP服务;(5) 本地传输的测试;南京工业大学本科生毕业设计(论文)3.1.2 安装配置NFS服务安装配置NFS服务的大致步骤如下:(1) 安装NFS内核服务;(2) 重新配置portmap服务,修改/etc/hosts.den

21、y和/etc/hosts.allow配置文件,重启portmap服务;(3) 修改NFS服务的配置文件/etc.exports,添加服务目录和配置,重新导入配置;(4) 重启NFS服务,并检查可挂载的目录;(5) 在本地挂载测试;3.2 U-boot在arm9上的移植3.2.1 U-boot介绍U-boot是bootloader的一个版本,bootloader是在操作系统内核启动前运行的一段小程序。通过这段程序,我们可以初始化硬件设备,以便为最终调用操作系统内核准备好正确的环境,最后从别处载入内核映像到主寸并跳入到入口地址。3.2.2 U-boot的移植首先修改顶层的makefile文件,使其

22、支持mini2440开发板。然后在/Borad目录当中创建mini2440的目录及其文件,最后在configs当中创建mini2440开发板的配置文件。南京工业大学本科生毕业设计(论文)第四章 LINUX系统移植及按键驱动开发4.1 Linux系统移植4.1.1 获取Linux内核源代码从linux官方网站下载Linux内核代码。4.1.2 指定交叉编译变量我们移植目的是让Linux-可以在mini2440上运行。修改总目录下面的Makefile,改为:export KBUILD_BUILDHOST :=$(SUBARCH)ARCH ?= armCROSS_COMPILE ?=

23、 arm-linux-其中,ARCH是指定目标平台为arm,CROSS_COMPILE 是指定交叉编译器,这里指定的是系统默认的交叉编译器。4.1.3 内核配置菜单中的MINI2440选项输入命令 make menuconfig出现内核配置菜单如图4-1:南京工业大学本科生毕业设计(论文) 图4-1按上下键移动到System Type,按回车进入该子菜单,如图4-2:图4-2南京工业大学本科生毕业设计(论文)再找到S3C2440 Machines,按回车进入该子菜单,选择mini2440 development即可。4.1.4 为内核打上yaffs2补丁进入yaffs2目录执行:#cd yaf

24、fs2#./path-ker.sh.c /opt/FriendlyARM/mini2440/linux-Yaffs2补丁成功打上。4.1.5 配置和编译带YAFFS2支持的内核在lunux 内核源代码根目录运行:make menuconfig,移动上下键找到File System,如图4-3,按回车进入该子菜单图4-3南京工业大学本科生毕业设计(论文) 再找到“Miscellaneous filesystem”菜单栏,按回车进入该子菜单,如图4-4:图4-4出现如图4-5,找到“YAFFS2 file system support”,并按空格选中它,这样我们就在内核中添加了YA

25、FFS2文件系统的支持。南京工业大学本科生毕业设计(论文)图4-5在命令行输入 make zImage4.2 按键驱动开发4.2.1 按键驱动原理Mini2440具有6个用户测试用按键,它们都是连接到CPU的中断引脚。6个用户按键分别对应如下表4-1:表4-1按键对应的端口寄存器对应的中断对应的复用功能K1GPG0EINT8仅有GPIO 和中断功能K2GPG3EINT11nSS1K3GPG5EINT13SPISIMOK4GPG6EINT14SPISIMIK5GPG7EINT15SPICLKK6GPG11EINT19TCLK南京工业大学本科生毕业设计(论文)4.2.1 按键驱动设计思路(1)整体

26、思路按键的捕获,Mini2440是用的中断方式,所以要对每个按键进行结构体定义,然后使用中断服务程序对中断进行捕获。(2) 中断模式Mini2440一共有7种工作模式,中断模式是其中一种,是特权模式,也是异常模式。中断的控制寄存器比较多,其实总开关就在CPSR种的I位和F位,一个是中断允许,一个是快中断允许。当一个异常模式发生时候(这里关心中断模式),ARM core会自动地完成许多事情:1.在异常模式的LR寄存器种保存上一个模式的的下一条,即将执行的指令的地址2.将CPSR值复制到异常模式的SPSR3.将CPSR设置为异常模式的数值4.令PC的数值等于异常模式在异常向量表中的地址,即跳转执行

27、异常向量表中的指令当退出异常模式的时候,由软件完成下列事情:1.将前面保存在异常模式中的LR的数值减去适当的数值,赋给PC寄存器2.将SPSR复制给CPSR使用中断的步骤如下:1.设置好中断模式和快速中断的栈2.准备好中断处理函数要设置好中断向量表,并且要中断核心的程序ISR,最后清除中断3.进入中断,出中断需要保存运行环境4.根据具体中断,设置外设5.确定中断的方式,FIQ还是IRQ6.IRQ,设置INTMSK寄存器,FIQ不受INTMSK影响7. 设置CPSR中的总中断位IF位南京工业大学本科生毕业设计(论文)(3) 驱动程序的分析和编写按键是利用中断的方式进行操作的,所以要定义一个结构体

28、来存放按键的中断号,GPIO端口,定义键值,用来传递给应用层让客户可以在写程序时候用到,实际代码如下:struct button_irq_desc int irq; /按键对应的中断号 int pin; /按键所对应的GPIO 端口 int pin_setting; /按键对应的引脚描述,实际并未用到,保留 int number; /定义键值,以传递给应用层/用户态 char *name; /每个按键的名称;/*结构体实体定义*/static struct button_irq_desc button_irqs = IRQ_EINT8 , S3C2410_GPG(0) , S3C2410_GP

29、G0_EINT8 , 0, "KEY0", IRQ_EINT11, S3C2410_GPG(3) , S3C2410_GPG3_EINT11 , 1, "KEY1", IRQ_EINT13, S3C2410_GPG(5) , S3C2410_GPG5_EINT13 , 2, "KEY2", IRQ_EINT14, S3C2410_GPG(6) , S3C2410_GPG6_EINT14 , 3, "KEY3",;因为本驱动是基于中断方式的,所以要创建一个等待队列,以配合中断函数使用;当有按键按下并读取到键值时,将会

30、唤醒此队列,并设置中断标志,以便能通过 read 函数判断和读取键值传递到用户态;当没有按键按下时,系统并不会轮询按键状态,以节省时钟资源。具体实现代码如下:static DECLARE_WAIT_QUEUE_HEAD(button_waitq);/*中断标识变量,配合上面的队列使用,中断服务程序会把它设置为1,read 函数会把它清零*/static volatile int ev_press = 0;static irqreturn_t buttons_interrupt(int irq, void *dev_id)struct button_irq_desc *button_irqs =

31、 (struct button_irq_desc *)dev_id;int down;udelay(0);down = !s3c2410_gpio_getpin(button_irqs->pin);if (down != (key_valuesbutton_irqs->number & 1) / Changedkey_valuesbutton_irqs->number = '0' + down;ev_press = 1; wake_up_interruptible(&button_waitq); return IRQ_RETVAL(IRQ_HA

32、NDLED);在应用程序执行open(“/dev/buttons”,)时会调用到此函数,在这里,它的作用主要是注册按键的中断。所用的中断类型是IRQ_TYPE_EDGE_BOTH,也就是双沿触发,在上升沿和下降沿均会产生中断,这样做是为了更加有效地判断按键状态具体实现代码如下:static int s3c24xx_buttons_open(struct inode *inode, struct file *file) int i; int err = 0; for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs0); i+) if (

33、button_irqsi.irq < 0) continue;err = request_irq(button_irqsi.irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,button_, (void *)&button_irqsi);if (err) break;if (err) i-;for (; i >= 0; i-) if (button_irqsi.irq < 0) continue;disable_irq(button_irqsi.irq);free_irq(button_irqsi.irq, (v

34、oid *)&button_irqsi);return -EBUSY;ev_press = 1;return 0;下面这段close(fd)函数对应用程序的系统调用,在此,它的主要作用是当关闭设备时释放按键的中断:static int s3c24xx_buttons_close(struct inode *inode, struct file *file) int i; for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs0); i+) if (button_irqsi.irq < 0) continue;free_i

35、rq(button_irqsi.irq, (void *)&button_irqsi); return 0;通过下面这段函数实现对按键的读取,以及返回给用户空间,是用户空间可以对按键进行使用:static int s3c24xx_buttons_read(struct file *filp, char _user *buff, size_t count, loff_t *offp) unsigned long err;if (!ev_press) if (filp->f_flags & O_NONBLOCK) return -EAGAIN;else wait_event_

36、interruptible(button_waitq, ev_press); ev_press = 0; err = copy_to_user(buff, &key_values, sizeof(key_values); return err ? -EFAULT : min(sizeof(key_values), count);4.3 根文件系统的制作4.3.1常用的Linux根文件系统类型(1)NFS网络文件系统(2)JFFS/JFFS2(3)YAFFS/YAFFS2我采用的是YAFFS2文件系统,它是NAND FLASH嵌入式文件系统。4.3.2 YAFFS2文件系统的移植(1)下

37、载YAFFS2文件系统代码。(2)将下载的文件yaffs.tar.gz拷贝到你的一个临时文件夹中,假设是/tmp,并解压:# cd /tmp# tar xzvf yaffs.tar.gz解压后得到Development文件夹,该文件夹里有两个子文件:yaffs和yaffs2。考虑到现在的NAND FLASH容量越做越大,而且yaffs2可以自动选择挂载是yaffs1还是yaffs2文件系统,这里我们移植yaffs2。当然如果你的NAND FLASH只是512+16B的,可以只移植yaffs,因为即使你移植了yaffs2,它也会自动选择挂载yaffs1的。(3)在要移植的内核目录下建立yaffs

38、2文件夹,并将需要的文件拷贝过来:# cd $(linuxdir)/fs# mkdir yaffs2 # cd yafs2# cp /tmp/Development/yaffs2/*.c .# cp /tmp/Development/yaffs/*.h .# cp /tmp/Development/yaffs2/Makefile-kernel Makefile# cp /tmp/Development/yaffs2/Kconfig .(4)修改$(linuxdir)/fs/yaffs2中的文件:在开始未修改该目录.c文件前,会出现很多的built-in.o的错误,要么是提示某些函数未定义,要么

39、是某些函数重复定义,花了我很长的时间,终于找到问题所在。部分错误提示如下:(这是我开始编译yaffs时的错误,yaffs2的错误更多,但类型差不多)fs/built-in.o(.text+0x8478c): In function yaffs_internal_read_super_mtd': : undefined reference to nandmtd_WriteChunkToNAND' fs/built-in.o(.text+0x84790): In function yaffs_internal_read_super_mtd': : undefined ref

40、erence to nandmtd_ReadChunkFromNAND' fs/built-in.o(.text+0x84794): In function yaffs_internal_read_super_mtd': : undefined reference to nandmtd_EraseBlockInNAND' fs/built-in.o(.text+0x84798): In function yaffs_internal_read_super_mtd': : undefined reference to nandmtd_InitialiseNAND&

41、#39;查看.c文件,我发觉有很多是通过Kconfig文件里定义的CONFIG常量来判断执行的,而这些常量在你make menuconfig/xconfig后退出后会将你的选择保存到文件中,但yaffs2目录下的有些.c 文件中引用了这些常量来判断,却并未加入引用config.h文件,从而会出错。将yaffs2目录下所有引用了这些常量的.c文件中加入对 config.h的引用即可: #include (5)修改$(linuxdir)/fs/Makefile 和 Kconfig文件。# cd $(linuxdir)/fs# vi Makefile (将下面一行添加到Makefile中) obj-

42、$(CONFIG_YAFFS_FS) += yaffs2/# vi Kconfig (将下面一行添加到Kconfig中) source "fs/yaffs2/Kconfig(6)在编译内核时选择:<*> YAFFS2 file system support <*> 512 byte / page devices <*> Lets Yaffs do its own ECC <*> 2048 byte (or larger) / page devices <*> Autoselect yaffs2 format <*>

43、; Disable lazy loading <*> Turn off wide tnodes <*> Turn off debug chunk erase check通过mkyaffsimage 制做出来的image 其OOB 中也包含它自己计算的ECC校验数据,其校验算法有可能和MTD NAND 驱动的校验算法不同,如果在内核中由MTD来处理ECC,会造成MTD 认为所有的page 都校验错误。所以,这也是我前面说最好把Lets Yaffs do its own ECC 选上的原因,同时,要把MTD NAND 驱动中的ECC 校验关闭。在$(linuxdir)/dr

44、ivers/mtd/nand/your_nand.c的初始化函数中设置this-eccmode = NAND_ECC_NONE.这样做实际是使用了yaffs的ECC,但在读写yaffs分区时分出现提示说:Reading data from NAND FLASH without ECC is not recommended Writing data without ECC to NAND-FLASH is not recommended个人认为,其实已经使用了yaffs的ECC,只是在传给MTD时,MTD没认可,参考mtd/nand/nand_base.c文件里的 nand_read_ecc函数

45、以及yaffs2/yaffs_fs.c文件中在于ECC的定义。这里应该是提示没用NAND的ECC,而使用的是 yaffs的ECC。这可以通过mkyaffsimage制作一个image来验证。解决方法:要么使用nand的ECC,将yaffs的ECC屏蔽掉; 要么将nand_base.c里的相关错误信息屏蔽掉。(7)修改你要移植的芯片中的Makefile,在devices后面添加mtdX和mtdblockX设备,设备个数视你的nand的分区个数而定,这里我的flash在your_nand.c中分成了三个区。mtd0,c,90,0 mtd1,c,90,1 mtd2,c,90,2 mtdblock0,

46、b,31,0 mtdblock1,b,31,1 mtdblock2,b,31,2(8)编译后将kernel和文件系统下载到板子上,查看结果并挂载。# cat /proc/mtd (查看分区情况)mtd0: 00400000 00004000 "EV40 flash partition 1"mtd1: 00400000 00004000 "EV40 flash partition 2"mtd2: 00800000 00004000 "EV40 flash partition 3"# cat /proc/filesystems (查看内核

47、支持的文件系统)nodev sysfsnodev rootfsnodev bdevnodev procnodev sockfsnodev futexfsnodev pipefsnodev eventpollfs ext2nodev ramfsnodev devfsnodev nfsnodev jffs2 romfs yaffs yaffs2nodev rpc_pipefs我们发现系统已经支持yaffs和yaffs2文件系统了。# eraseall /dev/mtd0 (在挂载之前可以先将该分区里的内容擦除掉)# mount t yaffs2 /dev/mtdblock0 /mnt (将第1个分

48、区挂载到/mnt目录下)yaffs: dev is 32505856 name is "mtdblock0"yaffs: Attempting MTD mount on 31.0, "mtdblock0"yaffs: auto selecting yaffs1我们发现如果你的flash是512+16B / page的,即使你选择的是yaffs2文件系统,内核也会自动选择挂载yaffs1文件系统。 4.3.3 制作根文件系统根文件系统介绍根文件系统是嵌入式linux系统三个重要组成部分之中的其中一个,其他两个是bootloader, kernel。在系统

49、中扮演者重要的角色。它是linux系统正常运行必须的shell命令和其他应用程序的存储媒介。通常存储在磁盘以及Flash中。嵌入式一般根文件系统存储在Nandflash中,比较著名的flash根文件系统是jffs2和yaffs2。在开发阶段一般用nfs网络文件系统。还有一种内存文件系统,ramdisk内存盘,这个文件系统因为在内存的缘故,掉电后所存储的东西就会丢失。根文件系统的目录结构bin 存放所有用户都可以使用的、基本的命令。sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。usr 里面存放的是共享、只读的程序和数据。proc 这是个空目录,常作为proc文件系统的挂载点。d

50、ev 该目录存放设备文件和其它特殊文件。etc 存放系统配置文件,包括启动文件。lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系 统中的可执行程序。boot 引导加载程序使用的静态文件home 用户主目录,包括供服务账号锁使用的主目录,如FTPmnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空 的子目录。opt 给主机额外安装软件所摆放的目录。root root用户的主目录tmp 存放临时文件,通常是空目录。var 存放可变的数据。 建立根文件系统的基本目录#!/bin/sh echo "-Create rootfs directo

51、ns start.-" mkdir rootfs cd rootfs echo "-Create root,dev.-" mkdir root dev etc boot tmp var sys proc lib mnt home usr mkdir etc/init.d etc/rc.d etc/sysconfig mkdir usr/sbin usr/bin usr/lib usr/modules echo "make node in dev/console dev/null" sudo mknod -m 600 dev/console c

52、5 1 sudo mknod -m 600 dev/null c 1 3 mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/run var/tmp chmod 1777 tmp chmod 1777 var/tmp echo "-make direction done-" 将上段代码保存成脚本,加上可执行权限。就会在工作目录建立根文件系统基本目录。南京工业大学本科生毕业设计(论文)第5章 应用程序编写及调试5.1主程序的编写5.1.1 主程序流程图南京工业大学本科生毕业设计(论文)5.1.2 主程序int main(void)int buttons_fd;int key_value;struct song *head;/*打开设备文件*/buttons_fd = open("/dev/buttons", 0);if (buttons_fd < 0) perror("open device buttons");exit(1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论