基于微处理器S3C6410的NAND FLASH模拟U盘的原理与实现

发布者:Alisallll最新更新时间:2018-03-21 来源: eefocus关键字:微处理器  S3C6410  NAND  FLASH  模拟U盘 手机看文章 扫描二维码
随时随地手机看文章

    本文介绍了嵌入式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所示。

a.JPG

    
    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所示。

b.JPG

 

    
    Linux2.6内核中,在文件archarmplat-s3cincludeplatPartition.h中定义了分区信息如下:
   e.JPG
    其中“.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[]中添加分区信息如下:
   f.JPG
    
    其中:.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功能作为模块编译进内核时,(选择栏应填“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所示。

c.JPG

    
    从图中看出属性中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所示信息。

d.JPG

    
    图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机的问题,具有实际意义。

关键字:微处理器  S3C6410  NAND  FLASH  模拟U盘 引用地址:基于微处理器S3C6410的NAND FLASH模拟U盘的原理与实现

上一篇:基于AT91SAM9260的终端软硬件平台的设计
下一篇:基于STM32微处理器的LED光电特性测试装置设计

推荐阅读最新更新时间:2024-03-16 15:58

MSP430F5438A 内存Flash 读写操作
1、msp430的存储结构采用冯.依曼结构,即RAM和Flash在同一个寻址空间内统一编址,没有代码空间和数据空间之分。 2、Flash是以段为为基本结构进行存储的。总体上分三部分: Flash主存储区:用于存储程序代码,被分成4个扇区,每个扇区分128seg, 每个seg段 大小为 64 * 1024 / 128 = 512B。 Flash控制器可以以位、字节、或者字的格式写入Flash控制器。但是控制器最小的擦除单位是段 。 BSL存储区:是存储器的引导加载存储器,可以用于存储引导加载程序,分4段,每段512B,每段可以单独擦除、 信息存储区:主要用于存储需要掉电后永久保存的数据,分4段,每段128B。 每段可以
[单片机]
AirTag拆解,采用兆易创新Nor Flash
日前,iFixit拆解了苹果最新的AirTag,芯片BOM表如下: Apple:U1 ultra-wideband transceiver Nordic Semiconductor: nRF52832 Bluetooth low-energy SoC w/NFC controller GigaDevice: GD25LE32D 32 Mb serial NOR flash Maxim Integrated: MAX98357B class AB digital audio amplifier Texas Instruments: TLV9001 1-MHz, rail-to-rail I/O operational ampli
[物联网]
AirTag拆解,采用兆易创新Nor <font color='red'>Flash</font>
MSP430F5529 flash 读写 详解
MSP430F5529falsh的读写 先上代码 void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 unsigned long * Flash_ptrD; // 定义指向信息存储器D段的指针 unsigned long value; OLED_Init(); Flash_ptrD = (unsigned long *) 0x1800; // 初始化指针 value = 0x00000678; // 初始化需写入的长字 FCTL3 = FWKEY; /
[单片机]
MSP430F5529 <font color='red'>flash</font> 读写 详解
AMD发表4核心运算微处理器技术
  另一个运算微处理器大厂AMD当然也不可能放弃在此次ISSCC 2007中宣扬技术能力的机会。   这次AMD在会议中所发表的是,4核心运算微处理器相关的制程与设计技术,而这颗4核心运算微处理器已经迈入即将出货的阶段,根据AMD的规划,这颗开发代码为Barcelona的微处理器,预计在2007年中正式对外发表亮相,所诉求的是在提升运算处理能力的同时,还能兼顾到耗电量以及散热管理的能力。   这颗新一代的运算微处理器,AMD是利用65纳米的SOI CMOS制程技术,将4个CPU积集在同一芯片上,并且在这颗微处理器中的PMOS部分是采用了「embedded SiGe」的材料技术。AMD也延续了过去的习惯,在芯片的中内建了北桥以及
[焦点新闻]
除了微处理器不断升级换代,汽车电子还有哪些爆发点?
去年,全球半导体产业接连发生三起引人注目的巨额并购案,高通并购恩智浦(NXP)、西门子并购Mentor Graphics、三星电子并购哈曼(Harman International),看似毫无关联实际却指向同一个关键词: 汽车电子 。   随着汽车电子化、智能化程度越来越高,对 传感器 、电子大脑和信息交流芯片的要求也就越高。调研机构HIS表示,一辆普通的新车目前可含有多达616块芯片。在去年德国慕尼黑电子展的汽车电子大会上,博世的Markus Sonnemann博士就指出,一部汽车上仅仅是MEMS传感器就可能超过50颗!     IC Insights统计数据表明,近三年全球车用芯片市场以年复合成长率高达11%的速度增长着,
[嵌入式]
uClinux平台下的Flash存储技术
摘要:较为详细地介绍嵌入式操作系统uClinux平台下的Flash存储技术,并给出基于三星S3C4510系统下Dlash存储器具体设计实例。 关键词:Flash存储技术 uClinux平台 S3C4510 1 Flash类型与技术特点 Flash主要分为NOR和NAND两类。下面对二者作较为详细的比较。 1.1 性能比较 Flash闪存是非易失存储器,可以对存储器单元块进行擦写和再编程。任何Flash器件进行写入操作前必须先执行擦除。NAND器件执行擦除操作十分简单;而NOR则要求在进行擦除前,先要将目标块内所有的位都写为0。擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为1~5s;擦除N
[应用]
Linux下s3c6410的GPIO操作(7)
没想到一个小小的GPIO操作函数,竟然写了七篇博客,这应该算是最后一篇了。 1、s3c6410的GPIO操作函数主要涉及到三个文件,如下所示: arch/arm/plat-s3c64xx/gpiolib.c linux/arch/arm/plat-s3c/gpio.c linux/arch/arm/plat-s3c/gpio-config.c 这三个文件中的很多函数都已经讲到了,可以说基本上都讲了,当然,下面这两个函数没讲: int s3c_gpio_cfgpin(unsigned int pin, unsigned int config) { struct s3c_gpio_chip *chip =s
[单片机]
STM32HAL----USB串行FLASH模拟U盘
其实本身是很容易实现的,但中途遇到了一个以往较少注意到的问题:堆栈空间。 参考这个:https://www.cnblogs.com/qsyll0916/p/8013136.html 总的来说,就是因为堆空间分配不足,导致没有足够的空间给USB作缓冲。这个问题网上很多人遇到过,但是 解决这问题帖子没找到。原子的HAL例程是将FLASH当成512字节扇区进行读写的,原因是为了同时挂载SD卡(512) 而堆空间STM32默认就是0x200,512字节。所以原子哥没有遇到这问题。至于硬石的代码,我发现他的程序 误以为USB缓冲使用的是栈空间,当然,实际上使用的是堆空间。所以他修改了启动文件的堆栈大小为: Stack
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved