--- /dev/null
+#!/usr/bin/env python
+# GoodFET ARM Debugging Interface v5 (ADIv5) Client Library.
+# the ideal interface to pwning ARM Cortex
+#
+# Contributions and bug reports welcome.
+#
+#
+
+import sys, binascii, struct, time
+import atlasutils.smartprint as asp
+from GoodFET import GoodFET
+from intelhex import IntelHex
+
+
+#Global Commands
+READ = 0x00
+WRITE = 0x01
+PEEK = 0x02
+POKE = 0x03
+SETUP = 0x10
+START = 0x20
+STOP = 0x21
+CALL = 0x30
+EXEC = 0x31
+NOK = 0x7E
+OK = 0x7F
+
+# ARM7TDMI JTAG commands
+IR_SHIFT = 0x80
+DR_SHIFT = 0x81
+RESETTAP = 0x82
+RESETTARGET = 0x83
+GET_REGISTER = 0x87
+SET_REGISTER = 0x88
+DEBUG_INSTR = 0x89
+# Really ARM specific stuff
+WAIT_DBG = 0x91
+CHAIN0 = 0x93
+SCANCHAIN1 = 0x94
+EICE_READ = 0x95
+EICE_WRITE = 0x96
+
+#4-bit ARM JTAG INSTRUCTIONS - STANDARD
+IR_ABORT = 0x8
+IR_RESERVED1 = 0x9
+IR_DPACC = 0xA
+IR_APACC = 0xB
+IR_RESERVED2 = 0xC
+IR_RESERVED3 = 0xD
+IR_IDCODE = 0xE
+IR_BYPASS = 0xF
+#4-bit ARM JTAG INSTRUCTIONS - IMPLEMENTATION-DEFINED
+IR_EXTEST = 0x0
+IR_SAMPLE = 0x1
+IR_PRELOAD = 0x2
+IR_RESERVED = 0x3
+IR_INTEST = 0x4
+IR_CLAMP = 0x5
+IR_HIGHZ = 0x6
+IR_CLAMPZ = 0x7
+
+DP_CTRLSTAT_OFF = 0x4
+DP_SELECT_OFF = 0x8
+DP_RDBUFF_OFF = 0xC
+
+PM_usr = 0b10000
+PM_fiq = 0b10001
+PM_irq = 0b10010
+PM_svc = 0b10011
+PM_abt = 0b10111
+PM_und = 0b11011
+PM_sys = 0b11111
+proc_modes = {
+ 0: ("UNKNOWN, MESSED UP PROCESSOR MODE","fsck", "This should Never happen. MCU is in funky state!"),
+ PM_usr: ("User Processor Mode", "usr", "Normal program execution mode"),
+ PM_fiq: ("FIQ Processor Mode", "fiq", "Supports a high-speed data transfer or channel process"),
+ PM_irq: ("IRQ Processor Mode", "irq", "Used for general-purpose interrupt handling"),
+ PM_svc: ("Supervisor Processor Mode", "svc", "A protected mode for the operating system"),
+ PM_abt: ("Abort Processor Mode", "abt", "Implements virtual memory and/or memory protection"),
+ PM_und: ("Undefined Processor Mode", "und", "Supports software emulation of hardware coprocessor"),
+ PM_sys: ("System Processor Mode", "sys", "Runs privileged operating system tasks (ARMv4 and above)"),
+}
+
+PSR_bits = [
+ None, None, None, None, None, "Thumb", "nFIQ_int", "nIRQ_int",
+ "nImprDataAbort_int", "BIGendian", None, None, None, None, None, None,
+ "GE_0", "GE_1", "GE_2", "GE_3", None, None, None, None,
+ "Jazelle", None, None, "Q (DSP-overflow)", "oVerflow", "Carry", "Zero", "Neg",
+ ]
+
+ARM_INSTR_NOP = 0xe1a00000L
+ARM_INSTR_BX_R0 = 0xe12fff10L
+ARM_INSTR_STR_Rx_r14 = 0xe58f0000L # from atmel docs
+ARM_READ_REG = ARM_INSTR_STR_Rx_r14
+ARM_INSTR_LDR_Rx_r14 = 0xe59f0000L # from atmel docs
+ARM_WRITE_REG = ARM_INSTR_LDR_Rx_r14
+ARM_INSTR_LDR_R1_r0_4 = 0xe4901004L
+ARM_READ_MEM = ARM_INSTR_LDR_R1_r0_4
+ARM_INSTR_STR_R1_r0_4 = 0xe4801004L
+ARM_WRITE_MEM = ARM_INSTR_STR_R1_r0_4
+ARM_INSTR_MRS_R0_CPSR = 0xe10f0000L
+ARM_INSTR_MSR_cpsr_cxsf_R0 =0xe12ff000L
+ARM_INSTR_STMIA_R14_r0_rx = 0xE88e0000L # add up to 65k to indicate which registers...
+ARM_INSTR_LDMIA_R14_r0_rx = 0xE89e0000L # add up to 65k to indicate which registers...
+ARM_STORE_MULTIPLE = ARM_INSTR_STMIA_R14_r0_rx
+ARM_INSTR_SKANKREGS = 0xE88F7fffL
+ARM_INSTR_CLOBBEREGS = 0xE89F7fffL
+
+ARM_INSTR_B_IMM = 0xea000000L
+ARM_INSTR_B_PC = 0xea000000L
+ARM_INSTR_BX_PC = 0xe1200010L # need to set r0 to the desired address
+THUMB_INSTR_LDR_R0_r0 = 0x68006800L
+THUMB_WRITE_REG = THUMB_INSTR_LDR_R0_r0
+THUMB_INSTR_STR_R0_r0 = 0x60006000L
+THUMB_READ_REG = THUMB_INSTR_STR_R0_r0
+THUMB_INSTR_MOV_R0_PC = 0x46b846b8L
+THUMB_INSTR_MOV_PC_R0 = 0x46474647L
+THUMB_INSTR_BX_PC = 0x47784778L
+THUMB_INSTR_NOP = 0x1c001c00L
+THUMB_INSTR_B_IMM = 0xe000e000L
+ARM_REG_PC = 15
+
+
+LDM_BITMASKS = [(1<<x)-1 for x in xrange(16)]
+
+CSYSPWRUPACK = 1<<31
+CSYSPWRUPACK_BIT = 31
+CSYSPWRUPREQ = 1<<30
+CSYSPWRUPREQ_BIT = 30
+CDBGPWRUPACK = 1<<29
+CDBGPWRUPACK_BIT = 29
+CDBGPWRUPREQ = 1<<28
+CDBGPWRUPREQ_BIT = 28
+CSYSRSTACK = 1<<27
+CSYSRSTACK_BIT = 27
+CSYSRSTREQ = 1<<26
+CSYSRSTREQ_BIT = 26
+TRNCNT = 0x3ff<<12
+TRNCNT_BIT = 12
+MASKLANE = 0xf<<8
+MASKLANE_BIT = 8
+WDATAERR = 1<<7
+WDATAERR = 1<<7
+READOK = 1<<6
+READOK = 1<<6
+STICKYERR = 1<<5
+STICKYERR = 1<<5
+STICKYCMP = 1<<4
+STICKYCMP = 1<<4
+TRNMODE = 3<<2
+TRNMODE = 3<<2
+STICKYORUN = 1<<1
+STICKYORUN = 1<<1
+ORUNDETECT = 1<<0
+ORUNDETECT = 1<<0
+
+
+
+def debugstr(strng):
+ print >>sys.stderr,(strng)
+def PSRdecode(psrval):
+ output = [ "(%s mode)"%proc_modes[psrval&0x1f][1] ]
+ for x in xrange(5,32):
+ if psrval & (1<<x):
+ output.append(PSR_bits[x])
+ return " ".join(output)
+
+fmt = ["B", "B", "<H", "<L", "<L", "<Q", "<Q", "<Q", "<Q"]
+def chop(val,byts):
+ s = struct.pack(fmt[byts], val)
+ return [ord(b) for b in s ][:byts]
+
+class GoodFETADIv5(GoodFET):
+ """A GoodFET variant for use with ARM7TDMI microprocessor."""
+ def __init__(self):
+ GoodFET.__init__(self)
+ self.storedPC = 0xffffffff
+ self.current_dbgstate = 0xffffffff
+ self.flags = 0xffffffff
+ self.nothing = 0xffffffff
+ self.ir_status = None
+ self.ap_selected = None
+ self.ap_bank = 0
+ self.aps = []
+
+ def __del__(self):
+ pass
+
+ def setup(self):
+ """Move the FET into the JTAG ARM application."""
+ #print "Initializing ARM."
+ self.writecmd(0x14,SETUP,0,self.data)
+
+ def getpc(self):
+ return self.ADIgetPC()
+
+ def flash(self,file):
+ """Flash an intel hex file to code memory."""
+ print "Flash not implemented.";
+
+ def dump(self,file,start=0,stop=0xffff):
+ """Dump an intel hex file from code memory."""
+ print "Dump not implemented.";
+
+ def ADIident(self):
+ """Get an ARM's ID."""
+ raise Exception("Not Implemented. Abstract base class method called.")
+ def ADIidentstr(self):
+ ident=self.ADIident()
+ ver = (ident >> 28)
+ partno = (ident >> 12) & 0xffff
+ mfgid = (ident >> 1) & 0x7ff
+ return "Chip IDCODE: 0x%x\n\tver: %x\n\tpartno: %x\n\tmfgid: %x\n" % (ident, ver, partno, mfgid);
+
+ def ADIget_register(self, reg):
+ """Get an ARM's Register"""
+ self.writecmd(0x14,GET_REGISTER,1,[reg&0xf])
+ retval = struct.unpack("<L", "".join(self.data[0:4]))[0]
+ return retval
+ def ADIset_register(self, reg, val):
+ """Get an ARM's Register"""
+ self.writecmd(0x14,SET_REGISTER,8,[val&0xff, (val>>8)&0xff, (val>>16)&0xff, val>>24, reg,0,0,0])
+ retval = struct.unpack("<L", "".join(self.data[0:4]))[0]
+ return retval
+ def ADIget_registers(self):
+ """Get ARM Registers"""
+ regs = [ self.ADIget_register(x) for x in range(15) ]
+ regs.append(self.ADIgetPC()) # make sure we snag the "static" version of PC
+ return regs
+ def ADIset_registers(self, regs, mask):
+ """Set ARM Registers"""
+ for x in xrange(15):
+ if (1<<x) & mask:
+ self.ADIset_register(x,regs.pop(0))
+ if (1<<15) & mask: # make sure we set the "static" version of PC or changes will be lost
+ self.ADIsetPC(regs.pop(0))
+
+ def ADIrestart(self):
+ raise Exception("Not Implemented. Abstract base class method called.")
+
+ ####### Common DP features #######
+ def ADIgetAPACC(self, addr, flags): # candidate for firmware. not sure the intelligence wants to be there, but performance may want it.
+ raise Exception("Not Implemented. Abstract base class method called.")
+ def ADIsetAPACC(self, addr, val):
+ raise Exception("Not Implemented. Abstract base class method called.")
+ def ADIgetDPACC(self, addr, flags): # candidate for firmware. not sure the intelligence wants to be there, but performance may want it.
+ raise Exception("Not Implemented. Abstract base class method called.")
+ def ADIsetDPACC(self, addr, val):
+ raise Exception("Not Implemented. Abstract base class method called.")
+ def ADIsetABORT(self):
+ """ ONLY use if the debugger has received WAIT responses over an extended period"""
+ raise Exception("Not Implemented. Abstract base class method called.")
+
+ def ADIsetSELECT(self, num):
+ return self.ADIsetDPACC(0x8, num)
+ def ADIgetSELECT(self):
+ return self.ADIgetDPACC(0x8)
+ def ADIgetSELECTrepr(self):
+ raw = self.ADIgetSELECT()
+ swdp_ctrlsel = raw&1
+ apbanksel = (raw>>4) & 0xf
+ apsel = raw>>24
+ return "SWDP_CTRLSEL = %d\nAPBANKSEL = %d\nAPSEL = %d\n"
+
+ def ADIgetWCR(self): # SWDP only
+ raise Exception("IMPLEMENT ME: ADIgetWCR")
+
+ def ADIgetRESEND(self): # SWDP only
+ raise Exception("IMPLEMENT ME: ADIgetRESEND")
+
+class GoodFETADIjtag(GoodFETADIv5):
+ """A GoodFET variant for use with ARM7TDMI microprocessor."""
+ def ADIshift_IR(self, IR, noretidle=0):
+ if (self.ir_status != IR):
+ self.writecmd(0x14,IR_SHIFT,2, [IR, LSB|noretidle])
+ self.ir_status = IR
+ return self.data
+ def ADIshift_DR(self, bignum, bits, flags=0):
+ data = [bits&0xff, flags&0xff,0,0]
+ data.extend(chop(data, bits/4))
+ self.writecmd(0x14,DR_SHIFT, len(data), data)
+ return self.data
+ def ADIident(self):
+ """Get an ARM's ID."""
+ self.ADIshift_IR(IR_IDCODE,0)
+ self.ADIshift_DR(0,32,LSB)
+ retval = struct.unpack("<L", "".join(self.data[0:4]))[0]
+ return retval
+
+ def ADIdebuginstr(self,instr,bkpt):
+ """if type (instr) == int or type(instr) == long:
+ instr = struct.pack("<L", instr)
+ instr = [int("0x%x"%ord(x),16) for x in instr]
+ instr.extend([bkpt])
+ self.writecmd(0x14,DEBUG_INSTR,len(instr),instr)
+ return (self.data)"""
+ pass
+ def ADI_nop(self, bkpt=0):
+ """if self.status() & DBG_TBIT:
+ return self.ADIdebuginstr(THUMB_INSTR_NOP, bkpt)
+ return self.ADIdebuginstr(ARM_INSTR_NOP, bkpt)"""
+ pass
+
+ def ADIrestart(self):
+ self.ADIshift_IR(IR_RESTART)
+
+ ####### Common DP features #######
+ def ADIgetAPACC(self, addr): # candidate for firmware. not sure the intelligence wants to be there, but performance may want it.
+ self.ADIshift_IR(IR_APACC)
+ data = 1 | (addr>>1) # addr[3:2] goes in bits [2:1]. this *must* be a multiple of 4.
+ return self.ADIshift_DR(data, 35, LSB)
+ def ADIsetAPACC(self, addr, val):
+ """
+ 0 < val < 0xffffffff
+ addr == 4*n (ie. multiple of four, returns the word at that register)
+ """
+ self.ADIshift_IR(IR_APACC)
+ data = (val<<3) | (addr>>1) # addr[3:2] goes in bits [2:1]. this *must* be a multiple of 4.
+ self.ADIshift_DR(data, 35, LSB)
+ def ADIgetDPACC(self, addr, flags): # candidate for firmware. not sure the intelligence wants to be there, but performance may want it.
+ self.ADIshift_IR(IR_DPACC)
+ data = 1 | (addr>>1) # addr[3:2] goes in bits [2:1]. this *must* be a multiple of 4.
+ return self.ADIshift_DR(data, 35, LSB)
+ def ADIsetDPACC(self, addr, val):
+ """
+ 0 < val < 0xffffffff
+ addr == 4*n (ie. multiple of four, returns the word at that register)
+ """
+ self.ADIshift_IR(IR_DPACC)
+ data = (val<<3) | (addr>>1) # addr[3:2] goes in bits [2:1]. this *must* be a multiple of 4.
+ self.ADIshift_DR(data, 35, LSB)
+
+ def ADIsetABORT(self):
+ """ ONLY use if the debugger has received WAIT responses over an extended period"""
+ self.ADIshift_IR(self, IR_ABORT)
+ self.ADIshift_DR(self, 1, 35)
+
+ def ADIsetSELECT(self, apnum, apbank, flags="ignored for jtag"):
+ if (apnum != self.ap_selected or apbank != self.ap_bank):
+ select = (apnum<<24) | (apbank<<4)
+ self.ADIsetDPACC(0x8, select)
+ self.ap_selected = apnum
+ self.ap_bank = apbank
+ def ADIgetSELECT(self, noncached=False):
+ if (noncached):
+ return self.ADIgetDPACC(0x8)
+ return self.ap_selected
+
+
+
+class ADI_AccessPort: # define common AP calls
+ def __init__(self, DP, apnum):
+ self.dp = DP # link to parent. all calls should use this to access the underlying debug port.
+ self.apnum = apnum # which AP am i to this DP?
+
+ def getRegister(self, bank, off):
+ self.dp.ADIsetSELECT(self.apnum, bank)
+ return self.dp.ADIgetAPACC(off)
+
+ def getRegisterByAddr(self, addr):
+ bank = addr/16
+ self.dp.ADIsetSELECT(self.apnum, bank)
+ return self.dp.ADIgetAPACC(addr&0xf)
+
+ def getIdentRegister(self):
+ ident = self.getRegisterByAddr(0xfc)
+ return ident
+
+ def getIdentRegisterrepr(self):
+ raw = self.getIdentRegister()
+ ap_rev = raw>>28
+ jep_cont = (raw>>24) & 0xf
+ jep_ident = (raw>>17) & 0x7f
+ ap_class = (raw>>16) & 1
+ ap_ident = raw & 0xff
+ return "AP Revision: 0x%x\nJEP-106 Continuation Code: 0x%x\nJEP-106 Identity Code: 0x%x\nAP Class: 0x%x\nAP Identification: %x (%s)\n"%(ap_rev,jep_cont,jep_ident,ap_class,ap_ident,AP_IDENT_TYPES[ap_ident&0xf])
+ #def
+
+class ADI_MEM_AP(ADI_AccessPort):
+ def __init__(self, DP, apnum):
+ ADI_AccessPort.__init__(self, DP, apnum)
+ self.cfg = self.getCFG() # necessary to cache endianness information
+ # FIXME: how do i determine if this adi supports multibyte access or just word? or packed transfers?
+ self.setMemAccessSize(4)
+
+ def setMemAccessSize(self, bytecount):
+ csw = self.getCSW()
+ csw &= 0xfffffff8
+ csw |= (bytecount>>1)
+ self.setCSW(csw)
+
+ def getCSW(self):
+ pass
+ def setCSW(self, csw):
+ pass
+
+ def getTAR(self):
+ pass
+ def setTAR(self, csw):
+ pass
+
+ def getDRW(self):
+ pass
+ def setDRW(self, csw):
+ pass
+
+ def getBD0(self):
+ pass
+ def setBD0(self, csw):
+ pass
+
+ def getCFG(self):
+ pass
+ def setCFG(self, csw):
+ pass
+
+ def getBASE(self):
+ pass
+ def setBASE(self, csw):
+ pass
+
+ def getIDR(self):
+ pass
+ def setIDR(self, csw):
+ pass
--- /dev/null
+#############################
+# Transaction Values
+# 0 = Request
+# 1 = Response
+#############################
+TRANSACTION = 0
+#############################
+
+#############################
+# SPI Byte Values
+#############################
+spi_version_mask = 0xC0
+spi_pro_stat = (0x0A, 0x0B, 0xC0, 0xC1)
+
+spi_bytes = (
+ 0x00,
+ 0x01,
+ 0x02,
+ 0x03,
+ 0x04,
+ 0x0A,
+ 0x0B,
+ 0xC0,
+ 0xC1,
+ 0xA7,
+ 0xFD,
+ 0xFE,
+ 0xFF
+)
+
+spi_values = (
+ 'EM260_RESET',
+ 'OVERSIZED_EZSP_FRAME',
+ 'ABORTED_TRANSACTION',
+ 'MISSING_FRAME_TERMINATOR',
+ 'RESERVED_ERROR',
+ 'SPI_PROTOCOL_VERSION',
+ 'SPI_STATUS',
+ 'RESP_STAT_SLEEP',
+ 'RESP_STAT_READY',
+ 'FRAME_TERMINATOR',
+ 'BOOTLOADER_FRAME',
+ 'EZSP_FRAME',
+ 'CONT_BYTE'
+)
+
+spi_table = {}
+spi_table_rev = {}
+for byte in xrange(len(spi_bytes)):
+ spi_table[spi_bytes[byte]] = spi_values[byte]
+ spi_table_rev[spi_values[byte]] = spi_bytes[byte]
+
+#############################
+
+#############################
+# Command Control Frame
+#############################
+cmd_mask = 0x80
+resp_over_mask = 0x01
+resp_trun_mask = 0x02
+
+cmd_control = (
+ 'CMDI', # Master State: Idle
+ 'CMDD', # Master State: Deep Sleep
+ 'CMDP', # Master State: Power Down
+ 'Reserved',
+ 'Reserved',
+ 'Reserved',
+ 'Reserved',
+)
+
+#resp_overflow = 'Out of Memory'
+resp_overflow = 'NOMEM'
+#resp_truncated = 'Truncated Response'
+resp_truncated = 'TRUNC_RESP'
+#############################
+
+#############################
+# Named Values
+#############################
+
+# Ember
+
+# Boolean
+boolean = (
+ 'FALSE', # 0x00
+ 'TRUE' # 0x01
+)
+
+# Frame IDs
+frame_error = 'NOT IMPLEMENTED'
+frame_ids = (
+ 'version', # 0x00
+ 'NOT IMPLEMENTED', # 0x01
+ 'addEndpoint', # 0x02
+ 'NOT IMPLEMENTED', # 0x03
+ 'NOT IMPLEMENTED', # 0x04
+ 'nop', # 0x05
+ 'callback', # 0x06
+ 'noCallbacks', # 0x07
+ 'reset', # 0x08
+ 'setToken', # 0x09
+ 'getToken', # 0x0A
+ 'getMfgToken', # 0x0B
+ 'NOT IMPLEMENTED', # 0x0C
+ 'getMillisecondTime', # 0x0D
+ 'setTimer', # 0x0E
+ 'timerHandler', # 0x0F
+ 'serialWrite', # 0x10
+ 'serialRead', # 0x11
+ 'debugWrite', # 0x12
+ 'debugHandler', # 0x13
+ 'requestLinkKey', # 0x14
+ 'setManufacturerCode', # 0x15
+ 'setPowerDescriptor', # 0x16
+ 'networkInit', # 0x17
+ 'networkState', # 0x18
+ 'stackStatusHandler', # 0x19
+ 'startScan', # 0x1A
+ 'networkFoundHandler', # 0x1B
+ 'scanCompleteHandler', # 0x1C
+ 'stopScan', # 0x1D
+ 'formNetwork', # 0x1E
+ 'joinNetwork', # 0x1F
+ 'leaveNetwork', # 0x20
+ 'findAndRejoinNetwork', # 0x21
+ 'permitJoining', # 0x22
+ 'childJoinHandler', # 0x23
+ 'trustCenterJoinHandler', # 0x24
+ 'NOT IMPLEMENTED', # 0x25
+ 'getEui64', # 0x26
+ 'getNodeId', # 0x27
+ 'getNetworkParameters', # 0x28
+ 'getParentChildParameters', # 0x29
+ 'clearBindingTable', # 0x2A
+ 'setBinding', # 0x2B
+ 'getBinding', # 0x2C
+ 'deleteBinding', # 0x2D
+ 'bindingIsActive', # 0x2E
+ 'getBindingRemoteNodeId', # 0x2F
+ 'setBindingRemoteNodeId', # 0x30
+ 'remoteSetBindingHandler', # 0x31
+ 'remoteDeleteBindingHandler', # 0x32
+ 'maximumPayloadLength', # 0x33
+ 'sendUnicast', # 0x34
+ 'NOT IMPLEMENTED', # 0x35
+ 'sendBroadcast', # 0x36
+ 'NOT IMPLEMENTED', # 0x37
+ 'sendMulticast', # 0x38
+ 'sendReply', # 0x39
+ 'NOT IMPLEMENTED', # 0x3A
+ 'NOT IMPLEMENTED', # 0x3B
+ 'NOT IMPLEMENTED', # 0x3C
+ 'NOT IMPLEMENTED', # 0x3D
+ 'NOT IMPLEMENTED', # 0x3E
+ 'messageSentHandler', # 0x3F
+ 'cancelMessage', # 0x40
+ 'sendManyToOneRouteRequest',# 0x41
+ 'pollForData', # 0x42
+ 'pollCompleteHandler', # 0x43
+ 'pollHandler', # 0x44
+ 'incomingMessageHandler', # 0x45
+ 'setRam', # 0x46
+ 'getRam', # 0x47
+ 'energyScanResultHandler', # 0x48
+ 'getRandomNumber', # 0x49
+ 'getChildData', # 0x4A
+ 'NOT IMPLEMENTED', # 0x4B
+ 'NOT IMPLEMENTED', # 0x4C
+ 'NOT IMPLEMENTED', # 0x4D
+ 'getTimer', # 0x4E
+ 'scanAndFormNetwork', # 0x4F
+ 'scanAndJoinNetwork', # 0x50
+ 'scanErrorHandler', # 0x51
+ 'getConfigurationValue', # 0x52
+ 'setConfigurationValue', # 0x53
+ 'NOT IMPLEMENTED', # 0x54
+ 'setPolicy', # 0x55
+ 'getPolicy', # 0x56
+ 'NOT IMPLEMENTED', # 0x57
+ 'invalidCommand', # 0x58
+ 'incomingRouteRecordHandler', # 0x59
+ 'setSourceRoute', # 0x5A
+ 'addressTableEntryIsActive',# 0x5B
+ 'setAddressTableRemoteEui64', # 0x5C
+ 'setAddressTableRemoteNodeId', # 0x5D
+ 'getAddressTableRemoteEui64', # 0x5E
+ 'getAddressTableRemoteNodeId', # 0x5F
+ 'lookupNodeIdByEui64', # 0x60
+ 'lookupEui64ByNodeId', # 0x61
+ 'incomingSenderEui64Handler', # 0x62
+ 'getMulticastTableEntry', # 0x63
+ 'setMulticastTableEntry', # 0x64
+ 'readAndClearCounters', # 0x65
+ 'addOrUpdateKeyTableEntry', # 0x66
+ 'NOT IMPLEMENTED', # 0x67
+ 'setInitialSecurityState', # 0x68
+ 'getCurrentSecurityState', # 0x69
+ 'getKey', # 0x6A
+ 'NOT IMPLEMENTED', # 0x6B
+ 'NOT IMPLEMENTED', # 0x6C
+ 'NOT IMPLEMENTED', # 0x6D
+ 'switchNetworkKeyHandler', # 0x6E
+ 'NOT IMPLEMENTED', # 0x6F
+ 'NOT IMPLEMENTED', # 0x70
+ 'getKeyTableEntry', # 0x71
+ 'setKeyTableEntry', # 0x72
+ 'broadcastNextNetworkKey', # 0x73
+ 'broadcastNetworkKeySwitch',# 0x74
+ 'findKeyTableEntry', # 0x75
+ 'eraseKeyTableEntry', # 0x76
+ 'becomeTrustCenter', # 0x77
+ 'NOT IMPLEMENTED', # 0x78
+ 'getNeighbor', # 0x79
+ 'neighborCount', # 0x7A
+ 'getRouteTableEntry', # 0x7B
+ 'idConflictHandler', # 0x7C
+ 'incomingManyToOneRouteRequestHandler', # 0x7D
+ 'setExtendedTimeout', # 0x7E
+ 'getExtendedTimeout', # 0x7F
+ 'incomingRouteErrorHandler',# 0x80
+ 'echo', # 0x81
+ 'replaceAddressTableEntry', # 0x82
+ 'mfglibStart', # 0x83
+ 'mfglibEnd', # 0x84
+ 'mfglibStartTone', # 0x85
+ 'mfglibStopTone', # 0x86
+ 'mfglibStartStream', # 0x87
+ 'mfglibStopStream', # 0x88
+ 'mfglibSendPacket', # 0x89
+ 'mfglibSetChannel', # 0x8A
+ 'mfglibGetChannel', # 0x8B
+ 'mfglibSetPower', # 0x8C
+ 'mfglibGetPower', # 0x8D
+ 'mfglibRxHandler', # 0x8E
+ 'launchStandaloneBootloader', # 0x8F
+ 'sendBootloadMessage', # 0x90
+ 'getStandaloneBootloaderVersionPlatMicroPhy', # 0x91
+ 'incomingBootloadMessageHandler', # 0x92
+ 'bootloadTransmitCompleteHandler', # 0x93
+ 'aesEncrypt', # 0x94
+ 'overrideCurrentChannel', # 0x95
+ 'sendRawMessage', # 0x96
+ 'macPassthroughMessageHandler', # 0x97
+ 'rawTransmitCompleteHandler', # 0x98
+ 'setRadioPower', # 0x99
+ 'setRadioChannel', # 0x9A
+ 'zigbeeKeyEstablishmentHandler', # 0x9B
+ 'energyScanRequest', # 0x9C
+ 'delayTest', # 0x9D
+ 'generateCbkeKeysHandler', # 0x9E
+ 'calculateSmacs', # 0x9F
+ 'calculateSmacsHandler', # 0xA0
+ 'clearTemporaryDataMaybeStoreLinkKey', # 0xA1
+ 'NOT IMPLEMENTED', # 0xA2
+ 'NOT IMPLEMENTED', # 0xA3
+ 'generateCbkeKeys', # 0xA4
+ 'NOT IMPLEMENTED', # 0xA5
+ 'dsaSign', # 0xA6
+ 'dsaSignHandler', # 0xA7
+ 'scanForJoinableNetwork', # 0xA8
+ 'unusedPanIdFoundHandler', # 0xA9
+ 'getValue', # 0xAA
+ 'setValue', # 0xAB
+ 'NOT IMPLEMENTED', # 0xAC
+ 'NOT IMPLEMENTED', # 0xAD
+ 'NOT IMPLEMENTED', # 0xAE
+ 'NOT IMPLEMENTED' # 0xAF
+)
+
+frame_table = {}
+frame_table_rev = {}
+for fid in xrange(len(frame_ids)):
+ frame_table[fid] = frame_ids[fid]
+ frame_table[frame_ids[fid]] = fid
+
+# EzspConfigId
+EZSP_CONFIG_PACKET_BUFFER_COUNT = 0x01
+EZSP_CONFIG_NEIGHBOR_TABLE_SIZE = 0x02
+EZSP_CONFIG_APS_UNICAST_MESSAGE_COUNT = 0x03
+EZSP_CONFIG_BINDING_TABLE_SIZE = 0x04
+EZSP_CONFIG_ADDRESS_TABLE_SIZE = 0x05
+EZSP_CONFIG_MULTICAST_TABLE_SIZE = 0x06
+EZSP_CONFIG_ROUTE_TABLE_SIZE = 0x07
+EZSP_CONFIG_DISCOVERY_TABLE_SIZE = 0x08
+EZSP_CONFIG_BROADCAST_ALARM_DATA_SIZE = 0x09
+EZSP_CONFIG_UNICAST_ALARM_DATA_SIZE = 0x0A
+EZSP_CONFIG_STACK_PROFILE = 0x0C
+EZSP_CONFIG_SECURITY_LEVEL = 0x0D
+EZSP_CONFIG_MAX_HOPS = 0x10
+EZSP_CONFIG_MAX_END_DEVICE_CHILDREN = 0x11
+EZSP_CONFIG_INDIRECT_TRANSMISSION_TIMEOUT = 0x12
+EZSP_CONFIG_END_DEVICE_POLL_TIMEOUT = 0x13
+EZSP_CONFIG_MOBILE_NODE_POLL_TIMEOUT = 0x14
+EZSP_CONFIG_RESERVED_MOBILE_CHILD_ENTRIES = 0x15
+EZSP_CONFIG_HOST_RAM = 0x16
+EZSP_CONFIG_TX_POWER_MODE = 0x17
+EZSP_CONFIG_DISABLE_RELAY = 0x18
+EZSP_CONFIG_TRUST_CENTER_ADDRESS_CACHE_SIZE = 0x19
+EZSP_CONFIG_SOURCE_ROUTE_TABLE_SIZE = 0x1A
+EZSP_CONFIG_END_DEVICE_POLL_TIMEOUT_SHIFT = 0x1B
+EZSP_CONFIG_FRAGMENT_WINDOW_SIZE = 0x1C
+EZSP_CONFIG_FRAGMENT_DELAY_MS = 0x1D
+EZSP_CONFIG_KEY_TABLE_SIZE = 0x1E
+EZSP_CONFIG_APS_ACK_TIMEOUT = 0x1F
+EZSP_CONFIG_ACTIVE_SCAN_DURATION = 0x20
+EZSP_CONFIG_END_DEVICE_BIND_TIMEOUT = 0x21
+EZSP_CONFIG_PAN_ID_CONFLICT_REPORT_THRESHOLD = 0x22
+EZSP_CONFIG_REQUEST_KEY_TIMEOUT = 0x24
+EZSP_CONFIG_ENABLE_DUAL_CHANNEL_SCAN = 0x25
+
+ezsp_config_id = {
+ 'EZSP_CONFIG_PACKET_BUFFER_COUNT' : 0x01,\
+ 'EZSP_CONFIG_NEIGHBOR_TABLE_SIZE' : 0x02,\
+ 'EZSP_CONFIG_APS_UNICAST_MESSAGE_COUNT' : 0x03,\
+ 'EZSP_CONFIG_BINDING_TABLE_SIZE' : 0x04,\
+ 'EZSP_CONFIG_ADDRESS_TABLE_SIZE' : 0x05,\
+ 'EZSP_CONFIG_MULTICAST_TABLE_SIZE' : 0x06,\
+ 'EZSP_CONFIG_ROUTE_TABLE_SIZE' : 0x07,\
+ 'EZSP_CONFIG_DISCOVERY_TABLE_SIZE' : 0x08,\
+ 'EZSP_CONFIG_BROADCAST_ALARM_DATA_SIZE' : 0x09,\
+ 'EZSP_CONFIG_UNICAST_ALARM_DATA_SIZE' : 0x0A,\
+ 'EZSP_CONFIG_STACK_PROFILE' : 0x0C,\
+ 'EZSP_CONFIG_SECURITY_LEVEL' : 0x0D,\
+ 'EZSP_CONFIG_MAX_HOPS' : 0x10,\
+ 'EZSP_CONFIG_MAX_END_DEVICE_CHILDREN' : 0x11,\
+ 'EZSP_CONFIG_INDIRECT_TRANSMISSION_TIMEOUT' : 0x12,\
+ 'EZSP_CONFIG_END_DEVICE_POLL_TIMEOUT' : 0x13,\
+ 'EZSP_CONFIG_MOBILE_NODE_POLL_TIMEOUT' : 0x14,\
+ 'EZSP_CONFIG_RESERVED_MOBILE_CHILD_ENTRIES' : 0x15,\
+ 'EZSP_CONFIG_HOST_RAM' : 0x16,\
+ 'EZSP_CONFIG_TX_POWER_MODE' : 0x17,\
+ 'EZSP_CONFIG_DISABLE_RELAY' : 0x18,\
+ 'EZSP_CONFIG_TRUST_CENTER_ADDRESS_CACHE_SIZE' : 0x19,\
+ 'EZSP_CONFIG_SOURCE_ROUTE_TABLE_SIZE' : 0x1A,\
+ 'EZSP_CONFIG_END_DEVICE_POLL_TIMEOUT_SHIFT' : 0x1B,\
+ 'EZSP_CONFIG_FRAGMENT_WINDOW_SIZE' : 0x1C,\
+ 'EZSP_CONFIG_FRAGMENT_DELAY_MS' : 0x1D,\
+ 'EZSP_CONFIG_KEY_TABLE_SIZE' : 0x1E,\
+ 'EZSP_CONFIG_APS_ACK_TIMEOUT' : 0x1F,\
+ 'EZSP_CONFIG_ACTIVE_SCAN_DURATION' : 0x20,\
+ 'EZSP_CONFIG_END_DEVICE_BIND_TIMEOUT' : 0x21,\
+ 'EZSP_CONFIG_PAN_ID_CONFLICT_REPORT_THRESHOLD' : 0x22,\
+ 'EZSP_CONFIG_REQUEST_KEY_TIMEOUT' : 0x24,\
+ 'EZSP_CONFIG_ENABLE_DUAL_CHANNEL_SCAN' : 0x25,\
+ }
+ezsp_config_id_rev = {}
+for cid,num in ezsp_config_id.items():
+ ezsp_config_id_rev[num] = cid
+
+# EzspValueId
+EZSP_VALUE_TOKEN_STACK_NODE_DATA = 0x00
+EZSP_VALUE_MAC_PASSTHROUGH_FLAGS = 0x01
+EZSP_VALUE_EMBERNET_PASSTHROUGH_SOURCE_ADDRESS = 0x02
+ezsp_value_id = {\
+ 'EZSP_VALUE_TOKEN_STACK_NODE_DATA' : 0x00,\
+ 'EZSP_VALUE_MAC_PASSTHROUGH_FLAGS' : 0x01,\
+ 'EZSP_VALUE_EMBERNET_PASSTHROUGH_SOURCE_ADDRESS' : 0x02,\
+}
+ezsp_value_id_rev = {}
+for vid,num in ezsp_value_id.items():
+ ezsp_value_id_rev[num] = vid
+
+# EmberConfigTxPowerMode
+EMBER_TX_POWER_MODE_DEFAULT = 0x00
+EMBER_TX_POWER_MODE_BOOST = 0x01
+EMBER_TX_POWER_MODE_ALTERNATE = 0x02
+EMBER_TX_POWER_MODE_BOOST_AND_ALTERNATE = 0x03
+
+ember_config_tx_power_mode = {\
+ 'EMBER_TX_POWER_MODE_DEFAULT' : 0x00,\
+ 'EMBER_TX_POWER_MODE_BOOST' : 0x01,\
+ 'EMBER_TX_POWER_MODE_ALTERNATE' : 0x02,\
+ 'EMBER_TX_POWER_MODE_BOOST_AND_ALTERNATE' : 0x03,\
+}
+ember_config_tx_power_mode_rev = {}
+for mode,num in ember_config_tx_power_mode.items():
+ ember_config_tx_power_mode_rev[num] = mode
+
+
+# EzspPolicyId
+EZSP_TRUST_CENTER_POLICY = 0x00
+EZSP_BINDING_MODIFICATION_POLICY = 0x01
+EZSP_UNICAST_REPLIES_POLICY = 0x02
+EZSP_POLL_HANDLER_POLICY = 0x03
+EZSP_MESSAGE_CONTENTS_IN_CALLBACK_POLICY = 0x04
+EZSP_TC_KEY_REQUEST_POLICY = 0x05
+EZSP_APP_KEY_REQUEST_POLICY = 0x06
+ezsp_policy_id = {\
+ 'EZSP_TRUST_CENTER_POLICY' : 0x00,\
+ 'EZSP_BINDING_MODIFICATION_POLICY' : 0x01,\
+ 'EZSP_UNICAST_REPLIES_POLICY' : 0x02,\
+ 'EZSP_POLL_HANDLER_POLICY' : 0x03,\
+ 'EZSP_MESSAGE_CONTENTS_IN_CALLBACK_POLICY' : 0x04,\
+ 'EZSP_TC_KEY_REQUEST_POLICY' : 0x05,\
+ 'EZSP_APP_KEY_REQUEST_POLICY' : 0x06,\
+}
+ezsp_policy_id_rev = {}
+for pid,num in ezsp_policy_id.items():
+ ezsp_policy_id_rev[num] = pid
+
+
+# EzspDecisionid
+EZSP_ALLOW_JOINS = 0x00
+EZSP_ALLOW_JOINS_REJOINS_HAVE_LINK_KEY = 0x04
+EZSP_ALLOW_PRECONFIGURED_KEY_JOINS = 0x01
+EZSP_ALLOW_REJOINS_ONLY = 0x02
+EZSP_DISALLOW_ALL_JOINS_AND_REJOINS = 0x03
+EZSP_DISALLOW_BINDING_MODIFICATION = 0x10
+EZSP_ALLOW_BINDING_MODIFICATION = 0x11
+EZSP_HOST_WILL_NOT_SUPPLY_REPLY = 0x20
+EZSP_HOST_WILL_SUPPLY_REPLY = 0x21
+EZSP_POLL_HANDLER_IGNORE = 0x30
+EZSP_POLL_HANDLER_CALLBACK = 0x31
+EZSP_MESSAGE_TAG_ONLY_IN_CALLBACK = 0x40
+EZSP_MESSAGE_TAG_AND_CONTENTS_IN_CALLBACK = 0x41
+EZSP_DENY_TC_KEY_REQUESTS = 0x50
+EZSP_ALLOW_TC_KEY_REQUESTS = 0x51
+EZSP_DENY_APP_KEY_REQUESTS = 0x60
+EZSP_ALLOW_APP_KEY_REQUESTS = 0x61
+ezsp_decision_id = {
+ 'EZSP_ALLOW_JOINS' : 0x00,\
+ 'EZSP_ALLOW_JOINS_REJOINS_HAVE_LINK_KEY' : 0x04,\
+ 'EZSP_ALLOW_PRECONFIGURED_KEY_JOINS' : 0x01,\
+ 'EZSP_ALLOW_REJOINS_ONLY' : 0x02,\
+ 'EZSP_DISALLOW_ALL_JOINS_AND_REJOINS' : 0x03,\
+ 'EZSP_DISALLOW_BINDING_MODIFICATION' : 0x10,\
+ 'EZSP_ALLOW_BINDING_MODIFICATION' : 0x11,\
+ 'EZSP_HOST_WILL_NOT_SUPPLY_REPLY' : 0x20,\
+ 'EZSP_HOST_WILL_SUPPLY_REPLY' : 0x21,\
+ 'EZSP_POLL_HANDLER_IGNORE' : 0x30,\
+ 'EZSP_POLL_HANDLER_CALLBACK' : 0x31,\
+ 'EZSP_MESSAGE_TAG_ONLY_IN_CALLBACK' : 0x40,\
+ 'EZSP_MESSAGE_TAG_AND_CONTENTS_IN_CALLBACK' : 0x41,\
+ 'EZSP_DENY_TC_KEY_REQUESTS' : 0x50,\
+ 'EZSP_ALLOW_TC_KEY_REQUESTS' : 0x51,\
+ 'EZSP_DENY_APP_KEY_REQUESTS' : 0x60,\
+ 'EZSP_ALLOW_APP_KEY_REQUESTS' : 0x61,\
+}
+ezsp_decision_id_rev = {}
+for did,num in ezsp_decision_id.items():
+ ezsp_decision_id_rev[num] = did
+
+
+# EzspMfgTokenId
+EZSP_MFG_CUSTOM_VERSION = 0x00
+EZSP_MFG_STRING = 0x01
+EZSP_MFG_BOARD_NAME = 0x02
+EZSP_MFG_MANUF_ID = 0x03
+EZSP_MFG_PHY_CONFIG = 0x04
+EZSP_MFG_BOOTLOAD_AES_KEY = 0x05
+EZSP_MFG_ASH_CONFIG = 0x06
+EZSP_MFG_EZSP_STORAGE = 0x07
+EZSP_STACK_CAL_DATA = 0x08
+EZSP_MFG_CBKE_DATA = 0x09
+EZSP_MFG_INSTALLATION_CODE = 0x0A
+ezsp_mfg_token_id = {
+ 'EZSP_MFG_CUSTOM_VERSION' : 0x00,\
+ 'EZSP_MFG_STRING' : 0x01,\
+ 'EZSP_MFG_BOARD_NAME' : 0x02,\
+ 'EZSP_MFG_MANUF_ID' : 0x03,\
+ 'EZSP_MFG_PHY_CONFIG' : 0x04,\
+ 'EZSP_MFG_BOOTLOAD_AES_KEY' : 0x05,\
+ 'EZSP_MFG_ASH_CONFIG' : 0x06,\
+ 'EZSP_MFG_EZSP_STORAGE' : 0x07,\
+ 'EZSP_STACK_CAL_DATA' : 0x08,\
+ 'EZSP_MFG_CBKE_DATA' : 0x09,\
+ 'EZSP_MFG_INSTALLATION_CODE' : 0x0A,\
+}
+ezsp_mfg_token_id_rev = {}
+for tid,num in ezsp_mfg_token_id.items():
+ ezsp_mfg_token_id_rev[num] = tid
+
+
+# EzspStatus
+EZSP_SUCCESS = 0x00
+EZSP_SPI_ERR_FATAL = 0x10
+EZSP_SPI_ERR_EM260_RESET = 0x11
+EZSP_SPI_ERR_OVERSIZED_EZSP_FRAME = 0x12
+EZSP_SPI_ERR_ABORTED_TRANSACTION = 0x13
+EZSP_SPI_ERR_MISSING_FRAME_TERMINATOR = 0x14
+EZSP_SPI_ERR_WAIT_SECTION_TIMEOUT = 0x15
+EZSP_SPI_ERR_NO_FRAME_TERMINATOR = 0x16
+EZSP_SPI_ERR_EZSP_COMMAND_OVERSIZED = 0x17
+EZSP_SPI_ERR_EZSP_RESPONSE_OVERSIZED = 0x18
+EZSP_SPI_WAITING_FOR_RESPONSE = 0x19
+EZSP_SPI_ERR_HANDSHAKE_TIMEOUT = 0x1A
+EZSP_SPI_ERR_STARTUP_TIMEOUT = 0x1B
+EZSP_SPI_ERR_STARTUP_FAIL = 0x1C
+EZSP_SPI_ERR_UNSUPPORTED_SPI_COMMAND = 0x1D
+EZSP_ASH_IN_PROGRESS = 0x20
+EZSP_ASH_HOST_FATAL_ERROR = 0x21
+EZSP_ASH_NCP_FATAL_ERROR = 0x22
+EZSP_ASH_DATA_FRAME_TOO_LONG = 0x23
+EZSP_ASH_DATA_FRAME_TOO_SHORT = 0x24
+EZSP_ASH_NO_TX_SPACE = 0x25
+EZSP_ASH_NO_RX_SPACE = 0x26
+EZSP_ASH_NO_RX_DATA = 0x27
+EZSP_ASH_NOT_CONNECTED = 0x28
+EZSP_ERROR_VERSION_NOT_SET = 0x30
+EZSP_ERROR_INVALID_FRAME_ID = 0x31
+EZSP_ERROR_WRONG_DIRECTION = 0x32
+EZSP_ERROR_TRUNCATED = 0x33
+EZSP_ERROR_OVERFLOW = 0x34
+EZSP_ERROR_OUT_OF_MEMORY = 0x35
+EZSP_ERROR_INVALID_VALUE = 0x36
+EZSP_ERROR_INVALID_ID = 0x37
+EZSP_ERROR_INVALID_CALL = 0x38
+EZSP_ERROR_NO_RESPONSE = 0x39
+EZSP_ERROR_COMMAND_TOO_LONG = 0x40
+EZSP_ERROR_QUEUE_FULL = 0x41
+EZSP_ASH_ERROR_VERSION = 0x50
+EZSP_ASH_ERROR_TIMEOUTS = 0x51
+EZSP_ASH_ERROR_RESET_FAIL = 0x52
+EZSP_ASH_ERROR_NCP_RESET = 0x53
+EZSP_ASH_ERROR_SERIAL_INIT = 0x54
+EZSP_ASH_ERROR_NCP_TYPE = 0x55
+EZSP_ASH_ERROR_RESET_METHOD = 0x56
+EZSP_ASH_ERROR_XON_XOFF = 0x57
+EZSP_ASH_STARTED = 0x70
+EZSP_ASH_CONNECTED = 0x71
+EZSP_ASH_DISCONNECTED = 0x72
+EZSP_ASH_ACK_TIMEOUT = 0x73
+EZSP_ASH_CANCELLED = 0x74
+EZSP_ASH_OUT_OF_SEQUENCE = 0x75
+EZSP_ASH_BAD_CRC = 0x76
+EZSP_ASH_COMM_ERROR = 0x77
+EZSP_ASH_BAD_ACKNUM = 0x78
+EZSP_ASH_TOO_SHORT = 0x79
+EZSP_ASH_TOO_LONG = 0x7A
+EZSP_ASH_BAD_CONTROL = 0x7B
+EZSP_ASH_BAD_LENGTH = 0x7C
+EZSP_ASH_NO_ERROR = 0xFF
+ezsp_status = {\
+ 'EZSP_SUCCESS' : 0x00,\
+ 'EZSP_SPI_ERR_FATAL' : 0x10,\
+ 'EZSP_SPI_ERR_EM260_RESET' : 0x11,\
+ 'EZSP_SPI_ERR_OVERSIZED_EZSP_FRAME' : 0x12,\
+ 'EZSP_SPI_ERR_ABORTED_TRANSACTION' : 0x13,\
+ 'EZSP_SPI_ERR_MISSING_FRAME_TERMINATOR' : 0x14,\
+ 'EZSP_SPI_ERR_WAIT_SECTION_TIMEOUT' : 0x15,\
+ 'EZSP_SPI_ERR_NO_FRAME_TERMINATOR' : 0x16,\
+ 'EZSP_SPI_ERR_EZSP_COMMAND_OVERSIZED' : 0x17,\
+ 'EZSP_SPI_ERR_EZSP_RESPONSE_OVERSIZED' : 0x18,\
+ 'EZSP_SPI_WAITING_FOR_RESPONSE' : 0x19,\
+ 'EZSP_SPI_ERR_HANDSHAKE_TIMEOUT' : 0x1A,\
+ 'EZSP_SPI_ERR_STARTUP_TIMEOUT' : 0x1B,\
+ 'EZSP_SPI_ERR_STARTUP_FAIL' : 0x1C,\
+ 'EZSP_SPI_ERR_UNSUPPORTED_SPI_COMMAND' : 0x1D,\
+ 'EZSP_ASH_IN_PROGRESS' : 0x20,\
+ 'EZSP_ASH_HOST_FATAL_ERROR' : 0x21,\
+ 'EZSP_ASH_NCP_FATAL_ERROR' : 0x22,\
+ 'EZSP_ASH_DATA_FRAME_TOO_LONG' : 0x23,\
+ 'EZSP_ASH_DATA_FRAME_TOO_SHORT' : 0x24,\
+ 'EZSP_ASH_NO_TX_SPACE' : 0x25,\
+ 'EZSP_ASH_NO_RX_SPACE' : 0x26,\
+ 'EZSP_ASH_NO_RX_DATA' : 0x27,\
+ 'EZSP_ASH_NOT_CONNECTED' : 0x28,\
+ 'EZSP_ERROR_VERSION_NOT_SET' : 0x30,\
+ 'EZSP_ERROR_INVALID_FRAME_ID' : 0x31,\
+ 'EZSP_ERROR_WRONG_DIRECTION' : 0x32,\
+ 'EZSP_ERROR_TRUNCATED' : 0x33,\
+ 'EZSP_ERROR_OVERFLOW' : 0x34,\
+ 'EZSP_ERROR_OUT_OF_MEMORY' : 0x35,\
+ 'EZSP_ERROR_INVALID_VALUE' : 0x36,\
+ 'EZSP_ERROR_INVALID_ID' : 0x37,\
+ 'EZSP_ERROR_INVALID_CALL' : 0x38,\
+ 'EZSP_ERROR_NO_RESPONSE' : 0x39,\
+ 'EZSP_ERROR_COMMAND_TOO_LONG' : 0x40,\
+ 'EZSP_ERROR_QUEUE_FULL' : 0x41,\
+ 'EZSP_ASH_ERROR_VERSION' : 0x50,\
+ 'EZSP_ASH_ERROR_TIMEOUTS' : 0x51,\
+ 'EZSP_ASH_ERROR_RESET_FAIL' : 0x52,\
+ 'EZSP_ASH_ERROR_NCP_RESET' : 0x53,\
+ 'EZSP_ASH_ERROR_SERIAL_INIT' : 0x54,\
+ 'EZSP_ASH_ERROR_NCP_TYPE' : 0x55,\
+ 'EZSP_ASH_ERROR_RESET_METHOD' : 0x56,\
+ 'EZSP_ASH_ERROR_XON_XOFF' : 0x57,\
+ 'EZSP_ASH_STARTED' : 0x70,\
+ 'EZSP_ASH_CONNECTED' : 0x71,\
+ 'EZSP_ASH_DISCONNECTED' : 0x72,\
+ 'EZSP_ASH_ACK_TIMEOUT' : 0x73,\
+ 'EZSP_ASH_CANCELLED' : 0x74,\
+ 'EZSP_ASH_OUT_OF_SEQUENCE' : 0x75,\
+ 'EZSP_ASH_BAD_CRC' : 0x76,\
+ 'EZSP_ASH_COMM_ERROR' : 0x77,\
+ 'EZSP_ASH_BAD_ACKNUM' : 0x78,\
+ 'EZSP_ASH_TOO_SHORT' : 0x79,\
+ 'EZSP_ASH_TOO_LONG' : 0x7A,\
+ 'EZSP_ASH_BAD_CONTROL' : 0x7B,\
+ 'EZSP_ASH_BAD_LENGTH' : 0x7C,\
+ 'EZSP_ASH_NO_ERROR' : 0xFF,\
+}
+ezsp_status_rev = {}
+for tid,num in ezsp_status.items():
+ ezsp_status_rev[num] = tid
+
+
+# EmberStatus
+EMBER_SUCCESS = 0x00
+EMBER_ERR_FATAL = 0x01
+EMBER_EEPROM_MFG_STACK_VERSION_MISMATCH = 0x04
+EMBER_INCOMPATIBLE_STATIC_MEMORY_DEFINITIONS = 0x05
+EMBER_EEPROM_MFG_VERSION_MISMATCH = 0x06
+EMBER_EEPROM_STACK_VERSION_MISMATCH = 0x07
+EMBER_NO_BUFFERS = 0x18
+EMBER_SERIAL_INVALID_BAUD_RATE = 0x20
+EMBER_SERIAL_INVALID_PORT = 0x21
+EMBER_SERIAL_TX_OVERFLOW = 0x22
+EMBER_SERIAL_RX_OVERFLOW = 0x23
+EMBER_SERIAL_RX_FRAME_ERROR = 0x24
+EMBER_SERIAL_RX_PARITY_ERROR = 0x25
+EMBER_SERIAL_RX_EMPTY = 0x26
+EMBER_SERIAL_RX_OVERRUN_ERROR = 0x27
+EMBER_MAC_TRANSMIT_QUEUE_FULL = 0x39
+EMBER_MAC_UNKNOWN_HEADER_TYPE = 0x3A
+EMBER_MAC_SCANNING = 0x3D
+EMBER_MAC_NO_DATA = 0x31
+EMBER_MAC_JOINED_NETWORK = 0x32
+EMBER_MAC_BAD_SCAN_DURATION = 0x33
+EMBER_MAC_INCORRECT_SCAN_TYPE = 0x34
+EMBER_MAC_INVALID_CHANNEL_MASK = 0x35
+EMBER_MAC_COMMAND_TRANSMIT_FAILURE = 0x36
+EMBER_MAC_NO_ACK_RECEIVED = 0x40
+EMBER_MAC_INDIRECT_TIMEOUT = 0x42
+EMBER_SIM_EEPROM_ERASE_PAGE_GREEN = 0x43
+EMBER_SIM_EEPROM_ERASE_PAGE_RED = 0x44
+EMBER_SIM_EEPROM_FULL = 0x45
+EMBER_ERR_FLASH_WRITE_INHIBITED = 0x46
+EMBER_ERR_FLASH_VERIFY_FAILED = 0x47
+EMBER_SIM_EEPROM_INIT_1_FAILED = 0x48
+EMBER_SIM_EEPROM_INIT_2_FAILED = 0x49
+EMBER_SIM_EEPROM_INIT_3_FAILED = 0x4A
+EMBER_ERR_TOKEN_UNKNOWN = 0x4B
+EMBER_ERR_TOKEN_EXISTS = 0x4C
+EMBER_ERR_TOKEN_INVALID_SIZE = 0x4D
+EMBER_ERR_TOKEN_READ_ONLY = 0x4E
+EMBER_ERR_BOOTLOADER_TRAP_TABLE_BAD = 0x58
+EMBER_ERR_BOOTLOADER_TRAP_UNKNOWN = 0x59
+EMBER_ERR_BOOTLOADER_NO_IMAGE = 0x5A
+EMBER_DELIVERY_FAILED = 0x66
+EMBER_BINDING_INDEX_OUT_OF_RANGE = 0x69
+EMBER_ADDRESS_TABLE_INDEX_OUT_OF_RANGE = 0x6A
+EMBER_INVALID_BINDING_INDEX = 0x6C
+EMBER_INVALID_CALL = 0x70
+EMBER_COST_NOT_KNOWN = 0x71
+EMBER_MAX_MESSAGE_LIMIT_REACHED = 0x72
+EMBER_MESSAGE_TOO_LONG = 0x74
+EMBER_BINDING_IS_ACTIVE = 0x75
+EMBER_ADDRESS_TABLE_ENTRY_IS_ACTIVE = 0x76
+EMBER_ADC_CONVERSION_DONE = 0x80
+EMBER_ADC_CONVERSION_BUSY = 0x81
+EMBER_ADC_CONVERSION_DEFERRED = 0x82
+EMBER_ADC_NO_CONVERSION_PENDING = 0x84
+EMBER_SLEEP_INTERRUPTED = 0x85
+EMBER_PHY_TX_UNDERFLOW = 0x88
+EMBER_PHY_TX_INCOMPLETE = 0x89
+EMBER_PHY_INVALID_CHANNEL = 0x8A
+EMBER_PHY_INVALID_POWER = 0x8B
+EMBER_PHY_TX_BUSY = 0x8C
+EMBER_PHY_UNKNOWN_RADIO_TYPE = 0x8D
+EMBER_PHY_OSCILLATOR_CHECK_FAILED = 0x8E
+EMBER_PHY_PARTIAL_PACKET = 0x8F
+EMBER_NETWORK_UP = 0x90
+EMBER_NETWORK_DOWN = 0x91
+EMBER_JOIN_FAILED = 0x94
+EMBER_MOVE_FAILED = 0x96
+EMBER_CANNOT_JOIN_AS_ROUTER = 0x98
+EMBER_NODE_ID_CHANGED = 0x99
+EMBER_PAN_ID_CHANGED = 0x9A
+EMBER_NO_BEACONS = 0xAB
+EMBER_RECEIVED_KEY_IN_THE_CLEAR = 0xAC
+EMBER_NO_NETWORK_KEY_RECEIVED = 0xAD
+EMBER_NO_LINK_KEY_RECEIVED = 0xAE
+EMBER_PRECONFIGURED_KEY_REQUIRED = 0xAF
+EMBER_NOT_JOINED = 0x93
+EMBER_INVALID_SECURITY_LEVEL = 0x95
+EMBER_NETWORK_BUSY = 0xA1
+EMBER_INVALID_ENDPOINT = 0xA3
+EMBER_BINDING_HAS_CHANGED = 0xA4
+EMBER_INSUFFICIENT_RANDOM_DATA = 0xA5
+EMBER_APS_ENCRYPTION_ERROR = 0xA6
+EMBER_TRUST_CENTER_MASTER_KEY_NOT_SET = 0xA7
+EMBER_SECURITY_STATE_NOT_SET = 0xA8
+EMBER_KEY_TABLE_INVALID_ADDRESS = 0xB3
+EMBER_SECURITY_CONFIGURATION_INVALID = 0xB7
+EMBER_TOO_SOON_FOR_SWITCH_KEY = 0xB8
+EMBER_KEY_NOT_AUTHORIZED = 0xBB
+EMBER_SOURCE_ROUTE_FAILURE = 0xA9
+EMBER_MANY_TO_ONE_ROUTE_FAILURE = 0xAA
+EMBER_STACK_AND_HARDWARE_MISMATCH = 0xB0
+EMBER_APPLICATION_ERROR_0 = 0xF0
+EMBER_APPLICATION_ERROR_1 = 0xF1
+EMBER_APPLICATION_ERROR_2 = 0xF2
+EMBER_APPLICATION_ERROR_3 = 0xF3
+EMBER_APPLICATION_ERROR_4 = 0xF4
+EMBER_APPLICATION_ERROR_5 = 0xF5
+EMBER_APPLICATION_ERROR_6 = 0xF6
+EMBER_APPLICATION_ERROR_7 = 0xF7
+EMBER_APPLICATION_ERROR_8 = 0xF8
+EMBER_APPLICATION_ERROR_9 = 0xF9
+EMBER_APPLICATION_ERROR_10 = 0xFA
+EMBER_APPLICATION_ERROR_11 = 0xFB
+EMBER_APPLICATION_ERROR_12 = 0xFC
+EMBER_APPLICATION_ERROR_13 = 0xFD
+EMBER_APPLICATION_ERROR_14 = 0xFE
+EMBER_APPLICATION_ERROR_15 = 0xFF
+ember_status = {\
+ 'EMBER_SUCCESS' : 0x00,\
+ 'EMBER_ERR_FATAL' : 0x01,\
+ 'EMBER_EEPROM_MFG_STACK_VERSION_MISMATCH' : 0x04,\
+ 'EMBER_INCOMPATIBLE_STATIC_MEMORY_DEFINITIONS' : 0x05,\
+ 'EMBER_EEPROM_MFG_VERSION_MISMATCH' : 0x06,\
+ 'EMBER_EEPROM_STACK_VERSION_MISMATCH' : 0x07,\
+ 'EMBER_NO_BUFFERS' : 0x18,\
+ 'EMBER_SERIAL_INVALID_BAUD_RATE' : 0x20,\
+ 'EMBER_SERIAL_INVALID_PORT' : 0x21,\
+ 'EMBER_SERIAL_TX_OVERFLOW' : 0x22,\
+ 'EMBER_SERIAL_RX_OVERFLOW' : 0x23,\
+ 'EMBER_SERIAL_RX_FRAME_ERROR' : 0x24,\
+ 'EMBER_SERIAL_RX_PARITY_ERROR' : 0x25,\
+ 'EMBER_SERIAL_RX_EMPTY' : 0x26,\
+ 'EMBER_SERIAL_RX_OVERRUN_ERROR' : 0x27,\
+ 'EMBER_MAC_TRANSMIT_QUEUE_FULL' : 0x39,\
+ 'EMBER_MAC_UNKNOWN_HEADER_TYPE' : 0x3A,\
+ 'EMBER_MAC_SCANNING' : 0x3D,\
+ 'EMBER_MAC_NO_DATA' : 0x31,\
+ 'EMBER_MAC_JOINED_NETWORK' : 0x32,\
+ 'EMBER_MAC_BAD_SCAN_DURATION' : 0x33,\
+ 'EMBER_MAC_INCORRECT_SCAN_TYPE' : 0x34,\
+ 'EMBER_MAC_INVALID_CHANNEL_MASK' : 0x35,\
+ 'EMBER_MAC_COMMAND_TRANSMIT_FAILURE' : 0x36,\
+ 'EMBER_MAC_NO_ACK_RECEIVED' : 0x40,\
+ 'EMBER_MAC_INDIRECT_TIMEOUT' : 0x42,\
+ 'EMBER_SIM_EEPROM_ERASE_PAGE_GREEN' : 0x43,\
+ 'EMBER_SIM_EEPROM_ERASE_PAGE_RED' : 0x44,\
+ 'EMBER_SIM_EEPROM_FULL' : 0x45,\
+ 'EMBER_ERR_FLASH_WRITE_INHIBITED' : 0x46,\
+ 'EMBER_ERR_FLASH_VERIFY_FAILED' : 0x47,\
+ EMBER_SIM_EEPROM_INIT_1_FAILED : 0x48,\
+ EMBER_SIM_EEPROM_INIT_2_FAILED : 0x49,\
+ EMBER_SIM_EEPROM_INIT_3_FAILED : 0x4A,\
+ 'EMBER_ERR_TOKEN_UNKNOWN' : 0x4B,\
+ 'EMBER_ERR_TOKEN_EXISTS' : 0x4C,\
+ 'EMBER_ERR_TOKEN_INVALID_SIZE' : 0x4D,\
+ 'EMBER_ERR_TOKEN_READ_ONLY' : 0x4E,\
+ 'EMBER_ERR_BOOTLOADER_TRAP_TABLE_BAD' : 0x58,\
+ 'EMBER_ERR_BOOTLOADER_TRAP_UNKNOWN' : 0x59,\
+ 'EMBER_ERR_BOOTLOADER_NO_IMAGE' : 0x5A,\
+ 'EMBER_DELIVERY_FAILED' : 0x66,\
+ 'EMBER_BINDING_INDEX_OUT_OF_RANGE' : 0x69,\
+ 'EMBER_ADDRESS_TABLE_INDEX_OUT_OF_RANGE' : 0x6A,\
+ 'EMBER_INVALID_BINDING_INDEX' : 0x6C,\
+ 'EMBER_INVALID_CALL' : 0x70,\
+ 'EMBER_COST_NOT_KNOWN' : 0x71,\
+ 'EMBER_MAX_MESSAGE_LIMIT_REACHED' : 0x72,\
+ 'EMBER_MESSAGE_TOO_LONG' : 0x74,\
+ 'EMBER_BINDING_IS_ACTIVE' : 0x75,\
+ 'EMBER_ADDRESS_TABLE_ENTRY_IS_ACTIVE' : 0x76,\
+ 'EMBER_ADC_CONVERSION_DONE' : 0x80,\
+ 'EMBER_ADC_CONVERSION_BUSY' : 0x81,\
+ 'EMBER_ADC_CONVERSION_DEFERRED' : 0x82,\
+ 'EMBER_ADC_NO_CONVERSION_PENDING' : 0x84,\
+ 'EMBER_SLEEP_INTERRUPTED' : 0x85,\
+ 'EMBER_PHY_TX_UNDERFLOW' : 0x88,\
+ 'EMBER_PHY_TX_INCOMPLETE' : 0x89,\
+ 'EMBER_PHY_INVALID_CHANNEL' : 0x8A,\
+ 'EMBER_PHY_INVALID_POWER' : 0x8B,\
+ 'EMBER_PHY_TX_BUSY' : 0x8C,\
+ 'EMBER_PHY_UNKNOWN_RADIO_TYPE' : 0x8D,\
+ 'EMBER_PHY_OSCILLATOR_CHECK_FAILED' : 0x8E,\
+ 'EMBER_PHY_PARTIAL_PACKET' : 0x8F,\
+ 'EMBER_NETWORK_UP' : 0x90,\
+ 'EMBER_NETWORK_DOWN' : 0x91,\
+ 'EMBER_JOIN_FAILED' : 0x94,\
+ 'EMBER_MOVE_FAILED' : 0x96,\
+ 'EMBER_CANNOT_JOIN_AS_ROUTER' : 0x98,\
+ 'EMBER_NODE_ID_CHANGED' : 0x99,\
+ 'EMBER_PAN_ID_CHANGED' : 0x9A,\
+ 'EMBER_NO_BEACONS' : 0xAB,\
+ 'EMBER_RECEIVED_KEY_IN_THE_CLEAR' : 0xAC,\
+ 'EMBER_NO_NETWORK_KEY_RECEIVED' : 0xAD,\
+ 'EMBER_NO_LINK_KEY_RECEIVED' : 0xAE,\
+ 'EMBER_PRECONFIGURED_KEY_REQUIRED' : 0xAF,\
+ 'EMBER_NOT_JOINED' : 0x93,\
+ 'EMBER_INVALID_SECURITY_LEVEL' : 0x95,\
+ 'EMBER_NETWORK_BUSY' : 0xA1,\
+ 'EMBER_INVALID_ENDPOINT' : 0xA3,\
+ 'EMBER_BINDING_HAS_CHANGED' : 0xA4,\
+ 'EMBER_INSUFFICIENT_RANDOM_DATA' : 0xA5,\
+ 'EMBER_APS_ENCRYPTION_ERROR' : 0xA6,\
+ 'EMBER_TRUST_CENTER_MASTER_KEY_NOT_SET' : 0xA7,\
+ 'EMBER_SECURITY_STATE_NOT_SET' : 0xA8,\
+ 'EMBER_KEY_TABLE_INVALID_ADDRESS' : 0xB3,\
+ 'EMBER_SECURITY_CONFIGURATION_INVALID' : 0xB7,\
+ 'EMBER_TOO_SOON_FOR_SWITCH_KEY' : 0xB8,\
+ 'EMBER_KEY_NOT_AUTHORIZED' : 0xBB,\
+ 'EMBER_SOURCE_ROUTE_FAILURE' : 0xA9,\
+ 'EMBER_MANY_TO_ONE_ROUTE_FAILURE' : 0xAA,\
+ 'EMBER_STACK_AND_HARDWARE_MISMATCH' : 0xB0,\
+ 'EMBER_APPLICATION_ERROR_0' : 0xF0,\
+ 'EMBER_APPLICATION_ERROR_1' : 0xF1,\
+ 'EMBER_APPLICATION_ERROR_2' : 0xF2,\
+ 'EMBER_APPLICATION_ERROR_3' : 0xF3,\
+ 'EMBER_APPLICATION_ERROR_4' : 0xF4,\
+ 'EMBER_APPLICATION_ERROR_5' : 0xF5,\
+ 'EMBER_APPLICATION_ERROR_6' : 0xF6,\
+ 'EMBER_APPLICATION_ERROR_7' : 0xF7,\
+ 'EMBER_APPLICATION_ERROR_8' : 0xF8,\
+ 'EMBER_APPLICATION_ERROR_9' : 0xF9,\
+ 'EMBER_APPLICATION_ERROR_10' : 0xFA,\
+ 'EMBER_APPLICATION_ERROR_11' : 0xFB,\
+ 'EMBER_APPLICATION_ERROR_12' : 0xFC,\
+ 'EMBER_APPLICATION_ERROR_13' : 0xFD,\
+ 'EMBER_APPLICATION_ERROR_14' : 0xFE,\
+ 'EMBER_APPLICATION_ERROR_15' : 0xFF,\
+}
+ember_status_rev = {}
+for tid,num in ember_status.items():
+ ember_status_rev[num] = tid
+
+
+# EmberEventUnits
+EMBER_EVENT_INACTIVE = 0x00
+EMBER_EVENT_MS_TIME = 0x01
+EMBER_EVENT_QS_TIME = 0x02
+EMBER_EVENT_MINUTE_TIME = 0x03
+ember_event_units = {\
+ 'EMBER_EVENT_INACTIVE' : 0x00,\
+ 'EMBER_EVENT_MS_TIME' : 0x01,\
+ 'EMBER_EVENT_QS_TIME' : 0x02,\
+ 'EMBER_EVENT_MINUTE_TIME' : 0x03,\
+}
+ember_event_units_rev = {}
+for tid,num in ember_event_units.items():
+ ember_event_units_rev[num] = tid
+
+
+# EmberNodeType
+EMBER_UNKNOWN_DEVICE = 0x00
+EMBER_COORDINATOR = 0x01
+EMBER_ROUTER = 0x02
+EMBER_END_DEVICE = 0x03
+EMBER_SLEEPY_END_DEVICE = 0x04
+EMBER_MOBILE_END_DEVICE = 0x05
+ember_node_type = {\
+ 'EMBER_UNKNOWN_DEVICE' : 0x00,\
+ 'EMBER_COORDINATOR' : 0x01,\
+ 'EMBER_ROUTER' : 0x02,\
+ 'EMBER_END_DEVICE' : 0x03,\
+ 'EMBER_SLEEPY_END_DEVICE' : 0x04,\
+ 'EMBER_MOBILE_END_DEVICE' : 0x05 ,\
+}
+ember_node_type_rev = {}
+for tid,num in ember_node_type.items():
+ ember_node_type_rev[num] = tid
+
+
+# EmberNetworkStatus
+EMBER_NO_NETWORK = 0x00
+EMBER_JOINING_NETWORK = 0x01
+EMBER_JOINED_NETWORK = 0x02
+EMBER_JOINED_NETWORK_NO_PARENT = 0x03
+EMBER_LEAVING_NETWORK = 0x04
+ember_network_status = {\
+ 'EMBER_NO_NETWORK' : 0x00,\
+ 'EMBER_JOINING_NETWORK' : 0x01,\
+ 'EMBER_JOINED_NETWORK' : 0x02,\
+ 'EMBER_JOINED_NETWORK_NO_PARENT' : 0x03,\
+ 'EMBER_LEAVING_NETWORK' : 0x04 ,\
+}
+ember_network_status_rev = {}
+for tid,num in ember_network_status.items():
+ ember_network_status_rev[num] = tid
+
+
+# EmberIncomingMessageType
+EMBER_INCOMING_UNICAST = 0x00
+EMBER_INCOMING_UNICAST_REPLY = 0x01
+EMBER_INCOMING_MULTICAST = 0x02
+EMBER_INCOMING_MULTICAST_LOOPBACK = 0x03
+EMBER_INCOMING_BROADCAST = 0x04
+EMBER_INCOMING_BROADCAST_LOOPBACK = 0x05
+EMBER_INCOMING_MANY_TO_ONE_ROUTE_REQUEST = 0x06
+ember_incoming_message_type = {\
+ 'EMBER_INCOMING_UNICAST' : 0x00,\
+ 'EMBER_INCOMING_UNICAST_REPLY' : 0x01,\
+ 'EMBER_INCOMING_MULTICAST' : 0x02,\
+ 'EMBER_INCOMING_MULTICAST_LOOPBACK' : 0x03,\
+ 'EMBER_INCOMING_BROADCAST' : 0x04,\
+ 'EMBER_INCOMING_BROADCAST_LOOPBACK' : 0x05,\
+ 'EMBER_INCOMING_MANY_TO_ONE_ROUTE_REQUEST' : 0x06,\
+}
+ember_incoming_message_type_rev = {}
+for tid,num in ember_incoming_message_type.items():
+ ember_incoming_message_type_rev[num] = tid
+
+
+# EmberOutgoingMessageType
+EMBER_OUTGOING_DIRECT = 0x00
+EMBER_OUTGOING_VIA_ADDRESS_TABLE = 0x01
+EMBER_OUTGOING_VIA_BINDING = 0x02
+EMBER_OUTGOING_MULTICAST = 0x03
+EMBER_OUTGOING_BROADCAST = 0x04
+ember_outgoing_message_type = {\
+ 'EMBER_OUTGOING_DIRECT' : 0x00,\
+ 'EMBER_OUTGOING_VIA_ADDRESS_TABLE' : 0x01,\
+ 'EMBER_OUTGOING_VIA_BINDING' : 0x02,\
+ 'EMBER_OUTGOING_MULTICAST' : 0x03,\
+ 'EMBER_OUTGOING_BROADCAST' : 0x04,\
+}
+ember_outgoing_message_type_rev = {}
+for tid,num in ember_outgoing_message_type.items():
+ ember_outgoing_message_type_rev[num] = tid
+
+
+# EmberMacPassthroughType
+EMBER_MAC_PASSTHROUGH_NONE = 0x00
+EMBER_MAC_PASSTHROUGH_SE_INTERPAN = 0x01
+EMBER_MAC_PASSTHROUGH_EMBERNET = 0x02
+EMBER_MAC_PASSTHROUGH_EMBERNET_SOURCE = 0x04
+ember_mac_passthrough_type = {\
+ 'EMBER_MAC_PASSTHROUGH_NONE' : 0x00,\
+ 'EMBER_MAC_PASSTHROUGH_SE_INTERPAN' : 0x01,\
+ 'EMBER_MAC_PASSTHROUGH_EMBERNET' : 0x02,\
+ 'EMBER_MAC_PASSTHROUGH_EMBERNET_SOURCE' : 0x04,\
+}
+ember_mac_passthrough_type_rev = {}
+for tid,num in ember_mac_passthrough_type.items():
+ ember_mac_passthrough_type_rev[num] = tid
+
+
+# EmberBindingType
+EMBER_UNUSED_BINDING = 0x00
+EMBER_UNICAST_BINDING = 0x01
+EMBER_MANY_TO_ONE_BINDING = 0x02
+EMBER_MULTICAST_BINDING = 0x03
+ember_binding_type = {\
+ 'EMBER_UNUSED_BINDING' : 0x00,\
+ 'EMBER_UNICAST_BINDING' : 0x01,\
+ 'EMBER_MANY_TO_ONE_BINDING' : 0x02,\
+ 'EMBER_MULTICAST_BINDING' : 0x03,\
+}
+ember_binding_type_rev = {}
+for tid,num in ember_binding_type.items():
+ ember_binding_type_rev[num] = tid
+
+
+# EmberApsOption
+EMBER_APS_OPTION_NONE = 0x0000
+EMBER_APS_OPTION_ENCRYPTION = 0x0020
+EMBER_APS_OPTION_RETRY = 0x0040
+EMBER_APS_OPTION_ENABLE_ROUTE_DISCOVERY = 0x0100
+EMBER_APS_OPTION_FORCE_ROUTE_DISCOVERY = 0x0200
+EMBER_APS_OPTION_SOURCE_EUI64 = 0x0400
+EMBER_APS_OPTION_DESTINATION_EUI64 = 0x0800
+EMBER_APS_OPTION_ENABLE_ADDRESS_DISCOVERY = 0x1000
+EMBER_APS_OPTION_POLL_RESPONSE = 0x2000
+EMBER_APS_OPTION_FRAGMENT = 0x8000
+ember_aps_options = {\
+ 'EMBER_APS_OPTION_NONE' : 0x0000,\
+ 'EMBER_APS_OPTION_ENCRYPTION' : 0x0020,\
+ 'EMBER_APS_OPTION_RETRY' : 0x0040,\
+ 'EMBER_APS_OPTION_ENABLE_ROUTE_DISCOVERY' : 0x0100,\
+ 'EMBER_APS_OPTION_FORCE_ROUTE_DISCOVERY' : 0x0200,\
+ 'EMBER_APS_OPTION_SOURCE_EUI64' : 0x0400,\
+ 'EMBER_APS_OPTION_DESTINATION_EUI64' : 0x0800,\
+ 'EMBER_APS_OPTION_ENABLE_ADDRESS_DISCOVERY' : 0x1000,\
+ 'EMBER_APS_OPTION_POLL_RESPONSE' : 0x2000,\
+ 'EMBER_APS_OPTION_FRAGMENT' : 0x8000,\
+}
+ember_aps_options_rev = {}
+for tid,num in ember_aps_options.items():
+ ember_aps_options_rev[num] = tid
+
+
+# EzspNetworkScanType
+EZSP_ENERGY_SCAN = 0x00
+EZSP_ACTIVE_SCAN = 0x01
+EZSP_UNUSED_PAN_ID_SCAN = 0x02
+EZSP_NEXT_JOINABLE_NETWORK_SCAN = 0x03
+ezsp_network_scan_type = {\
+ 'EZSP_ENERGY_SCAN' : 0x00,\
+ 'EZSP_ACTIVE_SCAN' : 0x01,\
+ 'EZSP_UNUSED_PAN_ID_SCAN' : 0x02,\
+ 'EZSP_NEXT_JOINABLE_NETWORK_SCAN' : 0x03,\
+}
+ezsp_network_scan_type_rev = {}
+for tid,num in ezsp_network_scan_type.items():
+ ezsp_network_scan_type_rev[num] = tid
+
+
+# EmberJoinDecision
+EMBER_USE_PRECONFIGURED_KEY = 0x00
+EMBER_SEND_KEY_IN_THE_CLEAR = 0x01
+EMBER_DENY_JOIN = 0x02
+EMBER_NO_ACTION = 0x03
+ember_join_decision = {\
+ 'EMBER_USE_PRECONFIGURED_KEY' : 0x00,\
+ 'EMBER_SEND_KEY_IN_THE_CLEAR' : 0x01,\
+ 'EMBER_DENY_JOIN' : 0x02,\
+ 'EMBER_NO_ACTION' : 0x03,\
+}
+ember_join_decision_rev = {}
+for tid,num in ember_join_decision.items():
+ ember_join_decision_rev[num] = tid
+
+
+# EmberInitialSecurityBitmask
+EMBER_STANDARD_SECURITY_MODE = 0x0000
+EMBER_HIGH_SECURITY_MODE = 0x0001
+EMBER_DISTRIBUTED_TRUST_CENTER_MODE = 0x0002
+EMBER_GLOBAL_LINK_KEY = 0x0004
+EMBER_PRECONFIGURED_NETWORK_KEY_MODE = 0x0008
+EMBER_TRUST_CENTER_USES_HASHED_LINK_KEY = 0x0084
+EMBER_HAVE_PRECONFIGURED_KEY = 0x0100
+EMBER_HAVE_NETWORK_KEY = 0x0200
+EMBER_GET_LINK_KEY_WHEN_JOINING = 0x0400
+EMBER_REQUIRE_ENCRYPTED_KEY = 0x0800
+ember_initial_security_bitmask = {\
+ 'EMBER_STANDARD_SECURITY_MODE' : 0x0000,\
+ 'EMBER_HIGH_SECURITY_MODE' : 0x0001,\
+ 'EMBER_DISTRIBUTED_TRUST_CENTER_MODE' : 0x0002,\
+ 'EMBER_GLOBAL_LINK_KEY' : 0x0004,\
+ 'EMBER_PRECONFIGURED_NETWORK_KEY_MODE' : 0x0008,\
+ 'EMBER_TRUST_CENTER_USES_HASHED_LINK_KEY' : 0x0084,\
+ 'EMBER_HAVE_PRECONFIGURED_KEY' : 0x0100,\
+ 'EMBER_HAVE_NETWORK_KEY' : 0x0200,\
+ 'EMBER_GET_LINK_KEY_WHEN_JOINING' : 0x0400,\
+ 'EMBER_REQUIRE_ENCRYPTED_KEY' : 0x0800,\
+}
+ember_initial_security_bitmask_rev = {}
+for tid,num in ember_initial_security_bitmask.items():
+ ember_initial_security_bitmask_rev[num] = tid
+
+
+# EmberCurrentSecurityBitmask
+EMBER_STANDARD_SECURITY_MODE = 0x0000
+EMBER_HIGH_SECURITY_MODE = 0x0001
+EMBER_DISTRIBUTED_TRUST_CENTER_MODE = 0x0002
+EMBER_GLOBAL_LINK_KEY = 0x0004
+EMBER_HAVE_TRUST_CENTER_LINK_KEY = 0x0010
+EMBER_TRUST_CENTER_USES_HASHED_LINK_KEY = 0x0084
+ember_current_security_bitmask = {\
+ 'EMBER_STANDARD_SECURITY_MODE' : 0x0000,\
+ 'EMBER_HIGH_SECURITY_MODE' : 0x0001,\
+ 'EMBER_DISTRIBUTED_TRUST_CENTER_MODE' : 0x0002,\
+ 'EMBER_GLOBAL_LINK_KEY' : 0x0004,\
+ 'EMBER_HAVE_TRUST_CENTER_LINK_KEY' : 0x0010,\
+ 'EMBER_TRUST_CENTER_USES_HASHED_LINK_KEY' : 0x0084,\
+}
+ember_current_security_bitmask_rev = {}
+for tid,num in ember_current_security_bitmask.items():
+ ember_current_security_bitmask_rev[num] = tid
+
+
+# EmberKeyType
+EMBER_TRUST_CENTER_LINK_KEY = 0x01
+EMBER_TRUST_CENTER_MASTER_KEY = 0x02
+EMBER_CURRENT_NETWORK_KEY = 0x03
+EMBER_NEXT_NETWORK_KEY = 0x04
+EMBER_APPLICATION_LINK_KEY = 0x05
+EMBER_APPLICATION_MASTER_KEY = 0x06
+ember_key_type = {\
+ 'EMBER_TRUST_CENTER_LINK_KEY' : 0x01,\
+ 'EMBER_TRUST_CENTER_MASTER_KEY' : 0x02,\
+ 'EMBER_CURRENT_NETWORK_KEY' : 0x03,\
+ 'EMBER_NEXT_NETWORK_KEY' : 0x04,\
+ 'EMBER_APPLICATION_LINK_KEY' : 0x05,\
+ 'EMBER_APPLICATION_MASTER_KEY' : 0x06,\
+}
+ember_key_type_rev = {}
+for tid,num in ember_key_type.items():
+ ember_key_type_rev[num] = tid
+
+
+# EmberKeyStructBitmask
+EMBER_KEY_HAS_SEQUENCE_NUMBER = 0x0001
+EMBER_KEY_HAS_OUTGOING_FRAME_COUNTER = 0x0002
+EMBER_KEY_HAS_INCOMING_FRAME_COUNTER = 0x0004
+EMBER_KEY_HAS_PARTNER_EUI64 = 0x0008
+ember_key_structure_bitmask = {\
+ 'EMBER_KEY_HAS_SEQUENCE_NUMBER' : 0x0001,\
+ 'EMBER_KEY_HAS_OUTGOING_FRAME_COUNTER' : 0x0002,\
+ 'EMBER_KEY_HAS_INCOMING_FRAME_COUNTER' : 0x0004,\
+ 'EMBER_KEY_HAS_PARTNER_EUI64' : 0x0008,\
+}
+ember_key_structure_bitmask_rev = {}
+for tid,num in ember_key_structure_bitmask.items():
+ ember_key_structure_bitmask_rev[num] = tid
+
+
+# EmberDeviceUpdate
+EMBER_STANDARD_SECURITY_SECURED_REJOIN = 0x0
+EMBER_STANDARD_SECURITY_UNSECURED_JOIN = 0x1
+EMBER_DEVICE_LEFT = 0x2
+EMBER_STANDARD_SECURITY_UNSECURED_REJOIN = 0x3
+EMBER_HIGH_SECURITY_SECURED_REJOIN = 0x4
+EMBER_HIGH_SECURITY_UNSECURED_JOIN = 0x5
+EMBER_HIGH_SECURITY_UNSECURED_REJOIN = 0x7
+ember_device_update = {\
+ 'EMBER_STANDARD_SECURITY_SECURED_REJOIN' : 0x0,\
+ 'EMBER_STANDARD_SECURITY_UNSECURED_JOIN' : 0x1,\
+ 'EMBER_DEVICE_LEFT' : 0x2,\
+ 'EMBER_STANDARD_SECURITY_UNSECURED_REJOIN' : 0x3,\
+ 'EMBER_HIGH_SECURITY_SECURED_REJOIN' : 0x4,\
+ 'EMBER_HIGH_SECURITY_UNSECURED_JOIN' : 0x5,\
+ 'EMBER_HIGH_SECURITY_UNSECURED_REJOIN' : 0x7,\
+}
+ember_device_update_rev = {}
+for tid,num in ember_device_update.items():
+ ember_device_update_rev[num] = tid
+
+
+# EmberKeyStatus
+EMBER_APP_LINK_KEY_ESTABLISHED = 0x01
+EMBER_APP_MASTER_KEY_ESTABLISHED = 0x02
+EMBER_TRUST_CENTER_LINK_KEY_ESTABLISHED = 0x03
+EMBER_KEY_ESTABLISHMENT_TIMEOUT = 0x04
+EMBER_KEY_TABLE_FULL = 0x05
+EMBER_TC_RESPONDED_TO_KEY_REQUEST = 0x06
+EMBER_TC_APP_KEY_SENT_TO_REQUESTER = 0x07
+EMBER_TC_RESPONSE_TO_KEY_REQUEST_FAILED = 0x08
+EMBER_TC_REQUEST_KEY_TYPE_NOT_SUPPORTED = 0x09
+EMBER_TC_NO_LINK_KEY_FOR_REQUESTER = 0x0A
+EMBER_TC_REQUESTER_EUI64_UNKNOWN = 0x0B
+EMBER_TC_RECEIVED_FIRST_APP_KEY_REQUEST = 0x0C
+EMBER_TC_TIMEOUT_WAITING_FOR_SECOND_APP_KEY_REQUEST = 0x0D
+EMBER_TC_NON_MATCHING_APP_KEY_REQUEST_RECEIVED = 0x0E
+EMBER_TC_FAILED_TO_SEND_APP_KEYS = 0x0F
+EMBER_TC_FAILED_TO_STORE_APP_KEY_REQUEST = 0x10
+EMBER_TC_REJECTED_APP_KEY_REQUEST = 0x11
+ember_key_status = {\
+ 'EMBER_APP_LINK_KEY_ESTABLISHED' : 0x01,\
+ 'EMBER_APP_MASTER_KEY_ESTABLISHED' : 0x02,\
+ 'EMBER_TRUST_CENTER_LINK_KEY_ESTABLISHED' : 0x03,\
+ 'EMBER_KEY_ESTABLISHMENT_TIMEOUT' : 0x04,\
+ 'EMBER_KEY_TABLE_FULL' : 0x05,\
+ 'EMBER_TC_RESPONDED_TO_KEY_REQUEST' : 0x06,\
+ 'EMBER_TC_APP_KEY_SENT_TO_REQUESTER' : 0x07,\
+ 'EMBER_TC_RESPONSE_TO_KEY_REQUEST_FAILED' : 0x08,\
+ 'EMBER_TC_REQUEST_KEY_TYPE_NOT_SUPPORTED' : 0x09,\
+ 'EMBER_TC_NO_LINK_KEY_FOR_REQUESTER' : 0x0A,\
+ 'EMBER_TC_REQUESTER_EUI64_UNKNOWN' : 0x0B,\
+ 'EMBER_TC_RECEIVED_FIRST_APP_KEY_REQUEST' : 0x0C,\
+ 'EMBER_TC_TIMEOUT_WAITING_FOR_SECOND_APP_KEY_REQUEST' : 0x0D,\
+ 'EMBER_TC_NON_MATCHING_APP_KEY_REQUEST_RECEIVED' : 0x0E,\
+ 'EMBER_TC_FAILED_TO_SEND_APP_KEYS' : 0x0F,\
+ 'EMBER_TC_FAILED_TO_STORE_APP_KEY_REQUEST' : 0x10,\
+ 'EMBER_TC_REJECTED_APP_KEY_REQUEST' : 0x11,\
+}
+ember_key_status_rev = {}
+for tid,num in ember_key_status.items():
+ ember_key_status_rev[num] = tid
+
+#############################
+