Android 開發之 ---- 底層驅動開發(一)

驅動概述

        說到 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框架圖:

         

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章