一、內核聲卡驅動配置 (Linux 3.0)
- 修改 `arch/arm/mach-s3c2440/mach-mini2440.c`(或對應板級文件):
添加平台設備 `uda1340_codec`、`s3c2440_audio`、`samsung_asoc_dma`。
定義 `s3c24xx_uda134x_platform_data` 指定 GPIO:L3_CLK=GPB4, L3_MODE=GPB2, L3_DATA=GPB3,型號 `UDA134X_UDA1341`。
- `make menuconfig` 啟用:
`Device Drivers → Sound card support → Advanced Linux Sound Architecture → SoC Audio → Samsung S3C24XX UDA134X support`。
並選擇 `UDA1341` 模式。
- 編譯內核、燒錄,啟動日誌出現 `uda1341` 相關註冊信息即成功。
二、Madplay 交叉編譯遷移 (arm-linux-gcc-4.5.4)
依賴庫編譯順序
- zlib-1.1.4:`./configure --prefix=...` → 修改 `Makefile` 中 `CC/AR/RANLIB` 為交叉工具鏈 → `make && make install`。
- libid3tag-0.15.1b:`./configure CC=arm-linux-gcc --host=arm-linux --disable-shared --prefix=... CPPFLAGS=-I.../include LDFLAGS=-L.../lib` → `make install`。
- libmad-0.15.1b:同樣 configure,編譯時遇到 `-fforce-mem` 錯誤,**刪除 `Makefile` 中該選項**(GCC ≥3.4 已移除)。
- madplay-0.15.2b:同樣 configure,**關鍵**:若提示找不到 `mad.h` 或 `libmad.a`,手動從編譯產物目錄(`.libs/`)複製到 `--prefix` 指定的 `include/`、`lib/`、`lib/.libs/`。
常見坑點與解決
- **SecureCRT 複製粘貼亂碼**:建議在虛擬機內直接用文本編輯器修改內核源碼,避免隱藏字符導致編譯錯誤。
- **靜態編譯仍顯示動態鏈接**:`file madplay` 顯示 `dynamically linked` 可能是因 `libc` 未靜態鏈接,加上 `-static` 鏈接選項或檢查工具鏈配置。
- **權限**:所有 `configure`/`make`/`make install` 需 `sudo` 或確保目標目錄寫權限。
三、驗證
chmod 777 madplay
./madplay test.mp3
# 聽到聲音即成功
# 快捷鍵:+/- 音量,b 暫停,ESC/s 停止
總結
嵌入式音頻遷移核心:內核 ALSA SoC 平台設備註冊 → 交叉編譯依賴鏈(zlib→id3tag→mad→madplay) → 靜態鏈接解決運行時依賴 → 硬件 GPIO 匹配。耐心解決每個編譯報錯是關鍵。