Linux kernel 到 Android framework 之間的那一層。
BSP bring-up 與系統整合,Qualcomm 和 NXP 平台。 Yocto、kernel driver、Android BSP、V4L2、GStreamer、WebRTC。 往上做到即時串流,往下做到讓感光元件送出第一張圖。
#技術
Audio codec bring-up
ASoC / ALSA 這一層。codec 掛上去不出聲、出聲但速度不對、 44.1k 切 48k 就爆掉——這些幾乎都不是 codec 壞了,是時鐘樹沒對上。 從 CPU 的 MCLK 一路驗到 codec 內部 PLL 感知到的頻率, 釐清 SAI 與 codec 兩側各自的 BCLK 計算方式,以及 slot 寬度為何必須匹配。
Android 那一側:從零撰寫 I2C/I2S driver 將 codec 接上系統, 客製 AudioFlinger 與 AudioPolicy 的繞送邏輯,調 DSP 的校準參數, 以及量測音訊子系統的耗電並把它壓進電池預算。
Camera pipeline
MIPI CSI-2 到應用層之間的每一層都動過。 Qualcomm 的 camera 堆疊逐層讀過——HAL1 與 HAL3 的差別、 mm-camera2 和 CamX 的分界、MCT 怎麼串 pipeline、chromatix 調什麼、 ISP 在哪裡介入、SMMU 為什麼會擋住 buffer、camera daemon 的角色。 NXP 那邊則是 kernel 這一側:raw sensor driver、IPU/ISI 的 DMA 路徑、 Media Entity Link 的接法、V4L2 ioctl 擴充。
3A 從頭實作過:AE 以 PID controller 控補光、 AF 用 Sobel 對比配搜尋、AWB 做 debayer 後的 RGB 增強。 前處理鏈(debayer、色彩空間轉換、histogram、Sobel、低通)一併自行接上。
即時串流
GStreamer pipeline 接硬體編碼,用 tee 同時餵 WebRTC 和本地顯示。 端到端總延遲壓到 100ms 以下,Full HD 60fps。 NAT 穿透那一段:WS signaling、STUN/TURN, 以及 UDP 遭全面封鎖的網路環境下的繞行架構。
色彩空間轉換是這條路上最容易變成瓶頸的一步。 RGB888 → YUV420 比較過 LUT、NEON SIMD、libyuv、OpenMP 四種解法, 在 Cortex-A53 上從 132ms 壓到接近即時。
常見的故障形態
- codec 在 master mode 下 BCLK 算錯,聲音以一半速度播出來
- 時鐘源不匹配讓 codec 內部 PLL 誤觸發,取樣率一切換就失真
- SAI 推導不出目標取樣率而拒絕開工
- MIPI CSI-2 解析度被 driver 寫死,換了訊號源就只剩一半畫面
- GStreamer pipeline deadlock、WebRTC 資源洩漏、PTS 不連續
- USB state machine 在連續插拔下錯亂、OTG 觸發的關機失敗
- NFC Type 4 持續寫入失敗(要逐層拆協定才找得到)
底層
Yocto BSP、U-Boot 與 UEFI 開機流程、kernel patch 與 defconfig。 電源:charger IC 並聯充電、gas gauge 電量計、高溫充電截止。 USB:自寫 redriver driver 支援完整 Type-C(DP Alt Mode、USB Audio、OTG)。 建置環境:Android repo server、Docker 編譯環境、每日自動建置。
裝置端 ML
在生物辨識終端上建置過完整的 anti-spoofing 管線:蒐集訓練資料、 訓練 SVM、部署至裝置端做即時推論,前處理鏈一併自行實作。 難處不在接上模型,而在於讓它在一顆沒有 GPU 的 SoC 上跑得動。
#聯絡
承接兩類案件:embedded / camera / 串流 的 bring-up 與疑難排解, 以及 AI 導入評估——特別是「這個功能到底該不該用 LLM 做、 成本和隱私的取捨長什麼樣」這類在動工前就該釐清的問題。
- Email support@bitilabs.com