dnw2的使用

来源:互联网 发布:五线谱翻译成简谱软件 编辑:程序博客网 时间:2024/06/05 08:29
1.第一步,先安装软件包libusb-dev,在终端输入:sudo apt-get install libusb-dev


2.将代码复制到本地文本,然后编译:gcc dnw2.c -o dnw2 -lusb


#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){

printf("idVendor:0x%x\t,ipProduct:0x%x\n",

dev->descriptor.idVendor, dev->descriptor.idProduct);

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");
}


unsignedchar* prepare_write_buf(char*filename,unsignedint*len){
unsignedchar*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=(unsignedchar*) 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();
return1;
}
struct usb_dev_handle *hdev= open_port();
if(!hdev){
return1;
}
unsignedint len =0;
unsignedchar* write_buf = prepare_write_buf(argv[1],&len);
if(NULL== write_buf)
return1;
unsignedint remain = len;
unsignedint 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");
return0;
}

3.将编译后的可执行文件放入根目录下的/bin中。

sudo mv dnw2 /bin


0 0