Archive for 2018 年 12 月

Vatics – Initial Firmware from UART

21 十二月, 2018

簡述

未燒錄 firmware 的 Vatics, 可以有幾個方式燒錄. 這邊用 UART 燒錄.

以下是用 UART 燒錄的步驟

  1. Build L1 Loader
  2. Build U-Boot
  3. Build ImageGenerator
  4. Build Boot Image
  5. Prepare Boot SD Card

Build L1 Loader

參考設計, 選定 DDR 參數, 在 configs/ 下面

cd ~/M5S-V2.1/M5S-V2.1/02_BSP/03_Bootloader/Source_Code/Loader_v2.1-rc3

make config=configs/250mhz.lpddr2.2g.config

Build U-Boot

* 應用 IC 是 5502S

* default boot device 是 SPI NOR Flash, 此處相同

cd ~/M5S-V2.1/M5S-V2.1/02_BSP/03_Bootloader/Source_Code/U-Boot_v2.1-rc3

$ make distclean

$ make m550s_defconfig

$ make clean

$ make

此處會產出 u-boot.bin

Build ImageGenerator_App

cd ~/M5S-V2.1/M5S-V2.1/02_BSP/03_Bootloader/Source_Code/ImageGenerator_v2.1-rc1/ImageGenerator_App

此處會產出 imagegenerator

Build Boot Image

將 build 出的 image 複製到 ImageGenerator/ImageGenerator_App

  • Loader_v2.1-rc3/loader-dummy.bin
  • Loader_v2.1-rc3/loader-nf2k.bin
  • Loader_v2.1-rc3/loader-sd.bin
  • Loader_v2.1-rc3/loader-sf.bin
  • Loader_v2.1-rc3/loader-sn.bin
  • Loader_v2.1-rc3/loader-uart.bin
  • Loader_v2.1-rc3/loader-usb.bin
  • U-Boot_v2.1-rc3/u-boot.bin

然後執行 ImageGenerator

./imagegenerator -t sf -c ./SF/M5S_SF.config -l loader-sf.bin -u u-boot.bin -o m5s_bootimage_sf.bin

Prepare boot SD card

在 Linux 上 format SD 卡

確認 SD 卡 device

$ lsblk

製作 disk partition

$ sudo fdisk /dev/sdb

=> o, n, p,enter, enter, enter,w

重新抓取 device information

$ sudo fdisk -l /dev/sdb1

格式化

$ sudo mkdosfs -F32 -n BOOTEXT /dev/sdb1

更名 loader-sd.bin 為 loader.bin

複製 loader.bin, u-boot.bin 到 SD 卡

>>> power on

 

 

 

 

 

 

 

 

Vatics – Cross Compile OpenCV

20 十二月, 2018

簡述

OpenCV 是一套影像處理軟體. 除了提供影像處理工具外, 除此之外, 它也是一個工具平台, 在 OpenCV 上可以再架構 Dlib 或是 TensorFlow/Caffe. 可以說, OpenCV 是一個影像工作的基礎.

也因為這樣, OpenCV 是一個很大的軟體鍊.  移植 OpenCV 是一個很複雜的工作.

Tool Chain

CMake-3.13.0-rc2

$ sudo apt-get install build-essential

$ wget https://www.cmake.org/files/v3.13/cmake-3.13.0-rc2.tar.gz

$ tar xf cmake-3.13.0-rc2.tar.gz

$ cd cmake-3.13.0-rc2

$ ./configure

$ make

$ sudo make install

unzip

https://downloads.sourceforge.net/infozip/unzip60.tar.gz

# 系統已安裝

Dependences

FFmpeg

 

zlib

$ wget http://www.zlib.net/zlib-1.2.11.tar.gz

$ tar -zxvf zlib-1.2.11.tar.gz

$ cd zlib-1.2.11

$  export CC=arm-linux-gcc

$ export AR=arm-linux-ar

$ ./configure

$ make

$ make install prefix=/home/nick/M5S-V2.1/package/OpenCV/install/zlib

 

OpenCV

$ wget https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/3.4.3/opencv-3.4.3.zip

$ unzip opencv-3.4.3.zip

$ mkdir build

$ cd build

$ make-opencv.sh

