Android驅動開發-底層驅動開發

Android驅動開發的一些參考資料,轉載過來以後學習學習!

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

        
Android 設備驅動(下)

           MTD 驅動

                Flash 驅動通常使用 MTD (memory technology device ),內存技術設備。

                MTD 的字符設備:

                /dev/mtdX

                       主設備號 90.

                MTD 的塊設備:

                /dev/block/mtdblockX

                        主設備號 13.

                MTD 驅動源碼

                        drivers/mtd/mtdcore.c:MTD核心,定義MTD原始設備

                        drivers/mtd/mtdchar.c:MTD字符設備

                        drivers/mtd/mtdblock.c:MTD塊設備

                 MTD 結構圖

                



           MTD 驅動程序是 Linux 下專門爲嵌入式環境開發的新一類驅動程序。Linux 下的 MTD 驅動程序接口被劃分爲用戶模塊和硬件模塊:

           用戶模塊 提供從用戶空間直接使用的接口:原始字符訪問、原始塊訪問、FTL (Flash Transition Layer)和JFS(Journaled File System)。

            硬件模塊  提供內存設備的物理訪問,但不直接使用它們,二十通過上述的用戶模塊來訪問。這些模塊提供了閃存上讀、寫和擦除等操作的實現。

     

           藍牙驅動   

              在 Linux 中,藍牙設備驅動是網絡設備,使用網絡接口。

              Android 的藍牙協議棧使用BlueZ實現來對GAP, SDP以及RFCOMM等應用規範的支持,並獲得了SIG認證。由於Bluez使用GPL授權, 所以Android 框架通過D-BUS IPC來與bluez的用戶空間代碼交互以避免使用未經授權的代碼。            

              藍牙協議部分頭文件:
                                                   include/net/bluetooth/hci_core.h

                                                   include/net/bluetooth/bluetooth.h

                                                   藍牙協議源代碼文件:

                                                               net/bluetooth/*

                                                   藍牙驅動程序部分的文件:

                                                                drivers/bluetooth/*

              藍牙的驅動程序一般都通過標準的HCI控制實現。但根據硬件接口和初始化流程的不同,又存在一些差別。這類初始化動作一般是一些晶振頻率,波特率等基礎設置。比如CSR的芯片一般通過BCSP協議完成最初的初始化配置,再激活標準HCI控制流程。對Linux來說,一旦bluez可以使用HCI與芯片建立起通信(一般是hciattach + hciconfig),便可以利用其上的標準協議(SCO, L2CAP等),與藍牙通信,使其正常工作了。


          WLAN 設備驅動(Wi-Fi)(比較複雜我面會專門寫個wifi分析)

           在linux中,Wlan設備屬於網絡設備,採用網絡接口。

           Wlan在用戶空間採用標準的socket接口進行控制。

                     WiFi協議部分頭文件:

                               include/net/wireless.h

                    WiFi協議部分源文件:

                               net/wireless/*

                    WiFi驅動程序部分:

                               drivers/net/wireless/*

          wifi模塊結構圖:

        
轉載地址:http://blog.csdn.net/jmq_0000/article/details/7372783

http://blog.csdn.net/jmq_0000/article/details/7379802

還有一篇很適合初學者學習的參考文檔:http://wenku.baidu.com/view/9587886227d3240c8447efff.html,大家可以去看看的!

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