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

📄 tos-bsl.in

📁 tinyos2.0版本驱动
💻 IN
📖 第 1 页 / 共 5 页
字号:
        self.SetRSTpin(1)                       #disable power        self.SetTESTpin(0)                      #disable power        self.serialport.close()    def comRxHeader(self):        """receive header and split data"""        if DEBUG > 1: sys.stderr.write("* comRxHeader()\n")        hdr = self.serialport.read(1)        if not hdr: raise BSLException("Timeout")        rxHeader = ord(hdr) & 0xf0;        rxNum    = ord(hdr) & 0x0f;        if self.protocolMode == self.MODE_BSL:            self.reqNo = 0            self.seqNo = 0            rxNum = 0        if DEBUG > 1: sys.stderr.write("* comRxHeader() OK\n")        return rxHeader, rxNum    def comRxFrame(self, rxNum):        if DEBUG > 1: sys.stderr.write("* comRxFrame()\n")        rxFrame = chr(self.DATA_FRAME | rxNum)        if DEBUG > 2: sys.stderr.write("  comRxFrame() header...\n")        rxFramedata = self.serialport.read(3)        if len(rxFramedata) != 3: raise BSLException("Timeout")        rxFrame = rxFrame + rxFramedata        if DEBUG > 3: sys.stderr.write("  comRxFrame() check header...\n")        if rxFrame[1] == chr(0) and rxFrame[2] == rxFrame[3]:   #Add. header info. correct?            rxLengthCRC = ord(rxFrame[2]) + 2       #Add CRC-Bytes to length            if DEBUG > 2: sys.stderr.write("  comRxFrame() receiving data, size: %s\n" % rxLengthCRC)            rxFramedata = self.serialport.read(rxLengthCRC)            if len(rxFramedata) != rxLengthCRC: raise BSLException("Timeout")            rxFrame = rxFrame + rxFramedata            #Check received frame:            if DEBUG > 3: sys.stderr.write("  comRxFrame() crc check\n")            #rxLength+4: Length with header but w/o CRC:            checksum = self.calcChecksum(rxFrame, ord(rxFrame[2]) + 4)            if rxFrame[ord(rxFrame[2])+4] == chr(0xff & checksum) and \               rxFrame[ord(rxFrame[2])+5] == chr(0xff & (checksum >> 8)): #Checksum correct?                #Frame received correctly (=> send next frame)                if DEBUG > 2: sys.stderr.write("* comRxFrame() OK\n")                return rxFrame            else:                if DEBUG: sys.stderr.write("  comRxFrame() Checksum wrong\n")        else:            if DEBUG: sys.stderr.write("  comRxFrame() Header corrupt %r" % rxFrame)        raise BSLException(self.ERR_COM)            #Frame has errors!    def comTxHeader(self, txHeader):        """send header"""        if DEBUG > 1: sys.stderr.write("* txHeader()\n")        self.serialport.write(txHeader)    def comTxRx(self, cmd, dataOut, length):        """Sends the command cmd with the data given in dataOut to the        microcontroller and expects either an acknowledge or a frame        with result from the microcontroller.  The results are stored        in dataIn (if not a NULL pointer is passed).        In this routine all the necessary protocol stuff is handled.        Returns zero if the function was successful."""        if DEBUG > 1: sys.stderr.write("* comTxRx()\n")        txFrame     = []        rxHeader    = 0        rxNum       = 0        dataOut = list(dataOut)     #convert to a list for simpler data fill in        #Transmitting part ----------------------------------------        #Prepare data for transmit        if (length % 2) != 0:            #/* Fill with one byte to have even number of bytes to send */            if self.protocolMode == self.MODE_BSL:                dataOut.append(0xFF)  #fill with 0xFF            else:                dataOut.append(0)     #fill with zero        txFrame = "%c%c%c%c" % (self.DATA_FRAME | self.seqNo, cmd, len(dataOut), len(dataOut))        self.reqNo = (self.seqNo + 1) % self.MAX_FRAME_COUNT        txFrame = txFrame + string.join(dataOut,'')        checksum = self.calcChecksum(txFrame, length + 4)        txFrame = txFrame + chr(checksum & 0xff)        txFrame = txFrame + chr((checksum >> 8) & 0xff)        accessAddr = (0x0212 + (checksum^0xffff)) & 0xfffe  #0x0212: Address of wCHKSUM        if self.BSLMemAccessWarning and accessAddr < self.BSL_CRITICAL_ADDR:            sys.stderr.write("WARNING: This command might change data at address %04x or %04x!\n" % (accessAddr, accessAddr + 1))        self.serialport.flushInput()                #clear receiving queue        #TODO: Check after each transmitted character,        #TODO: if microcontroller did send a character (probably a NAK!).        for c in txFrame:            self.serialport.write(c)            if DEBUG > 3: sys.stderr.write("\ttx %02x" % ord(c))            #if self.serialport.inWaiting(): break  #abort when BSL replies, probably NAK        else:            if DEBUG > 1: sys.stderr.write( "  comTxRx() transmit OK\n")        #Receiving part -------------------------------------------        rxHeader, rxNum = self.comRxHeader()        #receive header        if DEBUG > 1: sys.stderr.write("  comTxRx() rxHeader=0x%02x, rxNum=%d, seqNo=%d, reqNo=%s\n" % (rxHeader, rxNum, self.seqNo, self.reqNo))        if rxHeader == self.DATA_ACK:               #acknowledge/OK            if DEBUG > 2: sys.stderr.write("  comTxRx() DATA_ACK\n")            if rxNum == self.reqNo:                self.seqNo = self.reqNo                if DEBUG > 2: sys.stderr.write("* comTxRx() DATA_ACK OK\n")                return          #Acknowledge received correctly => next frame            raise BSLException(self.ERR_FRAME_NUMBER)        elif rxHeader == self.DATA_NAK:             #not acknowledge/error            if DEBUG > 2: sys.stderr.write("* comTxRx() DATA_NAK\n")            raise BSLException(self.ERR_RX_NAK)        elif rxHeader == self.DATA_FRAME:           #receive data            if DEBUG > 2: sys.stderr.write("* comTxRx() DATA_FRAME\n")            if rxNum == self.reqNo:                rxFrame = self.comRxFrame(rxNum)                return rxFrame            raise BSLException(self.ERR_FRAME_NUMBER)        elif rxHeader == self.CMD_FAILED:           #Frame ok, but command failed.            if DEBUG > 2: sys.stderr.write("*  comTxRx() CMD_FAILED\n")            raise BSLException(self.ERR_CMD_FAILED)        raise BSLException("Unknown header 0x%02x\nAre you downloading to RAM into an old device that requires the patch? Try option -U" % rxHeader)    def SetDTR(self, level, invert):        """Controls DTR pin (0: GND; 1: VCC; unless inverted flag is set)"""        if invert:            self.serialport.setDTR(not level)        else:            self.serialport.setDTR(level)        if self.slowmode:            time.sleep(0.040)    def SetRTS(self, level, invert):        """Controls RTS pin (0: GND; 1: VCC; unless inverted flag is set)"""        if invert:            self.serialport.setRTS(not level)        else:            self.serialport.setRTS(level)        if self.slowmode:            time.sleep(0.040)    def SetRSTpin(self, level=1):        """Controls RST/NMI pin (0: GND; 1: VCC; unless inverted flag is set)"""        if self.swapRSTTEST:            self.SetRTS(level, self.invertRST)        else:            self.SetDTR(level, self.invertRST)    def SetTESTpin(self, level=1):        """Controls TEST pin (inverted on board: 0: VCC; 1: GND; unless inverted flag is set)"""        if self.swapRSTTEST:            self.SetDTR(level, self.invertTEST)        else:            self.SetRTS(level, self.invertTEST)    def telosSetSCL(self, level):        self.serialport.setRTS(not level)    def telosSetSDA(self, level):        self.serialport.setDTR(not level)    def telosI2CStart(self):	self.telosSetSDA(1)	self.telosSetSCL(1)	self.telosSetSDA(0)    def telosI2CStop(self):	self.telosSetSDA(0)	self.telosSetSCL(1)	self.telosSetSDA(1)    def telosI2CWriteBit(self, bit):	self.telosSetSCL(0)	self.telosSetSDA(bit)        time.sleep(2e-6)	self.telosSetSCL(1)        time.sleep(1e-6)	self.telosSetSCL(0)    def telosI2CWriteByte(self, byte):        self.telosI2CWriteBit( byte & 0x80 );        self.telosI2CWriteBit( byte & 0x40 );        self.telosI2CWriteBit( byte & 0x20 );        self.telosI2CWriteBit( byte & 0x10 );        self.telosI2CWriteBit( byte & 0x08 );        self.telosI2CWriteBit( byte & 0x04 );        self.telosI2CWriteBit( byte & 0x02 );        self.telosI2CWriteBit( byte & 0x01 );        self.telosI2CWriteBit( 0 );  # "acknowledge"    def telosI2CWriteCmd(self, addr, cmdbyte):	self.telosI2CStart()        self.telosI2CWriteByte( 0x90 | (addr << 1) )	self.telosI2CWriteByte( cmdbyte )	self.telosI2CStop()    def telosBReset(self,invokeBSL=0):	# "BSL entry sequence at dedicated JTAG pins"        # rst !s0: 0 0 0 0 1 1	# tck !s1: 1 0 1 0 0 1        #   s0|s1: 1 3 1 3 2 0	# "BSL entry sequence at shared JTAG pins"        # rst !s0: 0 0 0 0 1 1	# tck !s1: 0 1 0 1 1 0        #   s0|s1: 3 1 3 1 0 2	if invokeBSL:	  self.telosI2CWriteCmd(0,1)	  self.telosI2CWriteCmd(0,3)	  self.telosI2CWriteCmd(0,1)	  self.telosI2CWriteCmd(0,3)	  self.telosI2CWriteCmd(0,2)	  self.telosI2CWriteCmd(0,0)	else:	  self.telosI2CWriteCmd(0,3)	  self.telosI2CWriteCmd(0,2)	self.telosI2CWriteCmd(0,0)        time.sleep(0.250)       #give MSP430's oscillator time to stabilize	self.serialport.flushInput()  #clear buffers    def bslReset(self, invokeBSL=0):        """Applies BSL entry sequence on RST/NMI and TEST/VPP pins        Parameters:            invokeBSL = 1: complete sequence            invokeBSL = 0: only RST/NMI pin accessed        RST is inverted twice on boot loader hardware        TEST is inverted (only once)        Need positive voltage on DTR, RTS for power-supply of hardware"""	if self.telosI2C:	  self.telosBReset(invokeBSL)	  return        if DEBUG > 1: sys.stderr.write("* bslReset(invokeBSL=%s)\n" % invokeBSL)        self.SetRSTpin(1)       #power suply        self.SetTESTpin(1)      #power suply        time.sleep(0.250)       #charge capacitor on boot loader hardware	if self.telosLatch:	  self.SetTESTpin(0)	  self.SetRSTpin(0)	  self.SetTESTpin(1)        self.SetRSTpin(0)       #RST  pin: GND        if invokeBSL:            self.SetTESTpin(1)  #TEST pin: GND            self.SetTESTpin(0)  #TEST pin: Vcc            self.SetTESTpin(1)  #TEST pin: GND            self.SetTESTpin(0)  #TEST pin: Vcc            self.SetRSTpin (1)  #RST  pin: Vcc            self.SetTESTpin(1)  #TEST pin: GND        else:            self.SetRSTpin(1)   #RST  pin: Vcc        time.sleep(0.250)       #give MSP430's oscillator time to stabilize        self.serialport.flushInput()    #clear buffers    def bslSync(self,wait=0):        """Transmits Synchronization character and expects to receive Acknowledge character        if wait is 0 it must work the first time. otherwise if wait is 1        it is retried (forever).        """        loopcnt = 5                                 #Max. tries to get synchronization        if DEBUG > 1: sys.stderr.write("* bslSync(wait=%d)\n" % wait)        while wait or loopcnt:            loopcnt = loopcnt - 1                   #count down tries            self.serialport.flushInput()            #clear input, in case a prog is running            self.serialport.write(chr(self.BSL_SYNC))   #Send synchronization byte            c = self.serialport.read(1)             #read answer            if c == chr(self.DATA_ACK):             #ACk                if DEBUG > 1: sys.stderr.write("  bslSync() OK\n")                return                              #Sync. successful            elif not c:                             #timeout                    if loopcnt > 4:                        if DEBUG > 1:                            sys.stderr.write("  bslSync() timeout, retry ...\n")                    elif loopcnt == 4:                        #nmi may have caused the first reset to be ignored, try again                        self.bslReset(0)                         self.bslReset(1)                    elif loopcnt > 0:                        if DEBUG > 1:                            sys.stderr.write("  bslSync() timeout, retry ...\n")                    else :                        if DEBUG > 1:                            sys.stderr.write("  bslSync() timeout\n")            else:                                   #garbage                if DEBUG > 1: sys.stderr.write("  bslSync() failed (0x%02x), retry ...\n" % ord(c))                                raise BSLException(self.ERR_BSL_SYNC)       #Sync. failed    def bslTxRx(self, cmd, addr, length = 0, blkout = None, wait=0):        """Transmits a command (cmd) with its parameters:        start-address (addr), length (len) and additional        data (blkout) to boot loader.        wait specified if the bsl sync should be tried once or        repeated, forever        Parameters return by boot loader are passed via blkin.        """        if DEBUG > 1: sys.stderr.write("* bslTxRx()\n")        if cmd == self.BSL_TXBLK:            #Align to even start address            if (addr % 2) != 0:

⌨️ 快捷键说明

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