USB海量存储类设备功能在ARM系统中的应用
发布时间:2008/5/27 0:00:00 访问次数:596
    
     昆明理工大学 理学院 童耀南,吴光敏,孟 宇
    
    技术发展到今天的信息时代,数据的存储和传输在嵌入式系统有了越来越重要的地位。而usb是目前设计成熟、应用广泛且使用极为简捷的技术,usb传输是一种高效方便的数据传输方式。基于上述原因,本文重点论述基于usb的海量存储(usb mass storage)设备功能在arm嵌入式系统中设计和应用。使用该设备功能,上位机可以像读写普通u盘一样对于系统采集并存储在flash中的数据进行读写。
    1 硬件方案
    
    l.1 器件简介
    
    s3c44b0x[1]是samsung公司出品的基于arm7tdmi内核的risc型微处理器,8 kb指令和数据共享的缓存,主频可达66 mhz,可以运行16位的thumb指令和32位的arm指令,且接口丰富,具有通用性。
    
    k9f2808u0c[2]是samsung公司生产的一款nand型闪存芯片,容量为16 mb,读写速度快,数据保存时间长,可擦写10万次,在嵌入式系统中有着广泛的应用,主要是负责数据存储。
    
    pdiusbdl2[3]是philips公司生产的带有并行总线和局部dma传输能力的全速usb接口芯片,符合usb1.1版规范,可以与任何外部mcu/mpu实现并行接口,传输速度可达2 mb/s。该usb芯片有1个控制端点和2个普通端点。
    
    1.2 硬件连接图
    
    硬件连接如图1所示。在该系统中,flash芯片k9f2808u0c负责嵌入式系统中的数据存储;处理器s3c44b0x执行底层固件代码;usb接口芯片pdius-bdl2负责设备与上位机的通讯。这样系统采集并存储在闪存芯片中的数据便可以通过usb接口传输到上位机。
    
    
    2 软件实现
    
    要实现实验系统与上位机的usb通讯,首先要正确设计pdiusbd12的底层固件程序。而要实现系统的海量存储设备功能,还要有flash的读写操作代码和实现海量存储设备类规范的代码。下面从这3个方面来分析。软件开发环境为arm公司的ads1.2,usb监控和测试软件为bus hound。
    
    2.1 pdiusbd12固件编程
    
    pdiusbdl2固件结构和数据流向如图2所示。结构图中的硬件提取层是固件中的最底层代码,负责对处理器与pdiusbdl2相连接的i/o口进行操作,以通知pdi-usbd12接下来处理器将对其进行命令操作或是数据操作。而命令接口层是基于硬件提取层的一套对pdius-bdl2进行操作的子程序,可以方便上层程序的编写。
    
    
    当pdiusbd12向处理器发出中断请求时,处理器读取中断寄存器,根据中断源调用相应的中断服务处理程序,中断服务处理程序设置相应的事件标志,如果有数据传输并作相应的数据处理。根据usb协议[4],控制端点0用来负责设备的枚举,如获取设备各种描述符、设置地址、获取海量存储设备的逻辑单元数目和复位设备等操作。这些操作是通过中断和主循环共同完成的。这里端点1未用到,可以忽略其中断。端点2是主端点,用作bulk-only传输。在端点2的中断处理程序中实现bulk-only传输及命令解析和执行。
    
    其中,中断服务处理程序与主循环通过一个名为controldata的结构体变量进行通讯。主循环初始化i/o口、事件标志busbflags、建立包数据缓冲区、定时器和中断,重新连接usb总线后进入一个无限循环,当该循环轮询到某事件标志被置位时便进行相应的处理。特别是在设备枚举中当建立标志被置位时,根据设备请求的类型域controldata,devicerequest,bmrequesttype来确定是标准设备请求、厂商设备请求还是类型设备请求,再根据请求类型进行相应的调用。
    
    2.2 k9f2808u0c读写操作
    
    k9f2808u0c共有1 024块,每块32页,每页528 b,其中512 b用于存放数据,另外16 b用于存放信息,如块的好坏标记、块逻辑地址和ecc校验和等。flash读写有其自身的特点,读写都以页为单位,可以随机读,但无法随机写,写操作前必须把写单元所在的块擦除。因此,对于该闪存的读操作可以采取直接读取来处理;而对于写操作,则通过设
    
     昆明理工大学 理学院 童耀南,吴光敏,孟 宇
    
    技术发展到今天的信息时代,数据的存储和传输在嵌入式系统有了越来越重要的地位。而usb是目前设计成熟、应用广泛且使用极为简捷的技术,usb传输是一种高效方便的数据传输方式。基于上述原因,本文重点论述基于usb的海量存储(usb mass storage)设备功能在arm嵌入式系统中设计和应用。使用该设备功能,上位机可以像读写普通u盘一样对于系统采集并存储在flash中的数据进行读写。
    1 硬件方案
    
    l.1 器件简介
    
    s3c44b0x[1]是samsung公司出品的基于arm7tdmi内核的risc型微处理器,8 kb指令和数据共享的缓存,主频可达66 mhz,可以运行16位的thumb指令和32位的arm指令,且接口丰富,具有通用性。
    
    k9f2808u0c[2]是samsung公司生产的一款nand型闪存芯片,容量为16 mb,读写速度快,数据保存时间长,可擦写10万次,在嵌入式系统中有着广泛的应用,主要是负责数据存储。
    
    pdiusbdl2[3]是philips公司生产的带有并行总线和局部dma传输能力的全速usb接口芯片,符合usb1.1版规范,可以与任何外部mcu/mpu实现并行接口,传输速度可达2 mb/s。该usb芯片有1个控制端点和2个普通端点。
    
    1.2 硬件连接图
    
    硬件连接如图1所示。在该系统中,flash芯片k9f2808u0c负责嵌入式系统中的数据存储;处理器s3c44b0x执行底层固件代码;usb接口芯片pdius-bdl2负责设备与上位机的通讯。这样系统采集并存储在闪存芯片中的数据便可以通过usb接口传输到上位机。
    
    
    2 软件实现
    
    要实现实验系统与上位机的usb通讯,首先要正确设计pdiusbd12的底层固件程序。而要实现系统的海量存储设备功能,还要有flash的读写操作代码和实现海量存储设备类规范的代码。下面从这3个方面来分析。软件开发环境为arm公司的ads1.2,usb监控和测试软件为bus hound。
    
    2.1 pdiusbd12固件编程
    
    pdiusbdl2固件结构和数据流向如图2所示。结构图中的硬件提取层是固件中的最底层代码,负责对处理器与pdiusbdl2相连接的i/o口进行操作,以通知pdi-usbd12接下来处理器将对其进行命令操作或是数据操作。而命令接口层是基于硬件提取层的一套对pdius-bdl2进行操作的子程序,可以方便上层程序的编写。
    
    
    当pdiusbd12向处理器发出中断请求时,处理器读取中断寄存器,根据中断源调用相应的中断服务处理程序,中断服务处理程序设置相应的事件标志,如果有数据传输并作相应的数据处理。根据usb协议[4],控制端点0用来负责设备的枚举,如获取设备各种描述符、设置地址、获取海量存储设备的逻辑单元数目和复位设备等操作。这些操作是通过中断和主循环共同完成的。这里端点1未用到,可以忽略其中断。端点2是主端点,用作bulk-only传输。在端点2的中断处理程序中实现bulk-only传输及命令解析和执行。
    
    其中,中断服务处理程序与主循环通过一个名为controldata的结构体变量进行通讯。主循环初始化i/o口、事件标志busbflags、建立包数据缓冲区、定时器和中断,重新连接usb总线后进入一个无限循环,当该循环轮询到某事件标志被置位时便进行相应的处理。特别是在设备枚举中当建立标志被置位时,根据设备请求的类型域controldata,devicerequest,bmrequesttype来确定是标准设备请求、厂商设备请求还是类型设备请求,再根据请求类型进行相应的调用。
    
    2.2 k9f2808u0c读写操作
    
    k9f2808u0c共有1 024块,每块32页,每页528 b,其中512 b用于存放数据,另外16 b用于存放信息,如块的好坏标记、块逻辑地址和ecc校验和等。flash读写有其自身的特点,读写都以页为单位,可以随机读,但无法随机写,写操作前必须把写单元所在的块擦除。因此,对于该闪存的读操作可以采取直接读取来处理;而对于写操作,则通过设