Archive

Posts Tagged ‘Embedded’

移植 Flite 到 ARM 平台

九月 21st, 2007

Flite (Festival-Lite) 是一套 TTS(Text To Speech) 系統,透過語音合成技術,不需要錄一堆龐大的語音資料庫就可以朗讀文句。Flite 顧名思義就是有名的 Festival 重寫精簡版,更適合應用在嵌入式系統上,編譯完的執行檔只有 2.5MB 左右,也由於是使用 C 寫的,所以可以很容易和自己的程式結合,試了半天總算可以在 2410 Arm Linux 上面跑起來了。

1. 跨平台編譯
編譯方式和大多數 Open Source 差不多。
# ./configure CC=arm-linux-gcc --host=arm-linux
# make
# arm-linux-strip bin/flite

完成就會得到 flite 執行檔,下載到板子測試:
# flite -t "Hello, How are you?"
嗯,沒有聲音,只有第一次出現 0.x 秒的雜音,再試試:
# flite "Hello, How are you?" test.wav
會將語音存成 test.wav,抓到 PC 上播放,很正常。所以猜想應該是放音部份的問題。

2. 修改 src/audio/au_oss.c
覺得這一段怪怪的,因為記得 S3C2410 採用的 UDA1341 音效晶片只有 Ch1 和 Ch2
if (ad->channels == 0)
ad->channels = 1;
改成
if (ad->channels == 1)
ad->channels = 2;
重新編譯後再測試,有了,有聲音出來了,不過速度太快了,根本聽不清楚再唸什麼,所以要再改一下。

3. 修改 lang/cmu_us_kal/cmu_us_kal.c
/* Intonation */
feat_set_float(v->features,"int_f0_target_mean",95.0); //音色
feat_set_float(v->features,"int_f0_target_stddev",11.0); //音調
feat_set_float(v->features,"duration_stretch",1.1); //速度
前兩個互相搭配可以調整出不同的聲音,實際測試結果發現在 ARM 平台及 PC 上播放會差滿多的,PC 上照預設值就很好聽,ARM 則是調整到下面這樣才比較能接受。
/* Intonation */
feat_set_float(v->features,"int_f0_target_mean",167.0); //音色
feat_set_float(v->features,"int_f0_target_stddev",65.0); //音調
feat_set_float(v->features,"duration_stretch",2.5); //速度

英文 TTS 差不多都已經滿純熟了,中文 TTS 不少業界或實驗室也都有不錯成果,不過都是要付費居多,如果是 Windows 則有微軟的 Speech SDK 可以使用。
另外有找到 SD178A 這顆 IC,應該是個不錯的東西。

Embedded , , ,

在嵌入式 Linux 架設 Boa Webserver

九月 18th, 2007

Boa 是一套小型的網頁伺服器,很適合應用在 Embedded System 上,並且內建就可以直接支援以 C 寫的 CGI 網頁,這篇是移植 Boa 到 ARM9 S3C2410 平台的過程,Linux 版本為 2.6.17.4,使用 arm-linux toolchain 3.4.1 編譯。

1. 產生 Makefile
下載 Source code 並解壓縮進到 src 目錄。
# ./configure --host=arm-linux

2. 修改 Makefile 使用跨平台編譯
CC = arm-linux-gcc
CPP = arm-linux-gcc -E
# make (如果編譯或執行時有錯誤請看Q&A)
# arm-linux-strip boa

3. 配置 Boa
可以在源碼目錄找到這個設定檔,放到 /etc/boa 裡面,有修改的部份如下:
User 0
Group 0
#DirectoryMaker /usr/lib/boa/boa_indexer
CGIPath /bin:/usr/bin:/var/www/cgi-bin
ScriptAlias /cgi-bin/ /var/www/cgi-bin/

然後需要放一個 mime.types 檔案在 /etc,我是直接複製 ubuntu 裡的檔案。

4. 加入 boa 執行檔
將編譯好的 boa 執行檔加入檔案系統 /bin,要啟動 server 只要輸入 boa 即可,可到 /var/log/boa 查看 log。

問題 Q&A:
Read more...

Embedded, Linux, Server , , ,

S3C2410 RTC Driver 問題

九月 18th, 2007

在 Linux 系統中的時鐘,可分為硬體時鐘及系統時鐘。硬體時鐘可以依賴輔助電源(電池)持續累計時間;而系統時鐘則每次重新啟動就會重置,所以一般 Linux 在開機時會做個和硬體時鐘同步的動作(hwclock -s),但是在 Embedded Linux 中是要手動操作的。

