Friday, March 9, 2018

使用LXC建立USB以及X-forward環境

使用LXC建立USB以及X forward環境

因為修課需要一些debian系的工具,不過我不想讓debian系的和Arch Linux混在一起,所以LXC看起來是一個不錯的解。

環境

  1. OS: Arch Linux (4.15.7-1-ARCH)
  2. LXC
  3. ubuntu on LXC

步驟

LXC準備

安裝 LXC

$ sudo pacman -Sy lxc arch-install-scripts debootstap

建立 Host Network (NAT bridge) (Arch Wiki寫得很好看Arch Wiki)

建立/etc/default/lxc-net(詳情見Arch Wiki)
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
修改lxc template conf,在/etc/lxc/default.conf新增
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
安裝dnsmasq
$ sudo pacman -Sy dnsmasq
開啟以及設定開機啟動:
sudo systemctl start lxc-net
sudo systemctl enable lxc-net

建立container (ubuntu)

建previleged的container
$ sudo lxc-create -n UbuntuBuild -t /usr/share/lxc/templates/lxc-ubuntu [ -P lxc-location]  
修改container的網路(由於我要裝的軟體的license綁mac address,所以我需要修改一下mac address),修改lxc的路徑下的config file,若沒指定lxc的位置,預設是在/var/lib/lxc/CONTAINER_NAME/config,有指定路徑則在 /PATH/YOU/DEFINED/CONTAINER_NAME/config
## default values
... 
...
## network
lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.name = eth0
lxc.net.0.hwaddr = .... ## 自行修改mac address

LXC Xorg

修改container的config(同上位置)
## default values
...
...
# network
...
...
## for xorg
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir,ro
lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file

lxc.mount.entry = tmpfs tmp tmpfs defaults
基本上邏輯是把Xorg需要的device mount進來。
/dev/dri為direct rendering manager(DRM)的device file,
/dev/snd為音效的device file
/dev/video0為video device file
ubuntu on LXC中安裝X相關套件
$ sudo lxc-console -n UbuntuBuild [ -P /path]
進到ubuntu lxc
# sudo apt-get install xauth x11-apps
使用ssh -X進入LXC
# /usr/bin/xclock
應該要有windows跑出來
其他app可能會需要裝dbus
# sudo apt-get install dbus dbus-x11
其他部份可以看以連結How Do I Get X11 Applications Running in a LXC Container?

LXC USB

修改container的config(同上位置)
## usb
lxc.cgroup.devices.allow = c 189:* rwm

lxc.mount.entry = /dev/bus/usb/001 dev/bus/usb/001  none bind,optional,create=dir
lxc.mount.entry = /dev/bus/usb/002 dev/bus/usb/002  none bind,optional,create=dir
lxc.mount.entry = /dev/bus/usb/003 dev/bus/usb/003  none bind,optional,create=dir
lxc.mount.entry = /dev/bus/usb/004 dev/bus/usb/004  none bind,optional,create=dir
接下來我們來探究一下
lxc.cgroup.devices.allow = c 189:* rwm
這行的意思,首先
$ ls -al /dev/bus/usb/001
drwxr-xr-x 2 root root     80 Mar  8 23:06 .
drwxr-xr-x 6 root root    120 Mar  8 23:06 ..
crw-rw-r-- 1 root root 189, 0 Mar  8 23:06 001
crw-rw-r-- 1 root root 189, 1 Mar  8 23:06 002
你會發現189這個數字,這數字其實是major number,這些數字在Linux的文件中都有定義,請看https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.txt
逗號後為minor number,有於usb裝置多,所以在lxc.cgroup.devices.allow中用wildcard取代。底下部份就是把usb的device folder mount進LXC中。

LXC Serial Port設定

由於修課需要用到serial port,但是Serial Port的tty只有插上後才會出現,這對開機就需mount的lxc來說偏麻煩。這時有一個好用的指令出現了。

lxc-device

在使用lxc-device時仍須注意cgroup是否有允許該裝置。
例如Serial Port常用(USB serial converters)的major number為188。所以需要在config中新增
lxc.cgroup.devices.allow = c 188:* rwm
這樣開機後才有效果。接下來,在插入裝置後找到該裝置device名稱,例如
/dev/ttyUSB1。這時我們需要透過lxc-device把其接入中。
$ sudo lxc-device -n CONTAINER_NAME [-P path] add /dev/ttyUSB1
這樣這個裝置就會被加入LXC中了。

Saturday, February 3, 2018

使用SW4STM32建置STM32 HAL專案

使用SW4STM32建置STM32 HAL專案

上學期修課時需要的一些小技巧紀錄一下。有人蠻多人問過我,所以打一篇文章。

步驟

