微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ARM11的嵌入式Linux NAND FLASH模拟U盘挂载分析与实现

基于ARM11的嵌入式Linux NAND FLASH模拟U盘挂载分析与实现

时间:04-22 来源:互联网 点击:

摘要:介绍了嵌入式Linux操作系统下基于三星微处理器S3C6410的NAND FLASH模拟U盘的原理与实现方法。操作系统采用Linux 2.6.28版本,平台为飞凌OK6410-A开发板。采用的方案是通过添加一个512 MB的NAND FLASH分区空间,配置Linux系统USB Gadget功能,实现划分出的512 MB的NAND FLASH空间以U盘存储系统与PC机通信。该方案的文献目前在国内外同等操作系统版本和平台上并无先例。通过上述方案成功地实现了S3C6410开发板划分出512 MB的NAND FLASH空间以U盘形式挂载到了PC机上,实现与PC机的信息交换。
关键词:ARM11;模拟U盘;Linux;S3C6410

0 引言
现阶段嵌入式产品作为U盘挂载到PC机上在各类电子产品中被越来越多的应用,Linux操作系统在电子产品中的应用也越来越广泛,但是Linux中模拟U盘挂载到PC机中,与PC机上通用Windows的通信还很好的达到实现。本文基于ARM11体系结构的处理器,实现了Linux系统下NAND FLASH模拟U盘挂载到PC机上与Windows进行通信。并在飞凌的OK6410-A板上得到验证,实现了该功能。
目前国内嵌入式产品多用ARM9体系结构,ARM11则用于高端电子产品,NAND FLASH模拟U盘的挂载技术虽然在电子产品中广泛应用,但是对于以新起的Linux操作系统的高端电子产品,这项技术还鲜少以文献的形式得以系统阐述,国内长春大学张伟等人在这方面做过研究,但是他们是基于ARM9体系,本文基于ARM9在ARM11体系结构的处理器上做了新的研究和应用。
现阶段有3类方式可以实现模拟U盘的功能,虚拟vfat.ing模拟U盘挂载,SD卡模拟U盘挂载,NAND FLASH模拟U盘挂载。NAND FLASH由于其大容量和高性价比,往往更加流行。本文是通过NAND FLASH实现模拟U盘的挂载的。

1 NAND FLASH模拟U盘原理分析
嵌入式产品模拟U盘与PC通信是现代嵌入式产品所广泛应用的一种技术,因此在实现Linux下NAND FLASH模拟U盘之前先要对Linux下NAND
FLASH模拟U盘的原理进行分析。Linux下对模拟U盘存储设备的支持就是Linux-USB Gadget驱动的加载,该驱动框架实现了USB协议定义的设备端的软件功能。
1.1 Linux-Gadget框架
Linux系统中Gadget驱动层序框架分为3层:Gadget驱动层;Gadget API层;UDC层。Gadget驱动层实现实现不同的USB功能,例如“USB网卡”、“U盘”、“打印机”等。Gadget API层,为Gadget提供的一套标准API,由底层USB设备控制器(USB Device Controller,UDC)实现这套API,Gadget驱动通过调用这些API实现与UDC通信。UDC是片上系统(SoC)的一部分,不同的UDC需要不同的驱动,同样的UDC不同板子代码也不一样,这一层为平台相关层,直接访问访问硬件,并向上层提供与硬件相关操作的回调函数。Gadget驱动框架原理图如图1所示。

UDC层中usb_gadget和usb_ep为2个描述结构体,分别描述UDC和端点,Gadget API通过这两个结构实现对UDC的控制。usb_gadget_ops和usb_ep_ops为函数集结构体,其主要功能是实现与硬件的交互并实现返回给上层Gadget API所需信息的功能。usb_gadget_register_driver和usb_gadget_unregister_driver为Gadget框架提供的标准API,是驱动层序的注册函数,由UDC层提供,之所以不是通过Gadget API层实现的原因是,用于将Gadget驱动程序绑定到UDC。xxx_udc_irq是UDC设备的中断处理函数,处理设备及其端点的中断请求。
Gadget API层为Gadget定义的一组标准API接口函数,并向上提供编程接口,这一层的存在实现了将下层UDC驱动和上层Gadget驱动程序的隔离,使得Linux系统中编写USB设备侧驱动程序时能够把功能的实现和底层通信分离。
Gadget驱动程序使用usb_gadget_driver结构体描述,实现将Gadget驱动与下层设备控制器相关联,并开启设备功能。
1.2 Linux NAND FLASH分区原理
NAND FLASH作为存储设备,存储着嵌入式产品从开机到结束的所有代码,所以做好存储设备的分区是至关重要的问题,LINUX操作系统下,分区如图2所示。


其中:.name为分区名称,定义为U_Strorage,.offset为起始地址,这个值需要结合该模块前面的模块的大小和起始地址算出;.size为定义的分区大小,为512 MB。
添加分区后重新编译,可在文件系统的/etc下找到相应盘符,如:mtdblock4。
2.2 配置内核
内核中实现NAND FLASH模拟U盘挂载的驱动是USB中的Gadget实现的,所以在实现这项功能时,首先在编译内核的时候,配置上Gadget功能。具体操作如下:
在内核源代码的根目录下执行#make menuconfig,这时将会看到内核的菜单选项,选择:
device driver-->
[*]usb support-->
*>usb gadget support
*>usb preipheral controller
将usb support功能选中,选择编译该功能进内核,并在usb support功能子目录中选择中usb gadget support和usb preipheral contro ller功能,选择编译进内核,做完这些操作后编译内核。
在shell窗口命令行中输入:
#make zImage
#make modules
在driver/usb/gadget目录下会生成g_file_storage.ko和s3c_udc_otg.ko.讲这两个模块复制到目标板的文件系统中。
注意:当usb gadget support功能非作为模块编译进内核时,编译过模块后需要更新内核。而当usb gadget support功能作为模块编译进内核时,(选择栏应填“M>usb gadget support”,其中“M”代表模块),在编译生成模块后,除了要加载g_file_storage.ko还要加载s3c_udc_otg.ko。
2.3 加载模块
在目标板的shell命令窗口中执行:
#insmod s3c_udc_otg.ko
#insmod g_file_storage.ko file=/dev/mtdblock4 stall=0 removable=1
这个时候将目标板连接到PC机即可看到被模拟的U盘盘符,接着就可以像操作正常U盘一样对该U盘进行操作。
注意:这个时候模拟U盘已经存在,但是在目标板中还看不到该U盘盘符,需要执行:
#mkdir/mnt/U_Storage
#mount-t vfat/dev/mtdblock4/U_Storage然后,才能在目标板的/mnt/U_Storage下操作这个U盘。

3 总结与展望
到此已经阐述并实现了模拟U盘的实现原理,其实践结果如图3所示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top