This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430Flasher compiled to run on ARM architecture

Hi,

I have compiled MSP430Flasher for ARM architecture. There are a small changes that I had to make. Because I couldn't find instructions anywhere, I will post them here. The compiled version works fine.

There are two steps: compiling libmsp430, and compiling MSP430Flasher.

For cross building I have used Debian Stretch x64.

Note: I had to add .txt to the patches, should be removed.

libmsp430

MSP430Flasher depends on library libmsp430.so. It too must be compiled for armhf architecture.

1) Download MSP Debug Stack sources: MSPDS-OPEN-SOURCE

2) Extract:

mkdir libmsp430
cd libmsp430
unzip ../slac460y.zip

3) Patch for Linux (thanks to Daniel Beer from dlbeer.co.nz):

slac460y-linux.patch.txt
diff -ur libmsp430-src-orig/DLL430_v3/src/DLL430_OldApiV3.cpp libmsp430-src/DLL430_v3/src/DLL430_OldApiV3.cpp
--- libmsp430-src-orig/DLL430_v3/src/DLL430_OldApiV3.cpp	2018-07-24 09:16:20.927974552 +1200
+++ libmsp430-src/DLL430_v3/src/DLL430_OldApiV3.cpp	2018-07-24 09:18:45.604227945 +1200
@@ -3865,7 +3865,7 @@
 #endif
 					UpdateLog.append("\n---------------------Firmware upate end--------------------------\n");
 
-					ofstream(logfile.c_str(), ios::app | ios::out) << UpdateLog;
+					std::ofstream(logfile.c_str(), ios::app | ios::out) << UpdateLog;
 				}
 			}
 
@@ -3907,7 +3907,7 @@
 #endif
 						UpdateLog.append("\n---------------------Firmware upate end--------------------------\n");
 
-						ofstream(logfile.c_str(), ios::app | ios::out) << UpdateLog;
+						std::ofstream(logfile.c_str(), ios::app | ios::out) << UpdateLog;
 					}
 				}
 			}
diff -ur libmsp430-src-orig/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp libmsp430-src/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp
--- libmsp430-src-orig/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp	2018-07-24 09:16:20.959974636 +1200
+++ libmsp430-src/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp	2018-07-24 09:49:48.189184415 +1200
@@ -52,6 +52,7 @@
 #include "WatchdogControl.h"
 #include "DeviceHandleMSP430.h"
 #include "HidUpdateManager.h"
+#include "MSP_FetFpgaHal.h"
 
 #include "Record.h"
 #include "MemoryContent.h"
diff -ur libmsp430-src-orig/Makefile libmsp430-src/Makefile
--- libmsp430-src-orig/Makefile	2018-07-24 09:16:20.763974121 +1200
+++ libmsp430-src/Makefile	2018-07-24 10:07:36.506228181 +1200
@@ -1,4 +1,5 @@
-CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden
+CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden \
+	-I/usr/include/hidapi
 
 PCH_HEADER := ./DLL430_v3/src/TI/DLL430/pch.h
 PCH_COMPILED := ./DLL430_v3/src/TI/DLL430/pch.h.gch
@@ -74,7 +75,7 @@
 	BSTATIC := -Wl,-Bstatic
 	BDYNAMIC := -Wl,-Bdynamic
 
-	HIDOBJ := $(LIBTHIRD)/hid-libusb.o
+	HIDOBJ := -lhidapi-libusb
 else
 	CXX:= clang++
 
@@ -146,8 +147,11 @@
 
 install:
 	cp $(OUTPUT) /usr/local/lib/
+	ldconfig
 
 clean:
 	$(MAKE) -C ./ThirdParty/BSL430_DLL clean
 	@for i in $(OBJS); do rm -f $$i; done
 	@rm -f $(PCH_HEADER).?ch build.log
+	rm -f $(STATICOUTPUT).a
+	rm -f $(OUTPUT)
Only in libmsp430-src-orig/ThirdParty/BSL430_DLL/BSL430_DLL: pch.h.gch
diff -ur libmsp430-src-orig/ThirdParty/BSL430_DLL/Makefile libmsp430-src/ThirdParty/BSL430_DLL/Makefile
--- libmsp430-src-orig/ThirdParty/BSL430_DLL/Makefile	2018-07-24 09:16:20.995974731 +1200
+++ libmsp430-src/ThirdParty/BSL430_DLL/Makefile	2018-07-24 10:09:28.817579798 +1200
@@ -1,4 +1,5 @@
-CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden
+CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden \
+	-I/usr/include/hidapi
 
 PCH_HEADER := ./BSL430_DLL/pch.h
 PCH_COMPILED := ./BSL430_DLL/pch.h.gch

