Android底層驅(qū)動(dòng)開(kāi)發(fā)_第1頁(yè)
Android底層驅(qū)動(dòng)開(kāi)發(fā)_第2頁(yè)
Android底層驅(qū)動(dòng)開(kāi)發(fā)_第3頁(yè)
Android底層驅(qū)動(dòng)開(kāi)發(fā)_第4頁(yè)
Android底層驅(qū)動(dòng)開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Android開(kāi)發(fā)之底層驅(qū)動(dòng)開(kāi)發(fā)(一)說(shuō)到android驅(qū)動(dòng)是離不開(kāi)Linux驅(qū)動(dòng)的。Android內(nèi)核采用的是Linux2.6內(nèi)核(最近Linux3.3已經(jīng)包含了一些Android代碼)。但Android并沒(méi)有完全照搬Linux系統(tǒng)內(nèi)核,除了對(duì)Linux進(jìn)行部分修正,還增加了不少內(nèi)容。android驅(qū)動(dòng)主要分兩種類型:Android專用驅(qū)動(dòng)和Android使用的設(shè)備驅(qū)動(dòng)(linux)Android專有驅(qū)動(dòng)程序:1) AndroidAshmem匿名共享內(nèi)存;為用戶空間程序提供分配內(nèi)存的機(jī)制,為進(jìn)程間提供大塊共享內(nèi)存,同時(shí)為內(nèi)核提供回收和管理這個(gè)內(nèi)存。2) AndroidLogger輕量級(jí)的LO

2、G(日志)驅(qū)動(dòng);3) AndroidBinder基于OpenBinder框架的一個(gè)驅(qū)動(dòng);5) LowMemoryKiller6) AndroidPMEM7) )USBGadget8) RamConsole9) )TimeDevice10)AndroidAlarm低內(nèi)存管理器;物理內(nèi)存驅(qū)動(dòng);4) AndroidPowerManagement電源管理模塊;USB驅(qū)動(dòng)(基于gaeget框架);用于調(diào)試寫入日志信息的設(shè)備;定時(shí)控制設(shè)備;硬件時(shí)鐘;Android上的設(shè)備驅(qū)動(dòng)(linux):1 )Framebuff顯示驅(qū)動(dòng);2 )Event輸入設(shè)備驅(qū)動(dòng);3 )ALSA音頻驅(qū)動(dòng);4 )OSS音頻驅(qū)動(dòng);5 )

3、v412攝像頭:視頻驅(qū)動(dòng);6 )MTD驅(qū)動(dòng);7 )藍(lán)牙驅(qū)動(dòng);8 )WLAN設(shè)備驅(qū)動(dòng);Android專有驅(qū)動(dòng)程序1 .AndroidAshmem為用戶空間程序提供分配內(nèi)存的機(jī)制,為進(jìn)程間提供大塊共享內(nèi)存,同時(shí)為內(nèi)核提供回收和管理這個(gè)內(nèi)存。設(shè)備節(jié)點(diǎn):/dev/ashmen.主設(shè)備號(hào)10.源碼位置:include/linux/ashmen.hKernel/mm/ashmen.c其優(yōu)勢(shì)是通過(guò)內(nèi)核驅(qū)動(dòng)提供了輔助相比于malloc和anonymous/namedmmap等傳統(tǒng)的內(nèi)存分配機(jī)制,內(nèi)核的內(nèi)存回收算法機(jī)制(pin/unoin)2 .AndroidLogger無(wú)論是底層的源代碼還上層的應(yīng)用,我們都可

4、以使用logger這個(gè)日志設(shè)備看、來(lái)進(jìn)行調(diào)試。設(shè)備節(jié)點(diǎn):/dev/log/main/dev/log/event/dev/log/radio源碼位置:include/linux/logger.hinclude/linux/logger.c3 .AndroidBinderIPCBinder一種進(jìn)程間通信機(jī)制。他的進(jìn)程能夠?yàn)槠渌M(jìn)程提供服務(wù)-通過(guò)標(biāo)準(zhǔn)的Linux系統(tǒng)調(diào)用APIo設(shè)備節(jié)點(diǎn):/dev/binder源碼位置:Kernel/include/linux/binder.hKernel/drivers/misc/binder.c4 .AndroidPowerManagement一個(gè)基于標(biāo)準(zhǔn)linu

5、x電源管理的輕量級(jí)Android電源管理系統(tǒng),源碼位置:drivers/android/power.ckernel/power/5 .LowMemoryKiller它在用戶空間中指定了一組內(nèi)存臨界值,當(dāng)其中某個(gè)值與進(jìn)程描述中的oom_adj值在同一范圍時(shí),該進(jìn)程將被Kill掉(在parameters/adj中指定oome_adj的最小值)。它與標(biāo)準(zhǔn)的LinuxOOM機(jī)制類似,只是實(shí)現(xiàn)方法不同源碼位置:drivers/misc/lowmemorykiller.c6 .AndroidPMEMPMEM主要作用就是向用戶空間提供連續(xù)的物理內(nèi)存區(qū)域。1.讓GPU或VPU緩沖區(qū)共享CPU核心。2.用于An

6、droidservice堆。源碼位置:include/linux/android_pmem.hdrivers/android/pmem.c7 .USBGadget基于標(biāo)準(zhǔn)LinuxUSBgaeget驅(qū)動(dòng)框架的設(shè)備驅(qū)動(dòng)。源碼位置:drivers/usb/gadet/8 .RamConsole為了提供調(diào)試功能,android允許將調(diào)試日志信息寫入這個(gè)設(shè)備,它是基于RAM的buffer.源碼位置:drivers/staging/android/ram_console.c9 .TimeDevice定時(shí)控制,提供了對(duì)設(shè)備進(jìn)行定時(shí)控制的功能。源碼位置:drivers/staging/android/tim

7、ed_output.c(timed_gpio.c)10 .AndroidAlarm提供一個(gè)定時(shí)器,用于把設(shè)備從睡眠狀態(tài)喚醒,同時(shí)它還提供了一個(gè)即使在設(shè)備睡眠時(shí)也會(huì)運(yùn)行的時(shí)鐘基準(zhǔn)。設(shè)備節(jié)點(diǎn):/dev/alarm源碼位置:drivers/trc/alarm.cAndroid設(shè)備驅(qū)動(dòng)1 .Framebuffer幀緩存設(shè)備Framebuffer驅(qū)動(dòng)在Linux中是標(biāo)準(zhǔn)的顯示設(shè)備的驅(qū)動(dòng)。對(duì)于PC系統(tǒng),它是顯卡的驅(qū)動(dòng);對(duì)于嵌入式SOC處理器系統(tǒng),它是LCD控制器或者其他顯示控制器的驅(qū)動(dòng)。它是一個(gè)字符設(shè)備,在文件系統(tǒng)中設(shè)備節(jié)點(diǎn)通常是/dev/fbx。每個(gè)系統(tǒng)可以有多個(gè)顯示設(shè)備,依次用/dev/fb0,/de

8、v/fb1等來(lái)表示。在Android系統(tǒng)中主設(shè)備號(hào)為29,次設(shè)備號(hào)遞增生成。Android對(duì)Framebuffer驅(qū)動(dòng)的使用方式是標(biāo)準(zhǔn)的,在/dev/graphie/中的Framebuffer設(shè)備節(jié)點(diǎn)由init進(jìn)程自動(dòng)創(chuàng)建,被libui庫(kù)調(diào)用。Android的GUI系統(tǒng)中,通過(guò)調(diào)用Framebuffer驅(qū)動(dòng)的標(biāo)準(zhǔn)接口,實(shí)現(xiàn)顯示設(shè)備的抽象。Framebuff的結(jié)構(gòu)框架和實(shí)現(xiàn):linuxLCD驅(qū)動(dòng)(二)-FrameBufferLinuxLCD驅(qū)動(dòng)(四)驅(qū)動(dòng)的實(shí)現(xiàn)2 .Event輸入設(shè)備驅(qū)動(dòng)Input驅(qū)動(dòng)程序是Linux輸入設(shè)備的驅(qū)動(dòng)程序,分為游戲桿(joystick)、鼠標(biāo)(mouse和mice)