cmake      \
-DBUILD_TIFF=ON    \
-DBUILD_ZLIB=ON             \
-DBUILD_SHARED_LIBS=OFF     \
-DBUILD_OPENEXR=OFF         \
-DWITH_V4L=ON    \
-DWITH_LIBV4L=ON   \
-DWITH_CUDA=OFF    \
-DWITH_OPENEXR=OFF          \
-DWITH_FFMPEG=ON            \
-DENABLE_CX11=ON   \
-DBUILD_opencv_world=ON     \
-DCMAKE_C_COMPILER=arm-linux-gcc \
-DCMAKE_CXX_COMPILER=arm-linux-g++ \
-DCMAKE_INSTALL_PREFIX=/vatics  \
-DCMAKE_C_FLAGS=-I/home/nick/M5S-V2.1/package/OpenCV/install/zlib/include \
-DCMAKE_CXX_FLAGS=-I/home/nick/M5S-V2.1/package/OpenCV/install/zlib/include \
-DCMAKE_LIBRARY_PATH=-L/home/nick/M5S-V2.1/package/OpenCV/install/zlib/lib  \
-DZLIB_INCLUDE_DIRS=/home/nick/M5S-V2.1/package/OpenCV/opencv-3.4.3/3rdparty/zlib   \
-DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm.toolchain.cmake   \
..

make
make DESTDIR=/home/nick/M5S-V2.1/package/OpenCV/install  install

 

 

 

 

Vatics – app (sample program) build configuration

19 十二月, 2018

簡述

說明 Vatics app ( sample program) 編譯的環境及設定

說明

Vatics 的 sample program 的 build system 分兩個層次. 在 ~/M5S-V2.1/M5S-2.1/03_SDK/02_Software_Tool_Kit/sdk_60633/sdk/apps 中去呼叫 rebuild_apps.sh, 進入 streamer & examples 這兩個子目錄中去編譯. 在 examples & streamer 中, 在各自創建 build_vienna 子目錄, 這是 CMake 的工作目錄. 再各自乎獨立 CMake 來 build 子目錄

特別要注意的是, rebuild_apps.sh 最後有一個警告訊息, SDK 和 BSP 的編譯條件似乎有干涉的可能

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
WARNING:"
Script devel_"${PLATFORM_DIR}" is used to build BSP."
It’s recommended to build SDK without sourcing devel_"${PLATFORM_DIR}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

build examples

執行 rebuild_apps.sh , 會進入 examples/build_vienna, 使用 cmake 命令來 make

cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-DPLATFORM_TYPE=${PLATFORM_TYPE} \
-DSDK_TYPE=${SDK_TYPE} \
-DCMAKE_TOOLCHAIN_FILE=../../cmake/${CMAKE_TOOLCHAIN_FILE}

其中

BUILD_TYPE = “Release"
PLATFORM_TYPE=SCHUBERT
SDK_TYPE="SDK_IPCAMERA"
CMAKE_TOOLCHAIN_FILE=devel_vienna_toolchain.cmake

devel_vienna_toolchain.cmake 在 ~/M5S-V2.1/M5S-2.1/03_SDK/02_Software_Tool_Kit/sdk_60633/sdk/cmake 中, 主要是作為 tool chain (CROSS COMPILE)  的環境設置, 內容如下 :

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(MY_TOOL_PATH /opt/vtcs_toolchain/vienna/usr)
SET(MY_TOOL_BIN_PATH /opt/vtcs_toolchain/vienna/usr/bin)
SET(MY_CROSS_COMPILER arm-linux-)
SET(CMAKE_C_COMPILER   ${MY_TOOL_BIN_PATH}/${MY_CROSS_COMPILER}gcc)
SET(CMAKE_CXX_COMPILER ${MY_TOOL_BIN_PATH}/${MY_CROSS_COMPILER}g++)
SET(CMAKE_FIND_ROOT_PATH ${MY_TOOL_PATH}/arm-buildroot-linux-uclibcgnueabihf/sysroot ${MY_TOOL_PATH}/arm-buildroot-linux-uclibcgnueabihf)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

而 CMakeList 則是指向上層目錄, 也就是 example/CMakeList,

MakeList 在 ~/M5S-

V2.1/M5S-2.1/03_SDK/02_Software_Tool_Kit/sdk_60633/sdk/apps/examples

Compiler Options

CMAKE_C_FLAGS: -std=gnu99 -O3 -Wall -Wextra -pedantic -pthread

CMAKE_CXX_FLAGS: -std=c++11 -O3 -Wall -Wextra -pedantic -pthread

 

 

 

後續應用

在建立自己的程式編譯環境的時候, 套用相同的設定應該就可以了.

 

 

 

 

OpenCV – DNN model run

17 十二月, 2018

簡述

紀錄及說明如何在 OpenCV/C++ 的環境下, 載入預先訓練好的 DNN模型及參數, 以及執行

Reference : Tensorflow detection model zoo:

這邊有很多已經訓練好的模型及參數

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

Reference : TensorFlow Object Detection API

https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API#generate-a-config-file

Utility : tf_text_graph_ssd.py

這個檔案有很多版本, 不知道在那裏抓到一個可以用的版本. 再去找源頭, 就再也找不到了, 先把它改名成 tf_text_graph_ssd_good.py

https://github.com/opencv/opencv/blob/master/samples/dnn/tf_text_graph_ssd.py

http://download.lastme.com/opencv/3.4.3/build/samples/dnn/tf_text_graph_ssd.py

特徵是它有 import tensorflow, 但是沒有用到 tf_text_graph_common, …

import tensorflow as tf

#from tf_text_graph_common import *

Extra Data

https://github.com/opencv/opencv_extra/tree/master/testdata/dnn

ssd_mobilenet_v1_coco

基於 COCO 資料集的 Mobilenet + SSD 模型

download link

http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz

pb file:

解開下在之後的 frozen_inference_graph.pb

pbtxt file:

python tf_text_graph_ssd.py –input frozen_inference_graph.pb –output graph.pbtxt –min_scale 0.15

python code:

cvNet = cv.dnn.readNetFromTensorflow(‘frozen_inference_graph.pb’, ‘graph_ssd.pbtxt’)
img = cv.imread(‘group-face-0.jpg’)
cvNet.setInput(cv.dnn.blobFromImage(img, size=(300, 300), swapRB=True, crop=False))
cvOut = cvNet.forward()

c code:

dnn::Net net = cv::dnn::readNetFromTensorflow(PB_FILE, PBTXT_FILE);
Mat frame = cv::imread(“f:\\group-face-0.jpg");
cv::Mat blob = cv::dnn::blobFromImage(frame, 1. / 255, Size(300, 300));
net.setInput(blob);
Mat output = net.forward();

 

 

 

 

 

 

 

 

U-Boot Modify environment for Linux

11 十二月, 2018

簡述

修改 U-Boot 啟動 Linux 的參數

printenv

列出所有環境變數

printenv var

列出環境變數 var

setenv var value

設定環境變數  var  的內容為 value

example

U-Boot> printenv bootargs
bootargs=root=/dev/mtdblock4 mem=512M console=0,115200 phy_mode=rmii
U-Boot> setenv bootargs root=/dev/mtdblock4 mem=768M console=0,115200 phy_mode=rmii
U-Boot> printenv bootargs
bootargs=root=/dev/mtdblock4 mem=768M console=0,115200 phy_mode=rmii

Cross Compile HDF5

10 十二月, 2018

簡述

在使用 OpenCV/C++ 載入 training 好的 cifar10_model-10.h5 檔案時, 無法編譯. 因為 OpenCV 需要用到 HDF5 這個ˋ library.

原本是想要在 PC/Python 的環境下去 train dataset, 然後放到 ARM/C++ 的環境去執行. train 好的 模型則是用 HDF5 的檔案來裝載.  不過後來發現 HDF5 是 不支援 cross compile. 原因是他在測試及源碼的部分用到了許多 in place, 這樣就造成 cross compile 無法使用, 且沒有意義.

HDF5 只支援 VS201X, Linux 這兩種組態, 而且必須在目標機上面編譯.

源碼下載位址

HDF5® Source Code

or

https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.4/src/

Source code 分成幾個不同包裝, For Linux, For Windows, CMake, configure

在 Windows 上編譯

下載 Building HDF5 WITH CMAKE (Windows)

CMake-hdf5-1.10.4.zip

解壓縮到 CMake-hdf5-1.10.4

再這個目錄中, 有好幾個批次檔, 複製 build-VS2015-64.bat 到 build-VS2015-64-temp.bat, 並作如下修改

“C:\Program Files\CMake\bin\ctest" -S HDF5config.cmake,BUILD_GENERATOR=VS201564 -C Release -V -O hdf5.log

編譯之後, 產生的 HDF5-1.10.4-win64.zip 解壓縮即可.

在 Linux Ubuntu 上編譯

這部分未完成, 且應該不會更新, 只留下作為參考

奇怪, hdf5-1.10.4tar.gz, hdf5-10.4.tar 都解不開, 不過 hdf5-1.10.4.zip 可ˋ以

$ unzip CMake-hdf5-1.10.4.zip

$ cd CMake-hdf5-1.10.4

$ nano HDF5options.cmake

cmake: 13 (message)
Could NOT find HDF5 (missing: HDF5_LIBRARIES HDF5_INCLUDE_DIRS)

export PATH="$PATH:/usr/local/hdf5″

 

 

 

Problem : wlan0 變成 wlx………

7 十二月, 2018

簡述

在安裝 Ubuntu 18.04 server 版的時候, 安裝了 USB WiFi adapter. 但是奇怪的是 wlan0 不見了, 取而代之的是一個奇怪的名稱 wlx………

說明

查閱資料之後, 發現這個叫做 Predicatable Network Interface Names, 訊息可查閱以下網址

https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

簡單的說, 當系統有數個相同的介面時, 可以用它來區分. USB WiFi adapter 叫做 wlx 後面接著一串符號, 是 MAC address.

好不好, 見仁見智. 不過, 如果不想要, 可以把它 diable 掉

$ sudo ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules

$ reboot

然後, wlan0 就回來了

U-Boot FAT command

6 十二月, 2018

簡述

在 U-Boot 的命令列環境下, 如何操作 FAT filsystem

在下 FAT 命令之前

有趣的是, 我們要先知道 FAT filesystem 在甚麼設備上, 才能對他下指令. 通常, embedded system 的 FAT filesystem 會是在 mmc 或是 USB 上. 所以, 先參考 mmc 及 USB 的操作

U-Boot mmc 操作命令

U-Boot usb 操作命令

fatinfo <interface> [<dev[:part]>]

顯示 FAT filesystem 的資訊

U-Boot> fatinfo mmc 0
Interface:  MMC
Device 0: Vendor: Man 000003 Snr 3beab000 Rev: 0.3 Prod: SS08G
Type: Removable Hard Disk
Capacity: 7580.0 MB = 7.4 GB (15523840 x 512)
Filesystem: FAT32 “NO NAME    "

U-Boot> fatinfo usb 0
Interface:  USB
Device 0: Vendor: Generic  Rev: 0.00 Prod: USB  SD Reader
Type: Removable Hard Disk
Capacity: 7580.0 MB = 7.4 GB (15523840 x 512)
Filesystem: FAT32 “NO NAME    "

fatload <interface> [<dev[:part]> [<addr> [<filename> bytes [pos]]]]]

