0%

Today’s weather is perfect for this party: annual summer alumni party of Wuhan University.

Alumni Me
Alumni Me

Today, I’ve got another GOOD news: our ARM Linux board based on AllWinner H3 is demonstrated successful.

1. Hardware

1.1 Appearance

Yeah, this is how OUR OWN board looks like:

LongerVisionTech H3 Board

1.2 Specifications

From the appearance, it’s NOT hard to tell the specifications:

Device Version Units
USB 2.0 2
Wired 100Mbps 1
HDMI 1.4 1
Power Adaptor 5V 1

2. Flash Armbian Debian

2.1 Armbian for AllWinner H3

Armbian provides abundant info for AllWinner H3:

2.2 Armbian for Orange Pi PC

I’m so lucky today that I tried ONLY ONE TIME and have this Debian Buster with Armbian Linux for Orange Pi PC successfully installed and run on our board. You just need to download and extract Armbian_5.91_Orangepipc_Debian_buster_next_4.19.59.img out, and have it installed by dd.

2.3 Longer Vision Technology H3 Board Test

It’s NOT hard to find out your board’s IP address

  • either from within your router
  • or boot your board with a monitor and run the command ip -c address.

Now, you should be able to SSH into your H3 baord directly as follows:

Armbian for LVT H3 Board

After you run

  • sudo apt update and sudo apt upgrade
  • sudo armbian-config

you should be able to upgrade your Debian Buster with Armbian Linux from 4.19.59-sunxi to 4.19.62-sunxi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
longervision-GT72-6QE% ssh longervision@192.168.1.96
longervision@192.168.1.96's password:
___ ____ _ ____ ____
/ _ \| _ \(_) | _ \ / ___|
| | | | |_) | | | |_) | |
| |_| | __/| | | __/| |___
\___/|_| |_| |_| \____|

Welcome to Debian Buster with Armbian Linux 4.19.62-sunxi
System load: 0.16 0.12 0.08 Up time: 6 min
Memory usage: 18 % of 460MB IP: 192.168.1.96
CPU temp: 79°C
Usage of /: 2% of 58G

Last login: Sun Aug 25 20:13:29 2019 from 192.168.1.200

3. Issues

It’s a kind of late. Let me finish this up for now ASAP.

3.1 Hardware Issues

  • ONLY 1 USB 2.0 port is working properly.
  • It’s EASY to reach the critical temperature, as showing:
Critial Temperature Reached

3.2 Features Expected

We really need a better low-cost chip to provide the support for:

  • USB 3.0
  • GigE

{% emoji smile %}

JeVois is an ARM Linux based camera module, delivered by JeVois Inc.. So far, this is the ONLY ARM Linux based camera module that I’m recommending, for its well-designed community as well as plenty of source code on Github.

1. Specifications

Clearly:

2. Getting Started with Jevois

The BEST place to start with JeVois is the following Youtube video:

I’m NOT going to repeat this step-by-step setup but move forward to the demonstration step directly.

3. Connect JeVois with Host

After having flashed JeVois’s TF card with the LATEST Linux image, we connect JeVois camera module into the laptop. This TF card will NOT mount onto the computer as a device automatically, but can be detected by lsusb as follows:

1
2
3
4
longervision-GT72-6QE% lsusb
......
Bus 001 Device 016: ID 1d6b:0102 Linux Foundation EEM Gadget
......

4. Simple Demonstration

4.1 Guvcview

Get Started Image Control Default Settings
Get Started Image Control Default Settings
Video Control Settings 640x480 Video Control Settings 640x360
Video Control Settings 640x480 Video Control Settings 640x360

4.2 JeVois Inventor

4.2.1 JeVois Tutorial

Again, a Youtube video is suggested to follow for the demonstration:

4.2.2 My Test

You can either download JeVois Inventor directly from the Official Website, or like me, build JeVois Inventor source code from scratch, based on my own QT, etc. Anyway, after JeVois Inventor has been successfully installed, it’s the time for us to test it out.

JeVois Inventor Info JeVois Inventor Parameters
JeVois Inventor Info JeVois Inventor Parameters
JeVois Inventor Console JeVois Inventor Camera
JeVois Inventor Console JeVois Inventor Camera
JeVois Inventor Config JeVois Inventor Code C++
JeVois Inventor Config JeVois Inventor Code C++
JeVois Inventor Console JeVois Inventor Camera
JeVois Inventor Code Python DNN JeVois Inventor System
JeVois Inventor Console JeVois Inventor Camera
JeVois Inventor System Export SD Card JeVois Inventor System Export SD Card Content

Being quite busy these days. Seriously, ARM board based on AllWinner H3 from my company Longer Vision is manufactured, and under test. Let’s have some fun.

{% emoji smile %}

In the end, better to listen to some music while blogging.

0. Preface

My ESP32-Cam has finally arrived today. The brand of AI Thinker has been demonstrated to be reliable.

In fact, I strictly followed randomnerdtutorials's blog ESP32-CAM Video Streaming and Face Recognition with Arduino IDE to demonstrate this low-cost video surveillance camera. So, in this blog, I ONLY enumerate some KEY POINTS that should be emphasized.

1. Connection

1.1 Schematic

ESP32-Cam can be connected to my laptop exactly the same as shown (cited directly from ESP32-CAM Video Streaming and Face Recognition with Arduino IDE).

ESP32-Cam Wiring FTDI 1

1.2 Real Connection

The real connection looks as:

ESP32-Cam Wiring FTDI

1.3 lsub

1
2
3
4
longervision-GT72-6QE% lsusb
......
Bus 001 Device 010: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
......

2. Key Points on Flashing ESP32-Cam

2.1 Code Modification

Example code CameraWebServer should be trivially modified as:

1
2
3
4
5
6
// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER

2.2 Verify/Compile and Upload

2.2.1 Verify/Compile

1
2
Sketch uses 2241942 bytes (71%) of program storage space. Maximum is 3145728 bytes.
Global variables use 52696 bytes (16%) of dynamic memory, leaving 274984 bytes for local variables. Maximum is 327680 bytes.

2.2.2 Upload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
esptool.py v2.6
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: c4:4f:33:13:32:7d
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...

Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 4102.7 kbit/s)...
Hash of data verified.
Compressed 16832 bytes to 10888...

Writing at 0x00001000... (100 %)
Wrote 16832 bytes (10888 compressed) at 0x00001000 in 1.0 seconds (effective 138.0 kbit/s)...
Hash of data verified.
Compressed 2242064 bytes to 1795627...

Writing at 0x00010000... (0 %)
Writing at 0x00014000... (1 %)
Writing at 0x00018000... (2 %)
Writing at 0x0001c000... (3 %)
Writing at 0x00020000... (4 %)
Writing at 0x00024000... (5 %)
Writing at 0x00028000... (6 %)
Writing at 0x0002c000... (7 %)
Writing at 0x00030000... (8 %)
Writing at 0x00034000... (9 %)
Writing at 0x00038000... (10 %)
Writing at 0x0003c000... (10 %)
Writing at 0x00040000... (11 %)
Writing at 0x00044000... (12 %)
Writing at 0x00048000... (13 %)
Writing at 0x0004c000... (14 %)
Writing at 0x00050000... (15 %)
Writing at 0x00054000... (16 %)
Writing at 0x00058000... (17 %)
Writing at 0x0005c000... (18 %)
Writing at 0x00060000... (19 %)
Writing at 0x00064000... (20 %)
Writing at 0x00068000... (20 %)
Writing at 0x0006c000... (21 %)
Writing at 0x00070000... (22 %)
Writing at 0x00074000... (23 %)
Writing at 0x00078000... (24 %)
Writing at 0x0007c000... (25 %)
Writing at 0x00080000... (26 %)
Writing at 0x00084000... (27 %)
Writing at 0x00088000... (28 %)
Writing at 0x0008c000... (29 %)
Writing at 0x00090000... (30 %)
Writing at 0x00094000... (30 %)
Writing at 0x00098000... (31 %)
Writing at 0x0009c000... (32 %)
Writing at 0x000a0000... (33 %)
Writing at 0x000a4000... (34 %)
Writing at 0x000a8000... (35 %)
Writing at 0x000ac000... (36 %)
Writing at 0x000b0000... (37 %)
Writing at 0x000b4000... (38 %)
Writing at 0x000b8000... (39 %)
Writing at 0x000bc000... (40 %)
Writing at 0x000c0000... (40 %)
Writing at 0x000c4000... (41 %)
Writing at 0x000c8000... (42 %)
Writing at 0x000cc000... (43 %)
Writing at 0x000d0000... (44 %)
Writing at 0x000d4000... (45 %)
Writing at 0x000d8000... (46 %)
Writing at 0x000dc000... (47 %)
Writing at 0x000e0000... (48 %)
Writing at 0x000e4000... (49 %)
Writing at 0x000e8000... (50 %)
Writing at 0x000ec000... (50 %)
Writing at 0x000f0000... (51 %)
Writing at 0x000f4000... (52 %)
Writing at 0x000f8000... (53 %)
Writing at 0x000fc000... (54 %)
Writing at 0x00100000... (55 %)
Writing at 0x00104000... (56 %)
Writing at 0x00108000... (57 %)
Writing at 0x0010c000... (58 %)
Writing at 0x00110000... (59 %)
Writing at 0x00114000... (60 %)
Writing at 0x00118000... (60 %)
Writing at 0x0011c000... (61 %)
Writing at 0x00120000... (62 %)
Writing at 0x00124000... (63 %)
Writing at 0x00128000... (64 %)
Writing at 0x0012c000... (65 %)
Writing at 0x00130000... (66 %)
Writing at 0x00134000... (67 %)
Writing at 0x00138000... (68 %)
Writing at 0x0013c000... (69 %)
Writing at 0x00140000... (70 %)
Writing at 0x00144000... (70 %)
Writing at 0x00148000... (71 %)
Writing at 0x0014c000... (72 %)
Writing at 0x00150000... (73 %)
Writing at 0x00154000... (74 %)
Writing at 0x00158000... (75 %)
Writing at 0x0015c000... (76 %)
Writing at 0x00160000... (77 %)
Writing at 0x00164000... (78 %)
Writing at 0x00168000... (79 %)
Writing at 0x0016c000... (80 %)
Writing at 0x00170000... (80 %)
Writing at 0x00174000... (81 %)
Writing at 0x00178000... (82 %)
Writing at 0x0017c000... (83 %)
Writing at 0x00180000... (84 %)
Writing at 0x00184000... (85 %)
Writing at 0x00188000... (86 %)
Writing at 0x0018c000... (87 %)
Writing at 0x00190000... (88 %)
Writing at 0x00194000... (89 %)
Writing at 0x00198000... (90 %)
Writing at 0x0019c000... (90 %)
Writing at 0x001a0000... (91 %)
Writing at 0x001a4000... (92 %)
Writing at 0x001a8000... (93 %)
Writing at 0x001ac000... (94 %)
Writing at 0x001b0000... (95 %)
Writing at 0x001b4000... (96 %)
Writing at 0x001b8000... (97 %)
Writing at 0x001bc000... (98 %)
Writing at 0x001c0000... (99 %)
Writing at 0x001c4000... (100 %)
Wrote 2242064 bytes (1795627 compressed) at 0x00010000 in 159.6 seconds (effective 112.4 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 134...

Writing at 0x00008000... (100 %)
Wrote 3072 bytes (134 compressed) at 0x00008000 in 0.0 seconds (effective 1534.2 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

2.3 Disconnect GPIO 0 from GND

Before testing the code, be sure to disconnect GPIO 0 from GND.

ESP32-Cam Disconnect

2.4 RESET ESP32-Cam Board

It’s VERY important that you open the Serial Monitor dialog to monitor the serial port. You will see the following outputs after resetting ESP32-Cam board.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1100
load:0x40078000,len:9232
load:0x40080400,len:6400
entry 0x400806a8

[E][sccb.c:154] SCCB_Write(): SCCB_Write Failed addr:0x30, reg:0xff, data:0x01, ret:-1
.........
WiFi connected
Starting web server on port: '80'
Starting stream server on port: '81'
Camera Ready! Use 'http://192.168.1.94' to connect

2.5 Video Streaming

By visiting the allocated IP address within any web browser, you’ll see the following picture:

ESP32-Cam OV2460

And you’ll notice the streaming info from serial port:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1100
load:0x40078000,len:9232
load:0x40080400,len:6400
entry 0x400806a8

[E][sccb.c:154] SCCB_Write(): SCCB_Write Failed addr:0x30, reg:0xff, data:0x01, ret:-1
.........
WiFi connected
Starting web server on port: '80'
Starting stream server on port: '81'
Camera Ready! Use 'http://192.168.1.94' to connect
MJPG: 5297B 63ms (15.9fps), AVG: 63ms (15.9fps), 0+0+0+0=0 0
MJPG: 5301B 40ms (25.0fps), AVG: 51ms (19.6fps), 0+0+0+0=0 0
MJPG: 5460B 39ms (25.6fps), AVG: 47ms (21.3fps), 0+0+0+0=0 0
MJPG: 5301B 40ms (25.0fps), AVG: 45ms (22.2fps), 0+0+0+0=0 0
MJPG: 5460B 43ms (23.3fps), AVG: 45ms (22.2fps), 0+0+0+0=0 0
MJPG: 5374B 41ms (24.4fps), AVG: 44ms (22.7fps), 0+0+0+0=0 0
MJPG: 5460B 37ms (27.0fps), AVG: 43ms (23.3fps), 0+0+0+0=0 0
MJPG: 5464B 43ms (23.3fps), AVG: 43ms (23.3fps), 0+0+0+0=0 0
MJPG: 5460B 37ms (27.0fps), AVG: 42ms (23.8fps), 0+0+0+0=0 0
MJPG: 5464B 46ms (21.7fps), AVG: 42ms (23.8fps), 0+0+0+0=0 0
MJPG: 5460B 30ms (33.3fps), AVG: 41ms (24.4fps), 0+0+0+0=0 0
MJPG: 5464B 43ms (23.3fps), AVG: 41ms (24.4fps), 0+0+0+0=0 0
MJPG: 5460B 39ms (25.6fps), AVG: 41ms (24.4fps), 0+0+0+0=0 0
MJPG: 5464B 37ms (27.0fps), AVG: 41ms (24.4fps), 0+0+0+0=0 0
MJPG: 5460B 37ms (27.0fps), AVG: 41ms (24.4fps), 0+0+0+0=0 0
......

3. Multiple Camera Streaming with Static IPs

I’m NOT going to talk about how to set up static IPs for IP cameras (well, yes, clearly, ESP32-Cam can be looked on as a low-cost video surveillance IP camera for sure). We ONLY demonstrate 4 ESP32-Cams are under streaming simultaneously with 4 statically allocated IP addresses.

We show the capturing effects FIRST:

Four ESP32-Cams Capturing

Then, we show how the cables are connected by using a power bank and an extra bread board. Here, FTDI is just used as a power adaptor to provide 5V voltage.

Four ESP32-Cams Power On
Four ESP32-Cams Cable Connection


        

噩耗传来,今晨,高中同学逝世,年仅43岁。今天是2019年8月15日,是日军投降的日子。同学经历4个月急性胰腺炎的煎熬,耗光所有家财,于北京时间早上9时11分不治。这两个神奇的时间...

难忘高中一起踢球、打麻将的日子。在球场上,他是跑不死的。而且身体肌肉比较多,所以才有两个外号:“施瓦辛格”、“周扎实”。

我的印象,他应该是我们高中班第一位走的同学。人生无常,想当年,他也是我们班第一位获得保送的同学吧?老天爷就是这样不公平。1995年,湖北省是高考前先保送,但是保送了之后还要参加高考,保送者确定必须过一本线才能进入所保送的大学就读。他心态好的出奇,保送东北大学之后就不再学习了,每天看金庸小说。高考竟然考到652?不太记得分数。总之,是一个在湖北省稳稳上清华的分数。经历了本硕连读,东大阿派的锤炼,他成功完成香港中文大学博士学位,并令人羡慕的进入珠海某大学就职,面朝大海、春暖花开的海景房,曾经令我幻想羡慕不已...可惜至今,我也没有机会去看过。

他的婚礼是在武汉办的,我是亲自参加的,他娶了一位非常漂亮的嫂子。他在婚礼上非常紧张,大概是兴奋的?夫妻对拜的时候,竟然说出“感谢娶我为妻”!这个证据确凿,每每想起,忍俊不止。

我在英国的时候,他给我介绍了一个很漂亮的女朋友。可惜缘分没有让我们走到一起。我还是通过这位已经是两个孩子的妈妈,获悉同学的病情,并立即通知高中同班同学筹款。只可惜还是...听到病危病重,真的是不敢相信自己的耳朵!确定水滴筹的照片就是他本人,已经瘦得不成人形!获悉同学病情的前三天,每天早上起床,眼睛湿润都不自知...前几年我到珠海,我们几位高中同学还吃海鲜聚会,没有见到他。没想到那次错过,就错过了一世...

这几年,见得太多了!这个社会,好像真的是:越是好人,越走得早?老天爷啊...“逢庙必拜、遇观必香”...人到中年,真的开始有点相信神佛...根本还没来得及小小欢庆几小时前首次带父母到美国小游,就...明天去列治文拜佛祈福。

我很喜欢卡拉OK,一直想要在hexo blog 加入自己原唱作为背景音乐(这也算是创新吧?),今天这篇不算是祷文的blog,纪念我同学,也算督促我完成了这个小小任务。回到家、刚刚开始check wechat,就看到这个噩耗,真的是... 这是我第一次发全民K歌,中间有跑调,我觉得没有必要修改任何!因为这就是我自己原唱,在听到消息之后,也着实情绪不能控制...

人生的意义在什么?“且行且珍惜”!珍惜身边拥有的一切吧!想起去年某台姐对我说:“看到你一家三口团聚,就感觉很幸福”。是啊...台姐本人从小姥姥带大、10岁出头一个人给姥姥送葬;而周伯伯白发人送黑发人,这...人,真的不能太“不知足”!我思想还没成熟呢!这么大了,怎么长的?太幼稚!!种地,有什么不好??

不知不觉,温哥华当地时间2019年8月15日凌晨3点20分。愿你在天堂没有痛苦...

Having been keeping an eye on Widora and Espressif for quite a bit. I finally decided to test out Widora's development board AIRV.

1. Background Knowledge

1.1 Espressif

Espressif is based in Shanghai, China, focusing on Wifi/Bluetooth chips, now have two main Wifi modules: * ESP32: Wifi with Bluetooth * ESP8266/ESP8285: Wifi ONLY

1.2 Widora

Widora is headquartered in Beijing, China, providing development boards using Espressif Wifi/Bluetooth chips.

1.3 Kendryte

NEVER heard of Kendryte before. It seems Kendryte develops some AI based on Risc-V chip architecture? That seems to be a good concept...

1.4 HiFive

As for Risc-V, HiFive developed by SiFive has to be mentioned in any case.

For me, a NOBODY has NOT had any chance or capability to deal with chips... So... shame... Anyway, let's test it out... ^_^

2. Test on Widora AIRV Face Detection

By using a RUBBISH USB cable, you should already be able to run the face detection sample code existing inside the board.

Normal Occlusion
Widora AIRV Face Detection Widora AIRV Face Detection with Occlusion

However, you really need to use a QUALIFIED Micro-B USB to USB Type A cable, in order to list the device out by lsusb.

1
2
➜  ~ lsusb
Bus 001 Device 010: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP2102/CP2109 UART Bridge Controller [CP210x family]

3. PlatformIO IDE for VSCode

PlatformIO IDE

4. Reflash Widora AIRV

Today, I got a very BAD news: one of my BEST classmates in my senior middle school has been staying in the hospital for OVER 3 months. The very serious pancreatitis has used up ALL his family's savings. That is the current Chinese medical system. Chinese people have NO 2nd choice: * either be the ruled class, who need to pay unaffordable medical service fee * or be the ruling class, who have THE RIGHT to enjoy ALL types of FREE medical service

SiFive is a NEW birth in the CHIP industry, which is based on RISC-V, started by University of California, Berkeley. I don't know where it will go, and how well it can do. But, innovation is just the right way to breakthrough the STALE ruling class.

1. Zephyr

There are plenty of popular RTOSes for MCUs with different architectures, including ARM, RISC-V, etc.

In my personal point of view: * MCUs: are based on microcontrollers, which are normally single user single thread. * SBCs: come with a true multi-user multi-threading operating system, for instance, Linux.

A detailed summary can be found on Wikipedia.

1.2 Getting Started With Zephyr

Over 150 boards are NOW supported by Zephyr, including today's leading role: HiFive1 Rev B. Let's just test out Zephyr right away.

In the following, we strictly follow Zephyr Getting Started Guide, with trivial customization.

1.2.1 Get the source code

Make sure west has been installed by pip install -U west --user, and then initialize and update Zephyr project contents as:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
➜  Zephyr pip show west
Name: west
Version: 0.6.0
Summary: Zephyr RTOS Project meta-tool
Home-page: https://github.com/zephyrproject-rtos/west
Author: Zephyr Project
Author-email: devel@lists.zephyrproject.org
License: UNKNOWN
Location: ~/.local/lib/python3.7/site-packages
Requires: PyYAML, configobj, colorama, pykwalify, setuptools
Required-by:
➜ Zephyr west init zephyrproject
=== Initializing in ....../zephyrproject
--- Cloning manifest repository from https://github.com/zephyrproject-rtos/zephyr, rev. master
Initialized empty Git repository in ....../zephyrproject/.west/manifest-tmp/.git/
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 359884 (delta 1), reused 0 (delta 0), pack-reused 359877
Receiving objects: 100% (359884/359884), 254.15 MiB | 12.49 MiB/s, done.
Resolving deltas: 100% (267566/267566), done.
From https://github.com/zephyrproject-rtos/zephyr
* branch master -> FETCH_HEAD
* [new branch] arm -> origin/arm
* [new branch] backport-14980-to-v1.14-branch -> origin/backport-14980-to-v1.14-branch
* [new branch] backport-15780-to-v1.14-branch -> origin/backport-15780-to-v1.14-branch
* [new branch] backport-17058-to-v1.14-branch -> origin/backport-17058-to-v1.14-branch
* [new branch] backport-17066-to-v1.14-branch -> origin/backport-17066-to-v1.14-branch
* [new branch] backport-17067-to-v1.14-branch -> origin/backport-17067-to-v1.14-branch
* [new branch] backport-17141-to-v1.14-branch -> origin/backport-17141-to-v1.14-branch
* [new branch] backport-17146-to-v1.14-branch -> origin/backport-17146-to-v1.14-branch
* [new branch] backport-17159-to-v1.14-branch -> origin/backport-17159-to-v1.14-branch
* [new branch] backport-17227-to-v1.14-branch -> origin/backport-17227-to-v1.14-branch
* [new branch] backport-17263-to-v1.14-branch -> origin/backport-17263-to-v1.14-branch
* [new branch] backport-17289-to-v1.14-branch -> origin/backport-17289-to-v1.14-branch
* [new branch] backport-17298-to-v1.14-branch -> origin/backport-17298-to-v1.14-branch
* [new branch] backport-17305-to-v1.14-branch -> origin/backport-17305-to-v1.14-branch
* [new branch] backport-17308-to-v1.14-branch -> origin/backport-17308-to-v1.14-branch
* [new branch] backport-17351-to-v1.14-branch -> origin/backport-17351-to-v1.14-branch
* [new branch] backport-17360-to-v1.14-branch -> origin/backport-17360-to-v1.14-branch
* [new branch] backport-17369-to-v1.14-branch -> origin/backport-17369-to-v1.14-branch
* [new branch] backport-17400-to-v1.14-branch -> origin/backport-17400-to-v1.14-branch
* [new branch] backport-17402-to-v1.14-branch -> origin/backport-17402-to-v1.14-branch
* [new branch] backport-17404-to-v1.14-branch -> origin/backport-17404-to-v1.14-branch
* [new branch] backport-17405-to-v1.14-branch -> origin/backport-17405-to-v1.14-branch
* [new branch] backport-17428-to-v1.14-branch -> origin/backport-17428-to-v1.14-branch
* [new branch] backport-17451-to-v1.14-branch -> origin/backport-17451-to-v1.14-branch
* [new branch] backport-17465-to-v1.14-branch -> origin/backport-17465-to-v1.14-branch
* [new branch] backport-17474-to-v1.14-branch -> origin/backport-17474-to-v1.14-branch
* [new branch] backport-17489-to-v1.14-branch -> origin/backport-17489-to-v1.14-branch
* [new branch] backport-17575-to-v1.14-branch -> origin/backport-17575-to-v1.14-branch
* [new branch] backport-17596-to-v1.14-branch -> origin/backport-17596-to-v1.14-branch
* [new branch] backport-17601-to-v1.14-branch -> origin/backport-17601-to-v1.14-branch
* [new branch] backport-17602-to-v1.14-branch -> origin/backport-17602-to-v1.14-branch
* [new branch] backport-17603-to-v1.14-branch -> origin/backport-17603-to-v1.14-branch
* [new branch] backport-17605-to-v1.14-branch -> origin/backport-17605-to-v1.14-branch
* [new branch] backport-17606-to-v1.14-branch -> origin/backport-17606-to-v1.14-branch
* [new branch] backport-17614-to-v1.14-branch -> origin/backport-17614-to-v1.14-branch
* [new branch] backport-17618-to-v1.14-branch -> origin/backport-17618-to-v1.14-branch
* [new branch] backport-17705-to-v1.14-branch -> origin/backport-17705-to-v1.14-branch
* [new branch] backport-17724-to-v1.14-branch -> origin/backport-17724-to-v1.14-branch
* [new branch] backport-17798-to-v1.14-branch -> origin/backport-17798-to-v1.14-branch
* [new branch] backport-17836-to-v1.14-branch -> origin/backport-17836-to-v1.14-branch
* [new branch] backport-17859-to-v1.14-branch -> origin/backport-17859-to-v1.14-branch
* [new branch] master -> origin/master
* [new branch] pull/17988/head -> origin/pull/17988/head
* [new branch] topic-EDTS -> origin/topic-EDTS
* [new branch] topic-sensors -> origin/topic-sensors
* [new branch] v1.10-branch -> origin/v1.10-branch
* [new branch] v1.11-branch -> origin/v1.11-branch
* [new branch] v1.12-branch -> origin/v1.12-branch
* [new branch] v1.13-branch -> origin/v1.13-branch
* [new branch] v1.14-branch -> origin/v1.14-branch
* [new branch] v1.5-branch -> origin/v1.5-branch
* [new branch] v1.6-branch -> origin/v1.6-branch
* [new branch] v1.7-branch -> origin/v1.7-branch
* [new branch] v1.8-branch -> origin/v1.8-branch
* [new branch] v1.9-branch -> origin/v1.9-branch
* [new tag] v1.0.0 -> v1.0.0
* [new tag] v1.1.0 -> v1.1.0
* [new tag] v1.1.0-rc1 -> v1.1.0-rc1
* [new tag] v1.10.0 -> v1.10.0
* [new tag] v1.10.0-rc1 -> v1.10.0-rc1
* [new tag] v1.10.0-rc2 -> v1.10.0-rc2
* [new tag] v1.10.0-rc3 -> v1.10.0-rc3
* [new tag] v1.11.0 -> v1.11.0
* [new tag] v1.11.0-rc1 -> v1.11.0-rc1
* [new tag] v1.11.0-rc2 -> v1.11.0-rc2
* [new tag] v1.11.0-rc3 -> v1.11.0-rc3
* [new tag] v1.12.0 -> v1.12.0
* [new tag] v1.12.0-rc1 -> v1.12.0-rc1
* [new tag] v1.12.0-rc2 -> v1.12.0-rc2
* [new tag] v1.12.0-rc3 -> v1.12.0-rc3
* [new tag] v1.13.0 -> v1.13.0
* [new tag] v1.13.0-rc1 -> v1.13.0-rc1
* [new tag] v1.13.0-rc2 -> v1.13.0-rc2
* [new tag] v1.13.0-rc3 -> v1.13.0-rc3
* [new tag] v1.14.0 -> v1.14.0
* [new tag] v1.14.0-rc1 -> v1.14.0-rc1
* [new tag] v1.14.0-rc2 -> v1.14.0-rc2
* [new tag] v1.14.0-rc3 -> v1.14.0-rc3
* [new tag] v1.14.1-rc1 -> v1.14.1-rc1
* [new tag] v1.2.0 -> v1.2.0
* [new tag] v1.2.0-rc1 -> v1.2.0-rc1
* [new tag] v1.2.0-rc2 -> v1.2.0-rc2
* [new tag] v1.3.0 -> v1.3.0
* [new tag] v1.3.0-rc1 -> v1.3.0-rc1
* [new tag] v1.3.0-rc2 -> v1.3.0-rc2
* [new tag] v1.4.0 -> v1.4.0
* [new tag] v1.4.0-rc1 -> v1.4.0-rc1
* [new tag] v1.4.0-rc2 -> v1.4.0-rc2
* [new tag] v1.4.0-rc3 -> v1.4.0-rc3
* [new tag] v1.5.0 -> v1.5.0
* [new tag] v1.5.0-rc0 -> v1.5.0-rc0
* [new tag] v1.5.0-rc1 -> v1.5.0-rc1
* [new tag] v1.5.0-rc2 -> v1.5.0-rc2
* [new tag] v1.5.0-rc3 -> v1.5.0-rc3
* [new tag] v1.5.0-rc4 -> v1.5.0-rc4
* [new tag] v1.6.0 -> v1.6.0
* [new tag] v1.6.0-rc1 -> v1.6.0-rc1
* [new tag] v1.6.0-rc2 -> v1.6.0-rc2
* [new tag] v1.6.0-rc3 -> v1.6.0-rc3
* [new tag] v1.6.0-rc4 -> v1.6.0-rc4
* [new tag] v1.6.1 -> v1.6.1
* [new tag] v1.6.1-rc -> v1.6.1-rc
* [new tag] v1.6.99 -> v1.6.99
* [new tag] v1.7.0 -> v1.7.0
* [new tag] v1.7.0-rc1 -> v1.7.0-rc1
* [new tag] v1.7.0-rc2 -> v1.7.0-rc2
* [new tag] v1.7.0-rc3 -> v1.7.0-rc3
* [new tag] v1.7.0-rc4 -> v1.7.0-rc4
* [new tag] v1.7.1 -> v1.7.1
* [new tag] v1.7.1-rc -> v1.7.1-rc
* [new tag] v1.7.99 -> v1.7.99
* [new tag] v1.8.0 -> v1.8.0
* [new tag] v1.8.0-rc1 -> v1.8.0-rc1
* [new tag] v1.8.0-rc2 -> v1.8.0-rc2
* [new tag] v1.8.0-rc3 -> v1.8.0-rc3
* [new tag] v1.8.0-rc4 -> v1.8.0-rc4
* [new tag] v1.8.99 -> v1.8.99
* [new tag] v1.9.0 -> v1.9.0
* [new tag] v1.9.0-rc1 -> v1.9.0-rc1
* [new tag] v1.9.0-rc2 -> v1.9.0-rc2
* [new tag] v1.9.0-rc3 -> v1.9.0-rc3
* [new tag] v1.9.0-rc4 -> v1.9.0-rc4
* [new tag] v1.9.1 -> v1.9.1
* [new tag] v1.9.2 -> v1.9.2
* [new tag] zephyr-v1.0.0 -> zephyr-v1.0.0
* [new tag] zephyr-v1.1.0 -> zephyr-v1.1.0
* [new tag] zephyr-v1.10.0 -> zephyr-v1.10.0
* [new tag] zephyr-v1.11.0 -> zephyr-v1.11.0
* [new tag] zephyr-v1.12.0 -> zephyr-v1.12.0
* [new tag] zephyr-v1.13.0 -> zephyr-v1.13.0
* [new tag] zephyr-v1.14.0 -> zephyr-v1.14.0
* [new tag] zephyr-v1.2.0 -> zephyr-v1.2.0
* [new tag] zephyr-v1.3.0 -> zephyr-v1.3.0
* [new tag] zephyr-v1.4.0 -> zephyr-v1.4.0
* [new tag] zephyr-v1.5.0 -> zephyr-v1.5.0
* [new tag] zephyr-v1.6.0 -> zephyr-v1.6.0
* [new tag] zephyr-v1.6.1 -> zephyr-v1.6.1
* [new tag] zephyr-v1.7.0 -> zephyr-v1.7.0
* [new tag] zephyr-v1.7.1 -> zephyr-v1.7.1
* [new tag] zephyr-v1.8.0 -> zephyr-v1.8.0
* [new tag] zephyr-v1.9.0 -> zephyr-v1.9.0
* [new tag] zephyr-v1.9.1 -> zephyr-v1.9.1
* [new tag] zephyr-v1.9.2 -> zephyr-v1.9.2
77db273f6f84b3d94d34b5e72070ec6bc31e41cf refs/remotes/origin/master
Checking out files: 100% (11758/11758), done.
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
=== Initialized. Now run "west update" inside ....../zephyrproject.
➜ Zephyr cd zephyrproject
➜ zephyrproject west update
=== updating ci-tools (tools/ci-tools):
--- ci-tools: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/tools/ci-tools/.git/
--- ci-tools: fetching changes
remote: Enumerating objects: 40, done.
remote: Counting objects: 100% (40/40), done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 396 (delta 27), reused 15 (delta 3), pack-reused 356
Receiving objects: 100% (396/396), 114.12 KiB | 990.00 KiB/s, done.
Resolving deltas: 100% (259/259), done.
From https://github.com/zephyrproject-rtos/ci-tools
* [new branch] cc-crlf -> refs/west/cc-crlf
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
* [new branch] whatchanged -> refs/west/whatchanged
HEAD is now at d56f2dd compliance: clarify CODEOWNER message
--- ci-tools: checked out d56f2dd3510e20fa8cf4aad442495c08a658113f as detached HEAD
=== updating civetweb (modules/lib/civetweb):
--- civetweb: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/lib/civetweb/.git/
--- civetweb: fetching changes
remote: Enumerating objects: 112, done.
remote: Counting objects: 100% (112/112), done.
remote: Compressing objects: 100% (72/72), done.
remote: Total 21202 (delta 57), reused 81 (delta 37), pack-reused 21090
Receiving objects: 100% (21202/21202), 24.50 MiB | 21.95 MiB/s, done.
Resolving deltas: 100% (13585/13585), done.
From https://github.com/antmicro/civetweb
* [new branch] 1.9 -> refs/west/1.9
* [new branch] array_size_check -> refs/west/array_size_check
* [new branch] initial-dirty-zephyr-port -> refs/west/initial-dirty-zephyr-port
* [new branch] master -> refs/west/master
* [new branch] no-filesystems -> refs/west/no-filesystems
* [new branch] no-filesystems-fixes -> refs/west/no-filesystems-fixes
* [new branch] no-filesystems-follow-up -> refs/west/no-filesystems-follow-up
* [new branch] no-filesytems-followup -> refs/west/no-filesytems-followup
* [new branch] wip-ssl-error-queue -> refs/west/wip-ssl-error-queue
* [new branch] wip-zephyr-port -> refs/west/wip-zephyr-port
* [new branch] zephyr-buildsystem-fix -> refs/west/zephyr-buildsystem-fix
* [new branch] zephyr-rtos-port -> refs/west/zephyr-rtos-port
* [new branch] zephyr-sample -> refs/west/zephyr-sample
* [new tag] v1.1 -> v1.1
* [new tag] v1.10 -> v1.10
* [new tag] v1.11 -> v1.11
* [new tag] v1.2 -> v1.2
* [new tag] v1.3 -> v1.3
* [new tag] v1.4 -> v1.4
* [new tag] v1.5 -> v1.5
* [new tag] v1.6 -> v1.6
* [new tag] v1.7 -> v1.7
* [new tag] v1.8 -> v1.8
* [new tag] v1.9 -> v1.9
* [new tag] v1.9.1 -> v1.9.1
HEAD is now at 7ffad765 Merge pull request #773 from antmicro/zephyr-buildsystem-fix
--- civetweb: checked out 7ffad765f9a63a7bab3432ca45248981f559d559 as detached HEAD
=== updating esp-idf (modules/hal/esp-idf):
--- esp-idf: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/hal/esp-idf/.git/
--- esp-idf: fetching changes
remote: Enumerating objects: 76449, done.
remote: Counting objects: 100% (76449/76449), done.
remote: Compressing objects: 100% (19840/19840), done.
remote: Total 76449 (delta 54455), reused 76449 (delta 54455), pack-reused 0
Receiving objects: 100% (76449/76449), 69.09 MiB | 24.97 MiB/s, done.
Resolving deltas: 100% (54455/54455), done.
From https://github.com/zephyrproject-rtos/esp-idf
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
* [new branch] zephyr -> refs/west/zephyr
HEAD is now at 6835bfc74 module: add zephyr integration
--- esp-idf: checked out 6835bfc741bf15e98fb7971293913f770df6081f as detached HEAD
=== updating fatfs (modules/fs/fatfs):
--- fatfs: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/fs/fatfs/.git/
--- fatfs: fetching changes
remote: Enumerating objects: 92, done.
remote: Counting objects: 100% (92/92), done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 92 (delta 45), reused 92 (delta 45), pack-reused 0
Unpacking objects: 100% (92/92), done.
From https://github.com/zephyrproject-rtos/fatfs
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at df96914 zephyr: add fatfs as a module
--- fatfs: checked out df96914dd989907f3a5de4cb95b116c2f305820d as detached HEAD
=== updating hal_qmsi (modules/hal/qmsi):
--- hal_qmsi: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/hal/qmsi/.git/
--- hal_qmsi: fetching changes
remote: Enumerating objects: 803, done.
remote: Counting objects: 100% (803/803), done.
remote: Compressing objects: 100% (253/253), done.
remote: Total 803 (delta 490), reused 800 (delta 488), pack-reused 0
Receiving objects: 100% (803/803), 517.11 KiB | 1.78 MiB/s, done.
Resolving deltas: 100% (490/490), done.
From https://github.com/zephyrproject-rtos/hal_qmsi
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at 9195fe6 zephyr: remove kconfig from module
--- hal_qmsi: checked out 9195fe6f97e4f7f25a3fc9e5a515f1b7af13762c as detached HEAD
=== updating hal_cypress (modules/hal/cypress):
--- hal_cypress: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/hal/cypress/.git/
--- hal_cypress: fetching changes
remote: Enumerating objects: 305, done.
remote: Counting objects: 100% (305/305), done.
remote: Compressing objects: 100% (198/198), done.
remote: Total 305 (delta 97), reused 305 (delta 97), pack-reused 0
Receiving objects: 100% (305/305), 954.91 KiB | 2.44 MiB/s, done.
Resolving deltas: 100% (97/97), done.
From https://github.com/zephyrproject-rtos/hal_cypress
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at a12d928 zephyr: move kconfig to the zephyr tree
--- hal_cypress: checked out a12d92816a53a521d79cefcf5c38b9dc8a4fed6e as detached HEAD
=== updating hal_silabs (modules/hal/silabs):
--- hal_silabs: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/hal/silabs/.git/
--- hal_silabs: fetching changes
remote: Enumerating objects: 1175, done.
remote: Counting objects: 100% (1175/1175), done.
remote: Compressing objects: 100% (299/299), done.
remote: Total 1175 (delta 857), reused 1175 (delta 857), pack-reused 0
Receiving objects: 100% (1175/1175), 3.33 MiB | 6.52 MiB/s, done.
Resolving deltas: 100% (857/857), done.
From https://github.com/zephyrproject-rtos/hal_silabs
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at 9151e61 zephyr: move kconfig to the zephyr tree
--- hal_silabs: checked out 9151e614c23997074acd1096a3e8a9e5c255d5b9 as detached HEAD
=== updating hal_st (modules/hal/st):
--- hal_st: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/hal/st/.git/
--- hal_st: fetching changes
remote: Enumerating objects: 7103, done.
remote: Counting objects: 100% (7103/7103), done.
remote: Compressing objects: 100% (1018/1018), done.
remote: Total 7103 (delta 5953), reused 7094 (delta 5946), pack-reused 0
Receiving objects: 100% (7103/7103), 22.25 MiB | 15.60 MiB/s, done.
Resolving deltas: 100% (5953/5953), done.
From https://github.com/zephyrproject-rtos/hal_st
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at 0ec40ae sensor/stmemsc: Introduce STMEMS Standard C Drivers
--- hal_st: checked out 0ec40aed8087f26bd9ac1b70fb5a6c326a6451aa as detached HEAD
=== updating hal_stm32 (modules/hal/stm32):
--- hal_stm32: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/hal/stm32/.git/
--- hal_stm32: fetching changes
remote: Enumerating objects: 44, done.
remote: Counting objects: 100% (44/44), done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 9226 (delta 15), reused 26 (delta 6), pack-reused 9182
Receiving objects: 100% (9226/9226), 29.54 MiB | 20.52 MiB/s, done.
Resolving deltas: 100% (7787/7787), done.
From https://github.com/zephyrproject-rtos/hal_stm32
* [new branch] fix_l4_can -> refs/west/fix_l4_can
* [new branch] master -> refs/west/master
HEAD is now at 49c2685 stm32mp1: add i2c ll driver
--- hal_stm32: checked out 49c26855a651087578b79707fae4ddbb1c0b207d as detached HEAD
=== updating libmetal (modules/hal/libmetal):
--- libmetal: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/hal/libmetal/.git/
--- libmetal: fetching changes
remote: Enumerating objects: 412, done.
remote: Counting objects: 100% (412/412), done.
remote: Compressing objects: 100% (208/208), done.
remote: Total 412 (delta 200), reused 412 (delta 200), pack-reused 0
Receiving objects: 100% (412/412), 143.22 KiB | 971.00 KiB/s, done.
Resolving deltas: 100% (200/200), done.
From https://github.com/zephyrproject-rtos/libmetal
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at 45e630d zephyr: move kconfig to the zephyr tree
--- libmetal: checked out 45e630d6152824f807d3f919958605c4626cbdff as detached HEAD
=== updating lvgl (modules/lib/gui/lvgl):
--- lvgl: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/lib/gui/lvgl/.git/
--- lvgl: fetching changes
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 19509 (delta 5), reused 15 (delta 4), pack-reused 19488
Receiving objects: 100% (19509/19509), 14.28 MiB | 16.21 MiB/s, done.
Resolving deltas: 100% (15472/15472), done.
From https://github.com/zephyrproject-rtos/lvgl
* [new branch] master -> refs/west/master
* [new branch] zephyr -> refs/west/zephyr
HEAD is now at a4626e82 lv_canvas: fix with LV_COLOR_16_SWAP
--- lvgl: checked out a4626e82781aecec137250f56d79961ca2f50b7b as detached HEAD
=== updating mbedtls (modules/crypto/mbedtls):
--- mbedtls: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/crypto/mbedtls/.git/
--- mbedtls: fetching changes
remote: Enumerating objects: 1029, done.
remote: Counting objects: 100% (1029/1029), done.
remote: Compressing objects: 100% (249/249), done.
remote: Total 1029 (delta 767), reused 1024 (delta 762), pack-reused 0
Receiving objects: 100% (1029/1029), 1.14 MiB | 3.30 MiB/s, done.
Resolving deltas: 100% (767/767), done.
From https://github.com/zephyrproject-rtos/mbedtls
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at ca32746 kconfig: move to main tree
--- mbedtls: checked out ca32746072ce3381f1c9ae46ba6cd34c69f8c0ee as detached HEAD
=== updating mcumgr (modules/lib/mcumgr):
--- mcumgr: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/lib/mcumgr/.git/
--- mcumgr: fetching changes
remote: Enumerating objects: 271, done.
remote: Counting objects: 100% (271/271), done.
remote: Compressing objects: 100% (94/94), done.
remote: Total 271 (delta 129), reused 268 (delta 127), pack-reused 0
Receiving objects: 100% (271/271), 74.20 KiB | 1.03 MiB/s, done.
Resolving deltas: 100% (129/129), done.
From https://github.com/zephyrproject-rtos/mcumgr
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at 8493495 kconfig: move Kconfig to main tree
--- mcumgr: checked out 84934959d2d1722a23b7e7e200191ae4a6f96168 as detached HEAD
=== updating net-tools (tools/net-tools):
--- net-tools: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/tools/net-tools/.git/
--- net-tools: fetching changes
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 1341 (delta 1), reused 2 (delta 1), pack-reused 1336
Receiving objects: 100% (1341/1341), 2.56 MiB | 5.37 MiB/s, done.
Resolving deltas: 100% (445/445), done.
From https://github.com/zephyrproject-rtos/net-tools
* [new branch] master -> refs/west/master
HEAD is now at 30b7efa net-setup: zeth-vlan.conf: Add IP addresses to zeth
--- net-tools: checked out 30b7efa827b04d2e47840716b0372737fe7d6c92 as detached HEAD
=== updating nffs (modules/fs/nffs):
--- nffs: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/fs/nffs/.git/
--- nffs: fetching changes
remote: Enumerating objects: 62, done.
remote: Counting objects: 100% (62/62), done.
remote: Compressing objects: 100% (40/40), done.
remote: Total 62 (delta 19), reused 61 (delta 18), pack-reused 0
Unpacking objects: 100% (62/62), done.
From https://github.com/zephyrproject-rtos/nffs
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at bc62a2f zephyr: add as a zephyr module
--- nffs: checked out bc62a2fa9d98ddb5d633c932ea199bc68e10f194 as detached HEAD
=== updating open-amp (modules/lib/open-amp):
--- open-amp: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/lib/open-amp/.git/
--- open-amp: fetching changes
remote: Enumerating objects: 204, done.
remote: Counting objects: 100% (204/204), done.
remote: Compressing objects: 100% (139/139), done.
remote: Total 204 (delta 57), reused 200 (delta 54), pack-reused 0
Receiving objects: 100% (204/204), 1.44 MiB | 3.89 MiB/s, done.
Resolving deltas: 100% (57/57), done.
From https://github.com/zephyrproject-rtos/open-amp
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at 9b591b2 cmake: fix zephyr library abstraction violation
--- open-amp: checked out 9b591b289e1f37339bd038b5a1f0e6c8ad39c63a as detached HEAD
=== updating openthread (modules/lib/openthread):
--- openthread: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/lib/openthread/.git/
--- openthread: fetching changes
remote: Enumerating objects: 5810, done.
remote: Counting objects: 100% (5810/5810), done.
remote: Compressing objects: 100% (2007/2007), done.
remote: Total 48001 (delta 4409), reused 4649 (delta 3782), pack-reused 42191
Receiving objects: 100% (48001/48001), 59.56 MiB | 24.88 MiB/s, done.
Resolving deltas: 100% (36241/36241), done.
From https://github.com/zephyrproject-rtos/openthread
* [new branch] master -> refs/west/master
* [new branch] zephyr -> refs/west/zephyr
HEAD is now at 0dbecf50 west: add zephyr module
--- openthread: checked out 0dbecf508e7a79aae8ed9631f1a63fc65478b213 as detached HEAD
=== updating segger (modules/debug/segger):
--- segger: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/debug/segger/.git/
--- segger: fetching changes
remote: Enumerating objects: 140, done.
remote: Counting objects: 100% (140/140), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 140 (delta 69), reused 140 (delta 69), pack-reused 0
Receiving objects: 100% (140/140), 73.45 KiB | 529.00 KiB/s, done.
Resolving deltas: 100% (69/69), done.
From https://github.com/zephyrproject-rtos/segger
* [new branch] master -> refs/west/master
* [new branch] v1.14-branch -> refs/west/v1.14-branch
HEAD is now at 6fcf616 ext: segger: update to SystemView v2.52h
--- segger: checked out 6fcf61606d6012d2c44129edc033f59331e268bc as detached HEAD
=== updating tinycbor (modules/lib/tinycbor):
--- tinycbor: cloning and initializing
Initialized empty Git repository in ....../zephyrproject/modules/lib/tinycbor/.git/
--- tinycbor: fetching changes
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 1729 (delta 0), reused 2 (delta 0), pack-reused 1725
Receiving objects: 100% (1729/1729), 1.11 MiB | 2.90 MiB/s, done.
Resolving deltas: 100% (1086/1086), done.
From https://github.com/zephyrproject-rtos/tinycbor
* [new branch] dev -> refs/west/dev
* [new branch] gh-pages -> refs/west/gh-pages
* [new branch] master -> refs/west/master
* [new branch] zephyr -> refs/west/zephyr
* [new tag] v0.1 -> v0.1
* [new tag] v0.2 -> v0.2
* [new tag] v0.2.1 -> v0.2.1
* [new tag] v0.3 -> v0.3
* [new tag] v0.3.1 -> v0.3.1
* [new tag] v0.3.2 -> v0.3.2
* [new tag] v0.4 -> v0.4
* [new tag] v0.4.1 -> v0.4.1
* [new tag] v0.4.2 -> v0.4.2
* [new tag] v0.5-beta1 -> v0.5-beta1
* [new tag] v0.5.0 -> v0.5.0
HEAD is now at 31ae89e zephyr: remove kconfig from module
--- tinycbor: checked out 31ae89e4b768612722620cb6cb173a0de4a19cc9 as detached HEAD
➜ zephyrproject

1.2.2 Update All Required Python Packages

Then, we manually modify/update the file ./zephyr/scripts/requirements.txt as:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
wheel>=0.30.0
breathe>=4.9.1
sphinx>=1.7.5
docutils>=0.14
sphinx_rtd_theme
sphinxcontrib-svg2pdfconverter
junit2html
PyYAML>=3.13
ply>=3.10
hub>=2.0
gitlint
pyelftools>=0.24
pyocd>=0.21.0
pyserial
pykwalify
# "win32" is used for 64-bit Windows as well
# windows-curses; sys_platform == "win32"
colorama
Pillow
intelhex
pytest
gcovr

Make sure all required python packages have been installed by command:

1
➜  zephyrproject pip3 install --user -r zephyr/scripts/requirements.txt

1.2.3 Install the Zephyr Software Development Kit (Zephyr SDK)

Step 1: Download the latest Zephyr Software Development Kit

You can either directly download the latest package from Zephyr project Downloads, or get the package by the following command:

1
2
3
4
5
➜  zephyrproject cd..
➜ Zephyr
➜ Zephyr mkdir release
➜ Zephyr cd release
➜ release wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.10.1/zephyr-sdk-0.10.1-setup.run

Step 2: Installation of Zephyr SDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
➜  release chmod +x zephyr-sdk-0.10.1-setup.run
➜ release ./zephyr-sdk-0.10.1-setup.run
Verifying archive integrity... All good.
Uncompressing SDK for Zephyr 100%
Enter target directory for SDK (default: /opt/zephyr-sdk/):
Installing SDK to /opt/zephyr-sdk
Creating directory /opt/zephyr-sdk
Success
[*] Installing x86 tools...
[*] Installing arm tools...
[*] Installing arc tools...
[*] Installing iamcu tools...
[*] Installing mips tools...
[*] Installing nios2 tools...
[*] Installing xtensa tools...
[*] Installing riscv32 tools...
[*] Installing x86_64 tools...
[*] Installing additional host tools...
Success installing SDK. SDK is ready to be used.

Step 3: Set Up Toolchain For RISC-V

Using Zephyr's own toolchain is strongly recommended for Zephyr projects (refer to Zephyr Project's Official Documentation ).

1
2
3
4
➜  release export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
➜ release export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
➜ release cd ../zephyrproject
➜ zephyrproject

1.2.4 Build and Run an Application

Before building and run an application, please make sure you have all required tools ALREADY installed on the host computer. On my HOST Ubuntu 19.04, I've got to manually install dtc (the latest release is version 1.5.0). I'm NOT going to talk about how go figure out installing any REQUIRED packages at this moment. Supposing you've got ALL REQUIRED tools successfully installed ALREADY.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
➜  zephyrproject cd zephyr 
➜ zephyr git:(master) ✗ source zephyr-env.sh
➜ zephyr git:(master) ✗ west build -b hifive1_revb samples/hello_world
-- west build: build configuration:
source directory: ....../zephyrproject/zephyr/samples/hello_world
build directory: ....../zephyrproject/zephyr/build
BOARD: hifive1_revb (origin: command line)
-- west build: generating a build system
Zephyr version: 1.14.99
-- Found PythonInterp: /usr/bin/python (found suitable version "3.7.3", minimum required is "3.4")
-- Selected BOARD hifive1_revb
-- Found west: ~/.local/bin/west (found suitable version "0.6.0", minimum required is "0.5.6")
-- Loading ....../zephyrproject/zephyr/boards/riscv/hifive1_revb/hifive1_revb.dts as base
-- Overlaying ....../zephyrproject/zephyr/dts/common/common.dts
Device tree configuration written to ....../zephyrproject/zephyr/build/zephyr/include/generated/generated_dts_board.conf
Parsing Kconfig tree in ....../zephyrproject/zephyr/Kconfig
Loaded configuration '....../zephyrproject/zephyr/boards/riscv/hifive1_revb/hifive1_revb_defconfig'
Merged configuration '....../zephyrproject/zephyr/samples/hello_world/prj.conf'
Configuration saved to '....../zephyrproject/zephyr/build/zephyr/.config'
-- Cache files will be written to: ~/.cache/zephyr
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- The ASM compiler identification is GNU
-- Found assembler: /opt/zephyr-sdk/riscv32-zephyr-elf/bin/riscv32-zephyr-elf-gcc
-- Performing Test toolchain_is_ok
-- Performing Test toolchain_is_ok - Success
Including module: civetweb in path: ....../zephyrproject/modules/lib/civetweb
-- Target architecture - riscv32
-- Enabling tests in the build - ON
-- Thread Stack Size - 102400
-- Enabling server executable - ON
-- Serve no static files - OFF
-- Disable CGI support - OFF
-- Disable caching support - OFF
-- C++ wrappers - OFF
-- IP Version 6 - OFF
-- Websockets support - OFF
-- Server statistics support - OFF
-- Memory Debugging - OFF
-- ASAN in debug mode - ON
-- Force x32 / x64 architecture - OFF
-- Lua CGI support - OFF
-- Executable installation - ON
-- Build if there are warnings - ON
-- Duktape CGI support - OFF
-- SSL support - ON
-- Compile for OpenSSL 1.1 API - OFF
-- Dynamically load SSL libraries - ON
-- Configuring C Compiler
-- Performing Test HAVE_C_FLAG_STD_C11
-- Performing Test HAVE_C_FLAG_STD_C11 - Success
-- Performing Test HAVE_C_FLAG_FSANITIZE_UNDEFINED
-- Performing Test HAVE_C_FLAG_FSANITIZE_UNDEFINED - Failed
-- Performing Test HAVE_C_FLAG_FSANITIZE_ADDRESS
-- Performing Test HAVE_C_FLAG_FSANITIZE_ADDRESS - Failed
-- Performing Test HAVE_C_FLAG_COVERAGE
-- Performing Test HAVE_C_FLAG_COVERAGE - Success
Including module: esp-idf in path: ....../zephyrproject/modules/hal/esp-idf/zephyr
Including module: fatfs in path: ....../zephyrproject/modules/fs/fatfs
Including module: qmsi in path: ....../zephyrproject/modules/hal/qmsi
Including module: cypress in path: ....../zephyrproject/modules/hal/cypress
Including module: silabs in path: ....../zephyrproject/modules/hal/silabs
Including module: st in path: ....../zephyrproject/modules/hal/st
Including module: stm32 in path: ....../zephyrproject/modules/hal/stm32
Including module: libmetal in path: ....../zephyrproject/modules/hal/libmetal
Including module: lvgl in path: ....../zephyrproject/modules/lib/gui/lvgl
Including module: mbedtls in path: ....../zephyrproject/modules/crypto/mbedtls
Including module: mcumgr in path: ....../zephyrproject/modules/lib/mcumgr
Including module: nffs in path: ....../zephyrproject/modules/fs/nffs
Including module: open-amp in path: ....../zephyrproject/modules/lib/open-amp
Including module: openthread in path: ....../zephyrproject/modules/lib/openthread
Including module: segger in path: ....../zephyrproject/modules/debug/segger
Including module: tinycbor in path: ....../zephyrproject/modules/lib/tinycbor
-- Configuring done
-- Generating done
-- Build files have been written to: ....../zephyrproject/zephyr/build
-- west build: building application
[0/1] Re-running CMake...
Zephyr version: 1.14.99
-- Selected BOARD hifive1_revb
-- Found west: ~/.local/bin/west (found suitable version "0.6.0", minimum required is "0.5.6")
/usr/bin/dtc
-- Loading ....../zephyrproject/zephyr/boards/riscv/hifive1_revb/hifive1_revb.dts as base
-- Overlaying ....../zephyrproject/zephyr/dts/common/common.dts
Device tree configuration written to ....../zephyrproject/zephyr/build/zephyr/include/generated/generated_dts_board.conf
Parsing Kconfig tree in ....../zephyrproject/zephyr/Kconfig
Loaded configuration '....../zephyrproject/zephyr/build/zephyr/.config'
No change to '....../zephyrproject/zephyr/build/zephyr/.config'
-- Cache files will be written to: ~/.cache/zephyr
Including module: civetweb in path: ....../zephyrproject/modules/lib/civetweb
-- Target architecture - riscv32
-- Enabling tests in the build - ON
-- Thread Stack Size - 102400
-- Enabling server executable - ON
-- Serve no static files - OFF
-- Disable CGI support - OFF
-- Disable caching support - OFF
-- C++ wrappers - OFF
-- IP Version 6 - OFF
-- Websockets support - OFF
-- Server statistics support - OFF
-- Memory Debugging - OFF
-- ASAN in debug mode - ON
-- Force x32 / x64 architecture - OFF
-- Lua CGI support - OFF
-- Executable installation - ON
-- Build if there are warnings - ON
-- Duktape CGI support - OFF
-- SSL support - ON
-- Compile for OpenSSL 1.1 API - OFF
-- Dynamically load SSL libraries - ON
-- Configuring C Compiler
Including module: esp-idf in path: ....../zephyrproject/modules/hal/esp-idf/zephyr
Including module: fatfs in path: ....../zephyrproject/modules/fs/fatfs
Including module: qmsi in path: ....../zephyrproject/modules/hal/qmsi
Including module: cypress in path: ....../zephyrproject/modules/hal/cypress
Including module: silabs in path: ....../zephyrproject/modules/hal/silabs
Including module: st in path: ....../zephyrproject/modules/hal/st
Including module: stm32 in path: ....../zephyrproject/modules/hal/stm32
Including module: libmetal in path: ....../zephyrproject/modules/hal/libmetal
Including module: lvgl in path: ....../zephyrproject/modules/lib/gui/lvgl
Including module: mbedtls in path: ....../zephyrproject/modules/crypto/mbedtls
Including module: mcumgr in path: ....../zephyrproject/modules/lib/mcumgr
Including module: nffs in path: ....../zephyrproject/modules/fs/nffs
Including module: open-amp in path: ....../zephyrproject/modules/lib/open-amp
Including module: openthread in path: ....../zephyrproject/modules/lib/openthread
Including module: segger in path: ....../zephyrproject/modules/debug/segger
Including module: tinycbor in path: ....../zephyrproject/modules/lib/tinycbor
-- Configuring done
-- Generating done
-- Build files have been written to: ....../zephyrproject/zephyr/build
[95/100] Linking C executable zephyr/zephyr_prebuilt.elf
Memory region Used Size Region Size %age Used
ROM: 15836 B 3842 KB 0.40%
RAM: 4064 B 16 KB 24.80%
IDT_LIST: 553 B 2 KB 27.00%
[100/100] Linking C executable zephyr/zephyr.elf

And during the building process while you run west build -b hifive1_revb samples/hello_world, you may meet the following headache issues:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
➜  zephyr git:(master) ✗ west build -b hifive1_revb samples/hello_world
-- west build: build configuration:
source directory: ....../Zephyr/zephyrproject/zephyr/samples/hello_world
build directory: ....../Zephyr/zephyrproject/zephyr/build
BOARD: hifive1_revb (origin: command line)
-- west build: generating a build system
Zephyr version: 1.14.99
-- Selected BOARD hifive1_revb
-- Found west: ~/.local/bin/west (found suitable version "0.6.0", minimum required is "0.5.6")
CMake Error at ....../Zephyr/zephyrproject/zephyr/cmake/host-tools.cmake:69 (message):
message called with incorrect number of arguments
Call Stack (most recent call first):
....../Zephyr/zephyrproject/zephyr/cmake/app/boilerplate.cmake:414 (include)
CMakeLists.txt:5 (include)


CMake Error at ....../Zephyr/zephyrproject/zephyr/cmake/host-tools.cmake:70 (string):
string sub-command REGEX, mode MATCH needs at least 5 arguments total to
command.
Call Stack (most recent call first):
....../Zephyr/zephyrproject/zephyr/cmake/app/boilerplate.cmake:414 (include)
CMakeLists.txt:5 (include)


CMake Error at ....../Zephyr/zephyrproject/zephyr/cmake/extensions.cmake:1324 (message):
Assertion failed: The detected dtc version is unsupported.

The version was found to be 0.6.0
But the minimum supported version is 1.4.6
See https://docs.zephyrproject.org/latest/getting_started/
for how to use the SDK's dtc alongside a custom toolchain.
Call Stack (most recent call first):
....../Zephyr/zephyrproject/zephyr/cmake/host-tools.cmake:72 (assert)
....../Zephyr/zephyrproject/zephyr/cmake/app/boilerplate.cmake:414 (include)
CMakeLists.txt:5 (include)


-- Configuring incomplete, errors occurred!
ERROR: command exited with status 1: /usr/bin/cmake -B....../Zephyr/zephyrproject/zephyr/build -S....../Zephyr/zephyrproject/zephyr/samples/hello_world -GNinja -DBOARD=hifive1_revb

In my case, it's because DTC is wrongly and automatically set to:

1
DTC:FILEPATH=/opt/zephyr-sdk/sysroots/x86_64-pokysdk-linux/usr/bin/dtc

even if

1
2
3
4
➜  zephyr whereis dtc
dtc: /usr/bin/dtc
➜ zephyr git:(master) ✗ dtc --version
Version: DTC 1.5.0-gb8d6eca7-dirty

Solution 1: Temporary Solution

Reset DTC to value /usr/bin/dtc in file build/CMakeCache.txt

Solution 2: Permanent Solution

Modify file ./cmake/toolchain/zephyr/0.10.1/host-tools.cmake as follows

  • Replace set(HOST_TOOLS_HOME ${ZEPHYR_SDK_INSTALL_DIR}/sysroots/${TOOLCHAIN_ARCH}-pokysdk-linux) with set(HOST_TOOLS_HOME /usr)
  • Remove list(APPEND CMAKE_PREFIX_PATH ${HOST_TOOLS_HOME}/usr)
  • Replace set_ifndef(QEMU_BIOS ${HOST_TOOLS_HOME}/usr/share/qemu) with set_ifndef(QEMU_BIOS /usr/local/share/qemu)
  • Replace set_ifndef(OPENOCD_DEFAULT_PATH ${HOST_TOOLS_HOME}/usr/share/openocd/scripts) with set_ifndef(OPENOCD_DEFAULT_PATH /usr/local/share/openocd/scripts)

Then, rebuild everything with west build -b hifive1_revb samples/hello_world.

2. Running Zephyr on SiFive HiFive1 Rev B01

2.1 Connect SiFive HiFive1 Rev B01

Now, let's plug in SiFive HiFive1 Rev B01 with a QUALIFIED Micro-B USB to USB Type A cable. SiFive HiFive1 Rev B01 will be prompted as a massive storage hard drive as:

HiFive1 Content Readme.html
HiFive1 Rev B01 Content Readme.html

Readme.html shows the following message: This board uses SEGGER J-Link OB technology to connect to the target CPU. More information

, and lsusb shows a SEGGER device:

1
2
3
4
➜  ~ lsusb
......
Bus 001 Device 010: ID 1366:1051 SEGGER
......

2.2 Flash SiFive HiFive1 Rev B01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
➜  build git:(master) ✗ west flash
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner jlink
-- runners.jlink: Flashing Target Device
SEGGER J-Link Commander V6.48b (Compiled Aug 2 2019 10:20:30)
DLL version V6.48b, compiled Aug 2 2019 10:20:19


J-Link Command File read successfully.
Processing script file...

J-Link connection not established yet but required for command.
Connecting to J-Link via USB...Updating firmware: J-Link OB-K22-SiFive compiled Jul 30 2019 12:24:12
Replacing firmware: J-Link OB-K22-SiFive compiled Mar 15 2019 12:47:14
Waiting for new firmware to boot
New firmware booted successfully
O.K.
Firmware: J-Link OB-K22-SiFive compiled Jul 30 2019 12:24:12
Hardware version: V1.00
S/N: 979000238
VTref=3.300V
Target connection not established yet but required for command.
Device "FE310" selected.


Connecting to target via JTAG
ConfigTargetSettings() start
ConfigTargetSettings() end
TotalIRLen = 5, IRPrint = 0x01
JTAG chain detection found 1 devices:
#0 Id: 0x20000913, IRLen: 05, Unknown device
Debug architecture:
RISC-V debug: 0.13
AddrBits: 7
DataBits: 32
IdleClks: 5
Stat: 0
Memory access:
Via system bus: No
Via ProgBuf: Yes (16 ProgBuf entries)
DataBuf: 1 entries
autoexec[0] implemented: Yes
Detected: RV32 core
CSR access via abs. commands: No
Temp. halted CPU for NumHWBP detection
HW instruction/data BPs: 8
Support set/clr BPs while running: No
HW data BPs trigger before execution of inst
RISC-V identified.
Reset delay: 0 ms
Reset type Normal: Resets core & peripherals using <ndmreset> bit in <dmcontrol> debug register.

Downloading file [....../zephyrproject/zephyr/build/zephyr/zephyr.bin]...
Comparing flash [100%] Done.
Erasing flash [100%] Done.
Programming flash [100%] Done.
Verifying flash [100%] Done.
J-Link: Flash download: Bank 0 @ 0x20000000: 1 range affected (65536 bytes)
J-Link: Flash download: Total time needed: 1.157s (Prepare: 0.081s, Compare: 0.318s, Erase: 0.128s, Program: 0.298s, Verify: 0.318s, Restore: 0.012s)
O.K.



Script processing completed.

2.3 Demonstrate Via Serial Port

By following HiFive1 Rev B01 Getting Started Guide, Chapter 6 Section 2: Console Configuration, we'll have:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
➜  ~ tail -n 15 -F /etc/udev/rules.d/99-jlink.rules
ATTR{idProduct}=="106b", ATTR{idVendor}=="1366", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTR{idProduct}=="106c", ATTR{idVendor}=="1366", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTR{idProduct}=="106d", ATTR{idVendor}=="1366", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTR{idProduct}=="106e", ATTR{idVendor}=="1366", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTR{idProduct}=="106f", ATTR{idVendor}=="1366", ENV{ID_MM_DEVICE_IGNORE}="1"
#
# Make sure that VCOM ports of J-Links can be opened with user rights
# We simply say that all devices from SEGGER which are in the "tty" domain are enumerated with normal user == R/W
#
SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", MODE="0666", GROUP="dialout"
#
# End of list
#
SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1051", MODE="664", GROUP="plugdev"
LABEL="jlink_rules_end"
➜ ~ groups
lvision adm dialout cdrom sudo dip plugdev lpadmin sambashare
➜ ~ ll /dev/ttyACM*
crw-rw-rw- 1 root dialout 166, 0 Aug 7 00:05 /dev/ttyACM0
crw-rw-rw- 1 root dialout 166, 1 Aug 6 23:10 /dev/ttyACM1

Let's start monitoring the serial port by:

1
➜  ~ screen /dev/ttyACM0 115200
HiFive1 Rev B01 Serial Port screen

The CORRECT demo should give the following ERROR message:

1
2
3
4
5
6
7
8
9
Bench Clock Reset Complete

ATE0-->ATE0
OK
AT+BLEINIT=0-->OK
AT+CWMODE=0-->OK

***** Booting Zephyr OS build zephyr-v1.14.0-2842-g0440a815a91b *****
Hello World! hifive1_revb

However, I've got NO idea why sometimes there is an Send Flag error:

1
ATE0--> Send Flag error: #0 #0 #0 #0 AT+BLEINIT=0-->AT+BLEINIT=0

It seems the messages are from bootloader, sometimes it fails to initialize ESP32 module.

Alright, it's TOO late already. I'll have to go to bed... ALL the BEST to my classmate.

Just finished reviewing a paper talking about Electrocardiography (ECG) biometrics 10 minutes ago. Let's continue having some fun of ECG right away.

Fundamental Knowledge About ECG

Details can be found on ACLS Medical Training. Let's cite the key graph as follows:

ECG Basics

BioSPPy

BioSppy is a Python tool which can display various types of biosignals. Its source code can be found on github.

Installation

1
2
3
4
5
6
7
8
9
10
11
12
13
➜  ~ pip install -U biosppy --user
......
➜ ~ pip show biosppy
Name: biosppy
Version: 0.6.1
Summary: A toolbox for biosignal processing written in Python.
Home-page: https://github.com/PIA-Group/BioSPPy
Author: Instituto de Telecomunicacoes
Author-email: carlos.carreiras@lx.it.pt
License: BSD 3-clause
Location: /home/lvision/.local/lib/python3.7/site-packages
Requires: scipy, numpy, matplotlib, scikit-learn, h5py, six, shortuuid, bidict
Required-by:

Test

A sample ECG data can be found at BioSPPy example.

1
2
3
4
5
6
7
8
from biosppy import storage
from biosppy.signals import ecg

# load raw ECG signal
signal, mdata = storage.load_txt('./examples/ecg.txt')

# process it and plot
out = ecg.ecg(signal=signal, sampling_rate=1000., show=True)
ECG Summary

Three things you need to verify:

1. Contents In File /usr/share/qtchooser/qt5-x86_64-linux-gnu.conf

1
2
3
4
5
6
7
8
9
➜  ~ cd /usr/share/qtchooser
➜ qtchooser ls
qt4-x86_64-linux-gnu.conf qt5-x86_64-linux-gnu.conf
➜ qtchooser cat qt4-x86_64-linux-gnu.conf
/usr/lib/x86_64-linux-gnu/qt4/bin
/usr/lib/x86_64-linux-gnu
➜ qtchooser cat qt5-x86_64-linux-gnu.conf
/opt/Qt/Current/gcc_64/bin
/opt/Qt/Current/gcc_64/lib

2. Use Qt5 By Default: /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf

1
2
3
4
5
6
7
➜  qtchooser cd /usr/lib/x86_64-linux-gnu/qt-default/qtchooser 
➜ qtchooser ll
total 0
lrwxrwxrwx 1 root root 53 Apr 5 21:21 default.conf -> ../../../../share/qtchooser/qt5-x86_64-linux-gnu.conf
➜ qtchooser cat default.conf
/opt/Qt/Current/gcc_64/bin
/opt/Qt/Current/gcc_64/lib

3. Doublecheck /usr/lib/x86_64-linux-gnu/qtchooser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜  qtchooser cd /usr/lib/x86_64-linux-gnu/qtchooser
➜ qtchooser pwd
/usr/lib/x86_64-linux-gnu/qtchooser
➜ qtchooser ll
total 0
lrwxrwxrwx 1 root root 50 Dec 21 2017 4.conf -> ../../../share/qtchooser/qt4-x86_64-linux-gnu.conf
lrwxrwxrwx 1 root root 50 Dec 21 2017 5.conf -> ../../../share/qtchooser/qt5-x86_64-linux-gnu.conf
lrwxrwxrwx 1 root root 50 Dec 21 2017 qt4.conf -> ../../../share/qtchooser/qt4-x86_64-linux-gnu.conf
lrwxrwxrwx 1 root root 50 Dec 21 2017 qt5.conf -> ../../../share/qtchooser/qt5-x86_64-linux-gnu.conf
➜ qtchooser cat 4.conf
/usr/lib/x86_64-linux-gnu/qt4/bin
/usr/lib/x86_64-linux-gnu
➜ qtchooser cat 5.conf
/opt/Qt/Current/gcc_64/bin
/opt/Qt/Current/gcc_64/lib

Today I'd love to talk about Pixy Cam a bit, which I do NOT recommend at all. There are several reasons: * Price: As you can see from Amazon, it's comparatively expensive, $95 USD. * Warranty period: 90 days from date of purchase * Size: too big

Actually, I purchased PIXY (with pan tilt mount base) in 2016 from amazon.com. However, it went died long time ago. What's more, I've tested ALL possible solutions from Pixycam Troubleshooting, but the 90-day warranty is easy to pass.

I do NOT want to talk more about Pixy Cam, and here is **my conclusion: Please use esp32-cam instead.

It's almost July 10, let me continue testing something else: OpenMV. I used to have purchased 2 OpenMV cameras, respectively: * OpenMV Cam M4 V2 with STM32F427VG * OpenMV Cam M7 with STM32F765VI

No matter which version of OpenMV is connected to the laptop via USB, command lsusb is able to list the device out as:

1
Bus 001 Device 020: ID 1209:abd1 InterBiometrics 

Dilemma of OpenMV-IDE

Conclusion FIRST: NEVER build OpenMV-IDE from scratch using a different version of Qt!!!

To build OpenMV-IDE is seriously headache.

1
2
3
4
5
6
7
➜  openmv ./openmv-ide-linux-x86_64-2.2.0.run
This application failed to start because it could not find or load the Qt platform plugin "xcb"
in "".

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, xcb.

Reinstalling the application may fix this problem.

Test OpenMV

In the following, we ONLY use picocom to carry out the test.

1. OpenMV Cam M4 V2 (OPENMV2 with STM32F427)

Current Contents In OpenMV Cam M4 V2
OpenMV Cam M4 V2 Properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
➜  ~ picocom /dev/ttyACM0
picocom v3.1

port is : /dev/ttyACM0
flowcontrol : none
baudrate is : 9600
parity is : none
databits are : 8
stopbits are : 1
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
hangup is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv -E
imap is :
omap is :
emap is : crcrlf,delbs,
logfile is : none
initstring : none
exit_after is : not set
exit is : no

Type [C-a] [C-h] to see available commands
Terminal ready
MicroPython v1.9.3-4922-ge0f81c867 on 2018-04-23; OPENMV2 with STM32F427
Type "help()" for more information.
>>>

Press Ctrl+A then Ctrl+x, picocom will terminate its execution.

1
2
3
>>> 
Terminating...
Thanks for using picocom

2. OpenMV Cam M7 (OPENMV3 with STM32F765)

Current Contents In OpenMV Cam M7
OpenMV Cam M7 Properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
➜  ~ picocom /dev/ttyACM0
picocom v3.1

port is : /dev/ttyACM0
flowcontrol : none
baudrate is : 9600
parity is : none
databits are : 8
stopbits are : 1
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
hangup is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv -E
imap is :
omap is :
emap is : crcrlf,delbs,
logfile is : none
initstring : none
exit_after is : not set
exit is : no

Type [C-a] [C-h] to see available commands
Terminal ready
MicroPython v1.9.4-4510-g23e8457de on 2018-06-29; OPENMV3 with STM32F765
Type "help()" for more information.
>>>
Terminating...
Thanks for using picocom
➜ ~

Flash OpenMV Firmware Onto OpenMV Board

1. Entering DFU Mode

Similar to what's discussed in our previous blog, we need to enter DFU mode before flashing. * Disconnect the power for OpenMV board FIRST * Connect BOOT pin and RST pin afterwards * Then, reconnect the USB cable for flashing.

Before entering DFU mode:

1
2
3
4
➜  ~ lsusb
...
Bus 001 Device 027: ID 1209:abd1 InterBiometrics
...

After entering DFU mode:

1
2
3
4
➜  ~ lsusb
...
Bus 001 Device 028: ID 0483:df11 STMicroelectronics STM Device in DFU Mode
...

2. Flashing OpenMV's Firmware

Checkout the NEWEST OpenMV. Find the corrensponding version of OpenMV board, flash it by command python pydfu.py -u <firmware.dfu>.

1) OpenMV Cam M4 V2 (OPENMV2 with STM32F427)

