I received my Carbon from Seedstudio a few months back. But, I never found time
to sit down and work on it. During FOSSASIA, in my MicroPython workshop,
Siddhesh was working to put MicroPython using Zephyr on
his Carbon. That gave me the motivation to have a look at the same after coming
back home.
What is Carbon?
Carbon is a 96Boards IoT edition compatible board, with a Cortex-M4 chip, and 512KB flash. It currently runs Zephyr, which is a Linux Foundation hosted project to build a scalable real-time operating system (RTOS).
Setup MicroPython on Carbon
To install the dependencies in Fedora:
$ sudo dnf group install "Development Tools"
$ sudo dnf install git make gcc glibc-static \
libstdc++-static python3-ply ncurses-devel \
python-yaml python2 dfu-util
The next step is to setup the Zephyr SDK. You can download the latest binary
from
here.
Then you can install it under your home directory (you don’t have to install it
system-wide). I installed it under ~/opt/zephyr-sdk-0.9 location.
Next, I had to check out the zephyr source, I cloned from
https://git.linaro.org/lite/zephyr.git repo. I also cloned MicroPython from
the official GitHub repo. I will just copy paste the next steps below.
$ source zephyr-env.sh
$ cd ~/code/git/
$ git clone https://github.com/micropython/micropython.git
$ cd micropython/zephyr
Then I created a project file for the carbon board specially, this file is
named as prj_96b_carbon.conf, and I am pasting the content below. I have
submitted the same as a patch to the upstream Micropython project. It disables
networking (otherwise you will get stuck while trying to get the REPL).
# No networking for carbon
CONFIG_NETWORKING=n
CONFIG_NET_IPV4=n
CONFIG_NET_IPV6=
Next, we have to build MicroPython as a Zephyr application.
$ make BOARD=96b_carbon
$ ls outdir/96b_carbon/
arch ext isr_tables.c lib Makefile scripts tests zephyr.hex zephyr.map zephyr.strip
boards include isr_tables.o libzephyr.a Makefile.export src zephyr.bin zephyr.lnk zephyr_prebuilt.elf
drivers isrList.bin kernel linker.cmd misc subsys zephyr.elf zephyr.lst zephyr.stat
After the build is finished, you will be able to see a zephyr.bin file in the output directory.
Uploading the fresh build to the carbon
Before anything else, I connected my Carbon board to the laptop using an USB
cable to the OTG port (remember to check the port name). Then, I had to press
the *BOOT0 button and while pressing that one, I also pressed the Reset
button. Then, left the reset button first, and then the boot0 button. If you
run the dfu-util command after this, you should be able to see some output like
below.
$ sudo dfu-util -l
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Found DFU: [0483:df11] ver=2200, devnum=14, cfg=1, intf=0, path="2-2", alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="385B38683234"
Found DFU: [0483:df11] ver=2200, devnum=14, cfg=1, intf=0, path="2-2", alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="385B38683234"
Found DFU: [0483:df11] ver=2200, devnum=14, cfg=1, intf=0, path="2-2", alt=1, name="@Option Bytes /0x1FFFC000/01*016 e", serial="385B38683234"
Found DFU: [0483:df11] ver=2200, devnum=14, cfg=1, intf=0, path="2-2", alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,03*128Kg", serial="385B38683234"
This means the board is in DFU mode. Next we flash the new application to the board.
$ sudo dfu-util -d [0483:df11] -a 0 -D outdir/96b_carbon/zephyr.bin -s 0x08000000
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
Downloading to address = 0x08000000, size = 125712
Download [=========================] 100% 125712 bytes
Download done.
File downloaded successfully
Hello World on Carbon

The hello world of the hardware land is the LED blinking code. I used the
on-board LED(s) for the same, the sample code is given below. I have now
connected the board to the UART (instead of OTG).
$ screen /dev/ttyUSB0 115200
>>>
>>> import time
>>> from machine import Pin
>>> led1 = Pin(("GPIOD",2), Pin.OUT)
>>> led2 = Pin(("GPIOB",5), Pin.OUT)
>>> while True:
... led2.low()
... led1.high()
... time.sleep(0.5)
... led2.high()
... led1.low()
... time.sleep(0.5)