本文介绍了嵌入式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机的信息交换。
现阶段嵌入式产品作为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所示。
Linux2.6内核中,在文件archarmplat-s3cincludeplatPartition.h中定义了分区信息如下:
其中“.name”为分区的名称,“.offset”为分区起始地址,“.size”为分区大小。这个结构体包涵了NANDFLASH的所有分区信息。
2 NAND FLASH模拟U盘实践方法
2.1 修改内核
由于struct mtd_partition s3c_partition_info[]定义了分区信息,所以首先要修改或者添加分区信息,使得模拟得到的U盘空间大小符合实际需求。
在arch\arm\plat-s3c\incIude\plat\Partition.h的struct mtd_partition s3c_partition_info[]中添加分区信息如下:
其中:.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功能作为模块编译进内核时,(选择栏应填“
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所示。
从图中看出属性中U_Storage的容量为504 MB并不是512 MB,这是因为厂家生产存储介质时,容量是10进制,比如1 GB=1 000 MB,但是电脑却是采用二进制,1 GB=210MB,1 MB=210KB,这样计算,电脑显示容量大小要比标注的容量小些。在PC机上在U_Storage中新建一个名为“zy”的文件夹,然后再在开发板上新建一个名为“haha”的文件夹,同时在Windows下和板子中查看,会出现如图4所示信息。
图4中H盘为PC机给U_Storage分配的盘符,上层界面为PC串口与开发板交互的打印信息该信息显示的是开发板的内容。从图中可知,H盘中存在“haha”和“zy”两个目录;开发板与PC交换界面中跳到/mnt/U_Storage/目录下,用“ls”命令查得,开发板交换目录中存在“haha”和“zy”两个目录,证明U盘和PC交互信息成功。NAND FLASH模拟U盘挂载,使得目标板充分利用了U盘的便捷功能,使得携带、操作、移植更为方便。Linux下基于ARM11体系结构模拟U盘的实现使得高端电子产品模拟U盘技术得到广泛应用。经实验验证该设计是成功的,成功解决了ARM11体系结构下目标板作为U盘挂载到PC机的问题,具有实际意义。
上一篇:基于AT91SAM9260的终端软硬件平台的设计
下一篇:基于STM32微处理器的LED光电特性测试装置设计
推荐阅读最新更新时间:2024-03-16 15:58