首先必須正確驅動 S3C2410 的 RTC(Real-Time Clock) 模組才能使用 hwclock 指令,Linux 2.6.10 版本之後應該都有內建驅動,不過在 2.6.14.7 版本中有些問題,會跑出 Segmentation fault 訊息,需要作以下修改。

1. 重新編譯 Kernel 選項
# make menuconfig
在 Device Drivers ---> Character devices --->
< > Enhanced Real Time Clock Support (不要選擇)
[*] S3C2410 RTC Driver

2. 修改 arch/arm/mach-s3c2410/mach-smdk2410.c
在 struct platform_device *smdk2410_devices[] 當中加入 &s3c_device_rtc,,這個結構已經在 arch/arm/mach-s3c2410/devs.c 定義,應該是忘記加了,修改好後再編譯即完成。

3. 確認驅動載入
Driver 有正確載入開機應該會有
S3C2410 RTC, (c) 2004 Simtec Electronics
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
並且有 /dev/misc/rtc 裝置

4. 使用 hwclock
先利用 date 指令調整好系統時間,再用 hwclock -w 寫入硬體時鐘,往後開機只要自動執行用 hwclock -s 即可抓到正確的時間囉!

Embedded, Linux ,

Linux 下透過 GPRS 上網

八月 25th, 2007

基本需求:

  • 可連上 GPRS 的硬體設備
  • 編譯 Kernel 使其支援 PPP
  • 擁有 pppd、chat 兩個程式
  • PPP 連線的 script 檔案

1. 可連上 GPRS 的硬體設備
可以是專用的 GPRS Modem 或是手機,不過當然要先配置好相關設定及驅動,我是使用 Wavecom Q2403A 這個 GSM/GPRS 模組透過 com port 來實驗。

2. 編譯 Kernel 使其支援 PPP
# make menuconfig
選擇 Device Drivers ---> Network device support ---> PPP (point-to-point protocol) support,底下的子項目如果不確定就全選即可。
核心更新後請檢查 /dev/ppp 是否存在,若無可用 mknod /dev/ppp c 108 0 建立。

3. 擁有 pppd、chat 兩個程式
如果是一般 PC 版本應該都已經有內建了;Embedded 平台則可以考慮使用 busybox,裡面也有包含這兩個程式;再不然就自行下載 source code 來編譯。

4. PPP 連線的 script 檔案
建立 script 來做 PPP 連線,通常可以在 /usr/share/doc/ppp/examples/scripts 底下找到 ppp-on、ppp-off、ppp-on-dialer 三個範例檔案,不過用範例檔的設定不一定能成功,請參考我的檔案,已測試中華電信可以成功。

相關的設定及原理可以參考:

Embedded, Linux, 系統筆記 , , , ,

USB 無線網卡驅動移植(ARM)

八月 18th, 2007

平台資訊:

核心板:Samsung S3C2410 ARM920T
無線網卡:PCI GW-US54GXS
Linux Kernel:2.6.14.7
Cross Compile:arm-linux-gcc 3.4.1

PCI 所推出的無線網卡大多採用 ZB1211(B) 的晶片,算是滿普遍的一種,所以相容性還不錯,成功移植機率比較大。先到官方下載好網卡的 Linux Driver。

1. 解壓縮檔案
tar zxvf GW-US54GXS_Linux_v2.15.0.0_CE.tar.gz

2. 修改 Makefile
# Cross Compile
CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
CPP=/usr/local/arm/3.4.1/bin/arm-linux-g++
LD=/usr/local/arm/3.4.1/bin/arm-linux-ld
----------------------------------------------------------------------------
# 修改 Kernel Source 所在路徑
KERN_26=y
KERNEL_SOURCE=/opt/linux-2.6.14.7
----------------------------------------------------------------------------
# 修改 MOD_PATH
MODPATH=/opt/linux-2.6.14.7/Modules_install/lib/modules/2.6.14.7
----------------------------------------------------------------------------
# 修改 KDIR
KDIR :=/opt/linux-2.6.14.7/Modules_install/lib/modules/2.6.14.7/build
----------------------------------------------------------------------------
存檔離開

3. 開始編譯
make ZD1211REV_B=1

4. 完成
沒錯誤就會得到 zd1211b.ko,將它加入檔案系統並用 insmod 載入即可。

延伸閱讀

Embedded , , ,