1
2
3
4
5
6
7
8
9
10
11
➜  openmv git:(master) python ./tools/pydfu.py -u firmware/OPENMV2/firmware.dfu 
./tools/pydfu.py:80: DeprecationWarning: inspect.getargspec() is deprecated since Python 3.0, use inspect.signature() or inspect.getfullargspec()
if 'length' in inspect.getargspec(usb.util.get_string).args:
File: firmware/OPENMV2/firmware.dfu
b'DfuSe' v1, image size: 834757, targets: 1
b'Target' 0, alt setting: 0, name: "ST...", size: 834472, elements: 1
0, address: 0x08010000, size: 834464
usb: 0483:df11, device: 0x0000, dfu: 0x011a, b'UFD', 16, 0x9dfe8e73
Writing memory...
0x08010000 834464 [=========================] 100%
Exiting DFU...

Let's try picocom directly:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
➜  openmv git:(master) picocom /dev/ttyACM0
picocom v3.1

port is : /dev/ttyACM0
flowcontrol : none
baudrate is : 9600
parity is : none
databits are : 8
stopbits are : 1
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
hangup is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv -E
imap is :
omap is :
emap is : crcrlf,delbs,
logfile is : none
initstring : none
exit_after is : not set
exit is : no

Type [C-a] [C-h] to see available commands
Terminal ready
6792
18.86792
18.86792
18.86792
18.86792
18.86792
18.86792
......
Traceback (most recent call last):
File "/main.py", line 51, in <module>
KeyboardInterrupt:
MicroPython v1.9.4-4553-gb4eccdfe3 on 2019-05-02; OPENMV2 with STM32F427
Type "help()" for more information.
>>>
Terminating...
Thanks for using picocom

Check file main.py, which starts running automatically while testing with picocom.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Face Detection Example
#
# This example shows off the built-in face detection feature of the OpenMV Cam.
#
# Face detection works by using the Haar Cascade feature detector on an image. A
# Haar Cascade is a series of simple area contrasts checks. For the built-in
# frontalface detector there are 25 stages of checks with each stage having
# hundreds of checks a piece. Haar Cascades run fast because later stages are
# only evaluated if previous stages pass. Additionally, your OpenMV Cam uses
# a data structure called the integral image to quickly execute each area
# contrast check in constant time (the reason for feature detection being
# grayscale only is because of the space requirment for the integral image).

import sensor, time, image

# Reset sensor
sensor.reset()

# Sensor settings
sensor.set_contrast(1)
sensor.set_gainceiling(16)
# HQVGA and GRAYSCALE are the best for face tracking.
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.GRAYSCALE)

# Load Haar Cascade
# By default this will use all stages, lower satges is faster but less accurate.
face_cascade = image.HaarCascade("frontalface", stages=25)
print(face_cascade)

# FPS clock
clock = time.clock()

while (True):
clock.tick()

# Capture snapshot
img = sensor.snapshot()

# Find objects.
# Note: Lower scale factor scales-down the image more and detects smaller objects.
# Higher threshold results in a higher detection rate, with more false positives.
objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)

# Draw objects
for r in objects:
img.draw_rectangle(r)

# Print FPS.
# Note: Actual FPS is higher, streaming the FB makes it slower.
print(clock.fps())

2) OpenMV Cam M7 (OPENMV3 with STM32F765)

1
2
3
4
5
6
7
8
9
10
11
➜  openmv git:(master) python ./tools/pydfu.py -u firmware/OPENMV3/firmware.dfu
./tools/pydfu.py:80: DeprecationWarning: inspect.getargspec() is deprecated since Python 3.0, use inspect.signature() or inspect.getfullargspec()
if 'length' in inspect.getargspec(usb.util.get_string).args:
File: firmware/OPENMV3/firmware.dfu
b'DfuSe' v1, image size: 1297173, targets: 1
b'Target' 0, alt setting: 0, name: "ST...", size: 1296888, elements: 1
0, address: 0x08020000, size: 1296880
usb: 0483:df11, device: 0x0000, dfu: 0x011a, b'UFD', 16, 0xeff0bf62
Writing memory...
0x08020000 1296880 [=========================] 100%
Exiting DFU...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
➜  openmv git:(master) picocom /dev/ttyACM0
picocom v3.1

port is : /dev/ttyACM0
flowcontrol : none
baudrate is : 9600
parity is : none
databits are : 8
stopbits are : 1
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
hangup is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv -E
imap is :
omap is :
emap is : crcrlf,delbs,
logfile is : none
initstring : none
exit_after is : not set
exit is : no

Type [C-a] [C-h] to see available commands
Terminal ready
MicroPython v1.9.4-4553-gb4eccdfe3 on 2019-05-02; OPENMV3 with STM32F765
Type "help()" for more information.
>>>
Terminating...
Thanks for using picocom
➜ openmv git:(master)

As you can see, firmware has NOW been updated to MicroPython v1.9.4-4553-gb4eccdfe3 on 2019-05-02.

Stream OpenMV Video without OpenMV-IDE

1. Snapshot

We FIRST test OpenMV snapshot code on OpenMV Cam M4 V2 (OPENMV2 with STM32F427).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Snapshot Example
#
# Note: You will need an SD card to run this example.
#
# You can use your OpenMV Cam to save image files.

import sensor, image, pyb

RED_LED_PIN = 1
BLUE_LED_PIN = 3

sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.QVGA) # or sensor.QQVGA (or others)
sensor.skip_frames(time = 2000) # Let new settings take affect.

pyb.LED(RED_LED_PIN).on()
sensor.skip_frames(time = 2000) # Give the user time to get ready.

pyb.LED(RED_LED_PIN).off()
pyb.LED(BLUE_LED_PIN).on()

print("You're on camera!")
sensor.snapshot().save("example.jpg") # or "example.bmp" (or others)

pyb.LED(BLUE_LED_PIN).off()
print("Done! Reset the camera to see the saved image.")
Snapshot on OpenMV Cam M4 V2

2. Video Recording

We THEN test OpenMV video recording on OpenMV Cam M7 (OPENMV3 with STM32F765).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# MJPEG Video Recording Example
#
# Note: You will need an SD card to run this demo.
#
# You can use your OpenMV Cam to record mjpeg files. You can either feed the
# recorder object JPEG frames or RGB565/Grayscale frames. Once you've finished
# recording a Mjpeg file you can use VLC to play it. If you are on Ubuntu then
# the built-in video player will work too.

import sensor, image, time, mjpeg, pyb

RED_LED_PIN = 1
BLUE_LED_PIN = 3

sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.QVGA) # or sensor.QQVGA (or others)
sensor.skip_frames(time = 2000) # Let new settings take affect.
clock = time.clock() # Tracks FPS.

pyb.LED(RED_LED_PIN).on()
sensor.skip_frames(time = 2000) # Give the user time to get ready.

pyb.LED(RED_LED_PIN).off()
pyb.LED(BLUE_LED_PIN).on()

m = mjpeg.Mjpeg("example.mjpeg")

print("You're on camera!")
for i in range(200):
clock.tick()
m.add_frame(sensor.snapshot())
print(clock.fps())

m.close(clock.fps())
pyb.LED(BLUE_LED_PIN).off()
print("Done! Reset the camera to see the saved recording.")
Video recorded on OpenMV Cam M7

It looks it's NOT easy to demo with the SD card. Please refer to my symptoms on the OpenMV forum.

3. Wifi Module

As expected, OpenMV NOW also privides its Wifi module now. Let's just test the example code from openmv's repo.

OpenMV Wifi Shield Connection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Connect Example
#
# This example shows how to connect your OpenMV Cam with a WiFi shield to the net.

import network

SSID='' # Network SSID
KEY='' # Network key

# Init wlan module and connect to network
print("Trying to connect... (may take a while)...")

wlan = network.WINC()
wlan.connect(SSID, key=KEY, security=wlan.WPA_PSK)

# We should have a valid IP now via DHCP
print(wlan.ifconfig())

However, it's NOT that handy to have the Wifi module tested.

My conclusion: Please use esp32-cam instead.