cd libmsp430
patch -p1 < ../slac460y-linux.patch
cd ..

4) Patch for ARM:

slac460y-arm.patch.txt
diff --git a/mspflasher/libmsp430/Makefile b/mspflasher/libmsp430/Makefile
index 31e53a9..273fa10 100644
--- a/mspflasher/libmsp430/Makefile
+++ b/mspflasher/libmsp430/Makefile
@@ -1,3 +1,6 @@
+CC = arm-linux-gnueabihf-
+BIT32 = 1
+
 CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden \
 	-I/usr/include/hidapi
 
@@ -44,11 +47,10 @@ LIBDIRS := -L$(LIBTHIRD)
 
 PLATFORM := $(shell uname -s)
 ifeq ($(PLATFORM),Linux)
-	CXX:= g++
+	CXX:= $(CC)g++
 
 	ifdef BIT32
 	STATICOUTPUT := linux32
-	CXXFLAGS += -m32
 	LIBTHIRD = ./ThirdParty/lib
 	LIBDIRS = -L$(LIBTHIRD)
 	else
@@ -64,7 +66,7 @@ ifeq ($(PLATFORM),Linux)
 	LIBS += -lusb-1.0
 	endif
 
-	LIBS += -lusb-1.0 -lrt -lpthread
+	LIBS += -lrt -lpthread
 
 	ifdef BOOST_DIR
 	INCLUDES += -I$(BOOST_DIR)
@@ -143,14 +145,14 @@ $(PCH_COMPILED): $(PCH_HEADER)
 	$(CXX) -c -o $@ $< $(USE_PCH) $(CXXFLAGS) $(INCLUDES) $(DEFINES)
 
 $(BSLLIB):
-	$(MAKE) -C ./ThirdParty/BSL430_DLL
+	$(MAKE) CROSS_COMPILE=${CC} -C ./ThirdParty/BSL430_DLL
 
 install:
 	cp $(OUTPUT) /usr/local/lib/
 	ldconfig
 
 clean:
-	$(MAKE) -C ./ThirdParty/BSL430_DLL clean
+	$(MAKE) CROSS_COMPILE=${CC} -C ./ThirdParty/BSL430_DLL clean
 	@for i in $(OBJS); do rm -f $$i; done
 	@rm -f $(PCH_HEADER).?ch build.log
 	rm -f $(STATICOUTPUT).a
diff --git a/mspflasher/libmsp430/ThirdParty/BSL430_DLL/Makefile b/mspflasher/libmsp430/ThirdParty/BSL430_DLL/Makefile
index 8d845cb..a1bd522 100644
--- a/mspflasher/libmsp430/ThirdParty/BSL430_DLL/Makefile
+++ b/mspflasher/libmsp430/ThirdParty/BSL430_DLL/Makefile
@@ -1,3 +1,5 @@
+CC = arm-linux-gnueabihf-
+
 CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden \
 	-I/usr/include/hidapi
 
@@ -37,10 +39,9 @@ OUTPUT := ../lib64/libbsl430.a
 
 PLATFORM := $(shell uname -s)
 ifeq ($(PLATFORM),Linux)
-	CXX:= g++
+	CXX:= $(CC)g++
 
 	ifdef BIT32
-	CXXFLAGS += -m32
 	OUTPUT := ../lib/libbsl430.a
 	endif
 

cd libmsp430
patch -p1 < ../slac460y-arm.patch
cd ..

5) Install cross compiler:

sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

6) Install build dependencies using MultiArch:

sudo dpkg --add-architecture armhf
sudo apt-get update
sudo apt-get install libboost-system1.62-dev:armhf libboost-filesystem1.62-dev:armhf libboost-date-time1.62-dev:armhf libboost-chrono1.62-dev:arm
hf libboost-thread1.62-dev:armhf libhidapi-dev:armhf libusb-1.0-0-dev:armhf

7) Build:

cd libmsp430
make
cd ..

8) Install to ARM target:

/usr/local/lib/libmsp430.so
sudo ldconfig

