MicroPython implementation for Kendryte K210
Branch: master
Clone or download
Latest commit c593f64 Feb 17, 2019

README.md

MicroPython for Kendryte K210

This MicroPython port is now in beta stage. Some bugs and issues can be expected.
All standard MicroPython functionality and modules are implemented, as well as advanced thread support, file system support and display module.
Modules providing support for K210 peripherals (Pin, UART, I2C, SPI, Camera, PWM, etc) will be implemented soon


This implementation is based on MaixPy
Based on kendryte-freertos-sdk (modified to include some needed features not yet implemented) it brings many new features:

  • MicroPython core based on latest build from main Micropython repository, unchanged except for the thread support.
  • Refactored _thread module with many new features, based on my MicroPython for ESP32 _thread module
  • Full support for SPIFFS file system on internal Flash(with directories support) and Fat32 file system on external SD Card
  • Full filesystem timestamp support for both SPIFFS and Fat32
  • ymodem module for file transfer to/from K210 board using ymodem protocol is provided
  • uhashlib and ucryptolib using K210 hardware AES are implemented
  • Display module ported from my MicroPython for ESP32 display module
  • pye, full screen file editor (as python frozen module) is provided
  • Eclipse project files included. To include it into Eclipse goto File->Import->Existing Projects into Workspace->Select root directory->[select MicroPython_K210_LoBo directory]->Finish. Rebuild index.
  • Porting most of the modules from my MicroPython for ESP32 port is planned.
  • More to come soon ...

Full Wiki pages with detailed instructions for build and usage will be available soon.


How to Build


Clone the MicroPython repository

git clone https://github.com/loboris/MicroPython_K210_LoBo.git

You can also download the repository as a zip file (using Clone or download button on the first repository page) and unpack it to some directory.
You will not be able to use git pull to update the repository, but otherwise the building process is the same.

Build the MicroPython firmware


Kendryte toolchain will be automatically downloaded and unpacked on first run of BUILD.sh script
kendryte-freertos-sdk is included in the repository

Change the working directory to MicroPython_K210_LoBo/k210-freertos.

To build the MicroPython firmware, run:

./BUILD.sh

To flush the built firmware to your K210 board, run:

./kflash.py -p /dev/ttyUSB0 -b 2000000 -t MaixPy.bin

Change /dev/ttyUSB0 to the port used to connect to the your board if needed.


I (188995) w25qxx_init: manuf_id:0xc8, device_id:0x17


 __  __              _____  __   __  _____   __     __ 
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ / 
| |\/| |   / /\ \     | |     > <   |  ___/    \   /  
| |  | |  / ____ \   _| |_   / . \  | |         | |   
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|
------------------------------------------------------

I (228135) [MAIXPY]: Stack:  min: 8065
I (232617) [MAIXPY]:  Pll0: freq: 780000000
I (237391) [MAIXPY]:  Pll1: freq: 159714285
I (242165) [MAIXPY]:   Cpu: freq: 390000000
I (246938) [MAIXPY]: Flash:   ID: [0xc8:0x17]
I (535090) [VFS_SPIFFS]: Flash VFS registered.

MaixPy-FreeRTOS by LoBo v1.0.1
------------------------------
MicroPython 76eeec7-dirty on 2019-01-24; Sipeed_board with Kendryte-K210
Type "help()" for more information.
>>> 
>>> 
>>> help('modules')
__main__          gc                ucollections      urandom
_thread           machine           ucryptolib        ure
array             math              uctypes           ustruct
binascii          micropython       uerrno            utime
board             os                uhashlib          utimeq
builtins          pye               uheapq            uzlib
cmath             re                uio               websocket
collections       sys               ujson             ymodem
display           ubinascii         uos
Plus any modules on the filesystem
>>> 
>>> import machine, uos, utime, _thread
>>> def test():
...     cnt = 0
...     machine.initleds()
...     while 1:
...         machine.setled(machine.LEDR, False)
...         machine.setled(machine.LEDB, False)
...         if (cnt % 2):
...             machine.setled(machine.LEDR, True)
...         else:
...             machine.setled(machine.LEDB, True)
...         cnt += 1
...         utime.sleep_ms(500)
...
>>> 
>>> th = _thread.start_new_thread("TestLED", test, ())
>>> _thread.list()

Total system run time: 880.221 s, Tasks run time: 880.221 s, numTasks=5
MicroPython threads:
-----------------------------------------------------------------------------------------------------
ID(handle) Proc             Name     State  Stack MaxUsed PyStack    Type Priority Run time (s)   (%)
-----------------------------------------------------------------------------------------------------
2148287848    0          TestLED   running  16016    1232    2048  PYTHON        8        0.354  0.04
2148402616    0       MainThread   running  31600    1256    4096    MAIN        8        4.000  0.45

FreeRTOS tasks running:
-------------------------------------------------------------------------------
ID(handle) Proc             Name     State MinStack Priority Run time (s)   (%)
-------------------------------------------------------------------------------
2148402616    0          mp_task   Running    30344       15        4.000  0.45
2148287848    0          TestLED     Ready    14784        8        0.354  0.04
2148355008    0             IDLE     Ready     7320        0      875.613 99.48
2148357096    1             IDLE     Ready     7416        0      880.183100.00
2148367744    1    hal_tick_task   Blocked     7432        0        0.008  0.00

>>> 
>>> 
>>> 
>>> sd = uos.VfsSDCard()
>>> uos.mount(sd, '/sd')
>>> uos.listdir('/sd')
['test1.avi', 'test.txt', 'test1.txt', 'Picture', 'Video', 'Audio', 'VideoCall', 'Money.wav', 'Wall1.raw', 'TEST_F~1.TXT', 'test_syscalls.tx
t', 'test_filesystem.txt']
>>> 
>>> uos.statvfs('/sd')
(4096, 4096, 1936436, 1925131, 1925131, 0, 0, 0, 0, 255)
>>> 
>>> import display
>>> tft = display.TFT()
>>> tft.init(0)
>>> tft.circle(160,120,80,tft.RED,tft.BLUE)
>>> tft.image(0,0,'/flash/test1.jpg')
>>> 
>>> import micropython, gc
>>> gc.collect()
>>> micropython.mem_info()
mem: total=37414, current=5122, peak=6688
stack: 1004
GC: total: 3121280, used: 1504, free: 3119776
 No. of 1-blocks: 25, 2-blocks: 4, max blk sz: 6, max free sz: 97351
>>>