其實滿簡單的,只要在建立新專案時多勾選一個選項即可。
當選擇完板子時不要急著案完成,繼續按下一步。
下一步後,勾選Hardware Abstraction Layer(HAL),即可導入ST官方提供之HAL library。其他還有一些第三方library如FreeRTOS等,也可在這裡新增。

結果

SW4STM32會建立如下專案:
其中HAL會獨立在HAL_Driver下。有幾個檔案要特別注意。

src/stm32l4xx_it.c和inc/stm32l4xx_it.h這兩個檔案為放置Interrupt handler用的檔案,如有新增的Interrupt handler最好是放在這裡。

src/system_stm32l4xx.c:這個檔案放置系統開機時的初始化(clock和RCC)。

src/syscalls.c:這個檔案放置syscall,如果需要將printf的輸出導到UART,就需要在這個檔案動手腳。如下重新定義_io_putchar(int ch)


其他

若要將其他的STM32CubeMX產生出的檔案放入SW4STM32產生之HAL專案,編譯時可能會遇到一些問題。如:void HAL_MspInit(void) redefination。原因是HAL_Driver/Src/stm32l4xx_hal_msp_template.c這個檔案會有衝突,處理方法即是刪除此檔。

Chasing Pianos: The Piano Music Of Michael Nyman / Valentina Lisitsa Soundtrack Collection

Chasing Pianos: The Piano Music Of Michael Nyman / Valentina Lisitsa

一、資訊


電影:鋼琴與他的情人(The Piano)、《奇異果夢遊仙境》(Wonderland)、《繪圖師的合約》(The Draughtsman’s Contract)、《千鈞一髮》(Gattaca)、《一加二的故事》(A Zed & Two Noughts)、安妮日記(The Diary of Anne Frank) 、Drowning by Numbers 、Carrington、The End of The Affair 、Man With a Movie Camera、The Claim 
配樂作家: Michael Nyman
演奏:Valentina Lisitsa
發行:Decca
Chasing Pianos: The Piano Music Of Michael Nyman / Valentina Lisitsa


二、心得感想

我第一次聽到Michael Nyman這位編曲家是在千鈞一髮(Gattaca)這部我非常喜歡的電影(看看這個部落格的名字就知道了),當時我不是很懂何謂極簡主義音樂,到了近年聽了許多極簡主義的音樂,例如:Philip Glass、Max Richter(後極簡)。等人的作品才開始了解極簡主意的魅力,透過同樣緩慢推移的模式將情緒注入其中。當然同樣的模式一直出現有時也被其他人批評。不過我覺得這類音樂有打動到我,在電影中讓情緒昇華這樣就夠了。

Michael Nyman最有名的配樂作品當屬<鋼琴師與她的情人>(The piano)這部電影了。而這張CD將這部電影中最精華的幾段配樂提取出來。至於其他電影我到是都沒聽過。

三、曲目


  1. The Heart Asks Pleasure First (Copyright 1993, published in Michael Nyman The Piano Collection) From The Piano 04:21
  2. Big My Secret (Copyright 1993, published in Michael Nyman The Piano Collection)From The Piano 02:58
  3. Candlefire From The Diary of Anne Frank 02:29
  4. If (Published 2005 in Michael Nyman The Piano Collection) From The Diary of Anne Frank 03:34
  5. Sheep ‘n’ Tides From Drowning by Numbers 02:32
  6. Goodbye Moortie From The Diary of Anne Frank 01:53
  7. ly Drive From Carrington 00:51
  8. Diary of Love From The End of The Affair 02:44
  9. Time Lapse From A Zed & Two Noughts 04:54
  10. Odessa Beach From Man With a Movie Camera 03:32
  11. The School Room From The Diary of Anne Frank 02:12
  12. Why?From The Diary of Anne Frank 03:59
  13. Chasing Sheep is best left to Shepherds From The Draughtman’s Contract 03:17
  14. Deep Sleep Playing From The Piano 02:19
  15. The Exchange From The Claim 02:51
  16. Here to There From The Piano 01:21
  17. Jack From Wonderland 02:20
  18. Bill From Wonderland 02:39
  19. The Departure From Gattaca 02:49
  20. Lost and Found From The Piano 03:08
  21. All Imperfect Things From The Piano 03:06
  22. The Attraction of The Pedalling Ankle From The Piano 07:42
  23. The Mood That Passes Through You From The Piano 02:36
  24. The Embrace From The Piano 02:31
  25. Silver-Fingered Fling From The Piano 05:15

Friday, October 6, 2017

Cloud Atlas Original Soundtrack

Cloud Atlas Original Soundtrack

一、資訊

電影:雲圖(Cloud Atlas)
配樂作家: Tom Tykwer、Johnny Klimek、Reinhold Heil
發行:Sony Music
CLOUD ATLAS ORIGINAL MOTION SOUNDTRACK

二、心得感想

這部電影其實我沒看過,我當初是因為偶然聽到了這部電影的配樂<Cloud Atlas Sextet>和<Prelude: The Atlas March>後跑去找了這部電影的原著小說來看。這部電影小說的敘事手法十分有趣。她其實六段故事以A-B-C-D-E-F-F-E-D-C-B-A的方式敘述的,而且每段故事時間相差很久,但是前段的故事會有部份連結到下一段,表現出"輪迴"的感覺。當然這種敘事方式拍成電影爆炸機率相當高的,而電影得票房也真的炸了。

如同敘事手法,配樂本身也是有A-B-C-D-E-F-F-E-D-C-B-A的曲目編排。有多首配樂的風格式成對的。不過其中最引人注目的仍是書中提到的<雲圖六重奏>,這首貫串整個故事的曲子。也就是<Prelude: The Atlas March>,之後包括<Cloud Atlas Opening Title>、<Cloud Atlas Finale>、<The Cloud Atlas Sextet for Orchestra>和<Cloud Atlas End Title>,我覺得光片尾幾首曲子的編排與交響編曲,這張專輯就很有收藏的價值了。當然片中的<Templa of Sacrifice>和<All Boundaries Are Conventions>也是我喜歡的曲子。不過剩下幾段的風格我不是很喜歡。

不過這張專輯聽的時候有發現一個問題,最後幾首有時會有不名聲響,我不確定是不是錄音失誤,還是刻意的。

三、曲目

  1. Prelude: The Atlas March
  2. Cloud Atlas Opening Title
  3. Travel to Edinburgh
  4. Luisa’s Birthmark
  5. Cavendish In Distress
  6. Papa Song
  7. Sloosha’s Hollow
  8. Sonmi-451 Meets Chang
  9. Won’t Let Go
  10. Kesselring
  11. The Escape
  12. Temple Of Sacrifice
  13. Catacombs
  14. Adieu
  15. New Direction
  16. All Boundaries Are Conventions
  17. The Message
  18. Chasing Luisa Rey
  19. Sonmi’s Discovery
  20. Death Is Only A Door
  21. Cloud Atlas Finale
  22. The Cloud Atlas Sextet for Orchestra
  23. Cloud Atlas End Title

Wednesday, October 4, 2017

The Imitation Game Original Soundtrack

The Imitation Game Original Soundtrack 

一、資訊

電影:模仿遊戲(The Imitation Game)
配樂作家:Alexandre Desplat
發行:Sony Music
THE IMITATION GAME

二、心得感想

這部電影我本身蠻喜歡的,因為我是資訊背景,這故事本身就有親切感(讀過資工系的或多或少聽過圖零機吧),雖然劇情魔改了Alan Turing的故事,但是改的還算流暢。唯一需要吐嘈的應該就是把發現德軍密碼會有固定內容,而這些內容可以用來剪枝(替除不可能發生的組合)部份改的太戲劇化了。

音樂部份為了呈現Alan Turing數學家的特質,讓音符很離散,很像一群數字在舞動。尤其在<Crosswords>、<Running>、<Decrypting>會有一種問題被拆解被處理的感覺。當然主題旋律<The Imitation Game>和<Alan Turing's Legacy>寫的很有味道。我當初在戲院看到這部電影時有被這兩首曲子觸動。<The Apple>、<Farewell To Christopher>是片中圖靈生命最悲情的時刻,這些悲傷讓我們對圖靈,還有對同性戀的迫害起了反思。

由於我仍是學生,財力不是十分充足,當初看完這部電影後一直去spotify反覆聽這片原聲帶,最後才決定買實體的,以更好的音質品味這張專輯。

三、曲目

  1. The Imitation Game
  2. Enigma
  3. Alan
  4. U-Boats
  5. Carrots And Peas
  6. Mission
  7. Crosswords
  8. Night Research
  9. Joan
  10. Alone With Numbers
  11. The Machine Christopher
  12. Running
  13. Christopher Is Dead
  14. Decrypting
  15. A Different Equation
  16. Becoming A Spy
  17. The Apple
  18. Farewell To Christopher
  19. End Of War
  20. Because Of You
  21. Alan Turing’s Legacy


Friday, September 8, 2017

Arduino TLC5940與伺服馬達

Arduino TLC5940與伺服馬達

TLC5940介紹


TLC5940是TI的16 channel LED驅動晶片。可以支援同時16通道的PWM灰階輸出,解析度為4096階。同時有兩種模式 12 bit (4096 Steps) Grayscale PWM Control 和 Dot Correction。

重要參數:
供應電壓:Vcc  => 3V ~ 5.5V
操作界面:Serial Data
資料傳輸速率:~30MHz
LED可驅動最大電壓:~17V
LED可驅動電流:0~60mA(Vcc < 3.6V ) 0~120mA(Vcc > 3.6V)

