From 5312c1ac9464a4c368f38efeb9f46dc474066d09 Mon Sep 17 00:00:00 2001 From: smckown Date: Tue, 2 Sep 2008 15:02:26 +0000 Subject: [PATCH] Incorporate new modular tos-bsl. --- support/make/msp/bsl.extra | 2 +- support/make/telosb.target | 2 +- tools/platforms/msp430/pybsl/TODO | 10 + .../msp430/pybsl/cp210x_rt/CP210xRuntime.lib | Bin 0 -> 2760 bytes .../msp430/pybsl/cp210x_rt/CP210xRuntimeDLL.h | 56 ++ .../msp430/pybsl/cp210x_rt/cp210xrtmodule.c | 116 +++ .../cp210xrt-0.1.cygwin-1.5.12-i686.tar.gz | Bin 0 -> 110823 bytes .../pybsl/cp210x_rt/dist/cp210xrt-0.1.tar.gz | Bin 0 -> 1384 bytes .../platforms/msp430/pybsl/cp210x_rt/setup.py | 10 + .../msp430/pybsl/cp210x_rt/test/reset.py | 21 + tools/platforms/msp430/pybsl/tos-bsl.in | 720 +++++++++++++----- tools/platforms/msp430/pybsl/tos-bsl.txt | 40 +- 12 files changed, 766 insertions(+), 211 deletions(-) create mode 100644 tools/platforms/msp430/pybsl/TODO create mode 100644 tools/platforms/msp430/pybsl/cp210x_rt/CP210xRuntime.lib create mode 100644 tools/platforms/msp430/pybsl/cp210x_rt/CP210xRuntimeDLL.h create mode 100644 tools/platforms/msp430/pybsl/cp210x_rt/cp210xrtmodule.c create mode 100644 tools/platforms/msp430/pybsl/cp210x_rt/dist/cp210xrt-0.1.cygwin-1.5.12-i686.tar.gz create mode 100644 tools/platforms/msp430/pybsl/cp210x_rt/dist/cp210xrt-0.1.tar.gz create mode 100644 tools/platforms/msp430/pybsl/cp210x_rt/setup.py create mode 100644 tools/platforms/msp430/pybsl/cp210x_rt/test/reset.py diff --git a/support/make/msp/bsl.extra b/support/make/msp/bsl.extra index 4be2e8a2..f8ad9e13 100644 --- a/support/make/msp/bsl.extra +++ b/support/make/msp/bsl.extra @@ -17,7 +17,7 @@ PROGRAM = bsl MSP_BSL ?= msp430-bsl # BSL is the comm port, can be specified as "bsl,2" when making BSL ?= auto -MSP_BSL_FLAGS ?= --telos +MSP_BSL_FLAGS ?= --device=telosa ifeq ($(BSL),auto) BSLTEST = $(shell motelist -c | perl -e '<> =~ /^[^,]+,(\S+?(\d+)[^,]*)/; print $$1;' ) diff --git a/support/make/telosb.target b/support/make/telosb.target index 697edf07..ed333efe 100644 --- a/support/make/telosb.target +++ b/support/make/telosb.target @@ -10,7 +10,7 @@ PFLAGS += -mdisable-hwmul OPTFLAGS += -O MSP_BSL ?= tos-bsl -MSP_BSL_FLAGS = --telosb +MSP_BSL_FLAGS = --device=telosb VOLUME_FILE = volumes-stm25p.xml VOLUME_ALLOCATOR ?= tos-storage-stm25p diff --git a/tools/platforms/msp430/pybsl/TODO b/tools/platforms/msp430/pybsl/TODO new file mode 100644 index 00000000..818703b2 --- /dev/null +++ b/tools/platforms/msp430/pybsl/TODO @@ -0,0 +1,10 @@ +- The python code in tos-bsl.in runs on Linux or in Cygwin but the latter + requires installation of the cp210x_rt python shim module, which is not + yet built or installed by the makefile. + +- The Cygwin/Windows code is currently not built, but untarred from a tarball. + This code is apparently from V1.5 of tos-bsl, prior to support for the + modular architecture and cp2103 additions in V1.6. This code should be + rebuilt. + +- The Binary windows version should be built from source. diff --git a/tools/platforms/msp430/pybsl/cp210x_rt/CP210xRuntime.lib b/tools/platforms/msp430/pybsl/cp210x_rt/CP210xRuntime.lib new file mode 100644 index 0000000000000000000000000000000000000000..e5d4b93af6f319346a3719793d9bd3d19e27e0b1 GIT binary patch literal 2760 zcmc&$y>HV{5I-kvLS2Taup${zp|a$w&Ib~rPMfHW>ZX>PijSeLn-~%)AysfBwyq5P z35*OK8BwPU3=GW7jQKCZo$VJpA9flA#7Xw^-TUR_s(p#4bZg8sVq;!;A#wKqpAm|l|!vqs1{(ynXYQ8q1R>ItTiO*)&7A} zc&QXh(ra|wY+q_~VJ_fBw`m$E0 z*I|I02*4l;&__cNYnG=8kB}OH6<7rhLe5v%li7gq-0k|L-v#(2Y>C#GENwuXlTe>% zCt*G@Uj_GMVxnmC7?sL1rk(R+p5yga3lfZY4rrdYT-xmbnG3`EM}Bv}0o=hV{|4aJ zIc$d@iQ!}jupj&dn+gSigdL5JN~ZrP@w#!*d%JnULcjwETDX6&ND$kNH|x5oZ>E|3 zK7M>b+&2eHdz2vAcW_yT+rW=s9vs;v5c-%h%&|=^F1ZEwVn{i#Ge!IY7z!Il&04qf zzVpTuw$vwrT&^6VeOm6KiGE2Q>`FwfRIggL=^l}4o%SULIuur5IAp7`3Q}YtVEdKu zARtSFS*)GWYGGy(34;a~lW{F%e@rh&$QQtlqtOt8Gkh;W?0NiJkP&GyH98YzE@Uy{ zs}(0j3*4-ZsasR-%hNI2%t{^enJLal9rHIk;Wm|hfNT5SpZucdM>?1BWXnE3e&Pyt zoo8q3(^M8l{K~K?>c;O(aYhfnL^egZA58J!md)yIGWiJCo6~#?=W~=!f&MQMJ7tc} tg&efbMwxK;SYn4`~?62 literal 0 HcmV?d00001 diff --git a/tools/platforms/msp430/pybsl/cp210x_rt/CP210xRuntimeDLL.h b/tools/platforms/msp430/pybsl/cp210x_rt/CP210xRuntimeDLL.h new file mode 100644 index 00000000..f6fa9a7c --- /dev/null +++ b/tools/platforms/msp430/pybsl/cp210x_rt/CP210xRuntimeDLL.h @@ -0,0 +1,56 @@ + +// The following ifdef block is the standard way of creating macros which make exporting +// from a DLL simpler. All files within this DLL are compiled with the CP210xRUNTIMEDLL_EXPORTS +// symbol defined on the command line. this symbol should not be defined on any project +// that uses this DLL. This way any other project whose source files include this file see +// CP210xRUNTIMEDLL_API functions as being imported from a DLL, wheras this DLL sees symbols +// defined with this macro as being exported. +#ifdef CP210xRUNTIMEDLL_EXPORTS +#define CP210xRUNTIMEDLL_API __declspec(dllexport) +#else +#define CP210xRUNTIMEDLL_API __declspec(dllimport) +#endif + +#define CP210x_MAX_SETUP_LENGTH 65536 + +#ifndef _CP210x_STANDARD_DEF_ +#define _CP210x_STANDARD_DEF_ +// GetDeviceVersion() return codes +#define CP210x_CP2101_VERSION 0x01 +#define CP210x_CP2102_VERSION 0x02 +#define CP210x_CP2103_VERSION 0x03 + +// Return codes +#define CP210x_SUCCESS 0x00 +#define CP210x_DEVICE_NOT_FOUND 0xFF +#define CP210x_INVALID_HANDLE 0x01 +#define CP210x_INVALID_PARAMETER 0x02 +#define CP210x_DEVICE_IO_FAILED 0x03 +#define CP210x_FUNCTION_NOT_SUPPORTED 0x04 +#define CP210x_GLOBAL_DATA_ERROR 0x05 +#define CP210x_COMMAND_FAILED 0x08 +#define CP210x_INVALID_ACCESS_TYPE 0x09 + +// Type definitions +typedef int CP210x_STATUS; +#endif /*_CP210x_STANDARD_DEF_*/ + +// Mask and Latch value bit definitions +#define CP210x_GPIO_0 0x01 +#define CP210x_GPIO_1 0x02 +#define CP210x_GPIO_2 0x04 +#define CP210x_GPIO_3 0x08 + +CP210xRUNTIMEDLL_API CP210x_STATUS WINAPI +CP210xRT_ReadLatch( HANDLE cyHandle, + LPBYTE lpbLatch); + +CP210xRUNTIMEDLL_API CP210x_STATUS WINAPI +CP210xRT_WriteLatch( HANDLE cyHandle, + BYTE bMask, + BYTE bLatch); + + +CP210xRUNTIMEDLL_API CP210x_STATUS WINAPI +CP210xRT_GetPartNumber( HANDLE cyHandle, + LPBYTE lpbPartNum); diff --git a/tools/platforms/msp430/pybsl/cp210x_rt/cp210xrtmodule.c b/tools/platforms/msp430/pybsl/cp210x_rt/cp210xrtmodule.c new file mode 100644 index 00000000..860c03d3 --- /dev/null +++ b/tools/platforms/msp430/pybsl/cp210x_rt/cp210xrtmodule.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2010, Titanium Mirror, Inc. + * All rights reserved. + * Based upon work Copyright (c) 2006-2007 by Sporian Microsystems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universität Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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 + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) 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 R. Steve McKown + */ + +#include +#include +#include +#include +#include "CP210xRuntimeDLL.h" + +typedef CP210xRUNTIMEDLL_API CP210x_STATUS WINAPI (*fn_t)(HANDLE, BYTE, BYTE); + +void* dll; +fn_t writeLatch; +PyObject* exception; + + +static PyObject* cp210xrt_writeLatch(PyObject* self, PyObject* args) +{ + int fd; + BYTE bMask; + BYTE bData; + HANDLE hDevice; + CP210x_STATUS ret; + + if (!PyArg_ParseTuple(args, "iBB", &fd, &bMask, &bData)) + return NULL; + if (!writeLatch) { + PyErr_SetString(exception, "No access to CP210xRuntime.dll"); + return NULL; + } + + hDevice = (HANDLE)get_osfhandle(fd); + if (hDevice == INVALID_HANDLE_VALUE) + { + PyErr_SetString(exception, "No access to device"); + return NULL; + } + + /* If we don't call writeLatch, then we don't core dump when we return to + * the python caller. If we do call writeLatch, the latches are set, but + * when we return return into python, perhaps the stack has been corrupted + * somehow. We get a stackdump from cygwin. + * + * Note: when we opened the handle here, via CreateFile(), then closed it + * before returning, we had no problems. + */ + ret = writeLatch(hDevice, bMask, bData); + if (ret != CP210x_SUCCESS) { + PyErr_SetString(exception, "IO Error with device"); + return NULL; + } + +#if 1 + Py_INCREF(Py_None); + return Py_None; +#else + return Py_BuildValue("i", ret); +#endif +} + + +static PyMethodDef cp210xrtMethods[] = { + { "writeLatch", cp210xrt_writeLatch, METH_VARARGS, "Set GPIO bits" }, + { NULL, NULL, 0, NULL } +}; + + +PyMODINIT_FUNC initcp210xrt(void) +{ + PyObject* m = Py_InitModule("cp210xrt", cp210xrtMethods); + exception = PyErr_NewException("cp210xrt.error", NULL, NULL); + Py_INCREF(exception); + PyModule_AddObject(m, "error", exception); + + if (!dll) { + dll = dlopen("CP210xRuntime.dll", RTLD_NOW); + if (dll) { + dlerror(); + writeLatch = (fn_t)dlsym(dll, "CP210xRT_WriteLatch"); + if (dlerror()) + writeLatch = NULL; + } + } +} + diff --git a/tools/platforms/msp430/pybsl/cp210x_rt/dist/cp210xrt-0.1.cygwin-1.5.12-i686.tar.gz b/tools/platforms/msp430/pybsl/cp210x_rt/dist/cp210xrt-0.1.cygwin-1.5.12-i686.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7c2aa956f45e0771d570015fba8ac6708c9ce5c8 GIT binary patch literal 110823 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 literal 0 HcmV?d00001 diff --git a/tools/platforms/msp430/pybsl/cp210x_rt/setup.py b/tools/platforms/msp430/pybsl/cp210x_rt/setup.py new file mode 100644 index 00000000..859bc2c5 --- /dev/null +++ b/tools/platforms/msp430/pybsl/cp210x_rt/setup.py @@ -0,0 +1,10 @@ +#!/usr/bin/python + +from distutils.core import setup, Extension + +module1 = Extension('cp210xrt', sources = ['cp210xrtmodule.c']) + +setup(name = 'cp210xrt', version = '0.1', + description = 'Interface to cp210x runtime dll', + ext_modules = [module1]) + diff --git a/tools/platforms/msp430/pybsl/cp210x_rt/test/reset.py b/tools/platforms/msp430/pybsl/cp210x_rt/test/reset.py new file mode 100644 index 00000000..3a58b1f9 --- /dev/null +++ b/tools/platforms/msp430/pybsl/cp210x_rt/test/reset.py @@ -0,0 +1,21 @@ +#!/usr/bin/python + +import sys, os, time, serial, cp210xrt; + +sys.stderr.write("os.name is %s\n" % os.name); +sys.stderr.write("sys.platform is %s\n" % sys.platform); + +serialport = serial.Serial(9, 9600, parity = serial.PARITY_EVEN, + timeout = 1000) +sys.stderr.write("using serial port %r\n" % serialport.portstr) +sys.stderr.write("serial port fd is %d\n" % serialport.fd) +#sys.stderr.write("serial port HANDLE is %d\n" % _get_osfhandle(serialport.fd)) + + +sys.stderr.write("clear bit...\n") +cp210xrt.writeLatch(serialport.fd, 0x04, 0x0) +sys.stderr.write("clear bit done\n") +time.sleep(0.250) +sys.stderr.write("set bit...\n") +cp210xrt.writeLatch(serialport.fd, 0x04, 0x04) + diff --git a/tools/platforms/msp430/pybsl/tos-bsl.in b/tools/platforms/msp430/pybsl/tos-bsl.in index ee0d4152..4cd94d86 100644 --- a/tools/platforms/msp430/pybsl/tos-bsl.in +++ b/tools/platforms/msp430/pybsl/tos-bsl.in @@ -6,11 +6,117 @@ # # fixes from Colin Domoney # -# based on the application note slas96b.pdf from Texas Instruments, Inc., +# based on the application note slaa96b.pdf from Texas Instruments, Inc., # Volker Rzehak # additional infos from slaa089a.pdf +# +# Modularization by R. Steve McKown, . +# Based upon work Copyright (c) 2006-2007 by Sporian Microsystems, Inc. +# +# +# Set and clear of digital signals +# ================================ +# +# All functions that can set or clear a digital pin or signal state do so +# relative to the assertion state of its signal. That is, setXXX(1) asserts +# signal XXX and setXXX(0) unasserts signal XXX. Asserting a signal means its +# logic value is set to that value that asserts, or activates, its condition. +# Signals may be either active high or active low, as shown in the chart below. +# +# signal -- asserted -- - unasserted - +# active --- value --- --- value --- +# state logic voltage logic voltage +# ---------------------------------------- +# high 1 Vcc 0 GND +# low 0 GND 1 VCC +# +# It is the responsibility of the setXXX functions to properly convert the +# set request into the proper output value. This provides a consistency for +# applications using the set functions, since they no longer care the manner +# in which an asserted or unasserted signal are actually represented in the +# transmission medium. +# +# +# Important information about RS-232C signals +# =========================================== +# +# RS-232C signals are active low. Confusingly, however, RS-232C physical +# drivers effectively invert the value, such that a high value, or MARK, is +# delivered over the wire as a negative voltage while a low value, or SPACE, is +# delivered as a positive voltage. By looking at an RS-232C signal on an +# oscilloscope, one might conclude that the RS-232C signals are active high for +# this reason. Here is how RS-232 breaks down: +# +# signal logical RS-232C RS-232C TTL RS-232 +# state value value name output voltage output voltage +# --------------------------------------------------------------- +# asserted 0/low SPACE +3v...+15v GND (0V) +# unasserted 1/high MARK -3v...-15v VCC +# +# Note that some RS-232 signals, notably TxD (transmit data) and RxD (receive +# data), can be idle. An idle signal is always unasserted. +# +# Using this guidance, an asserted DTR signal is logic low, is 0V in TTL RS-232 +# and +3V..15V in RS-232C. +# +# PC serial ports often break the spec and treat 0v as a logic 1/MARK instead +# of an invalid value. +# +# +# Important MSP430 signals +# ======================== +# +# The BSL protocol is entered by manipulating the RST and TCK pins on MSP430 +# uC's with dedicated JTAG pins, and by manipulating RST and TEST pins on +# MSP430 uC's with shared JTAG pins. The assertion state of TEST and TCK +# are the same, so we use the term TTCK to imply either or both of them +# simultaneously. +# +# RST and TCK are active low signals. TEST is active high. +# +# An MSP430 is reset by simplying asserting RST for a short period then +# unasserting it. +# +# The BSL mode is entered by performing this sequence of events, subject to +# timing constraints documented by TI: +# Assert RST +# Assert TTCK +# Unssert TTCK +# Assert TTCK +# Unssert RST +# Unssert TTCK +# +# +# The TI slaa096d Document +# ======================== +# +# The TI slaa096d document defines a circuit that can be used to program MSP430 +# parts using the BSL protocol. Other platforms, such as Telos, EyesIFx and +# Tinynode to name a few, also incorporate support for BSL using circuitry +# that can vary significantly from the TI schematic. +# +# The code presented in the TI document does not use a consistent methodology +# to indicate what is happening when a setXXX(n) function is called. In some +# cases, 'n' represents the assertion state, where 1=asserted and 0=unasserted. +# In other cases, 'n' represents the inverse of the assertion state. In yet +# other cases, 'n' represents the logic value of the signal on a given pin, or +# the inverse of the logic value. +# +# To improve readability and allow for modular, pluggable BSL handling, this +# code explicitly defines all setXXX(n) functions where 'n' represents the +# assertion state of the signal. In other words, when n==1 the signal is +# asserted and when n==0 the signal is unasserted. One can trivially determine +# the logic state of any signal pin by applying the current assertion state to +# the signal's active state (see the charts above). +# +# Device support +# ============== +# +# To add support for a new MSP430-based device, create a new class deriving +# from bsl_standard or one of its specializations. +# -import sys, time, string, cStringIO, struct +import sys, fcntl, time, string, cStringIO, struct sys.path.append("@tinyoslibdir@") import serial @@ -183,17 +289,20 @@ q #cpu types for "change baudrate" #use strings as ID so that they can be used in outputs too F1x = "F1x family" +F2x = "F2x family" F4x = "F4x family" #known device list deviceids = { 0xf149: F1x, + 0xf169: F1x, 0xf16c: F1x, #for telosb 0xf112: F1x, 0xf413: F4x, 0xf123: F1x, 0xf449: F4x, 0x1232: F1x, + 0xf26f: F2x, } class BSLException(Exception): @@ -266,14 +375,6 @@ class LowLevel: else: self.prolongFactor = aProlongFactor - #flags for inverted use of control pins - #used for some hardware - self.invertRST = 0 - self.invertTEST = 0 - self.swapRSTTEST = 0 - self.telosLatch = 0 - self.telosI2C = 0 - self.protocolMode = self.MODE_BSL self.BSLMemAccessWarning = 0 #Default: no warning. self.slowmode = 0 @@ -298,8 +399,7 @@ class LowLevel: timeout = self.timeout ) if DEBUG: sys.stderr.write("using serial port %r\n" % self.serialport.portstr) - self.SetRSTpin() #enable power - self.SetTESTpin() #enable power + self.bslInit() #enable power self.serialport.flushInput() self.serialport.flushOutput() @@ -310,8 +410,7 @@ class LowLevel: used in other programs. Returns zero if the function is successful.""" if DEBUG > 1: sys.stderr.write("* comDone()") - self.SetRSTpin(1) #disable power - self.SetTESTpin(0) #disable power + self.bslDone() #disable power self.serialport.close() def comRxHeader(self): @@ -437,141 +536,6 @@ class LowLevel: 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 @@ -765,6 +729,8 @@ class Memory: self.loadTIText(open(filename, "rb")) elif filename[-4:].lower() in ('.a43', '.hex'): self.loadIHex(open(filename, "rb")) + elif filename[-5:].lower() in ('.ihex'): + self.loadIHex(open(filename, "rb")) else: self.loadELF(open(filename, "rb")) @@ -874,7 +840,7 @@ class BootStrapLoader(LowLevel): continue def programBlk(self, addr, blkout, action): - """programm a memory block""" + """program a memory block""" if DEBUG > 1: sys.stderr.write("* programBlk()\n") #Check, if specified range is erased @@ -894,7 +860,7 @@ class BootStrapLoader(LowLevel): #list of tuples or lists: #segements = [ (addr1, [d0,d1,d2,...]), (addr2, [e0,e1,e2,...])] def programData(self, segments, action): - """programm or verify data""" + """program or verify data""" if DEBUG > 1: sys.stderr.write("* programData()\n") for seg in segments: currentAddr = seg.startaddress @@ -964,6 +930,19 @@ class BootStrapLoader(LowLevel): #Transmit password to get access to protected BSL functions. self.txPasswd() + def actionMainErase(self): + """Erase the main flash memory only""" + sys.stderr.write("Main Erase...\n") + sys.stderr.flush() + self.bslReset(1) #Invoke the boot loader. + self.txPasswd(self.passwd) #transmit password + for i in range(self.meraseCycles): + if i == 1: sys.stderr.write("Additional Main Erase Cycles...\n") + self.bslTxRx(self.BSL_ERASE, #Command: Segment Erase + 0xfffe, #Any address within flash memory. + 0xa504) #Required setting for main erase! + self.passwd = None #Password gets erased + def actionStartBSL(self, usepatch=1, adjsp=1, replacementBSL=None, forceBSL=0, mayuseBSL=0, speed=None, bslreset=1): """start BSL, download patch if desired and needed, adjust SP if desired""" sys.stderr.write("Invoking BSL...\n") @@ -1020,11 +999,16 @@ class BootStrapLoader(LowLevel): sys.stderr.write("Using built in BSL replacement for F4x devices\n") sys.stderr.flush() replacementBSL.loadTIText(cStringIO.StringIO(F4X_BSL)) #parse embedded BSL - else: + elif self.cpu == F1x: if DEBUG: sys.stderr.write("Using built in BSL replacement for F1x devices\n") sys.stderr.flush() replacementBSL.loadTIText(cStringIO.StringIO(F1X_BSL)) #parse embedded BSL + else: + if DEBUG: + sys.stderr.write("NO built in BSL replacement for F2x devices\n") + sys.stderr.flush() + #replacementBSL.loadTIText(cStringIO.StringIO(F1X_BSL)) #parse embedded BSL #now download the new BSL, if allowed and needed (version lower than the #the replacement) or forced @@ -1121,7 +1105,7 @@ class BootStrapLoader(LowLevel): raise BSLException, "verify without data not possible" def actionReset(self): - """perform a reset, start user programm""" + """perform a reset, start user program""" sys.stderr.write("Reset device ...\n") sys.stderr.flush() self.bslReset(0) #only reset @@ -1140,6 +1124,11 @@ class BootStrapLoader(LowLevel): 19200:[0x86e0, 0x0001], 38400:[0x87e0, 0x0002], }, + F2x: { + 9600:[0x8580, 0x0000], + 19200:[0x8b00, 0x0001], + 38400:[0x8c80, 0x0002], + }, F4x: { 9600:[0x9800, 0x0000], 19200:[0xb000, 0x0001], @@ -1175,6 +1164,342 @@ class BootStrapLoader(LowLevel): print "Device Type: 0x%04x\nBSL version: 0x%04x\n" % (family_type, bsl_version) +class bsl_standard(BootStrapLoader): + """ + This class supports the TI RS-232C programmer presented in slaa096d. + The programmer and the MSP430 being programmed are powered from power + scavenged off the DTR and RTS lines. Therefore, it is important that + DTR and RTS are asserted for some period before programming to charge + the programmer's power capacitor. Recall that an asserted RS-232 + signal generates a voltage between +3v and +15v. + + Per the documentation the signals' assertion states map as follows: + rs232.DTR -> (invert) -> msp430.RST + rs232.RTS -> (invert) -> msp430.TTCK + msp430.TTCK -> msp430.TCK + msp430.TTCK -> (invert) -> msp430.TEST + """ + def __init__(self, *args, **kargs): + BootStrapLoader.__init__(self, *args, **kargs) + + def mayuseBSL(self): + return 1 + + def speed(self): + return None + + def setRST(self, assertme): + """ + Calling setRST(1) asserts the RST signal at the msp430. Since RST + is active low, asserted=GND and unasserted=Vcc. + + Do not override this method + """ + self.lsetRST(assertme) + if (self.slowmode): + time.sleep(0.040) + + def setTTCK(self, assertme): + """ + Calling setTTCK(1) asserts TTCK. TTCK is a pseudo-signal that + acts as TCK and/or TEST. TCK is active high and TEST is active low. + + Do not override this method + """ + self.lsetTTCK(assertme) + if (self.slowmode): + time.sleep(0.040) + + def lsetRST(self, assertme): + """ rs232.DTR -> (invert) -> msp430.RST """ + self.serialport.setDTR(not assertme) + + def lsetTTCK(self, assertme): + """ rs232.RTS -> (invert) -> msp430.TTCK """ + self.serialport.setRTS(not assertme) + + def bslInit(self): + """ Initial state: RST and TTCK are unasserted """ + self.setRST(0) + self.setTTCK(0) + + def bslPrepare(self): + """ + bslInit unaserted RST and TTCK, which asserted DTR and RTS. Wait + a while to allow the programmer power cap to charge from the V+ + supplied by DTR and RTS. + """ + time.sleep(0.250) + + def bslDone(self): + """ Unasserting RST and TTCK also cuts power to the programmer """ + self.setRST(0) + self.setTTCK(0) + + def bslReset(self, invokeBSL=0): + if DEBUG > 1: sys.stderr.write("* bslReset(invokeBSL=%s)\n" % invokeBSL) + self.bslInit() + self.bslPrepare() + self.setRST(1) + if invokeBSL: + self.setTTCK(1) + self.setTTCK(0) + self.setTTCK(1) + self.setRST(0) + self.setTTCK(0) + else: + self.setRST(0) + time.sleep(0.250) # Allow MSP430 oscillator time to stabilize + self.serialport.flushInput() + + +class bsl_telosa(bsl_standard): + """ + The telosa hardware allows for programming its MSP430 via a USB port + through a USB/serial chip. The mapping of serial to uC signals differ + from the standard TI bsl hardware supported in bsl_standard. DTR from + the USB/serial chip is tied directly to TCK and RST is configured + through inverters and a type D flip-flop to help prevent spurious uC + resets. + + The signals' assertion states map as follows: + usbserial.RTS -> msp430.RST + usbserial.DTR -> msp430.TCK + + When performing a bslReset(), RST must first be asserted by clearing + the onboard flip-flop: + assert usbserial.DTR + assert usbserial.RTS + unassert usbserial.DTR + """ + def __init__(self, *args, **kargs): + bsl_standard.__init__(self, *args, **kargs) + + def lsetRST(self, assertme): + """ rs232.RTS -> msp430.RST """ + self.serialport.setRTS(assertme); + + def lsetTTCK(self, assertme): + """ rs232.DTR -> msp430.TTCK """ + self.serialport.setDTR(assertme); + + def bslPrepare(self): + """ Run the standard bslPrepare, then set the telosa flip-flop """ + bsl_standard.bslPrepare(self) + self.serialport.setDTR(1) + self.serialport.setRTS(1) + self.serialport.setDTR(0) + + +class bsl_telosb(bsl_standard): + """ + The telosb allows programming of its MSP430 via a USB port through a + USB/serial chip. It incorporates an I2C switch, whose SDA and SCL + inputs driven by the serial DTR and RTS signals. Switch outputs are + tied to the uC RST and TCK pins. + + The signals' assertion states map as follows: + usbserial.RTS -> (invert) -> I2C.SCL + usbserial.DTR -> (invert) -> I2C.SDA + """ + def __init__(self, *args, **kargs): + bsl_standard.__init__(self, *args, **kargs) + + def mayuseBSL(self): + return 0 + + def speed(self): + return 38400 + + def setSCL(self, level): + self.serialport.setRTS(not level) + + def setSDA(self, level): + self.serialport.setDTR(not level) + + def i2cStart(self): + self.setSDA(1) + self.setSCL(1) + self.setSDA(0) + + def i2cStop(self): + self.setSDA(0) + self.setSCL(1) + self.setSDA(1) + + def i2cWriteBit(self, bit): + self.setSCL(0) + self.setSDA(bit) + time.sleep(2e-6) + self.setSCL(1) + time.sleep(1e-6) + self.setSCL(0) + + def i2cWriteByte(self, byte): + self.i2cWriteBit( byte & 0x80 ); + self.i2cWriteBit( byte & 0x40 ); + self.i2cWriteBit( byte & 0x20 ); + self.i2cWriteBit( byte & 0x10 ); + self.i2cWriteBit( byte & 0x08 ); + self.i2cWriteBit( byte & 0x04 ); + self.i2cWriteBit( byte & 0x02 ); + self.i2cWriteBit( byte & 0x01 ); + self.i2cWriteBit( 0 ); # "acknowledge" + + def i2cWriteCmd(self, addr, cmdbyte): + self.i2cStart() + self.i2cWriteByte( 0x90 | (addr << 1) ) + self.i2cWriteByte( cmdbyte ) + self.i2cStop() + + def bslInit(self): + """ Not needed for telosb """ + + def bslDone(self): + """ Not needed for telosb """ + + def bslReset(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.i2cWriteCmd(0,1) + self.i2cWriteCmd(0,3) + self.i2cWriteCmd(0,1) + self.i2cWriteCmd(0,3) + self.i2cWriteCmd(0,2) + self.i2cWriteCmd(0,0) + else: + self.i2cWriteCmd(0,3) + self.i2cWriteCmd(0,2) + self.i2cWriteCmd(0,0) + time.sleep(0.250) #give MSP430's oscillator time to stabilize + self.serialport.flushInput() #clear buffers + + +class bsl_cp2103(bsl_standard): + """ + Some boards allow programming of their MSP430 via an onboard cp2103 + USB/serial chip configured such that two of its gpio pins are tied + directly to the RST and TCK pins of the uC. In this configuration the + RST and TCK signals are pulled up and the cp2103's gpio pins are + configured as open drain outputs. The gpio pins are active low and + are unasserted on power-up. + + The signals' assertion states map as follows: + usbserial.GPIO_3 -> msp430.RST + usbserial.GPIO_2 -> msp430.TCK + """ + def __init__(self, *args, **kargs): + bsl_standard.__init__(self, *args, **kargs) + self.cp2103 = None + + def mayuseBSL(self): + return 0 + + def speed(self): + return 38400 + + def lsetRST(self, assertme): + """ usbserial.GPIO_3 -> msp430.RST """ + self.cp2103.setGpio3(assertme); + + def lsetTTCK(self, assertme): + """ usbserial.GPIO_2 -> msp430.TTCK """ + self.cp2103.setGpio2(assertme); + + def bslInit(self): + if not self.cp2103: + # We can't define cp2103 until the first call to bslInit, since + # self.serialport is not instantiated until then. + self.cp2103 = cp2103_factory(self.serialport) + bsl_standard.bslInit(self) + + +GPIOBIC = 0x89f2 +GPIOBIS = 0x89f3 +GPIO_2 = 0x04 +GPIO_3 = 0x08 + +class cp2103_posix: + """ + Implements cp2103 gpio access for posix systems using ioctl() calls. + Requires a cp210x driver providing gpio control. + """ + def __init__(self, serialport): + sys.stderr.write("cp2103_posix\n") + self.fd = serialport.fd + + def setGpio2(self, assertme): + """ set not assertme to the gpio pin """ + if not self.fd: raise "connection not open" + if assertme: + fcntl.ioctl(self.fd, GPIOBIC, GPIO_2) + else: + fcntl.ioctl(self.fd, GPIOBIS, GPIO_2) + time.sleep(0.010) # no sleep = too fast + + def setGpio3(self, assertme): + """ set not assertme to the gpio pin """ + if not self.fd: raise "connection not open" + if assertme: + fcntl.ioctl(self.fd, GPIOBIC, GPIO_3) + else: + fcntl.ioctl(self.fd, GPIOBIS, GPIO_3) + time.sleep(0.010) # no sleep = too fast + + +class cp2103_cygwin: + """ + Implements cp2103 gpio access for windows cygwin systems via the + cp210x VCP and the CP210xRuntime.dll. + """ + def __init__(self, serialport): + import cp210xrt + sys.stderr.write("cp2103_cygwin\n") + self.fd = serialport.fd + + def setGpio2(self, assertme): + """ set not assertme to the gpio pin """ + import cp210xrt + if assertme: + cp210xrt.writeLatch(self.fd, GPIO_2, 0) + else: + cp210xrt.writeLatch(self.fd, GPIO_2, GPIO_2) + + def setGpio3(self, assertme): + """ set not assertme to the gpio pin """ + import cp210xrt + if assertme: + cp210xrt.writeLatch(self.fd, GPIO_3, 0) + else: + cp210xrt.writeLatch(self.fd, GPIO_3, GPIO_3) + + +def cp2103_factory(serialport): + import os; + if os.name == 'posix': + if sys.platform == 'cygwin': + return cp2103_cygwin(serialport) + else: + return cp2103_posix(serialport) + else: + raise "No cp2103 support is available for your platform." + + +def getClass(classname, modulename="__main__"): + """ Used by main() to select the appropriate bsl class based on device """ + return getattr(__import__(modulename, globals(), locals(), [classname]), + classname) + + def usage(): """print some help message""" sys.stderr.write(""" @@ -1221,22 +1546,20 @@ General options: Possible values are 9600, 19200, 38400 (default 9600) -1, --f1x Specify CPU family, in case autodetect fails + -2, --f2x Specify CPU family, in case autodetect fails -4, --f4x Specify CPU family, in case autodetect fails - --F1x and --f2x are only needed when the "change + --f1x, --f2x and --f4x are only needed when the "change baudrate" feature is used and the autodetect feature fails. If the device ID that is uploaded is known, it has precedence to the command line option. - --invert-reset Invert signal on RST pin (used for some BSL hardware) - --invert-test Invert signal on TEST/TCK pin (used for some BSL - hardware) - --swap-reset-test Swap the RST and TEST pins (used for some BSL hardware) - --telos-latch Special twiddle in BSL reset for Telos hardware - --telos-i2c DTR/RTS map via an I2C switch to TCK/RST in Telos Rev.B - --telos Implies options --invert-reset, --invert-test, - --swap-reset-test, and --telos-latch - --telosb Implies options --swap-reset-test, --telos-i2c, - --no-BSL-download, and --speed=38400 - --tmote Identical operation to --telosb + --device=device Required device. Supported devices are: + standard - Standard BSL programmer per TI specs + telosa - Telos revA and compatible boards + telosb - Telos revB and compatible boards + cp2103 - Boards using cp2103 gpio for BSL support + cp2103_old - The old cp2103 gpio format + Most settings for a device are defined within the + device specific bsl_{device} class. --no-BSL-download Do not download replacement BSL (disable automatic) --force-BSL-download Download replacement BSL even if not needed (the one in the device would have the required features) @@ -1245,6 +1568,7 @@ General options: Program Flow Specifiers: -e, --masserase Mass Erase (clear all flash memory) + -M, --mainerase Erase main flash memory only (requires --password) -E, --erasecheck Erase Check by file -p, --program Program file -v, --verify Verify by file @@ -1263,11 +1587,11 @@ Data retreiving: to redirect the output into a file. Do before exit: - -g, --go=address Start programm execution at specified address. + -g, --go=address Start program execution at specified address. This implies option --wait. -r, --reset Reset connected MSP430. Starts application. This is a normal device reset and will start - the programm that is specified in the reset + the program that is specified in the reset vector. (see also -g) -w, --wait Wait for before closing serial port. @@ -1320,7 +1644,7 @@ def main(): reset = 0 wait = 0 #wait at the end goaddr = None - bsl = BootStrapLoader() + bsl = None # now defined dynamically BootStrapLoader() toinit = [] todo = [] startaddr = None @@ -1335,21 +1659,35 @@ def main(): try: opts, args = getopt.getopt(sys.argv[1:], - "hc:P:wf:m:eEpvrg:UDudsxbITNB:S:V14", + "hc:P:wf:m:eMEpvrg:UDu:ds:xbITNB:S:V124", ["help", "comport=", "password=", "wait", "framesize=", - "erasecycles=", "masserase", "erasecheck", "program", + "erasecycles=", "masserase", "mainerase", "erasecheck", "program", "verify", "reset", "go=", "unpatched", "debug", "upload=", "download=", "size=", "hex", "bin", "intelhex", "titext", "notimeout", "bsl=", "speed=", - "bslversion", "f1x", "f4x", "invert-reset", "invert-test", - "swap-reset-test", "telos-latch", "telos-i2c", "telos", "telosb", - "tmote","no-BSL-download", "force-BSL-download", "slow"] + "bslversion", "f1x", "f2x", "f4x", "no-BSL-download", + "force-BSL-download", "slow", "device=" ] ) except getopt.GetoptError: # print help information and exit: usage() sys.exit(2) + # Get the --device setting first. If none, then use bsl_standard + for o, a in opts: + if o in ("--device", ): + # TBD: dynamically instantiate the correct bootloader class + bsl = getClass("bsl_%s" % a)() + if not bsl: + bsl = getClass("bsl_standard")() + if not callable(bsl.preparePatch): + raise BSLException("Invalid device %s\n" % a) + sys.stderr.write("Using device class %s\n" % bsl.__class__.__name__) + if callable(bsl.mayuseBSL): + mayuseBSL = bsl.mayuseBSL() + if callable(bsl.speed): + speed = bsl.speed() + for o, a in opts: if o in ("-h", "--help"): usage() @@ -1394,9 +1732,11 @@ def main(): bsl.meraseCycles = meraseCycles elif o in ("-e", "--masserase"): toinit.append(bsl.actionMassErase) #Erase Flash + elif o in ("-M", "--mainerase"): + toinit.append(bsl.actionMainErase) #Erase main Flash elif o in ("-E", "--erasecheck"): toinit.append(bsl.actionEraseCheck) #Erase Check (by file) - elif o in ("-p", "--programm"): + elif o in ("-p", "--program"): todo.append(bsl.actionProgram) #Program file elif o in ("-v", "--verify"): todo.append(bsl.actionVerify) #Verify file @@ -1456,34 +1796,14 @@ def main(): sys.stderr.write("speed must be decimal number\n") sys.exit(2) elif o in ("-1", "--f1x"): + # TBD: the cpu spec would best be defined in the device, eh? bsl.cpu = F1x + elif o in ("-2", "--f2x"): + # TBD: the cpu spec would best be defined in the device, eh? + bsl.cpu = F2x elif o in ("-4", "--f4x"): + # TBD: the cpu spec would best be defined in the device, eh? bsl.cpu = F4x - elif o in ("--invert-reset", ): - bsl.invertRST = 1 - elif o in ("--invert-test", ): - bsl.invertTEST = 1 - elif o in ("--swap-reset-test", ): - bsl.swapRSTTEST = 1 - elif o in ("--telos-latch", ): - bsl.telosLatch = 1 - elif o in ("--telos-i2c", ): - bsl.telosI2C = 1 - elif o in ("--telos", ): - bsl.invertRST = 1 - bsl.invertTEST = 1 - bsl.swapRSTTEST = 1 - bsl.telosLatch = 1 - elif o in ("--telosb", ): - bsl.swapRSTTEST = 1 - bsl.telosI2C = 1 - mayuseBSL = 0 - speed = 38400 - elif o in ("--tmote", ): - bsl.swapRSTTEST = 1 - bsl.telosI2C = 1 - mayuseBSL = 0 - speed = 38400 elif o in ("--no-BSL-download", ): mayuseBSL = 0 elif o in ("--force-BSL-download", ): @@ -1585,7 +1905,7 @@ def main(): if reset: #reset device first if desired bsl.actionReset() - if goaddr is not None: #start user programm at specified address + if goaddr is not None: #start user program at specified address bsl.actionRun(goaddr) #load PC and execute #upload datablock and output diff --git a/tools/platforms/msp430/pybsl/tos-bsl.txt b/tools/platforms/msp430/pybsl/tos-bsl.txt index 8f7c5fa4..121687b0 100644 --- a/tools/platforms/msp430/pybsl/tos-bsl.txt +++ b/tools/platforms/msp430/pybsl/tos-bsl.txt @@ -13,10 +13,16 @@ It is released under a free software license, see tos-bsl-license.txt for more details. (C) 2001-2003 Chris Liechti +(C) 2007-2010 Sporian Microsystems, Inc. and + Titanium Mirror, Inc. Features -------- +- new modular design supports multiple BSL interfacing techniques, + currently including standard serial as defined by TI, methods used by the + telosa and telosb platforms employing an FTDI usb/serial chip, and a new + open technique using the cp2103 usb/serial chip. - understands TI-Text and Intel-hex - download to Flash and/or RAM, erase, verify - reset and wait for keypress (to run a device directly from the port @@ -67,10 +73,11 @@ First the MSP430 BSL hardware is needed. An example schematics can be found in the application note "slaa96b" from TI (see references). Then this programm can be used to communicate between the PC and the MSP430 device. -The program can be started by typing "python bsl.py" in a console. Often -it works also with just "bsl.py" or "./bsl.py". +The program can be started by typing "python tos-bsl" in a console. Often +it works also with just "tos-bsl" or "./tos-bsl". -USAGE: bsl.py [options] [file] +USAGE: %s [options] [file] +Version: %s If "-" is specified as file the data is read from the stdinput. A file ending with ".txt" is considered to be in TIText format, @@ -112,19 +119,29 @@ General options: Possible values are 9600, 19200, 38400 (default 9600) -1, --f1x Specify CPU family, in case autodetect fails + -2, --f2x Specify CPU family, in case autodetect fails -4, --f4x Specify CPU family, in case autodetect fails - --F1x and --f2x are only needed when the "change + --f1x, --f2x and --f4x are only needed when the "change baudrate" feature is used and the autodetect feature fails. If the device ID that is uploaded is known, it has precedence to the command line option. - --invert-reset Invert signal on RST pin (used for some BSL hardware) - --invert-test Invert signal on TEST/TCK pin (used for some BSL - hardware) + --device=device Required device. Supported devices are: + standard - Standard BSL programmer per TI specs + telosa - Telos revA and compatible boards + telosb - Telos revB and compatible boards + cp2103 - Boards using cp2103 gpio for BSL support + cp2103_old - The old cp2103 gpio format + Most settings for a device are defined within the + device specific bsl_{device} class. + --no-BSL-download Do not download replacement BSL (disable automatic) + --force-BSL-download Download replacement BSL even if not needed (the one + in the device would have the required features) --slow Add delays when operating the conrol pins. Useful if the pins/circuit has high capacitance. Program Flow Specifiers: -e, --masserase Mass Erase (clear all flash memory) + -M, --mainerase Erase main flash memory only (requires --password) -E, --erasecheck Erase Check by file -p, --program Program file -v, --verify Verify by file @@ -143,11 +160,11 @@ Data retreiving: to redirect the output into a file. Do before exit: - -g, --go=address Start programm execution at specified address. + -g, --go=address Start program execution at specified address. This implies option --wait. -r, --reset Reset connected MSP430. Starts application. This is a normal device reset and will start - the programm that is specified in the reset + the program that is specified in the reset vector. (see also -g) -w, --wait Wait for before closing serial port. @@ -257,6 +274,11 @@ History ELF file support replacement BSLs are now internal + V1.6 + modular design uses --device option to select a communications method + support for motes using a cp2103 usb/serial chip + + References ---------- - Python: http://www.python.org -- 2.39.2