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

來源:互聯網
上載者:User

驅動概述

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

        

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: