<soh>表示为标准xmod本文来自辣文论文网em协议,每次传送128字节
或者
<stx>表示为1k xmodem协议,每次传送1024个字节 占1个字节
数据块号,第一个数据块为01h 占1个字节
数据毕业论文http://www.Lwfree.cn和和CRC校验 占1个或者2个字节
表4.1
定义:<soh> 01H, <stx> 02H, <eot> 04H , <ack> 06H ,<nak> 15H , <can> 18H
具体的数据流如下:
发送端 接受端
<--- <nak>
<soh> 01 FE -data- <xx> --->
<--- <ack>
<soh> 02 FD -data- xx ---> (未成功)
<--- <nak>
<soh> 02 FD -data- xx --->
<--- <ack>
<soh> 03 FC -data- xx --->
<--- <ack>
<eot> --->
<--- <ack>
图4.3
实现上,首先在命令数组注册命令“xmodem”,以及相应的执行函数Xmdoem,帮助函数xmodemhelp。当bootloader进入等待命令状态后一直等待接收串口数据,用户端键入“xmodem –d”,则串口接收到数据后,在表中查找到命令“xmodem”,立刻执行函数int Xmodem(int argc,char *argv[]),然后确认参数为“-d”,说明是下载功能,代码就利用xmodem协议通过串口与PC端利用超级终端通过串口进行数据传输。
为了防止冲突,最终传输的内核镜像仍然存放在物理地址的0xa0300000处,与设计中的一致。
(4) 通过USB接口进行镜像下载
通过串口进行内核镜像的下载,受到速度的限制,当开发者以后使用ramdisk(linux中的概念)时,通常要下载若干兆的数据,这时串口的速度劣势更加明显地表现出来了。本课题使用的硬件环境中,CPU PXA255芯片内置了一个USB 1.1设备端的控制模块,因此可以在bootloader中增加对USB传输的支持。
通过USB进行传输,硬件底层以及链路层都通过USB1.1协议,但是传输是双方面的,双方如何进行通信,如何进行同步,则成为关键问题。由于bootloader中增加该功能扩展,有着很强的目的性,就是为了下载内核镜像,因此在本课题中自己定义了一套简单的传输协议,包括通信流程以及具体的数据包格式。在本功能中,主机对应PC,从机对应本文的硬件系统。
本文中通信双方数据传输都使用数据包(packet)格式,具体格式如下:
数据包格式:
数据包头 Header 数据块 block
每个packet都有一个packet header,其定义如下:
typedef struct tagUSB_PACKET_HEADER
{
毕业论文http://www.Lwfree.cn;
USHORT payloadSize;
} USB_PACKET_HEADER, *PUSB_PACKET_HEADER;
其中headerSig为头标志,本课题设为“kITL”,payloadSize为后面数据块Block Data的长度,以字节为单位。
pktType为数据包类型,表明Header后面所跟的Block Data的类型。我们定义了三种类型:
Boot Request:此时pktType=0xBB,后面数据块Block Data为USB_BOOT_REQUEST类型,它是由从机向主机发送,请求开始传输数据,定义为:
typedef struct tagUSB_BOOT_REQUEST
{本文来自辣文论文网
char PlatformId[KITL_MAX_DEV_NAMELEN+1];
char DeviceName[KITL_MAX_DEV_NAMELEN+1];
short reserved;
} USB_BOOT_REQUEST, *PUSB_BOOT_REQUEST;
Boot ACK:此时pktType=0xDD,后面的数据块Block Data为USB_BOOT_ACK类型。它是主机接收到Boot Request请求后向从机发送的,表明主机已准备好向从机发送数据,定义为:
typedef struct tagUSB_BOOT_ACK
{
DWORD fJumping;
} USB_BOOT_ACK, *PUSB_BOOT_ACK;
Data:此时pktType= 0xCC,后面的数据块Block Data为传输数据块,它是由主机发送给从机的。它的前四个字节为USB_BLOCK_HEADER,后面为真正的传输数据。
Block Data:
USB_BLOCK_HEADER DATA
其中USB_BLOCK_HEADER定义如下:
typedef struct tagUSB_BLOCK_HEADER
{
DWORD uBlockNum; /*本数据块编号。第一个数据块为1*/
} USB_BLOCK_HEADER, *PUSB_BLOCK_HEADER;
具体的通信过程为:
1. 客户端(即从机)调用USBSendBootRequest()函数向主机端发送Boot请求;
2. 主机端程序USBBoot一旦收到Boot请求,立即向客户端发送Boot ACK应答,表示主机端已准备好;
3. 客户端接受到Boot ACK后,进入数据传输阶段;
4. 客户端向主机端发送数据请求包(Data request),在包中指明所要数据包号(第一个数据包号为0);
5. 主机端程序接收到数据请求包(Data request),则向客户端发送数据包;重复过程4、5,直到数据传送结束。
在bootloader中增加USB传输支持,与串口有一点不同的是:串口的独特作用被默认为bootloader的基本功能,因此串口直接进行初始化,无需任何的触发;而为了bootloader最终生成的镜像文件不至于太大,只有在bootloader进入等待命令行状态后,用户敲入“USB”
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页