從介面 (interface) 設備 (dev) 的 分割 (part) 的檔案 (filename) 的偏移位址 (pos) 讀取 bytes, 放置到 dram 的 addr 位址

U-Boot> fatload mmc 0 0x80000000 image_to_gray 0 4096
reading image_to_gray
FAT: Misaligned buffer address (80003f6a)
5221814 bytes read in 5123 ms (995.1 KiB/s)

U-Boot> fatload mmc 0 0x80000000 image_to_gray
reading image_to_gray
5238348 bytes read in 220 ms (22.7 MiB/s)

fatls <interface> [<dev[:part]>] [directory]

列出 FAT 目錄中的檔案

U-Boot> fatls mmc 0 lib
./
../
976   libasound.la
3620584   libasound.so.2.0.0
86831622   libavcodec.a
1185612   libavdevice.a
17958524   libavfilter.a
35972826   libavformat.a
1843522   libavutil.a
163600   libpostproc.a
389812   libswresample.a
2840724   libswscale.a
1973888   libx264.a
1766156   libx264.so.155
pkgconfig/

12 file(s), 3 dir(s)

U-Boot> fatls usb 0
system volume information/
665   sources.list
1128476   ew-7822uan_linux_driver_4.0.9.zip

2 file(s), 1 dir(s)

fatsize

U-Boot> fatsize mmc 0 image_to_gray
U-Boot>

fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>

將記憶體中位址在 addr 的內容, 寫入介面 (interface) 設備 (dev) 分割 (part) 的檔案 (filename), 長度為 bytes (16 進位)

U-Boot> fatwrite mmc 0 0x80000000 image_to_temp 4FEE4C
writing image_to_temp
5238348 bytes written

 

U-Boot usb command

4 十二月, 2018

簡述

對系統上的 usb device (主要是 storage) 進行操作

usb start

啟動 usb 控制器

U-Boot> usb start
(Re)start USB…
USB0:   USB Clock is enable
version 10000002
Host only
USB PHY ctrl0 = 0xbe1c46e4, ctrl1 = 0xff00, counter = 0x3d5
Read register b8300040 val 4f54320a
Core Release: 3.20a
Warning: SNPSID 4f54320a is not verified for the driver.
scanning bus 0 for devices… 2 USB Device(s) found
scanning usb for storage devices… 1 Storage Device(s) found

usb reset

重置 usb 控制器

U-Boot> usb reset
(Re)start USB…
USB0:   USB Clock is enable
version 10000002
Read register b8300040 val 4f54320a
Core Release: 3.20a
Warning: SNPSID 4f54320a is not verified for the driver.
scanning bus 0 for devices… 2 USB Device(s) found
scanning usb for storage devices… 1 Storage Device(s) found

usb stop

停止 usb 控制器

U-Boot> usb stop
stopping USB..

usb tree

列出 usb 設備的詳細設備資訊

U-Boot> usb tree
USB device tree:
1  Hub (480 Mb/s, 0mA)
|   U-Boot Root Hub
|
+-2  Mass Storage (480 Mb/s, 100mA)
Generic Mass Storage Device 00000000000006

usb info

列出 usb 設備的樹狀結構

U-Boot> usb info
1: Hub,  USB Revision 1.10
–  U-Boot Root Hub
– Class: Hub
– PacketSize: 8  Configurations: 1
– Vendor: 0x0000  Product 0x0000 Version 0.0
Configuration: 1
– Interfaces: 1 Self Powered 0mA
Interface: 0
– Alternate Setting 0, Endpoints: 1
– Class Hub
– Endpoint 1 In Interrupt MaxPacket 2 Interval 255ms

2: Mass Storage,  USB Revision 2.0
– Generic Mass Storage Device 00000000000006
– Class: (from Interface) Mass Storage
– PacketSize: 64  Configurations: 1
– Vendor: 0x1307  Product 0x0310 Version 1.0
Configuration: 1
– Interfaces: 1 Bus Powered 100mA
Interface: 0
– Alternate Setting 0, Endpoints: 2
– Class Mass Storage, Transp. SCSI, Bulk only
– Endpoint 1 Out Bulk MaxPacket 512
– Endpoint 2 In Bulk MaxPacket 512

usb test

開始 usb 2.0 測試模式

usb storage

顯示 usb storage 的詳細資訊

U-Boot> usb storage
Device 0: Vendor: Generic  Rev: 0.00 Prod: USB  SD Reader
Type: Removable Hard Disk
Capacity: 7580.0 MB = 7.4 GB (15523840 x 512)

usb dev

設定或顯示目前作用中的 usb storage device

U-Boot> usb dev

USB device 0: Vendor: Generic  Rev: 0.00 Prod: USB  SD Reader
Type: Removable Hard Disk
Capacity: 7580.0 MB = 7.4 GB (15523840 x 512)

usb part

列出 usb 設備的分割表

U-Boot> usb part

Partition Map for USB device 0  —   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
1     8192            15515648        38e91066-01     0c

usb read addr blk# cnt

從 usb device ( storage) 的 blk# 開始, 讀取 cnt 個 block, 目的地為 dram 的 addr 位址

usb write addr blk# cnt

將 dram 的 addr 位址開始的資料, 寫到 usb device (storage) 的 blk# 開始的區域, 大小為 cnt 個 block

 

 

 

U-Boot mmc command

4 十二月, 2018

簡述

在 U-Boot 的命令列模式下, 對 mmc 設備操作.

mmc list

列出目前的 mmc 設備

U-Boot> mmc list
VPL DWMMC: 0

mmc info

列出目前的 mmc 設備資訊

U-Boot> mmc info
Device: VPL DWMMC
Manufacturer ID: 3
OEM: 5344
Name: SS08G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit

mmc part

列出目前的 mmc 設備上的分割資訊

U-Boot> mmc part

Partition Map for MMC device 0  —   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
1     8192            15515648        dc73a8e3-01     0c

mmc dev [dev] [part]

顯示或是設定目前的設備, 分割

U-Boot> mmc dev
MMC: Change to high speed
MMC: Change to 4 Bit
switch to partitions #0, OK
mmc0 is current device

mmc rescan

U-Boot> mmc rescan
MMC: Change to high speed
MMC: Change to 4 Bit

mmc read addr blk# cnt

將資料自 mmc 設備讀至記憶體

U-Boot> mmc read 0x80000000 0x0 4

MMC read: dev # 0, block # 0, count 4 … 4 blocks read: OK

自 mmc 的 block 0, 讀取 4 個 block 到記憶體的 0x80000000

mmc write addr blk# cnt

將資料自記憶體寫至 mmc 設備

 

mmc erase blk# cnt

 

擦除 mmc 設備上, 從 blk# 開始的 cnt 個 block