9、和事件設(shè)備(Eventqueue)3種驅(qū)動(dòng)程序。其中事件驅(qū)動(dòng)程序是目前通用的程序、可支持鍵盤、鼠標(biāo)、觸摸屏等多種輸入設(shè)備。Input驅(qū)動(dòng)程序的主設(shè)備號(hào)是l3,每一種Input設(shè)備從設(shè)備號(hào)占用5位,3種從設(shè)備號(hào)分配是:游戲桿061;Mouse鼠標(biāo)3362;Mice鼠標(biāo)63;事件設(shè)備6495,各個(gè)具體的設(shè)備在misc、touchscreen、keyboard等目錄中。Event設(shè)備在用戶空問(wèn)使用read、ioctl、poll等文件系統(tǒng)的接口操作,read用于讀取輸入信息,ioctl用于獲取和設(shè)置信息,poll用于用戶空間的阻塞,當(dāng)內(nèi)核有按鍵等中斷時(shí),通過(guò)在中斷中喚醒內(nèi)核的poll實(shí)現(xiàn)。Event輸

10、入驅(qū)動(dòng)的架構(gòu)和實(shí)現(xiàn):linux設(shè)備驅(qū)動(dòng)之input子系統(tǒng)3 .ALSA音頻驅(qū)動(dòng)高級(jí)Linux聲音體系A(chǔ)LSA(AdvancedLinuxSoundArchitecture)是為音頻系統(tǒng)提供驅(qū)動(dòng)的Linux內(nèi)核組件,以替代原先的開(kāi)發(fā)聲音系統(tǒng)OSS。它是一個(gè)完全開(kāi)放源代碼的音頻驅(qū)動(dòng)程序集,除了像OSS那樣提供一組內(nèi)核驅(qū)動(dòng)程序模塊之外,ALSA還專門為簡(jiǎn)化應(yīng)用程序的編寫提供相應(yīng)的函數(shù)庫(kù),與OSS提供的基于ioctl等原始編程接口相比,ALSA函數(shù)庫(kù)使用起來(lái)要更加方便一些利用該函數(shù)庫(kù),開(kāi)發(fā)人員可以方便、快捷地開(kāi)發(fā)出自己的應(yīng)用程序,細(xì)節(jié)則留給函數(shù)庫(kù)進(jìn)行內(nèi)部處理,所以雖然ALSA也提供了類似于OSS的系統(tǒng)

11、接口,但建議應(yīng)用程序開(kāi)發(fā)者使用音頻函數(shù)庫(kù),而不是直接調(diào)用驅(qū)動(dòng)函數(shù)。ALSA驅(qū)動(dòng)的主設(shè)備號(hào)為116,次設(shè)備號(hào)由各個(gè)設(shè)備單獨(dú)定義,主要的設(shè)備節(jié)點(diǎn)如下:/ dev/snd/contmlCX主控制;/ dev/snd/pcmXXXcPCM數(shù)據(jù)通道;/ dev/snd/seq順序器;/ dev/snd/timer定義器。在用戶空問(wèn)中,ALSA驅(qū)動(dòng)通常配合alsa庫(kù)使用,庫(kù)通過(guò)ioctl等接口調(diào)用ALSA驅(qū)動(dòng)程序的設(shè)備節(jié)點(diǎn)。對(duì)于AIJSA驅(qū)動(dòng)的調(diào)用,調(diào)用的是用戶空間的ALSA庫(kù)的接口,而不是直接調(diào)ALSA驅(qū)動(dòng)程序。ALSA音頻驅(qū)動(dòng)的架構(gòu)ALSA驅(qū)動(dòng)程序的主要頭文件是include/sound/sound.

