[心得] SOC系統在Linux下驅動Hiface白棒的小心得
好久沒有騙P幣了XD
整理一下目前比較好拿到的soc開發板與arm處理器架構。
ARM11 (armv6)
1. Raspberry Pi (Broadcom BCM2835 700MHz)
Cortex-A7 (armv7)
1. Cubieboard2 (Allwinner A20 1GHz)
Cortex-A8 (armv7)
1. Beagleboard (Ti OMAP3530 720MHz)
2. Beagleboard XM (Ti DM3730 1GHz)
3. Beaglebone (Ti AM3358 720MHz)
4. Beaglebone Black(Ti AM3359 1GHz)
5. FREESCALE (i.MX53 1GHz)
6. Cubieboard (Allwinner A10 1GHz)
Cortex-A9 (armv7)
1. Pandaboard ES (Ti OMAP4460 1.2GHz)
2. Wandboard Solo,Dual,Quad (i.MX6 1~1.2GHz)
3. ORIGEN Quad (SAMSUNG Exynos4412 1.4GHz)
Cortex-A15 (armv7)
1. Arndale Board (Exynos 5250 1.7GHz)
開發平台
http://www.dnaspirit.com/starrer/soc/SOC01.jpg
接下來要玩的wandboard ,是 Freescale i.MX6 ARM Cortex-A9 SOC
這是Quad Core的版子 XD。效能過剩阿。
http://www.dnaspirit.com/starrer/soc/IMG_4591.jpg
[1] SOC平台的優勢
● 低耗電,線性電源好準備
● 智慧型手機人手一支,有效的跟桌上型系統整合,
透過DLNA,Throw 到SOC平台,播放內容。
● 透過手機,控制SOC平台,抓取其它DLNA的內容播放。
[2] SOC與傳統DAC的媒介
● USB介面是一個不錯的選擇,但是Linux的平台支援度不足是隱憂。
● USB 轉 SPDIF 在兼顧品質下是不錯的方案。
[3] M2Tech白棒的解決方案 (準備了Pandaboard & Raspberry Pi的編譯方式
話說M2tech有放出Hiface白棒的Linux driver,而且還在很hot的github上。
也有很多前輩玩的很徹底了。在使用X86處理器的Linux套件去編繹hiface的驅動,
與在SOC平台的Linux編譯,理論上,應該要一樣的簡單,
但是現實上卻不是如此。我們看一下在github上的How to build it 的方式,
apt-get install kernel-headers-$(uname -r)
apt-get install build-essential
apt-get install git
git clone git://github.com/panicking/snd-usb-asyncaudio.git
cd snd-usb-asyncaudio
make
看起來是相當的簡單,不過在SOC的平台上,
Embedded Linux是沒有kernel-header這個套件的,
除非套件本身native就有支援特定的soc平台。
本身我也有raspberry pi 並安裝了Raspbian,
試試看,如果下apt-get install kernel-headers-$(uname -r) 會出現甚麼:
--------
pi@raspberrypi ~ $ sudo apt-get install kernel-headers-$(uname -r)
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package kernel-headers-3.6.11
E: Couldn't find any package by regex 'kernel-headers-3.6.11'
pi@raspberrypi ~ $
---------
因為SOC本身並沒有內建類似BIOS這樣的東西來處理開機的部分,
在存放資料的媒介,除了部分有內建eMMC,大部分都必須使用SD Card來開機,
因此必須仰賴X-Loader -> U-Boot or Vendor所提供的inhouse bootloader,
來載入linux的kernel,順利開機後,只要套件本身有支援特定的指令集如armv7,
也就意味著,可以使用網路安裝的方式來進行套件的安裝,
在最常用的Debian部分,原廠的網站有寫,
Currently the Debian armhf port requires at least an ARMv7 CPU with Thumb-2
and VFP3D16.
也就是說,Raspberry Pi的SOC在使用armv6指令集狀況下,
必須有相對應的cross compiler來打造Debian這樣的套件,
Raspbian也就是在原廠支援下,在wheezy armhf 的port上打造的套件。
以下我以個人比較常用的pandaboard es做為例子,
若要安裝debian在pandaboard es上,
有幾種方式,一種就是抓人家弄好的img檔案,
然後直接建立在新的SD卡上,直接開機,然後基本的東西就幾乎都裝好了。
另一種方式就是把先把linux kerenl 載入,然後跑netinstall,
這樣就可以打造自己想要的套件內容。
我的方式是使用RobertCNelson寫的netinstall來安裝Debian,
https://github.com/RobertCNelson/netinstall
這種方式比起image檔案的方式是不方便一點,
但是套件的種類選擇比較多,如Ubuntu也支援。
例如想裝一些非stable的版本。
回到原題來,那如何成功的編譯這個驅動呢?
也就是說要拿到開機的linux同樣版本的kernel header即可,
RobertCNelson同樣的有放出如何編譯linux-kernel的方式,
同樣在github上。
https://github.com/RobertCNelson/stable-kernel
如果是raspberry pi 可參考
https://github.com/raspberrypi/linux
因此在pandaboard es上就很簡單,
---------------
補充,其實是要先準備目前kernel的config檔案,
zcat /proc/config.gz > ./config
最好以目前運行的版本為藍本。
git clone git://github.com/RobertCNelson/stable-kernel.git
cd stable-kernel
./build_deb.sh
---------------
接下來下載hiface的driver
git clone git://github.com/panicking/snd-usb-asyncaudio.git
cd snd-usb-asyncaudio
*由於hiface 預設會抓取/lib/modules/$(uname -r)/build為kernel source
*因此必須建立一個連結到實際的kernel source位置。
ln -s /home/cswang/stable-kernel/KERNEL /lib/modules/$(uname -r)/build
---------------
cswang@pandaes-debian:~/snd-usb-asyncaudio$ make
make -C /lib/modules/3.7.10-x13/build SUBDIRS=/home/cswang/snd-usb-asyncaudio
modules
make[1]: Entering directory `/home/cswang/stable-kernel/KERNEL'
CC [M] /home/cswang/snd-usb-asyncaudio/chip.o
CC [M] /home/cswang/snd-usb-asyncaudio/pcm.o
LD [M] /home/cswang/snd-usb-asyncaudio/snd-usb-hiface.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/cswang/snd-usb-asyncaudio/snd-usb-hiface.mod.o
LD [M] /home/cswang/snd-usb-asyncaudio/snd-usb-hiface.ko
make[1]: Leaving directory `/home/cswang/stable-kernel/KERNEL'
---------------
接下來把小白棒插入usb
用dmesg看一下
[11980.270660] usb 1-1.2.3: new high-speed USB device number 7 using ehci-omap
[11980.403503] usb 1-1.2.3: New USB device found, idVendor=04b4,
idProduct=930b
[11980.410980] usb 1-1.2.3: New USB device strings: Mfr=1, Product=2,
SerialNumber=0
[11980.418914] usb 1-1.2.3: Product: USB-SPDIF
[11980.423309] usb 1-1.2.3: Manufacturer: M2TECH
[11980.428344] usb 1-1.2.3: config 0 descriptor??
[11980.433807] twl6030_usb twl6030_usb: phy not ready, deferring probe
[11980.440521] platform twl6030_usb: Driver twl6030_usb requests probe
deferral
---------------
root@pandaes-debian:insmod snd-usb-hiface.ko
root@pandaes-debian:/home/cswang/snd-usb-asyncaudio# aplay -l
**** List of PLAYBACK Hardware Devices ****
No protocol specified
xcb_connection_has_error() returned true
card 0: PandaBoardES [PandaBoardES], device 0: TWL6040 twl6040-legacy-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: OMAPHDMI [OMAPHDMI], device 0: HDMI omap-hdmi-hifi-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: hiFace [hiFace], device 0: USB-SPDIF Audio [USB-SPDIF Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
---------------
表示白棒已經在pandaboard es 順利載入。
----------------------
Raspberry Pi的Raspbian 下編譯hiface driver
注意,請務必檢查目前運行的Raspbian 的kernel版本,
若不是3.6.x ,須自行切換branch。
目前git上master的版本就是3.6.y
git clone git://github.com/raspberrypi/linux.git
cd linux
把目前運行的config檔案抓下來
zcat /proc/config.gz > ./.config
make oldconfig
make
---------------
接下來下載hiface的driver
git clone git://github.com/panicking/snd-usb-asyncaudio.git
cd snd-usb-asyncaudio
*由於hiface 預設會抓取/lib/modules/$(uname -r)/build為kernel source
*因此必須建立一個連結到實際的kernel source位置。
ln -s /home/pi/linux /lib/modules/$(uname -r)/build
make
---------------
[總結]
● 還有一些小細節,若實作上有問題,歡迎發問,我會儘量回達。
● Raspberry Pi由於速度比較慢,所以編譯kernel要有等待的決心。
● 只要拿的到可運作的Linux kernel source,幾乎就可以編譯成功hiface的模組。
● hiface的linux driver只有支援 S32_LE 格式。
● 與其它播放器或DLNA的組合,這也是一個頗大的議題。
● 除了Pi之外,Pandaborad and Wandboard都有社群(Linaro)支援的
Android 4.2.2版本,Android 平台也是一個可以玩的部分。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.124.168.214
推
09/27 17:33, , 1F
09/27 17:33, 1F
推
09/27 17:35, , 2F
09/27 17:35, 2F
推
09/27 19:29, , 3F
09/27 19:29, 3F
→
09/27 20:05, , 4F
09/27 20:05, 4F
→
09/27 20:06, , 5F
09/27 20:06, 5F
→
09/27 20:06, , 6F
09/27 20:06, 6F
推
09/27 20:26, , 7F
09/27 20:26, 7F
→
09/27 22:41, , 8F
09/27 22:41, 8F
※ 編輯: dnaspirit 來自: 1.34.220.61 (09/27 22:42)
推
09/28 03:59, , 9F
09/28 03:59, 9F
推
09/28 14:07, , 10F
09/28 14:07, 10F
推
09/29 03:55, , 11F
09/29 03:55, 11F
→
09/29 04:00, , 12F
09/29 04:00, 12F
→
09/29 04:01, , 13F
09/29 04:01, 13F
→
09/29 04:03, , 14F
09/29 04:03, 14F
→
09/29 04:04, , 15F
09/29 04:04, 15F
→
09/29 07:07, , 16F
09/29 07:07, 16F
→
09/29 07:09, , 17F
09/29 07:09, 17F
→
09/29 07:09, , 18F
09/29 07:09, 18F
→
09/29 07:14, , 19F
09/29 07:14, 19F
→
09/29 07:18, , 20F
09/29 07:18, 20F
→
09/29 07:24, , 21F
09/29 07:24, 21F
→
09/29 07:25, , 22F
09/29 07:25, 22F