驅動概述
說到 android 驅動是離不開 Linux 驅動的。Android 核心採用的是 Linux2.6 核心 (最近Linux 3.3 已經包含了一些 Android 代碼)。但 Android 並沒有完全照搬 Linux 系統核心,除了對Linux 進行部分修正,還增加了不少內容。android 驅動 主要分兩種類型:Android 專用驅動 和 Android 使用的裝置驅動(linux)。
Android 專有驅動程式:
1)Android Ashmem 匿名共用記憶體; 為使用者空間程式提供分配記憶體的機制,為進程間提供大塊共用記憶體,同時為核心提供回收和管理這個記憶體。
2)Android Logger 輕量級的LOG(日誌) 驅動;
3)Android Binder 基於 OpenBinder 架構的一個驅動;
4)Android Power Management 電源管理模組;
5)Low Memory Killer 低記憶體管理器;
6)Android PMEM 實體記憶體驅動;
7)USB Gadget USB 驅動(基於 gaeget 架構);
8)Ram Console 用於調試寫入日誌資訊的裝置;
9)Time Device 定時控制裝置;
10)Android Alarm 硬體時鐘;
Android 上的裝置驅動:
1)Framebuff 顯示驅動;
2)Event 輸入裝置驅動;
3)ALSA 音頻驅動;
4)OSS 音頻驅動;
5)v412網路攝影機:視頻驅動;
6)MTD 驅動;
7)藍牙堆疊;
8)WLAN 裝置驅動;
Android 專有驅動程式
1.Android Ashmem
為使用者空間程式提供分配記憶體的機制,為進程間提供大塊共用記憶體,同時為核心提供回收和管理這個記憶體。
裝置節點:/dev/ashmen .主裝置號 10.
源碼位置: include/linux/ashmen.h Kernel /mm/ashmen.c
相比於 malloc 和 anonymous/named mmap 等傳統的記憶體配置機制,其優勢是通過核心驅動提供了輔助核心的記憶體回收演算法機制(pin/unoin)
2.Android Logger
無論是底層的原始碼還上層的應用,我們都可以使用 logger 這個日誌裝置看、來進行調試。
裝置節點: /dev/log/main /dev/log/event /dev/log/radio
源碼位置:include/linux/logger.h include/linux/logger.c
3.Android Binder
IPC Binder 一種處理序間通訊機制。他的進程能夠為其它進程提供服務 ----- 通過標準的 Linux 系統調用 API。
裝置節點 :/dev/binder
源碼位置:Kernel/include/linux/binder.h Kernel/drivers/misc/binder.c
4.Android Power Management
一個基於標準 linux 電源管理的輕量級 Android 電源管理系統,在 drivers/android/power.c kernel/power/
5.Low Memory Killer
它在使用者空間中指定了一組記憶體臨界值,當其中某個值與進程描述中的 oom_adj 值在同一範圍時,該進程將被Kill掉(在parameters/adj中指定oome_adj 的最小值)。它與標準的Linux OOM機制類似,只是實現方法不同
源碼位置:drivers/misc/lowmemorykiller.c
6.Android PMEM
PMEM 主要作用就是向使用者空間提供連續的實體記憶體地區。
1.讓 GPU 或 VPU 緩衝區共用 CPU 核心。
2.用於 Android service 堆。
源碼位置:include/linux/android_pmem.h drivers/android/pmem.c
7.USB Gadget
基於標準 Linux USB gaeget 驅動架構的裝置驅動。
源碼位置:drivers/usb/gadet/
8.Ram Console
為了提供調試功能,android 允許將調試日誌資訊寫入這個裝置,它是基於 RAM 的 buffer.
源碼位置: drivers/staging/android/ram_console.c
9.Time Device
定時控制,提供了對裝置進行定時控制的功能。
源碼位置:drivers/staging/android/timed_output.c(timed_gpio.c)
10.Android Alarm
提供一個定時器,用於把裝置從睡眠狀態喚醒,同時它還提供了一個即使在裝置睡眠時也會啟動並執行時鐘基準。
裝置節點:/dev/alarm
源碼位置:drivers/trc/alarm.c
Android 裝置驅動
1. Framebuffer 幀緩衝裝置
Framebuffer 驅動在 Linux 中是標準的顯示裝置的驅動。對於 PC 系統,它是顯卡的驅動 ; 對於嵌入式 SOC 處理器系統,它是 LCD 控制器或者其他顯示控制器的驅動。它是一個字元裝置,在檔案系統中裝置節點通常是 /dev/fbx 。 每個系統可以有多個顯示裝置 , 依次用 /dev/fbO 、 /dev/fb l
等來表示。在 Android 系統中主裝置號為 29 ,次裝置號遞增產生。
Android 對 Framebuffer 驅動的使用方式是標準的 , 在 / dev / graphie / 中的 Framebuffer 裝置節點由 init 進程自動建立 , 被 libui 庫調用 。 Android 的 GUI 系統中 , 通過調用 Framebuffer 驅動的標準介面,實現顯示裝置的抽象。
Framebuff的結構架構和實現 :
linux LCD驅動(二)--FrameBuffer
Linux LCD驅動(四)--驅動的實現
2.Event輸入裝置驅動
Input 驅動程式是 Linux 輸入裝置的驅動程式 , 分為遊戲杆 (joystick) 、 滑鼠 (mouse 和 mice)和事件裝置 (Event queue)3 種驅動程式。其中事件驅動程式是目前通用的程式,可支援鍵盤 、 滑鼠、觸控螢幕等多種輸入裝置。 Input 驅動程式的主裝置號是 l3 ,每一種 Input 裝置從裝置號占 用5 位 , 3 種從裝置號分配是 : 遊戲杆 0 ~ 61 ; Mouse 滑鼠 33
~ 62 ; Mice 滑鼠 63 ; 事件裝置 64 ~ 95 ,各個具體的裝置在 misc 、 touchscreen 、 keyboard 等目錄中。
Event 裝置在使用者空問使用 read 、 ioctl 、 poll 等檔案系統的介面操作, read 用於讀取輸入資訊, ioctl 用於擷取和設定資訊, poll 用於使用者空間的阻塞,當核心有按鍵等中斷時,通過在中斷中喚醒核心的 poll 實現。
Event 輸入驅動的架構和實現:
Linux裝置驅動之——input子系統
3.ALSA音頻驅動
進階 Linux 聲音體系 ALSA(Advanced Linux Sound Architecture ) 是為音頻系統提供驅動 的Linux 核心組件,以替代原先的開發聲音系統 OSS 。它是一個完全開放原始碼的音頻驅動程式集 ,除了像 OSS 那樣提供一組核心驅動程式模組之外 , ALSA 還專門為簡化應用程式的編寫提供相應的函數庫,與 OSS 提供的基於
ioctl 等原始編程介面相比, ALSA 函數庫使用起來要更加方便一些
利用該函數庫,開發人員可以方便、快捷地開發出自己的應用程式,細節則留給函數庫進行內部處理 。 所以雖然 ALSA 也提供了類似於 OSS 的系統介面 , 但建議應用程式開發人員使用音頻函數庫,而不是直接調用驅動函數。
ALSA 驅動的主裝置號為 116 ,次裝置號由各個裝置單獨定義,主要的裝置節點如下:
/ dev / snd / contmlCX —— 主控制 ;
/ dev / snd / pcmXXXc —— PCM 資料通道 ;
/ dev / snd / seq —— 順序器;
/ dev / snd / timer —— 定義器。
在使用者空問中 , ALSA 驅動通常配合 ALsA 庫使用 , 庫通過 ioctl 等介面調用 ALSA 驅動程式的裝置節點。對於 AIJSA 驅動的調用,調用的是使用者空間的 ALsA 庫的介面,而不是直接調用 ALSA 驅動程式。 ALSA 音頻驅動的架構如所示:
ALSA 驅動程式的主要標頭檔是 include / sound ./ sound . h ,驅動核心資料結構和具體驅動的註冊函數是 include / sound / core . h ,驅動程式 的核心實現是 Sound / core / sound . c 檔案。
ALSA 驅動程式使用下面的函數註冊控制和裝置:
int snd _ pcm _ new (struct snd _ card * card , char * id , int device , int playback _ count , int capture _ count , struct snd _ pcm ** rpcm) ;
int snd ctl _ add(struct snd _ card * card , struct snd _ kcontrol * kcontro1) ;
ALSA 音頻驅動在核心進行 menuconfig 配置時 , 配置選項為 “ Device Drivers ” > “ Sound c ard support ” 一 > “ Advanced Linux Sound Architecture ” 。子選項包含了 Generic sound devices( 通用聲音裝置 ) 、 ARM 體繫結構支援,以及相容 OSS 的幾個選項。 ALsA 音頻驅動配置對應的檔案是sound
/ core / Kconfig 。
Android 沒有直接使用 ALSA 驅動,可以基於 A-LSA 驅動和 ALSA 庫實現 Android Audio 的硬體抽象層; ALSA 庫調用核心的 ALSA 驅動, Audio 的硬體抽象層調用 ALSA 庫。
4.OSS音頻驅動
OSS(Open Sound System開放聲音系統)是 linux 上最早出現的音效卡驅動。OSS 由一套完整的核心驅動程式模組組成,可以為絕大多數音效卡提供統一的編程介面。
OSS 是字元裝置,主裝置號14,主要包括下面幾種裝置檔案:
1) /dev/sndstat
它是音效卡驅動程式提供的簡單介面,它通常是一個唯讀檔案,作用也只限於彙報音效卡的目前狀態。(用於檢測音效卡)
2)/dev/dsp
用於數字採樣和數字錄音的裝置檔案。對於音頻編程很重要。實現類比訊號和數字訊號的轉換。
3)/dev/audio
類似於/dev/dsp,使用的是 mu-law 編碼方式。
4)/dev/mixer
用於多個訊號組合或者疊加在一起,對於不同的音效卡來說,其混音器的作用可能各不相同。
5)/dev/sequencer
這個裝置用來對音效卡內建的波表合成器進行操作,或者對 MIDI 匯流排上的樂器進行控制。
OSS 驅動所涉及的檔案主要包括:
kernel/include/linux/soundcard.h
kernel/include/linux/sound.h 定義 OSS 驅動的次裝置號和註冊函數
kernel/sound_core.c OSS核心實現部分
OSS驅動架構圖:
5.V4l2視頻驅動
V4L2是V4L的升級版本,為linux下視頻裝置程式提供了一套介面規範。包括一套資料結構和底層V4L2驅動介面。V4L2提供了很多提供者,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所以在使用時需要參考驅動源碼,或仔細閱讀驅動提供者的使用說明。
V4L2的主裝置號是81,次裝置號:0~255,這些次裝置號裡也有好幾種裝置(視頻裝置、Radio裝置、Teletext、VBI)。
V4L2的裝置節點: /dev/videoX, /dev/vbiX and /dev/radioX
V4L2架構圖: