Python版DNW

  • A+
所属分类:Linux编程
摘要

准备全线迁到Linux下做实验,虚拟机里编译太慢了。DNW是个问题。其实DNW到底是个什么东西我并不清楚,厂家提供的bootloader就是用

准备全线迁到Linux下做实验,虚拟机里编译太慢了。DNW是个问题。其实DNW到底是个什么东西我并不清楚,厂家提供的bootloader就是用DNW通过USB线接受PC传来数据。记得两年前就见过网友Linux版的DNW。那时没开始接触内核,觉得写这个东西的人真NB。现在把那个代码找出来看看,原来蛮简单的。一个内核态的驱动,一个用户态的程序。通过看用户态的程序,知道了DNW传输的格式,即4字节的下载地址+4字节的传输总长度+传输内容+2字节的checksum。checksum就是把前面三个部分以unsigned char的形式全部加起来。

后来找到了无需内核态驱动的DNW,借助libusb纯在用户态做。这个蛮不错,昨晚准备编一个试一下,结果装了libusb一还干了别的事,到头到也没试。今天又找到了一个xdnw,它用QT给DNW做了个UI,还是利用libusb纯在用户态下实现。为了试一下它还特意去装了QT4,看了下界面,很简陋。没有具体使用,不过应该问题不大。

  1. #!/usr/bin/python   
  2. import usb.core  
  3. import StringIO  
  4. import struct  
  5. import sys  
  6.   
  7. if len(sys.argv) == 2 :  
  8.         addr = 0x32000000  
  9. elif len(sys.argv) == 3:  
  10.         addr = int(sys.argv[2], 16)  
  11. else:  
  12.         print 'Usage: dnw filename [address]'  
  13.         quit()  
  14.   
  15. def checksum(data):  
  16.         s = 0  
  17.         for i in data:  
  18.                 s += struct.unpack('B', i)[0];  
  19.         return s&0xffff  
  20.   
  21. content = open(sys.argv[1]).read()  
  22. address = struct.pack('L', addr)  
  23. length = struct.pack('L', len(content) + 10)  
  24. check = struct.pack('H', checksum(address + length + content))  
  25.   
  26. inp = StringIO.StringIO(address + length + content + check)  
  27.   
  28. dev = usb.core.find(idVendor=0x5345, idProduct=0x1234)  
  29. dev.set_configuration()  
  30. ep = dev[0][(0,0)][1]  
  31.   
  32. data = inp.read(512)  
  33. while data:  
  34.         ep.write(data)  
  35.         data = inp.read(512)  

除非注明,否则均为@蒲公英网原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.aipgy.com/58306.html

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: