Showing posts with label Ubuntu. Show all posts
Showing posts with label Ubuntu. Show all posts

Sunday, November 30, 2014

Spark Core without Internet and Cloud

I recently got a Spark Core. I don't find a need to connect my device to cloud. What's even more I don't want to do that. My home automation system is suppose to be cloud free. I want to make it a loose connection of Spark Core (in future Photon P0/P1) as controllers and data collectors, and Raspberry Pi as a brain device (exposing API or syncing with cloud of my choice).
First, one needs to remember that Spark is an embed device. System is linked with one's application. Every time one wants to update a program, one needs to recompile firmware (compile one's application as a compilation unit and link with the rest of firmware).

Installing firmware

The firmware repository is located here: https://github.com/spark/firmware Following instruction: https://github.com/spark/firmware#1-download-and-install-dependencies on Ubuntu means:
sudo apt-get install gcc-arm-none-eabi # wrong version
sudo apt-get install automake
sudo apt-get install dfu-util # wrong version
sudo apt-get install git
Do NOT do it at home. One needs to install gcc by:
sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded
sudo apt-get update
sudo apt-get install gcc-arm-none-eabi
More about problems with gcc for arm can be read: and dfu-util from source (a dfu-util build manual http://dfu-util.sourceforge.net/build.html):
sudo apt-get install libusb-1.0-0-dev
wget http://dfu-util.sourceforge.net/releases/dfu-util-0.8.tar.gz
tar -zxvf dfu-util-0.8.tar.gz dfu-util-0.8
cd dfu-util-0.8
./autogen.sh
# you need to have autoreconf, if error, try: sudo aptitude install dh-autoreconf
./configure
make
sudo make install
Reasons:
  • gcc-arm-none-eabi is missing nano.specs and <cctype> header file used in core-firmware/inc/spark_wiring_character.h this will cause your compilation to throw errors like this:
    4.8 arm-none-eabi-g++: error: nano.specs: No such file or directory
    
  • Ubuntu have dfu-util version 0.5, the most recent version is 0.8. In an old version running dfu-util -l will give you:
    Found DFU: [1d50:607f] devnum=0, cfg=1, intf=0, alt=0, name="UNDEFINED"
    Found DFU: [1d50:607f] devnum=0, cfg=1, intf=0, alt=1, name="UNDEFINED"
    
  • Notice "UNDEFINED". Using new version will print something more similar to:
    Found DFU: [1d50:607f] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash  /0x08000000/20*001Ka,108*001Kg" 
    Found DFU: [1d50:607f] devnum=0, cfg=1, intf=0, alt=1, name="@SPI Flash : SST25x/0x00000000/512*04Kg"
    
    But what's more, the old version is not able to flash Spark Core. Flashing and listing devices required to run it with root privilages (sudo).

Getting source

Note, that makefile for firmware assumes that all 3 projects are downloaded/cloned to the same directory: core-firmware, core-common-lib, core-communication-lib.

FDU mode

Flash it part of firmware manual requires you to put Core in FDU mode. If you wonder how DFU mode on Core looks: https://vine.co/v/MahhI1Fg7O6:

Sunday, December 22, 2013

Cross compiling from Linux x64 to Windows XP (win32)

As a staring point, I have installed:
  • mingw-w64 binutils
  • mingw-w64 gcc
  • mingw-w64 g++
On Ubuntu 13.10 this can be done through:
sudo apt-get install binutils-mingw-w64-i686 g++-mingw-w64-i686 gcc-mingw-w64-i686
Running configure tool (e.g. when compiling 3rd party libraries):
./configure --build=x86_64-pc-linux-gnu --host=i686-mingw32 --prefix=/usr/i686-w64-mingw32
make
sudo make install
Example program:
#include <iostream>

int main(int argc, char* argv[]) {
  std::cout << "Here I am - cross compiled hello world!\n";
  return 0;
}
Compiling example program:
i686-w64-mingw32-g++ main.cc -o main.exe --static
You can test on Windows XP, it works! ;-)
Notice: If one does not specify --static flag, then a following error may happen:
main.exe: error while loading shared libraries: 
  libstdc++-6.dll: cannot open shared object file: No such file or directory
This means that a libc is not installed. There are two ways to solve it, either by compiling statically or by installing libc on Windows.

Cross compiling Boost (v1.55)


One have to prepare own user-config.jam with custom compiler i686-w64-mingw32-g++. Easiest way is to copy it from Boost package:
cp tools/build/v2/user-config.jam $HOME
echo "using gcc : 4.6 : i686-w64-mingw32-g++ ;" >> $HOME/user-config.jam
Configure and prepare build:
./bootstrap.sh mingw \
  toolset=gcc-mingw \
  target-os=windows \
  address-model=32 \
  link=shared,static \
  threading=multi \
  threadapi=win32 \
  --prefix=/usr/i686-w64-mingw32
Build and install
./b2 install \
  toolset=gcc-mingw \
  target-os=windows \
  address-model=32 \
  link=shared,static \
  threading=multi \
  threadapi=win32 \
  --prefix=/usr/i686-w64-mingw32 \
  --layout=system release
Example program using Boost.Log:
#include <boost/log/trivial.hpp>

int main(int, char*[])
{
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    return 0;
}
When compiling, one has to use -lboost_thread_w32 instead of -lboost_thread also -pthread cannot be added.
Full compilation command:
i686-w64-mingw32-g++ \
  boost_log_test.cc \
  -lboost_log \
  -lboost_log_setup \
  -lboost_thread_win32 \
  -lboost_system \
  --static \
  -o boost_log_test.exe

JsonCpp(0.6.0-rc2)


JsonCpp is easy to use C++ library to read/write/parse JSON formatted files. It can be downloaded from: http://jsoncpp.sourceforge.net/. Compilation command for cmake looks like (assuming current directory is a project dir):
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_TOOLCHAIN_FILE=../win32_toolchain.cmake \
  -DCMAKE_INSTALL_PREFIX=/usr/i686-w64-mingw32 \
  -DJSONCPP_WITH_TESTS=OFF \
  -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF \
  ..
sudo make install
If you wonder what win32_toolchain.cmake is, it's a Win32 cmake toolchain configuration described here: CMake documentation about cross comilation.
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Enjoy life!