⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tos-build-deluge-image

📁 tinyos2.0版本驱动
💻
字号:
#!/usr/bin/env python# Copyright (c) 2007 Johns Hopkins University.# All rights reserved.## Permission to use, copy, modify, and distribute this software and its# documentation for any purpose, without fee, and without written# agreement is hereby granted, provided that the above copyright# notice, the (updated) modification history and the author appear in# all copies of this source code.## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA,# OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF# THE POSSIBILITY OF SUCH DAMAGE.# @author Razvan Musaloiu-E. <razvanm@cs.jhu.edu># @author Chieh-Jan Mike Liang <cliang4@cs.jhu.edu>import sys, struct, operatorfrom xml.dom.minidom import parseDELUGE_PKTS_PER_PAGE = 48DELUGE_PKT_PAYLOAD_SIZE = 23DELUGE_BYTES_PER_PAGE = DELUGE_PKTS_PER_PAGE * DELUGE_PKT_PAYLOAD_SIZEDELUGE_MAX_PAGES = 128DELUGE_IDENT_SIZE = 128def sencode(s, dim):  s = [ord(c) for c in s]  if len(s) > dim:    return s[:dim]  return s + [0] * (dim - len(s))# Encode to big endiandef encode(val, dim):  output = []  for i in range(dim):      output.append(val & 0xFF)      val = val >> 8  output.reverse()  return outputdef int2byte(v):    return "".join([struct.pack("B", i) for i in v])def crc16(data):  crc = 0  for b in data:      crc = crc ^ (b << 8)      for i in range(0, 8):          if crc & 0x8000 == 0x8000:              crc = (crc << 1) ^ 0x1021          else:              crc = crc << 1          crc = crc & 0xffff  return crcdef pages(data):  l = len(data) - 2*DELUGE_MAX_PAGES  if l % DELUGE_BYTES_PER_PAGE != 0:    sys.stderr.write("ERROR: Bug in padding!")    sys.exit()  return l / DELUGE_BYTES_PER_PAGEdef align(data):  mod = len(data) % DELUGE_BYTES_PER_PAGE  if mod == 0:    return data  return data + [0] * (DELUGE_BYTES_PER_PAGE - mod)def deluge_ident(data):  tmp = encode(ident['uidhash'], 4) + \        encode(ident['size'], 4) + \        [pages(data), 0]  crc = crc16(tmp)  tmp += encode(crc, 2) + \         sencode(ident['appname'], 16) + \         sencode(ident['username'], 16) + \         sencode(ident['hostname'], 16) + \         sencode(ident['platform'], 16) + \         encode(ident['timestamp'], 4) + \         encode(ident['userhash'], 4)  return tmp + [0] * (DELUGE_IDENT_SIZE - len(tmp))def deluge_crc(data):  crc = [0] * DELUGE_MAX_PAGES  j = 0  sys.stderr.write("CRCs:\n  ")  for i in range(0, len(data)-1, DELUGE_BYTES_PER_PAGE):    crc[j] = crc16(data[i:i+DELUGE_BYTES_PER_PAGE])    sys.stderr.write("0x%04X " % (crc[j]))    if (j + 1) % 7 == 0:      sys.stderr.write("\n  ")    j += 1  sys.stderr.write("\n")  return reduce(operator.add, [encode(i, 2) for i in crc]) + datafor i in range(len(sys.argv)):  if sys.argv[i] == '-i':    img_num = int(sys.argv[i+1])    dom = parse(sys.argv[-1])ident = {}ident_list = [(n.localName, n.firstChild.nodeValue)              for n in dom.getElementsByTagName('ident')[0].childNodes if n.localName != None]for (k, v) in ident_list:  ident[k] = vfor p in ['timestamp', 'userhash', 'uidhash']:  ident[p] = int(ident[p][:-1], 16)error = "ERROR: getting the image from the XML file failed."try:  image_element = dom.getElementsByTagName('image')[0]  if image_element.getAttribute('format') != 'ihex':    error = "ERROR: image format is %s instead of ihex" % image_element.getAttribute('format')    sys.exit()  image = image_element.firstChild.nodeValueexcept:  sys.stderr.write(error + '\n')  sys.exit()all = []section = []end_addr = Nonefor line in image.split():    #print "DEBUG:", line    length = int(line[1:3], 16)    addr = int(line[3:7], 16)    rectype = int(line[7:9], 16)    data = []    if len(line) > 11:        data = [int(line[i:i+2], 16) for i in range(9, len(line)-2, 2)]    crc = int(line[-2:], 16)    if rectype in [0x00, 0x03]:        if not end_addr:            end_addr = addr            start_addr = addr        if end_addr != addr:            all.append((start_addr, section))            if rectype == 0x03:                # This last record updates the first 4 bytes which                # holds some low level configuration. They are the                # same all the time so I guess that's why they are                # skipped.                break            section = []            start_addr = addr        section += data        end_addr = addr + length    elif rectype == 0x01:        all.append((start_addr, section))        section = []        start_addr = addrsys.stderr.write('Ihex read complete:\n')sys.stderr.write('  ' + '\n  '.join(["%5d bytes starting at 0x%X" % (len(l), a) for (a, l) in all]))sys.stderr.write('\n')sys.stderr.write('  %d bytes in %d sections\n' % (reduce(operator.add, [len(l) for (_, l) in all]), len(all)))# Usually, there are two sections: one for the code and one for the# interrupt vector.all_data = []for (addr, data) in all:  all_data += encode(addr, 4) + \              encode(len(data), 4) + \              dataall_data += encode(0, 4) + encode(0, 4) # Add the marker for the end of an imagepadding = [0] * (DELUGE_BYTES_PER_PAGE - len(all_data) % DELUGE_BYTES_PER_PAGE)if len(padding) < DELUGE_BYTES_PER_PAGE:  all_data += paddingall_data = deluge_crc(all_data)ident['size'] = DELUGE_IDENT_SIZE + len(all_data)sys.stdout.write(int2byte(deluge_ident(all_data)) + int2byte(all_data))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -