Archive for 2018 年 09 月

Linux code size reduce

27 九月, 2018

在 embedded system 中, 記憶體及儲存體都是非常有限的資源, 而且無法擴充. 因此執行檔大多需要對體積 (大小) 優化. 執行檔的大小經過優化之後, 優點體現在以下方面

  • 占用儲存體少. 如前述, 檔案小, 占用有限的儲存體少是優勢
  • 占用記憶體少. 檔案載入到記憶體執行時, 所需佔用的記憶體也較少
  • 載入時間短. 儲存體通常存取時間較長, 較小的檔案載入到記憶體所需的時間也較短

 

測試檔案: 一個簡單的 printf Hello world

 

精簡執行檔有以下幾個方式 :

  1. Compiler optimization 編譯器優化. 現代的 compiler 通常都具備優化的能力, 可ˊ已對檔案大小或是執行效率優化.
    1. gcc -o hello hello.c, default option, size 8608
    2. gcc -O1 -o hello hello.c, default option, size 8608
  2. strip. 二進位執行檔中, 含有大量符號資訊, 這些資訊通常是用來 debug 的. 可以通過 readelf 查看. $ readelf -S hello
    1. strip 前, size 8608
    2. strip 後, size 6320
    3. strip command -> $ strip hello
  3. objcopy

NT98515 Wi-Fi 連線軟體設置

20 九月, 2018

以下說明如何透過 USB Wi-Fi adapter 以及 hostapd/wpa_supplicant, 達到 Wi-Fi 連線能力.

NT98515 的核心預設沒有支援 USB Host 及 Wireless. 因此需要設定核心.

核心的設定

[*] Networking support  --->                              [CONFIG_NET]
  [*] Wireless  --->                                      [CONFIG_WIRELESS]
    <*/M> cfg80211 - wireless configuration API           [CONFIG_CFG80211]
    [*]     cfg80211 wireless extensions compatibility    [CONFIG_CFG80211_WEXT]
    <*/M> Generic IEEE 802.11 Networking Stack (mac80211) [CONFIG_MAC80211]
Device Drivers  --->
  [*] Network device support  --->                        [CONFIG_NETDEVICES]
    [*] Wireless LAN  --->                                [CONFIG_WLAN]

相依檔案

hostapd/wpa_supplicant 相依於 libcrypto, libnl, libssl , 其中 libcrypto, libssl 來自 OpenSSL. 而 hostapd, wpa_supplicant 都是來自於 hostapd 套件.

編譯 libnl

$ wget https://www.infradead.org/~tgr/libnl/files/libnl-3.2ˊ.25.tar.gz

$ tar -zxvf libnl-3.2.25.tar.gz

$ cd libnl-3.2.25

* libnl 需要設置環境變數 CPP, 否則 configure  會失敗 sainty check failed

$ export CPP="$CC -E"

$ ./configure –prefix=/home/novatek/NA51023_BSP/OpenSource/build/libnl –host=mips-linux –target=mips-linux –disable-maintainer-mode

$ make

編譯 OpenSSL

* OpenSSL 變更 configuration 時, 會出現要求  make depend, 但是真的 make depend 時, 又會遇到 makedepend. 解決方法是安cd 裝 xutils-dev

$ sudo apt install xutils-dev

$ make depend

參考連結

編譯 wpa_supplicant

$ wget https://w1.fi/releases/wpa_supplicant-2.6.tar.gz

$ tar -zxvf wpa_supplicant-2.6.tar.gz

$ cd wpa_supplicant-2.6/wpa_supplicant

$ cp defconfig .config

對 .config 作如下修改

# Uncomment following two lines and fix the paths if you have installed OpenSSL
# or GnuTLS in non-default location
#CFLAGS += -I/usr/local/openssl/include
#LIBS += -L/usr/local/openssl/lib
CFLAGS += -I/home/novatek/NA51023_BSP/OpenSource/build/openssl/include
CFLAGS += -I/home/novatek/NA51023_BSP/OpenSource/build/libnl/include/libnl3
LIBS += -L/home/novatek/NA51023_BSP/OpenSource/build/openssl/lib
LIBS += -L/home/novatek/NA51023_BSP/OpenSource/build/libnl/lib -lnl-3 -lnl-genl-3
LIBS += -L/home/novatek/NA51023_BSP/OpenSource/build/openssl/lib -lcrypto
LIBS_p += -L/home/novatek/NA51023_BSP/OpenSource/build/openssl/lib -lcrypto

以及

# Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
CONFIG_LIBNL32=y

修改 Makefile

CC=$(CROSS_COMPILE)gcc

然後 make

啟動

$ modprobe cfg80211
$ insmod 8188eu.ko

$ ifconfig wlan0 up
$ ./wpa_supplicant -iwlan0 -c/mnt/sd2/wpa_supplicant.conf -B
$ udhcpc -i wlan0
$ ifconfig

* 因為 udhcpc 連線後會嘗試去更新 DNS, 但是我們的 file system 是 read only. 這裡會卡住. 解決方法是 mark 掉 /usr/share/udhcpc/default.script

# rootfs is readonly, overwrite always failed, ignore it
# mv $RESOLV_CONF-$$ $RESOLV_CONF

編譯 hostapd

$ wget https://w1.fi/releases/hostapd-2.6.tar.gz

$ tar -zxvf hostapd-2.6.tar.gz

$ cd hostapd-2.6/hostapd

$ cp defconfig .config

以及

# Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
CONFIG_LIBNL32=y

修改 Makefile

CC=$(CROSS_COMPILE)gcc

然後 make

啟動

ifconfig lo 127.0.0.1
ifconfig wlan0 up
ifconfig wlan0 192.168.1.3
./hostapd -B -dd /mnt/sd2/hostapd.conf
udhcpd -S /mnt/sd2/udhcpdw.conf

hostapd.conf : 複製 hostapd-2.6/hostapd/hostapd.conf, 修改

ssid=IoT-Camera

udhcpdw.conf:  複製 /etc/udhcpdw.conf

 

Virtualbox-Ubuntu Share folder

18 九月, 2018

 

 

Virtualbox-Share-Folder-0

Virtualbox-Share-Folder-1

 

Virtualbox-Share-Folder-2

Virtualbox-Share-Folder-3

 

 

Virtualbox-Share-Folder-4

 

 

Virtualbox-Share-Folder-5

Virtualbox-Share-Folder-6

 

Virtualbox-Share-Folder-7

 

 

 

Virtualbox-Ubuntu Install

18 九月, 2018

重新在 Virtual Box 安裝 Ubuntu.

在 VirtualBox 中選擇新增

Virtualbox-Install-Ubuntu-0

Virtualbox-Install-Ubuntu-1

 

Virtualbox-Install-Ubuntu-2

 

Virtualbox-Install-Ubuntu-3

 

Virtualbox-Install-Ubuntu-4

 

Virtualbox-Install-Ubuntu-5

 

Virtualbox-Install-Ubuntu-6

 

 

 

 

 

 

FFmpeg stream to youtube command

17 九月, 2018

 

Terminal Commands:

One webcam:

ffmpeg -f alsa -ac 2 -i hw:1,0 -f v4l2 -s 1280x720 -r 10 -i /dev/video1 -vcodec libx264 -pix_fmt yuv420p -preset ultrafast -r 25 -g 20 -b:v 2500k -codec:a libmp3lame -ar 44100 -threads 6 -b:a 11025 -bufsize 512k -f flv rtmp://a.rtmp.youtube.com/live2/YOURSTREAMNAMEHERE

Two webcam overlay:

ffmpeg -f alsa -ac 2 -i hw:1,0 -f v4l2 -s 1280x720 -r 10 -i /dev/video1 -f v4l2 -s 320x240 -r 10 -i /dev/video0 -filter_complex "[1:v]setpts=PTS-STARTPTS[bg]; [2:v]setpts=PTS-STARTPTS[fg]; [bg][fg]overlay=shortest=1 [out]" -map "[out]" -map 0:a -vcodec libx264 -pix_fmt yuv420p -preset veryfast -r 25 -g 20 -b:v 2500k -codec:a libmp3lame -ar 44100 -threads 6 -b:a 11025 -bufsize 512k -f flv rtmp://a.rtmp.youtube.com/live2/YOURSTREAMNAMEHERE

Works as of Nov. 21 2014, with 14.04. As seen here: www.oldhomehandy.com

If you don't have FFMPEG installed use Jon Severinsson's FFmpeg PPA:

sudo apt-add-repository ppa:jon-severinsson/ffmpeg
sudo apt-get update
sudo apt-get install ffmpeg

Speaker Test on ALSA

6 九月, 2018

套用 ALSA 驅動的 Speaker Test

在裝置了 ALSA driver 的系統上, 可以使用 alsa-utils 的工具. 這裡說明用 speaker-test 來測試 speaker.

1. 列出設備

$ aplay -L

用 aplay 來列出可以用的設備

null
Discard all samples (playback) or generate zero samples (capture)
default:CARD=ALSA
bcm2835 ALSA, bcm2835 ALSA
Default Audio Device
sysdefault:CARD=ALSA
bcm2835 ALSA, bcm2835 ALSA
Default Audio Device
dmix:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Direct sample mixing device
dmix:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Direct sample mixing device
dsnoop:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Direct sample snooping device
dsnoop:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Direct sample snooping device
hw:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Direct hardware device without any conversions
hw:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Direct hardware device without any conversions
plughw:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Hardware device with all software conversions
plughw:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Hardware device with all software conversions

 

2. speaker test 指令格式

  • -c 通道數. 依指定的通道數量, 循序播放. 預設是 1 (Front Left)
  • -D 設備名稱. aplay -L 所列出來的 dmix, hw, plughw, …
  • -f 頻率
  • -t 聲音式樣. sine/wav/pink noise. 預設是 pink noise

 

3. 用法範例

$ speaker-test

在預設設備, 預設通道數, 播放預設式樣. 結果在左聲道播放 pink noise

$ speaker-test -c 6

在預設設備, 6 個通道數, 播放預設式樣. 結果在以下 6 通道 (Front Left, Center, Front Right, Rear Right, Rear Left, LFE) 輪流播放 pink noise.

$ speaker-test -c 6 -t sine -f 2600

在預設設備, 6 個通道數, 播放 sine 聲音. 結果在以下 6 通道 (Front Left, Center, Front Right, Rear Right, Rear Left, LFE) 輪流播放  2600Hz 的聲音.

$ speaker-test -c 2 -t wav

在預設設備, 2 個通道數, 播放語音. 結果在以下2 通道 (Front Left,Front Right) 輪流播放語音.

$ speaker-test -Dplughw:0 -c 4 -t wav

在plughw設備, 4 個通道數, 播放語音. 結果在以下4 通道 (Front Left,Front Right,Rear Right, Rear Left) 輪流播放語音.

 

 

 

 

 

NT98515 Image package

5 九月, 2018

NT98515 打包 binary 的流程

NT98515 在 build 完個套件之後, 會把它包成一個檔案, 以下說明打包的流程及設定檔案

指令

$ make pack

這個指令, 會由 make 程序執行 Makefile 的 pack 段落.

pack:

@$(call gen_nvt_pack)

而 gen_nvt_pack 則是定義在 build/definitions.mk, 由 Makefile 引入

-include $(BUILD_DIR)/definitions.mk

gen_nvt_pack

gen_nvt_pack = \
NVT_BIN_NAME=FW`cat $(NVT_PRJCFG_MODEL_CFG) | grep -w “CHIP" | grep -v FW | grep -v CFG | grep -v “\#" | awk -F’= ‘ ‘{print $$NF}’`A; \
DSP1_BIN=`cat $(NVT_PRJCFG_MODEL_CFG) | grep DSP1_TYPE | grep -v “\#" | grep DSP1_FREERTOS`; \
DSP2_BIN=`cat $(NVT_PRJCFG_MODEL_CFG) | grep DSP2_TYPE | grep -v “\#" | grep DSP2_FREERTOS`; \
if [ -f $(OUTPUT_DIR)/$$NVT_BIN_NAME.ini ]; then \
echo -e “\e[1;33mnvt pack config is existing…\e[0m"; \
else \
echo -e “\e[1;33mnvt pack config generation…\e[0m"; \
cd $(OUTPUT_DIR); $(BUILD_DIR)/nvt-tools/nvtpack -gen $$NVT_BIN_NAME.ext.bin; \
if [ ! -z “$$DSP1_BIN" ]; then \
sed -i ‘s/0 DSP1/1 DSP1/g’ $(OUTPUT_DIR)/$$NVT_BIN_NAME.ini; \
fi; \
if [ ! -z “$$DSP2_BIN" ]; then \
sed -i ‘s/0 DSP2/1 DSP2/g’ $(OUTPUT_DIR)/$$NVT_BIN_NAME.ini; \
fi; \
fi; \
echo -e “\e[1;33mnvt pack image is generated…\e[0m"; \
cd $(OUTPUT_DIR); $(BUILD_DIR)/nvt-tools/nvtpack -fw $(OUTPUT_DIR)/$$NVT_BIN_NAME.ini

gen_nvt_pack 說明

首先, 由 NVT_PRJCFG_MODEL_CFG (這個變數是 project config 的檔名 例如 uitron/Project/DemoKit/ModelConfig_IPCAM2_EVB.txt), 導出 NVT_BIN_NAME, DSP1_BIN, DSP2_BIN 這 3 個檔名.

然後. 檢查 $$NVT_BIN_NAME.ini 這個檔案在不在, 不在就建立一個.

[NVTPACK_FW_INI_16072017]
GEN packed/FW98515A.bin
CHIP_SELECT 1
ITEM00 0
ITEM01 1 FW98515A.ext.bin
ITEM02 1 FW98515A.bin
ITEM03 1 u-boot.bin
ITEM04 0
ITEM05 1 uImage.bin
ITEM06 1 rootfs.squash.bin
ITEM07 0
ITEM08 0 DSP1.bin
ITEM09 0
ITEM10 0
ITEM11 0
ITEM12 0
ITEM13 0
ITEM14 0
ITEM15 0

最後, 進到 OUTPUT_DIR (output) , 執行 build/nvt-tools/nvtpack -fw output

nvtpack 是一個二進位執行檔

 

 

 

Linux commands

5 九月, 2018

簡單紀錄 Linux 常用的命令 :

 

Date 日期設定

  • 中文的日期輸出格式, 常常不是預期要用到的. 這個只要設定環境變數就可以了
  • $ export LC_TIME=zh_TW.UTF-8, export LC_TIME=en_US.UTF-8
  • 修改到啟動檔
  • ~/.bashrc
  • /etc/default/locale
  • /etc/e

列出 CPU/記憶體使用程序

$ ps -eo pid,ppid, cmd, %mem, %cpu –sort=-%mem

$ ps

壓縮/解壓縮目錄

$ tar -zcvf <archive-name>.tar.gz <folder-name>

$ tar -zxvf <archive-name>.tar.gz -C <folder-name>

$ tar -jxf <archive-name>.tar.bz2

尋找檔案

$ find . -name “rtl8188eufw.bin"

$ ln -s <folder> <lin>

在目錄中尋找檔案內的字串

$ grep -rnw ‘string’ folder

檢視目錄中檔案大小

$ du -mh .

處理目錄中的所有檔案

$ for f in folder/ ; do cat “$f" ; done

 

 

 

FFMPEG command notes

3 九月, 2018

ffplay

play from web camera

$ffplay -i /dev/video0

Streaming To Local

$ ffmpeg -i <filename> -f mpegts udp://127.0.0.1:20000

$ ffplay -i udp://127.0.0.1:20000

Streaming to another computer

$ ffmpeg -i <filename> -f mpegts udp://192.168.43.247:20000

$ ffplay -i udp://127.0.0.1:20000

$ ffmpeg -i <filename> -q 0 -f mpegts udp://192.168.43.247:20000

 

$ ffmpeg -i input -c:v libx264 output.mp4

$ ffmpeg -i example.mp4 -hide-banner

$ ffmpeg -i input.mpg -f mp4 output.mp4

 

? — enable-muxer=mpegts

 

Raspberry Pi Audio

3 九月, 2018

說明在 Raspberry Pi 上的 Audio 應用

Raspberry-Audio-0

Raspberry Pi 有一個 3.5mm 的 audio jack, 所以可以用來做一些 audio 的應用. 這樣只說對了一半, Raspberry Pi 雖然有 audio jack, 但是它沒有 encoder, 所以只能做 audio 播放. 如果要做 audio 錄製, 就需要額外的部件. 譬如說, 像是以下的方式, 外接一個 USB Sound Card.

Raspberry-Audio-1

 

指令 :

播放

$ omxplayer a.wav

$ omxplay -p -o hdmi a.wav

$ omxplyer –nokey -o local a.wav &

錄製

$ arecord -f cd -D plughw:o -d 10 a.wav

工具

$ alsa-utils