MOLY-DO分为两个部分,其一为上位机,即常用的 Windows 应用程序,提供对LPC3250的各种操作;其二为下位机,即可独立运行在LPC3250上的固件程序,它包括LPC3250各种外围设备的驱动程序以及下位机主体 USB Device 子系统。
硬件工具:
○ ARM9 参考板一块(本文以LPC3250终端设备为例);
○ 一台有串口和 USB 接口的 PC 机;
○ 串口线(直连)和 USB 打印线各一根。
工作原理
使用串口线和 USB 打印线分别连接LPC3250终端设备的 UART5 插槽和 USB-B 型接口到 PC 机。运行上位机MOLY-DO弹出一个登陆框,可选择串口以及参考板类型,然后连接登录MOLY-DO上位机主界面,其中在登录的过程中通过串口下载usb_burn.bin 映像文件到LPC3250SRAM,此时LPC3250终端运行 usb_burn.bin 映像中的固件程序,完成LPC3250下位机的初始化。
在上位机主界面,可以对LPC3250终端设备上的 SRAM、SDRAM、NANDFlash、NORFlash 以及 SPIFlash 进行读写操作。如:烧写一级启动代码 restore.bin 到 NANDFlash 的第 0 块,烧写 u-boot 映像、linux 内核和文件系统映像到 NANDFlash 中。
1.下位机
开发工具:KEIL MDK 3.22a 或 GCC
难点:LPC3250中断处理、USB Device 驱动程序以及 restore 等启动程序的头文件的烧写。
在 IRAM 中运行固件程序,自定义 USB Device 类型,配合 PC 机 USB Device 驱动程序与上位机通信。在下位机中实现各种外围设备模块的功能,特别是某种存储器的读写操作。USB Device 子系统
1.LPC3250USB 设备控制器
USB 是一种 4 线总线,它支持一个主机同时与多个外设(最多可达 127 个)之间的通信。主机控制器通过基于令牌的协议给相应的设备分配 USB 带宽。USB 总线支持设备的热插拨和动态配置。所有传输都由主机控制器来启动。主机定义 1ms 帧的数据传输。每帧包含 SoF 标记和与设备端点之间传输的数据处理。每个设备最多包含有 16 个逻辑或 32 个物理端点。定义了 4 种类型的端点传输方式。控制传输主要用于在设备连接时对设备进行枚举以及其他因设备而已的特定操作。中断传输用于对延迟要求严格、小量数据的可靠传输,如键盘、游戏手柄等。批量传输用于对延迟要求宽松,大量数据的可靠传输,如U 盘等。同步传输用于对可靠性要求不高的实时数据传输,如摄像头、USB 音响等。
设备控制器使能与 USB 主机控制器之间的 12 Mb/s 的数据传输。它由寄存器接口、串行接口引擎、端点缓冲存储器和 DMA 控制器组成。串行接口引擎对 USB 数据流进行译码,并将数据写入相应的端点缓冲存储器。结束后的 USB 传输或错误条件的状态由状态寄存器来指示,产生中断(如果能中断使能)。使能时,DMA 控制器将控制端点缓冲区和 USB RAM 之间的数据传输。MOLY-DO下位机 USB
MOLY-DO采用 USB Full Speed 协议。逻辑端口 0 用于初始化 USB Device,在 USB 设备描述符中,我们采用自定义设备。选用逻辑端口 1、2 用于数据传输;其中逻辑端口 1 发送命令字,逻辑端口 2 用于数据传输。
使用 DMA 模式传输,有关 DMA 模式传输,详情请见 LPC32x0 用户手册。
通过 USB 能够对 SDRAM、SRAM、NANDFlash、NORFlash、SPIFlash 等存储器外设进行操作,下面将对 NANDFlash 操作进行简单介绍。
1.NANDFlash 操作
LPC3250有两个 NAND Flash 控制器,一个用于 multi level NAND Flash 设备而另外一个用于 single level NAND Flash 设备。
在MOLY-DO下位机中,完全实现 SLC、MLC NAND 设备驱动程序,以供 application() 程序所调用。例如使用nand_write_sector() 函数烧写 kickstart.bin 至 NANDFlash 中。
目前,下位机系统已支持三星 K9F2808、K9F5608等小页和 K9F1G08、K9F2G08等大页以及 ST NAND128-A、NAND256-A、NAND512-A、NAND01G-A等多种 NANDFlash。
同时,下位机还支持 SST 39VF6401B 等 NORFlash 以及 MX25L1605D 等 SPIFlash。
2.USB Device 驱动程序
开发工具:
○ DDK或WDK、BusHound 5.0、DriverStudio_3.0 和 VC++ 6.0
原理:
实现LPC3250USB Device自定义设备类型驱动,开辟两个逻辑端点分别用于指令和数据的传输。API 如下:Usb_Link_Data_Write、Usb_Link_Data_Read、Usb_Link_CMD_Write、Usb_Link_CMD_Read。
生成:
MOLY_DO_LIB.dll、MOLY_DO_LIB.lib、usb_link.inf、usb_link.sys上位机
开发工具:Microsoft Visual Studio 2005、BusHound 5.0
原理:通过串口使用 CComPort 类与LPC3250通信,完成固件代码搬移;配置 USB 设备驱动程序,查找LPC3250USB 设备,实现与下位机通信,完成对各种存储设备的操作。注:有关UART启动握手,详见上文或LPC3250用户手册。
难点:CComPort类、主界面控件移动处理如:CControlPos、CSplitCtrl、CPTabCtrl等类的实现。
1.LPC3250UART5 启动
LPC3250支持多种启动方式。启动程序可以识别、复制到内部 SRAM(IRAM)并从如下外部源上执行一个外部程序:
○ 使用UART5 或 USB 收发器的 UART 启动。
○ SLC/MLC NAND Fflash 启动。
○ 使用 SSP0 的 SPI 启动。
UART5 启动
UART 数据下载协议假设一个外部设备已经连接到 UART5 或 设置为 UART 模式的 USB 收发器。数据下载协议的第一个动作就是从 UART5 发送一个 boot_id,外围设备预计回应一个 ‘A’(0x41)。如果收到一个 ‘A’,UART5 再发 boot_id。外围设备预计回应一个 ‘U’(0x55)和一个 ‘3’(0x33)。如果 ‘U’ 和 ‘3’ 被接收到,之后 UART5 回应一个 ‘R’(0x52)。外围设备然后会预计发送一个起始地址(32 位值;以 4 个 UART 字节连续发送),接下来是代码数量(32 位值;以 4 个 UART 字节连续发送)的传输。在此时,代码将被传输。传递的代码按字节高低顺序存放在起始地址,且当接收到正确数量的代码后,开机程序跳转到传输代码的起始地址并退出。开机程序已经放弃控制并转移到开始执行下载的程序。
如果 ‘A’、’U’、’3’ 不是在 1 秒之内被接收到,超时,开机程序跳至正常启动程序。
主应用程序
MOLY-DO主窗口类CMOLYDODlg 同样是一个 CDialog 类。在 CMOLYDODlg 类中,实现 CScrollBar(滚动条)、CLRichEditCtrl(控制台)、CControlPos(控制控件)、CSplitCtrl 等公用子类以及各种存储器的操作窗口类:CTabNANDDlg、CTabNORDlg、CTabSPIDlg、CTabSDRAMDly、CTabSRAMDlg。
自定义类 CMainOpt 用于MOLY-DO的主操作。在此类中,通过 USB 完成与下位机的各种通信任务,如:执行操作(发命令字)、发送文件、接收文件、对比文件等等。主应用程序结构图如图3。