由於是輸出PWM,也可以拿來做PWM擴充。所以也可以拿來推Servo摟。

TLC5940 Ardunio library

在Ardunio IDE中可以透過library manager找到。而github上也有連結:

TLC5940電路接法

以下以PDIP封裝的TLC5940為例還有使用Arduino Mega2560。
TLC5940 Ardunio Mega2560
SIN(pin 26) MOSI(pin 51)
SCK(pin 25) SCLK(pin 52)
XLAT(pin 24) OC1A(pin 11)
BLANK(pin 23) OC1B(pin 12) + 1K ohm上拉電阻
GSCLK(pin 18) OC2B(pin 9)
VPRG(pin 27) VPRG(pin 50) or GND
XERR(pin 16) XERR(pin 10) or GND
SIN(pin 26) SIN(pin 51)
IREF(pin 20) 1K ohm下拉電阻
VCC(pin 21) 5V
GND(pin 22) GND

至於out0到out15的接法比較特別。
這樣即可完成Servo與TLC5940的電路。

程式部份

這部份可以直接使用範例。來做實驗。開啟方式:
Ardunio IDE-> Files-> Examples -> TLC5940 -> Servo


深入探討Ardunio TLC5940 library


  1. pinout
    pinout部份在library中的pinout中可以找到,包含各種Ardunio板子。
    這些腳位是不能隨便更改的,因為library使用了Arduino的硬體週邊做加速。
    EX: PWM SPI等。
  2. Serial Data
    Serial Data有兩種模式:
    1. SPI:因為Serial Data shift-in的方式其實就是SPI的MOSI和SCK腳位在做的事。
               所以透過SPI可以加速資傳輸速率。溝通方式可以在http://www.ti.com/lit/ds/symlink/tlc5940.pdf中見到。
    2. bit-bang:直接對GPIO操作(產生SCK的clock和data)來傳輸資料,只是較慢,但可以更換腳位。
  3. GSLCK XLAT與blank
    這裡是利用Ardunio的硬體pwm(output compare pwm)來辦到的,以GSCLK為例,她產生4096*50HZ的clock(4096為解析度,50為Servo是20ms一個週期)。在透過XLAT(鎖住更新資料),blank清除GS counter。

Thursday, September 7, 2017

STM32 LCD 使用 BSP 與STM32CubeMX

STM32 LCD 使用 BSP 與STM32CubeMX


本文以STM32F469NI Discovery為範例。目標是以STM32F469的BSP lib操作STM32F469 Discovery的TFT-LCD。

STM32CubeMX configuration

先將周邊開啟如以下設定。

LTDC : LCD-TFT Display Controller,硬體優化的LCD控制介面。
DSIHOST: Display Serial Interface Host,由MIPI alliance建立的行動顯示protocol。提供高速的LCD framrate。
DMA2D : Chrom-Art Accelerator™ 用來做圖像操作的DMA,可以做出限定範圍的填滿等記憶體操作。適用AHB bus,可以將結果導入AHB slave端(DSI HOST)。
RCC : LTDC , DSI HOST需要時序。
I2C : 觸控需要。(stm32f469_discovery.c需要I2C)。
FMC : 用BSP時可以選擇使用SDRAM存儲資料。


時脈控制,由於開啟HSE,所以DSI有了clock source。(這部分要注意STM32CubeMX產生出來的程式碼是否會讓clock超過硬體限制)。
選擇RGB565為color mode。
Pixel format選用ARGB8888。


引入Driver

在專案資料夾下的Drivers/BSP/Components/otm8009a 中,將該路徑下的otm8009a.c 加入keil專案。otm8009a為STM32F469_Discovery上的觸控顯示螢幕。
在專案資料夾下的Drivers/BSP/STM32469I_Discovey中,將該路徑下的stm32469i_discovery.c、stm32469i_discovery_lcd.c、stm32469i_sdram.c加入keil專案中。
去下載STM32CubeMX STM32F4 firmware link: http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-embedded-software/stm32cubef4.html
解開來,將Utilities資料夾放入project根目錄。

新增好的檔案架構如下。
在options for target -> C/C++ -> include path中加入那兩個資料夾。如下:

程式撰寫

main.c中include "stm32469i_discovery_lcd.h"
其中的初始流程為:

  1. 初始化LCD =>以BSP_LCD_Init()
  2. 選擇LCD layer => BSP_LCD_SelectLayer()
  3. 啟動LCD => BSP_LCD_DisplayOn()
剩下繪製部分所提供的函式都在stm32469_discovery_lcd.h中。
不過功能僅有基本。

成果


精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+ 關於library 目前主流有 https://github.com/maniacbug/RF24 與 https://github.com/TMRh20/RF24 這兩個。 其中TMRh20大大做...