12、h,驅(qū)動(dòng)核心數(shù)據(jù)結(jié)構(gòu)和具體驅(qū)動(dòng)的注冊(cè)函數(shù)是include/sound/core.h,驅(qū)動(dòng)程序的核心實(shí)現(xiàn)是Sound/core/sound.c文件。ALSA驅(qū)動(dòng)程序使用下面的函數(shù)注冊(cè)控制和設(shè)備:intsnd_pcm_new(structsnd_card*card,char*id,intdevice,intplayback_count,intcapture_count,structsnd_pcm*rpcm);intsndctl_add(structsnd_card*card,structsnd_kcontrol*kcontrol);ALSA音頻驅(qū)動(dòng)在內(nèi)核進(jìn)行menuconfig配置時(shí),配置選項(xiàng)為D

13、eviceDriversSoundcardsupport"一>"AdvancedLinuxSoundArchitecture。子選項(xiàng)包含了Genericsounddevices(通用聲音設(shè)備)、ARM體系結(jié)構(gòu)支持,以及兼容OSS的幾個(gè)選項(xiàng)。ALSA音頻驅(qū)動(dòng)配置對(duì)應(yīng)的文件是sound/core/Kconfig。Android沒(méi)有直接使用ALSA驅(qū)動(dòng),可以基于A-LSA驅(qū)動(dòng)和ALSA庫(kù)實(shí)現(xiàn)AndroidAudio的硬件抽象層;ALSA庫(kù)調(diào)用內(nèi)核的ALSA驅(qū)動(dòng),Audio的硬件抽象層調(diào)用ALSA庫(kù)。4.OSS音頻驅(qū)動(dòng)OSS(OpenSoundSystem開(kāi)放聲音系統(tǒng))是li

14、nux上最早出現(xiàn)的聲卡驅(qū)動(dòng)。OSS由一套完整的內(nèi)核驅(qū)動(dòng)程序模塊組成,可以為絕大多數(shù)聲卡提供統(tǒng)一的編程接口。OSS是字符設(shè)備,主設(shè)備號(hào)14,主要包括下面幾種設(shè)備文件:1) /dev/sndstat它是聲卡驅(qū)動(dòng)程序提供的簡(jiǎn)單接口,它通常是一個(gè)只讀文件,作用也只限于匯報(bào)聲卡的當(dāng)前狀態(tài)。(用于檢測(cè)聲卡)2) /dev/dsp用于數(shù)字采樣和數(shù)字錄音的設(shè)備文件。對(duì)于音頻編程很重要。實(shí)現(xiàn)模擬信號(hào)和數(shù)字信號(hào)的轉(zhuǎn)換。3) /dev/audio類似于/dev/dsp,使用的是mu-law編碼方式。4) /dev/mixer用于多個(gè)信號(hào)組合或者疊加在一起,對(duì)于不同的聲卡來(lái)說(shuō),其混音器的作用可能各不相同。5) /de

15、v/sequencer這個(gè)設(shè)備用來(lái)對(duì)聲卡內(nèi)建的波表合成器進(jìn)行操作,或者對(duì)MIDI總線上的樂(lè)器進(jìn)行控制。OSS驅(qū)動(dòng)所涉及的文件主要包括:kernel/include/linux/soundcard.hkernel/include/linux/sound.h定義OSS驅(qū)動(dòng)的次設(shè)備號(hào)和注冊(cè)函數(shù)kernel/sound_core.cOSS核心實(shí)現(xiàn)部分OSS驅(qū)動(dòng)架構(gòu)圖:Llllixcr5.V412視頻驅(qū)動(dòng)V4L2是V4L的升級(jí)版本,為linux下視頻設(shè)備程序提供了一套接口規(guī)范。包括一套數(shù)據(jù)結(jié)構(gòu)和底層V4L2驅(qū)動(dòng)接口。V4L2提供了很多訪問(wèn)接口,你可以根據(jù)具體需要選擇操作方法。需要注意的是,很少有驅(qū)動(dòng)完全

