驅動概述linux
說到 android 驅動是離不開 Linux 驅動的。Android 內核採用的是 Linux2.6 內核 (最近Linux 3.3 已經包含了一些 Android 代碼)。但 Android 並無徹底照搬 Linux 系統內核,除了對Linux 進行部分修正,還增長了很多內容。android 驅動 主要分兩種類型:Android 專用驅動 和 Android 使用的設備驅動(linux)。android
Android 專有驅動程序:算法
1)Android Ashmem 匿名共享內存; 爲用戶空間程序提供分配內存的機制,爲進程間提供大塊共享內存,同時爲內核提供回收和管理這個內存。編程
2)Android Logger 輕量級的LOG(日誌) 驅動;緩存
3)Android Binder 基於 OpenBinder 框架的一個驅動;數據結構
4)Android Power Management 電源管理模塊;架構
5)Low Memory Killer 低內存管理器;框架
6)Android PMEM 物理內存驅動;ide
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的結構框架和實現 :
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 輸入驅動的架構和實現:
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框架圖: