android移动设备

一、 数据传输格式

USB Tx format:

addr(4)+size(4)+data(n)+cs(2)

addr:下载到开发板RAM的目标地址, 4字节

size:传输文件的大小, 4字节

data:文件数据流, n字节

cs: checksum校验和, 2字节

二、 MenuUsbTransmit发送文件流程

1. 打开usb输出管道文件open_file( outPipe),如果失败,报错;

2. 选择并打开所要传输的文件;

3. 获取文件大小;fileSize=GetFileSize(hFile,NULL);

4. 分配一个(fileSize+10)大小的缓冲区;4+4+2=10

5. 将文件读入缓冲区txBuf+8(即保留前8个字节)开始处;

6. 将所设置的下载地址赋给txBuf[0:3]4个字节;downloadAddress;

7. 将fileSize+10赋给txBuf[4:7]4个字节

8. 将校验和赋给缓冲区的最后2字节(txBuf+8+fileSize))=cs;

9. 启动usb传输UsbTxFile()

DNW编译记录:

DNW的源码下载之后,直接编译和运行——当然这是你迫切想去做的了。不过此时可能遇麻烦,是一系列“头文件无法识别”的错误。此时你要做的:

1.将WINDDK下的WXP目录下的头文件添加到vc下的include文件中。此时你只需要将E:\WINDDK\2600\inc\wxp中的 wxp文件,"ctrl+c"&&"ctrl+v"到C:\Program Files\Microsoft Visual Studio\VC98\Include中。当然,前提是你已经安装了WINDDK和VC到相应的目录之下。这样你的编译器便不会对这些重要的“.h”视而不见了。

2.将WINDDK目录E:\WINDDK\2600\lib\wxp\i386下的usbd.lib,setupapi.lib添加到vc下的lib文件中

3.如果碰到:fatal error LNK1112: module machine type "IA64" conflicts with target machine type "IX86" (模块计算机类型“IA64”与目标计算机类型“IX86”冲突),首先,进入VC下的LINK,如图

并且要将Project Options下的内容手动修改成图中的内容——我特别指的是machine:IX86和最后一行的\lib\i386\… 然后将E:\WINDDK\2600\lib\wxp\i386下的库文件mfc42u.lib到C:\Program Files\Microsoft Visual Studio\VC98\Lib之中。注意,不是E:\WINDDK\2600\lib\wxp\ia64目录下的那个mfc42u.lib

Linux下编译记录:

编译PC端USB驱动和写入工具dnw_linux.tgz压缩包文件结构如下dnw_linux/dnw_linux/secbulk/dnw_linux/secbulk/Makefilednw_linux/secbulk/secbulk.cdnw_linux/dnw/dnw_linux/dnw/dnw.c其中secbulk.c是PC端USB驱动, dnw.c是写入工具编译驱动之前先修改secbulk.c找到#define BULKOUT_BUFFER_SIZE修改为#define BULKOUT_BUFFER_SIZE 512找到static struct usb_device_id secbulk_table[]= {{ USB_DEVICE(0x04e8, 0x1234)},{ }};修改为上面的样子接下来编译$cd secbulk$make -C /lib/modules/`uname -r`/build M=`pwd` modules加载编译好的驱动$sudo insmod ./secbulk.ko注意,每次下载前都需要加载驱动,或者可以设置为开机自动加载Ubuntu中,假设驱动文件在/opt/dnw_linux/secbulk/则修改/etc/rc.d/rc.local文件,末尾加入sudo insmod /opt/dnw_linux/secbulk/secbulk.ko即完成开机自动加载驱动模块接下来编译dnw写入工具先打开dnw.c修改找到printf("Writing data…\n");size_t remain_size = file_stat.st_size+10;size_t block_size = remain_size / 100;size_t writed = 0; 在它前面加上2行代码,如下:file_buffer [file_stat.st_size + 8] = sum & 0xff;file_buffer [file_stat.st_size + 9] = sum >> 8;printf("Writing data…\n");size_t remain_size = file_stat.st_size+10;size_t block_size = remain_size / 100;size_t writed = 0; 编译dnw$gcc -o dnw dnw.c编译成功后生成可执行dnw使用DNW下载启动开发板,进入minicom,并将开发板和PC用USB电缆连接,此时用dmesg命令可以看到secbulk驱动加载:[ 283.677772] usb 1-1: new full speed USB device using uhci_hcd and address 2[ 284.084835] usb 1-1: configuration #1 chosen from 1 choice[ 284.140430] secbulk:secbulk probing…[ 284.140482] secbulk:bulk out endpoint found!说明驱动可以使用重起开发板,别进linux系统,按任意键进入uboot界面,输入dnw 50008000当出现“USB host is connected. Waiting a download.”时,在PC端Linux上用dnw工具写入要下载的文件,,例如我要写入/tmp/zImage$./dnw /tmp/zImage写入完成后提示成功100% 312349 bytes OK至此,dnw在linux下使用一切正常

用积极的拼搏迎接雨后的彩虹,相信自己

android移动设备

相关文章:

你感兴趣的文章:

标签云: