使用天嵌的开发板,由于以前是在window + vmware + fedora10的方式做嵌入式开发。而在windows上有了dnw这样一个工具。最近转到linux上,平台是fedora14。现在下载文件就只能通过Uboot的tftp方式下载,然后用命令烧写,这样比较麻烦。其实我们还是可以使用以前的工具。这里有一个大神自己写的一个工具:dnw2,这样我们就可以和以前一样了。
首先这个工具是基于libusb开发的,所以开始之前,我们需要安装上这个库。
如果你使用的ubuntu,执行:sudo apt-get install libusb-dev
如果你使用的fedora,执行:yum install libusb-devel 先要切换到root用户下。
下面是dnw2的源码:
#include
<stdio.h>
#include
<usb.h>
#include
<errno.h>
#include
<sys/stat.h>
#include
<fcntl.h>
#include
<unistd.h>
#define QQ2440_SECBULK_IDVENDOR 0x5345
#define QQ2440_SECBULK_IDPRODUCT 0x1234
struct usb_dev_handle
* open_port()
{
struct usb_bus
*busses,
*bus;
usb_init();
usb_find_busses();
usb_find_devices();
busses = usb_get_busses();
for(bus=busses;bus;bus=bus->next)
{
struct usb_device
*dev;
for(dev=bus->devices;dev;dev=dev->next)
{
if( QQ2440_SECBULK_IDVENDOR==dev->descriptor.idVendor
&& QQ2440_SECBULK_IDPRODUCT==dev->descriptor.idProduct)
{
printf("Target usb device found!\n");
struct usb_dev_handle
*hdev = usb_open(dev);
if(!hdev)
{
perror("Cannot open device");
}
else
{
if(0!=usb_claim_interface(hdev,
0))
{
perror("Cannot claim interface");
usb_close(hdev);
hdev
= NULL;
}
}
return hdev;
}
}
}
printf("Target usb device not found!\n");
return
NULL;
}
void usage()
{
printf("Usage: dnw2 <file>\n\n");
}
unsigned
char* prepare_write_buf(char
*filename,
unsigned
int *len)
{
unsigned
char *write_buf
= NULL;
struct stat fs;
int fd
= open(filename, O_RDONLY);
if(-1==fd)
{
perror("Cannot open file");
return
NULL;
}
if(-1==fstat(fd,
&fs))
{
perror("Cannot get file size");
goto
error;
}
write_buf =
(unsigned
char*)malloc(fs.st_size+10);
if(NULL==write_buf)
{
perror("malloc failed");
goto
error;
}
if(fs.st_size
!=
read(fd, write_buf+8, fs.st_size))
{
perror("Reading file failed");
goto
error;
}
printf("Filename : %s\n", filename);
printf("Filesize : %d bytes\n", fs.st_size);
*((u_int32_t*)write_buf)
= 0x30000000;
//download address
*((u_int32_t*)write_buf+1)
= fs.st_size
+ 10;
//download size;
*len
= fs.st_size
+ 10;
return write_buf;
error:
if(fd!=-1)
close(fd);
if(NULL!=write_buf)
free(write_buf);
fs.st_size
= 0;
return
NULL;
}
int main(int argc,
char *argv[])
{
if(2!=argc)
{
usage();
return 1;
}
struct usb_dev_handle
*hdev = open_port();
if(!hdev)
{
return 1;
}
unsigned
int len = 0;
unsigned
char* write_buf
= prepare_write_buf(argv[1],
&len);
if(NULL==write_buf)
return 1;
unsigned
int remain = len;
unsigned
int towrite;
printf("Writing data ...\n");
while(remain)
{
towrite
= remain>512
? 512 : remain;
if(towrite
!= usb_bulk_write(hdev, 0x03, write_buf+(len-remain),
towrite, 3000))
{
perror("usb_bulk_write failed");
break;
}
remain-=towrite;
printf("\r%d%\t %d bytes ",
(len-remain)*100/len,
len-remain);
fflush(stdout);
}
if(0==remain)
printf("Done!\n");
return 0;
}
然后我们需要编译它:
gcc -o dnw dnw2.c -lusb
mv dnw /usr/bin
使用它时:
dnw yourfile