16、實(shí)現(xiàn)了所有的接口功能。所以在使用時(shí)需要參考驅(qū)動(dòng)源碼,或仔細(xì)閱讀驅(qū)動(dòng)提供者的使用說(shuō)明。Radio設(shè)V4L2的主設(shè)備號(hào)是81,次設(shè)備號(hào):0255,這些次設(shè)備號(hào)里也有好幾種設(shè)備(視頻設(shè)備、備、Teletext、VBI)。V4L2的設(shè)備節(jié)點(diǎn):/dev/videoX,/dev/vbiXand/dev/radioXV4L2框架圖:胖摟rt調(diào)用1icetkmnupAndroid開(kāi)發(fā)之-一底層驅(qū)動(dòng)開(kāi)發(fā)(二)MTD驅(qū)動(dòng)Flash驅(qū)動(dòng)通常使用MTD(memorytechnologydevice),內(nèi)存技術(shù)設(shè)備。MTD的字符設(shè)備:/dev/mtdX主設(shè)備號(hào)90.MTD的塊設(shè)備:/dev/block/mtdblock

17、X主設(shè)備號(hào)13.MTD驅(qū)動(dòng)源碼drivers/mtd/mtdcore.c:MTD核心,定義MTD原始設(shè)備drivers/mtd/mtdchar.c:MTD字符設(shè)備drivers/mtd/mtdblock.c:MTD塊設(shè)備MTD結(jié)構(gòu)圖MTD驅(qū)動(dòng)程序是Linux下專門為嵌入式環(huán)境開(kāi)發(fā)的新一類驅(qū)動(dòng)程序。Linux下的MTD驅(qū)動(dòng)程序接口被劃分為用戶模塊和硬件模塊:用戶模塊提供從用戶空間直接使用的接口:原始字符訪問(wèn)、原始?jí)K訪問(wèn)、FTL(FlashTransitionLayer)和JFS(JournaledFileSystem)。硬件模塊提供內(nèi)存設(shè)備的物理訪問(wèn),但不直接使用它們,二十通過(guò)上述的用戶模塊來(lái)訪

18、問(wèn)。這些模塊提供了閃存上讀、寫和擦除等操作的實(shí)現(xiàn)。藍(lán)牙驅(qū)動(dòng)在Linux中,藍(lán)牙設(shè)備驅(qū)動(dòng)是網(wǎng)絡(luò)設(shè)備,使用網(wǎng)絡(luò)接口。Android的藍(lán)牙協(xié)議棧使用BlueZ實(shí)現(xiàn)來(lái)對(duì)GAP,SDP以及RFCOMM等應(yīng)用規(guī)范的支持,并獲得了SIG認(rèn)證。由于Bluez使用GPL授權(quán),所以Android框架通過(guò)D-BUSIPC來(lái)與bluez的用戶空間代碼交互以避免使用未經(jīng)授權(quán)的代碼。藍(lán)牙協(xié)議部分頭文件:include/net/bluetooth/hci_core.hinclude/net/bluetooth/bluetooth.h藍(lán)牙協(xié)議源彳碼文件:net/bluetooth/*藍(lán)牙驅(qū)動(dòng)程序部分的文件:drivers/bluetooth/*藍(lán)牙的驅(qū)動(dòng)程序一月都通過(guò)標(biāo)準(zhǔn)的HCI控制實(shí)現(xiàn)。但根據(jù)硬件接口和初始化流程的不同,又存在一些差別。這類初始化動(dòng)作一般是一些晶振頻率,波特率等基礎(chǔ)設(shè)置。比如CSR的芯片一般通過(guò)BCSP協(xié)議完成最初的初始化配置,再激活標(biāo)準(zhǔn)HCI控制流程。對(duì)Linux來(lái)說(shuō),一旦bluez可以使用HCI與芯片建立起通信(一般是hciattach+h

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論