ubuntu12.04 dnw2 fl2440 配置
1、安装libusb-dev
sudo apt-get install libusb-dev
2、dnw2编译配置
源码如下,将其保存为dnw2.c
编译命令 gcc dnw2.c -o dnw2 -lusb。
不同的硬件平台,修改以下三项:
1 | QQ2440_SECBULK_IDVENDOR,QQ2440_SECBULK_IDPRODUCT,*((u_int32_t*)write_buf) = 0x30800000; //download address |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /* dnw2 linux main file. This depends on libusb. * * Author: Fox <hulifox008@163.com> * License: GPL * */ #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" ); } 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) = 0x30800000; //download address //*((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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!