在智慧硬體、車載終端、工業平板等嵌入式裝置中,Android 系統的顯示與互動體驗直接影響產品競爭力。液晶屏(LCD/MIPI-DSI)、觸控式螢幕(I2C/USB)和攝像頭(CSI/USB)的驅動適配是核心環節,涉及硬體介面、核心驅動、HAL 層實現及系統整合。本文將系統梳理三大外設的適配流程,結合程式碼示例與除錯技巧,助力開發者穩妥完成硬體相容性開發。
一、液晶屏驅動適配:從核心到 FrameBuffer
1. 硬體介面與協議選擇
常見介面:
MIPI-DSI:高速序列介面,適用於高解析度屏(如 1080P/4K),需確認屏引數(時序、解析度、色深)。
RGB/LVDS:並行介面,需匹配電平標準(如 TTL/LVDS)和時序(HSYNC/VSYNC)。
SPI/I2C:低速介面,僅用於小尺寸屏(如 OLED 字元屏)。
關鍵引數:在
device tree中配置display-timings節點,示例:dtsdisplay-timings { native-mode = <&timing0>; timing0: timing { hactive = <1920>; vactive = <1080>; hfront-porch = <88>; hback-porch = <48>; hsync-len = <44>; vfront-porch = <4>; vback-porch = <23>; vsync-len = <5>; clock-frequency = <148500000>; }; };
2. 核心驅動實現
DRM/KMS 框架:現代 Android 推薦使用 Direct Rendering Manager(DRM)驅動,支援多屏同步與硬體加速。
註冊 DRM 裝置:在
drivers/gpu/drm/下實現struct drm_driver,繫結到platform_device。實現 Modesetting:透過
drm_mode_create_dumb()分配幀緩衝區,drm_mode_set_crtc()配置顯示時序。Legacy FrameBuffer:舊裝置可能使用
fbdev框架,需實現struct fb_ops中的fb_check_var()、fb_set_par()等函式。
3. Android HAL 層整合
SurfaceFlinger 服務:在
hardware/libhardware/modules/gralloc/中實現gralloc_module_t,分配 GPU 可訪問的記憶體緩衝區。HDMI/DP 熱插拔:透過
uevent監聽介面狀態,動態調整顯示配置(如/sys/class/switch/hdmi/state)。
二、觸控式螢幕驅動適配:輸入子系統與多點觸控
1. 輸入裝置型別
電阻屏:透過
AD 轉換獲取座標,需實現input_report_abs()上報ABS_X/ABS_Y。電容屏:支援多點觸控,需上報
ABS_MT_POSITION_X/ABS_MT_POSITION_Y及BTN_TOUCH事件。協議支援:
I2C 介面:常見於 FT5x06、GT9xx 等晶片,需實現
i2c_driver並註冊input_dev。USB 介面:如 HID 協議裝置,直接使用
usbhid驅動。
2. 核心驅動開發
註冊輸入裝置:
cstruct input_dev *input_dev = input_allocate_device();input_dev->name = "gt9xx_ts";input_dev->id.bustype = BUS_I2C;input_set_abs_params(input_dev, ABS_X, 0, 1080, 0, 0); // X 軸範圍input_set_abs_params(input_dev, ABS_Y, 0, 1920, 0, 0); // Y 軸範圍input_set_capability(input_dev, EV_KEY, BTN_TOUCH); // 觸控按鍵input_register_device(input_dev);
中斷處理:在
probe()函式中請求中斷(如request_threaded_irq()),讀取觸控資料並上報事件。
3. Android 事件過濾與校準
多點觸控協議:有助於支援上報事件符合
A-Touch或B-Touch協議(透過getevent -l驗證)。校準工具:使用
tslib或自定義工具生成校準矩陣,儲存至/etc/pointercal檔案供系統讀取。
三、攝像頭驅動適配:CSI/USB 與 HAL 層整合
1. 硬體介面與感測器配置
CSI 介面:透過 MIPI CSI-2 連線攝像頭模組(如 OV5640、IMX335),需配置:
時鐘樹:在
device tree中設定clocks和clock-names(如mclk)。電源管理:透過
regulator框架控制DVDD/AVDD/DOVDD供電。USB 攝像頭:使用
uvcvideo驅動,自動識別UVC協議裝置。
2. V4L2 核心驅動
註冊影片裝置:
cstruct video_device *vdev = video_device_alloc();vdev->release = camera_release;vdev->fops = &camera_fops; // 實現 .open/.read/.ioctl 等vdev->ioctl_ops = &v4l2_ctrl_ioctl_ops;video_register_device(vdev, VFL_TYPE_GRABBER, 0); // 註冊為 /dev/video0
支援格式與解析度:在
struct v4l2_fmtdesc中宣告支援的格式(如V4L2_PIX_FMT_YUYV),並透過VIDIOC_S_FMT協商解析度。
3. Android Camera HAL 實現
HAL3 介面:實現
camera3_device_ops中的initialize()、configure_streams()、process_capture_request()等函式。元資料處理:填充
camera_metadata_t,設定支援的解析度、幀率、對焦模式等(透過camera_metadata_add())。除錯工具:使用
Camera2 API測試應用(如A Better Camera)驗證預覽、拍照功能。
四、除錯與最佳化技巧
日誌分析:
核心日誌:
dmesg | grep -i "dsi\|touch\|camera"。Android 日誌:
logcat | grep -E "SurfaceFlinger\|InputReader\|Camera2"。效能最佳化:
液晶屏:啟用
DRM_PANEL_BRIDGE減少幀緩衝複製。攝像頭:使用
DMA緩衝區避免CPU複製(V4L2_MEMORY_DMABUF)。相容性測試:
使用
CTS(Compatibility Test Suite)驗證顯示、輸入、攝像頭功能。自動化測試工具:
Monkey、UiAutomator模擬使用者操作。
線上諮詢
電話諮詢
微信諮詢
回到頂部