9) Install dependencies on ARM target (assumes that is it also running Debian Stretch):

sudo apt-get update
sudo apt-get install libboost-system1.62.0 libboost-filesystem1.62.0 libboost-date-time1.62.0 libboost-chrono1.62.0 libboost-thread1.62.0 libhidapi-libusb0 libusb-1.0-0

MSP430Flasher

1) Download MSPFlasher-1_03_20_00-linux-installer.zip: MSP430-FLASHER

2) Unzip:

unzip MSPFlasher-1_03_20_00-linux-installer.zip

3) Run to extract the sources:

./MSPFlasher-1.3.20-linux-installer.run --mode unattended --prefix ./mspflasherfull

4) Keep only the source folder:

mv ./mspflasherfull/Source ./mspflasher
rm -r ./mspflasherfull

5) Patch mspflasher to compile for ARM and resolve some issues:

mspflasher-arm-fixes.patch.txt
diff --git a/mspflasher/mspflasher/Makefile b/mspflasher/mspflasher/Makefile
index 2289de2..a548b5f 100644
--- a/mspflasher/mspflasher/Makefile
+++ b/mspflasher/mspflasher/Makefile
@@ -1,9 +1,9 @@
-CC=g++
-CFLAGS=-std=c++0x -I./Inc -m32
-LDFLAGS=-L../ -lmsp430
+CC=arm-linux-gnueabihf-g++
+CFLAGS=-std=c++0x -I./Inc
+LDFLAGS=-L../libmsp430/ -lmsp430
 SOURCES=MSP430_Flasher.cpp Support.cpp StdUseCase.cpp
 OBJECTS=$(SOURCES:.cpp=.o)
-EXECUTABLE=../MSP430Flasher
+EXECUTABLE=./MSP430Flasher
 
 all: $(SOURCES) $(EXECUTABLE)
 	
@@ -15,4 +15,4 @@ $(EXECUTABLE): $(OBJECTS)
 
 clean:
 	rm -rf *.o
-	rm -rf ../MSP430Flasher
+	rm -rf ./MSP430Flasher
diff --git a/mspflasher/mspflasher/StdUseCase.cpp b/mspflasher/mspflasher/StdUseCase.cpp
index 81fca35..c460e6f 100644
--- a/mspflasher/mspflasher/StdUseCase.cpp
+++ b/mspflasher/mspflasher/StdUseCase.cpp
@@ -388,6 +388,10 @@ void StdUseCase_InterfaceInit(sDefOptions_t* sOpt)
         StdUseCase_Exit(EXIT_INITIALIZE, 0);
     }
 
+    // load device database
+    MSP430_LoadDeviceDb(NULL);
+    Print_N_Log(STD_MSG,"* Loaded device database.\n");
+
     // set interface speed
     if(sOpt->pcFETspeed != NULL)
     {
diff --git a/mspflasher/mspflasher/Support.cpp b/mspflasher/mspflasher/Support.cpp
index a48544b..45ee150 100644
--- a/mspflasher/mspflasher/Support.cpp
+++ b/mspflasher/mspflasher/Support.cpp
@@ -304,7 +304,7 @@ int EvaluateOptions(int argc, char* argv[], sDefOptions_t* sOpt, sRTE_t* RTE)
 	}
 
     // get parameter
-    while ((cOpt = getopt(argc, ( char**)argv, g_cAllOpts, RTE)) != EOF )
+    while ((cOpt = getopt(argc, ( char**)argv, g_cAllOpts, RTE)) != (char)EOF )
     {
         // choose code for determined parameter
         switch (cOpt)
@@ -761,7 +761,7 @@ int EvaluateOptions(int argc, char* argv[], sDefOptions_t* sOpt, sRTE_t* RTE)
     }
 
     // get additional use case specific parameters
-    while ((cOpt = getopt(argc, ( char**)argv, g_cAllOpts, RTE)) != EOF )
+    while ((cOpt = getopt(argc, ( char**)argv, g_cAllOpts, RTE)) != (char)EOF )
     {
         for(i = 0; i < g_lCountOpt; i++)                        // for every element of struct of additional parameters
         {

cd mspflasher
patch -p1 < ../mspflasher-arm-fixes.patch
cd ..

6) Build:

cd mspflasher
make
cd ..

7) Install to target:

/usr/local/bin/MSP430Flasher

**Attention** This is a public forum