2012-08-10 10:27

278人阅读

评论(0)

网上下载的开源dnw程序 ,在pc linux下用gcc编译即可。

$gcc dnw2.c -o dnw -lusb

注意事项:

中: 编译如果提示没有usb.h文件,说明你的pc linux系统没有安装usb开发包,apt-get install libusb-dev

英:if not exist usb.h, please install libusb-dev, i.e  apt-get install libusb-dev

dnw2.c的源码如下,这里需要说明:

1.  如果你的开发板连接pc后提示找不到设备,很可能是因为

QQ2440_SECBULK_IDVENDOR

QQ2440_SECBULK_IDPRODUCT

这两个宏定义跟固件内的定久不一致。 一可以修改开发板的usb download相关定义。二可以修改dnw2.c中的定义。

2.  在虚拟机下执行,发现USB写速度太慢。 我的优化办法是加大写缓存,也就是把宏BLOCK_SIZE的值调大。

速度提升非常明显

/*Linux main file. This depends on libusb.

*

* Author: Fox

* License: GPL

*

*/

#include

#include

#include

#include

#include

#include

#include

#define QQ2440_SECBULK_IDVENDOR 0x5345

#define QQ2440_SECBULK_IDPRODUCT 0x1234

#define DOWNLOAD_ADDR_DEFAULT 0x32000000

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("Usage1: dnw , Default Download Addr =0x%x\n", DOWNLOAD_ADDR_DEFAULT);

printf("Usage2: dnw \n\n");

}

int myatoi( char *str )

{

int data = 0;

int off = 0;

int len = 0;

int isnegative = 0;

int multi = 10;

int i = 0;

if( str == NULL || (len=strlen(str))==0)

{

return data;

}

if( len == 0 )

{

return 0;

}

if( str[off] == '-' )

{

isnegative = 1;

off++;

len--;

}

if( len == 0 )

{

return 0;

}

//16进制

if( len > 2 && str[off] == '0' && (str[off+1] == 'x' || str[off+1] == 'X') )

{

multi = 16;

off += 2;

}

//2进制

else  if( len > 2 && str[off] == '0' && (str[off+1] == 'b' || str[off+1] == 'B') )

{

multi = 2;

off += 2;

}

//8进制

else if( str[off] == '0' )

{

multi = 8;

off += 1;

}

//10进制

else

{

multi = 10;

}

if( multi == 16 )

{

for( i = 0; ; i++ )

{

if( str[i+off] >= '0' && str[i+off] <= '9' )

{

data = (data<<4) + (str[i+off]-'0');

}

else if( str[i+off] >= 'a' && str[i+off] <= 'z' )

{

data = (data<<4) + (str[i+off]-'a');

}

else if( str[i+off] >= 'A' && str[i+off] <= 'Z' )

{

data = (data<<4) + (str[i+off]-'A');

}

else

{

break;

}

}

}

else if( multi == 10 )

{

for( i = 0; ; i++ )

{

if( str[i+off] >= '0' && str[i+off] <= '9' )

{

data = (data*10) + (str[i+off]-'0');

}

else

{

break;

}

}

}

else if( multi == 8 )

{

for( i = 0; ; i++ )

{

if( str[i+off] >= '0' && str[i+off] <= '7' )

{

data = (data<<3) + (str[i+off]-'0');

}

else

{

break;

}

}

}

else if (multi == 2 )

{

for( i = 0; ; i++ )

{

if( str[i+off] == '0' || str[i+off] == '1' )

{

data = (data<<1) + (str[i+off]-'0');

}

else

{

break;

}

}

}

else

{

return 0;

}

if( isnegative )

{

data *= -1;

}

return data;

}

unsigned char* prepare_write_buf(unsigned int addr, char *filename, unsigned int *len)

{

unsigned char *write_buf = NULL;

struct stat fs;

unsigned int i;

unsigned short checksum = 0;

unsigned char *pChar = NULL;

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", (int)fs.st_size);

*((u_int32_t*)write_buf) = addr; //download address

*((u_int32_t*)write_buf+1) = fs.st_size + 10; //download size;

printf("StartAddr:0x%x\n",*((u_int32_t*)write_buf));

printf("Size:0x%x\n",*((u_int32_t*)write_buf+1));

pChar = write_buf+8;

for( i = 0; i < fs.st_size; i++ )

{

checksum += *pChar++;

}

printf("CheckSum:0x%x\n",checksum);

pChar = write_buf + 8 + fs.st_size;

pChar[0]= (unsigned char)(checksum&0xff);

pChar[1]= (unsigned char)((checksum>>8)&0xff);

*len = fs.st_size + 10;

close(fd);

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[])

{

unsigned int downloadaddr = DOWNLOAD_ADDR_DEFAULT;

char *filename = NULL;

if( 2 == argc )

{

filename = argv[1];

}

else if( 3 == argc )

{

downloadaddr = myatoi(argv[1]);

filename = argv[2];

}

else

{

usage();

return -1;

}

if( downloadaddr == 0 || filename == NULL )

{

printf("Bad Param!!!\n");

//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(downloadaddr, filename, &len);

if (NULL==write_buf )

{

return 1;

}

unsigned int remain = len;

unsigned int towrite;

printf("Writing data ...\n");

while(remain)

{

#define BLOCK_SIZE 81920

towrite = remain > BLOCK_SIZE ? BLOCK_SIZE : remain;

if(towrite != usb_bulk_write(hdev, 0x02, write_buf+(len-remain), towrite, 30000))

{

perror("usb_bulk_write failed");

break;

}

remain -= towrite;

printf("\r%d%%\t %dK Bytes ", ((len-remain)*10)/(len/10), (len-remain)>>12);

fflush(stdout);

}

if( 0== remain )

{

printf("Done!\n");

}

if( NULL != write_buf )

{

free(write_buf);

}

return 0;

}

linux dnw工具,dnw for linux(pc)相关推荐

  1. 远程管理linux系统工具,远程管理Linux系统工具的设计与实现Linux013

    一种远程管理Linux系统工具的设计与实现 摘  要 现在,Linux已经是应用比较广泛的操作系统之一,在其系统中有很多的服务.为了实现远程配置和管理Linux中的各种服务,需要有一种远程管理Linu ...

  2. linux 串口工具_Zynq下linux系统搭建

    引言 Zynq器件将arm和FPGA结合,利用了两者各自的优势,arm可以实现灵活的控制,而FPGA部分可以实现算法加速,这大大扩展了zynq的应用.比如深度学习加速,图像处理等等.PL侧表示FPGA ...

  3. linux 网络安全工具,常用的Linux网络安全工具简介

    常用的Linux网络安全工具简介 互联网   发布时间:2008-10-08 22:12:04   作者:佚名   我要评论 常用的Linux网络安全工具简介 尽管各种版本的Linux distrib ...

  4. linux 渗透工具_适用于Linux的十大最佳渗透测试工具

    linux 渗透工具 This article covers some of the best penetration testing tools for Linux Cybersecurity is ...

  5. window linux传输工具,window与linux文件传输工具,linux文件传输

    window与linux文件传输工具,linux文件传输 window与linux文件传输工具 [一般用于SecureCRT ssh中使用] 法一:直接用yum安装lrzsz(推荐) yum inst ...

  6. linux rz工具怎么用,Linux和Windows间文件传输工具rz/sz(lrz/lsz) 介绍

    Linux下和Windows之间的文件传输工具rz/sz(lrz/lsz) 介绍 [什么是rz/sz (lsz/lrz)] 简单说就是,可以很方便地用这两个sz/rz工具,实现Linux下和Windo ...

  7. linux css 工具,7个Linux和Ubuntu下的免费CSS编辑器

    一个好的编辑器是世界上所有 1)jEdit jEdit是一款成熟的文本编辑器,其背后凝聚了许许多多人多年的开发汗水.下载,安装,然后设置,就可以快速轻松地进入jEdit启动页面. 官方网站:http: ...

  8. linux远程工具_【linux实操3.1】linux远程连接工具Secure的使用

    把自己的闲置笔记本用来做centos7服务器了,同时也出一期教程,记录自己同时也帮助需要的人:安排如下 1.[linux实操1]华硕笔记本安装centos7实战 2.[linux实操2]使用yum在命 ...

  9. linux sed工具,玩转Linux - 神级工具 sed awk

    简介 本文主要介绍 Linux 系统的两个神级工具:sed 和 awk ,他们是Linux高手们必备的技能,很值得我们去研究的东西. 这里是我在网上书上收集的相关资料,因为这两个工具很有名也很重要,所 ...

  10. linux irc工具,构建基于Linux下的IRC服务器和WEBIRC登陆平台

    一.简 介 IRC是英文"Internet Relay Chat"的缩写,它是一种即时交谈工具,是目前全球最流行的在线聊天方式之一.它的特点是速度快,方便的自建和使用个人聊天室,同 ...

最新文章

  1. hibernate教程--常用配置和核心API
  2. ABAP 程序运行锁
  3. 文本分类入门(三)统计学习方法
  4. crt中 新建的连接存储在哪_LCD发展至今仍然没有完胜CRT显示器,“老玩家”为你现身说法...
  5. mysql git下载安装_xshell、python、git、mysql安装(玩阿里云的第二天)
  6. java 迭代器复制_遍历聚合对象中的元素——迭代器模式(五):JDK内置迭代器的使用...
  7. 从 0 开始了解 Docker(ubuntu )
  8. 原版windows下载地址
  9. 电影票预售系统1.0
  10. 一位销售的几年职业总结
  11. WidsMob Denoise如何使用?WidsMob Denoise图片降噪教程
  12. Android图片处理(Matrix,ColorMatrix,深入讲解Android
  13. 网站强制跳转到国家反诈中心如何解封
  14. 腾讯云-即时通讯 IM
  15. QQ、微信消息定时发送/自动发送【支持发送文件】
  16. PHP预约模块开发,PHP实验室预约管理系统(源代码+论文)
  17. 面经分享|中科院老哥的算法开发岗面经总结
  18. Http status code 状态码
  19. APP - APP监控软件,美团 24 小时不间断定位上热搜
  20. 计算机翻译 调剂,19考研的看过来,部分接收调剂院校出炉,不少985噢!

热门文章

  1. Python制作短信发送程序
  2. dns解析失败的处理办法
  3. 裸眼3d项目,数字平原是这样制作的
  4. 远程过程调用失败 异常来自 HRESULT:0x800706BE
  5. java 订单号生成器
  6. 汤姆猫代码python_IOS 汤姆猫核心代码
  7. 周鸿祎带头,十家安全公司接受了这些尖锐拷问
  8. 机器学习入门实战加州房价预测
  9. SQL server SSMS图形界面实现(创建表、约束、关系图)
  10. 小喇叭上面有红叉,显示未插入扬声器或耳机,电脑没声音