導航:首頁 > 操作系統 > android驅動模塊

android驅動模塊

發布時間:2022-09-26 07:09:47

❶ 如何向android添加內核驅動模塊

1,同目錄下的makefile,如
#
# Makefile for instrial I/O Magnetometer sensors
#

obj-$(CONFIG_SENSORS_AK8975) += ak8975.o
obj-$(CONFIG_SENSORS_HMC5843) += hmc5843.o

2,同目錄下的kconfig

#
# Magnetometer sensors
#
comment "Magnetometer sensors"

config SENSORS_AK8975
tristate "Asahi Kasei AK8975 3-Axis Magnetometer"
depends on I2C
help
Say yes here to build support for Asahi Kasei AK8975 3-Axis
Magnetometer.

To compile this driver as a mole, choose M here: the mole
will be called ak8975.

3,總的config(配置變數為Y)
各項目配置文件的位置不同,
coffee:kernel/arch/arm/configs/M7023Q-debug-perf_defconfig
juice:common/customer/configs
配置信息如下:
# CONFIG_CFG80211 is not set
CONFIG_EXPERIMENTAL=y
CONFIG_LOCALVERSION="$(KERNEL_LOCAL_VERSION)-perf"
CONFIG_SWAP=y
CONFIG_ZRAM=m
CONFIG_SYSVIPC=y
CONFIG_SENSORS_AK8975=y
......

查看變數是否在編譯時配置成功:
out/target/proct/m7023q/obj/KERNEL_OBJ/include/generated/Autoconf.h
查找CONFIG_SENSORS_AK8975
若在編譯時有配置成功,將找到這一行:
#define CONFIG_SENSORS_AK8975 1

4、修改板級文件:
4.0及後續項目統一在:kernel/arch/arm/mach-msm/board-qrd7627a.c
注意juice中,很多配置(如tp)寫在kernel/arch/arm/mach-msm/board-msm7627a-io.c
在代碼中增加新模塊的內容,應該有兩處,第一處設置函數和結構體,第二處實際調用,注意引用上述第3步新增的編譯開關將代碼限制起來。
這些內容大多可以拷貝其它模塊,但是名字要和driver中的相同,注意要改的地方除了名字之外,還有中斷腳和I2C腳。其中固定模塊的中斷腳大部分時候不會改變(如tp就是int:48,reset:26),除非板子的datasheet特別註明才需要改變。但是I2C腳是會隨著slaver device的改變而改變的,需要查清楚。
配置platform_data:
一般需要初始化一個xxx_platform_data結構體(這個結構體的聲明應該讓驅動文件可視,probe中才知道去讀某個platformdata.yyy),並在i2c_board_info結構體中用.platform_data指向它,然後這個i2c_board_info將在板級文件中被注冊(作為函數i2c_register_board_info()的參數)。而這個.platform_data很有可能在驅動的probe函數中調用到,例如:
static struct msg2133_ts_platform_data msg2133_platformdata= {
.irq = 0,
.reset = GPIO_TP_RESET,
};

static struct i2c_board_info i2c_info_msg2133_dpt = {
I2C_BOARD_INFO("msg2133", 0x27),
.platform_data = &msg2133_platformdata,
};
i2c_info_msg2133_dpt.platform_data->irq = gpio_to_irq(GPIO_TP_INT);//結構體初始化的時候只能以常量賦值,因為此處需要做GPIO到irq的映射,所以要在此處賦值。
i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, &i2c_info_msg2133_dpt, 1);
在驅動的probe中:pdata =client->dev.platform_data;
...... = pdata.yyy; ......//(msg2133_ts_platform_data在該文件中可見)

❷ 如何在android安卓添加或載入設備驅動

驅動裝到手機上,把模塊連接的時候根據提示操作就行了!
就像iPhone的App Store一樣,Android也有自己的「Market」,目前Market上每天都有新增加的軟體和游戲,並且現階段出現的所有應用軟體和程序都是免費的。以下是Market使用教程:
1.打開G1的主菜單,找到並開啟Market軟體商店。在Macket主菜單中:
AndroidApplications:經過Google認可的Android軟體。
AndroidGames:經過Google認可的Android游戲。
AndroidSearch:搜索Market軟體商店裡的軟體。
AndroidMy downloads:查看你從Market下載好的軟體。
Android主菜單上面可以滾動的圖標是Google官方隨機推薦的一些第三方軟體。
2. 先點擊「Applications」後,會出現所有的第三方軟體分類,除了第一個All applications是指查看所有的第三方軟體之外,其他均為細分類。隨便點擊一個分類,則會出現該分類下的所有對應軟體,默認情況下By popularity是指按人氣由高到低的順序顯示該分類下的軟體,By date則是按照時間的先後順序來顯示該分類下的軟體。
3. 點擊一個軟體,你將會看到該軟體的詳細功能描述、網友評論、作者信息。如果你想安裝此軟體,可以直接點擊「Install」,那麼此時屏幕中將會顯示該軟體可能會涉及到的G1相關功能、個人隱私信息等提示,沒有問題的話,你就可以直接點擊「OK」,來下載並安裝此軟體了。
4. 如果你不想安裝此軟體,可以點擊「Cancel」來取消,如果你此時想進行更多操作,請點擊屏幕下方的 MENU按鈕,在屏幕下方出現的白色窗口裡:
AndroidMarket home:回到Market首頁
AndroidSearch:開始搜索Market里的軟體
AndroidMy downloads:查看已經下載好的軟體
AndroidHelp:上網查看Market的相關使用幫助
AndroidSecurity:查看該軟體所涉及的安全信息
AndroidFlag content:標記軟體內容

Search——軟體搜索篇
5. 如果你點擊Search,畫面頂部將會出現搜索欄,此時你可以隨意輸入你喜歡的軟體名稱,然後點擊Search即可。

My downloads——已下載軟體查看及卸載
6. 如果你點擊My downloads,此時將會出現的軟體列表即為你從Market上下載並安裝的軟體。若你想寫在寫在某個軟體,只需要找到並點擊這個軟體,然後在點擊「Uninstall」即可完成卸載工作!

❸ 怎樣將android wifi編譯成驅動模塊

修改 init.rc:很多文章都有描述,但還是有些說明不清的地方,我先列出增加項,然後作些說明。
增加: mkdir /system/etc/wifi 0771 wifi wifi
chmod 0771 /system/etc/wifi
chmod 0660 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf #wifi的原始配置文件
# wpa_supplicant socket
mkdir /data/system/wpa_supplicant 0771 wifi wifi
chmod 0771 /data/system/wpa_supplicant #放置wifi interface的地方
mkdir /data/misc/wifi 0771 wifi wifi
chmod 0771 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf #wifi的配置文件,將由wpa_supplicant根據實際配置寫入該文件
mkdir /data/misc/wifi/sockets 0777 wifi wifi #與上層通過socket通信的路徑
# Prepare for wifi
setprop wifi.interface ra0 #intreface名稱設置,這在framework/base/wifi/java/android/net/wifi /WifiStateTracker.java中會用到,以處理dhcp。rt2070用ra0,而vt6656使用eth1。
這里0771對 目錄許可權的處理是為了所有用戶能對下一級進行搜索,而紅字特別提醒的許可權配置,是因為/data/misc/wifi/sockets目錄不僅為wifi擁有者服務,還因為通信的原因要和其他用戶聯系,要不然,將會出現Unable to open connection to supplicant on "/data/system/wpa_supplicant/ra0": Connection refused,或permission denied的錯誤。很多人乾脆將上述所有的許可權都設為0777,當然也行,但總覺得有些粗糙。
service的修改:
service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant /
-Dwext -ira0 -c/data/misc/wifi/wpa_supplicant.conf #也可以用/system/etc/wifi/wpa_supplicant.conf代替
user root
group system wifi inet
# socket wpa_wlan0 dgram 660 wifi wifi #屏蔽該項是因為這項是用於UDP連接的
disable
oneshot

service dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d -B ra0
group system dhcp wifi
disabled
oneshot

❹ android ndk 開發只寫jni層的代碼嗎不能寫hal層的代碼嗎以及linux驅動模塊的代碼嘛

NDK開發可以linux下的android源碼中編譯單個模塊生成.so文件,然後放在上層android 項目中調用,你在源碼中吧,你要編譯的模塊驅動的C代碼放進去,按照JIN規則取號名字,然後編\編譯,就行了,把生成的 so文件導入到上層項目,然後你知道C的函數名,在java層寫本地方法和,C的函數名一樣,記得類名也別搞錯了,就行了。不要燒錄整個系統,只要編譯你需要的驅動模塊生成so文件就行

❺ android 沒有驅動程序怎麼解決

SB設備。 二是USB設備不能被電腦識別。我們先要判斷是電腦的問題還是USB設備的問題。我們可以用其他的USB設備來測試電腦有沒有問題。 如果是電腦的問題。你的電腦是不是被病毒破壞。USB2.0的驅動是不是安裝完好或版本不兼容。有沒有軟體沖突(先解決軟體問題)一般情況出來一個安裝驅動程序的提示。 如果是電腦硬體問題。我們先用萬用表測量USB的四條線(紅+5V 白DATA-數據- 綠DATA-數據- 黑 地線)萬用表紅表筆對地黑表筆測量(白線和淥線。的阻值不相差50歐,這兩條線都是從南橋出來的,如果阻值變化過大則可以判斷是南橋問題。說明USB在南橋內部的模塊燒毀。 在來看看外面的USB設備現在很多都要驅動程序。即使沒有驅動程序也不會出來無法識別的情況。出現無法識別的情況有幾種。一USB數據線不通或接觸不良一般都接觸那個地方因為時間長可能裡面生銹有脹東西還可能有東西在裡面擋住了。二 USB線不通。紅線不通什麼反應也不會有,白線不通無法識別。綠線不通也是無法識別。白線和綠線不可以接反。也是無法識別。黑線不通也沒有反應,這個測量的方法上面已經講到。 注意.紅線5V電壓低也可導致無法識別. 三 USB機板內部問題。1晶振不良,不起振。2晶振電容不良(20P)有兩個 3復位電容電阻不良。復位電壓偏底偏高 4三端IC不良為IC提供電壓不夠5. 主IC不良 祝你好運!

❻ Android 重學系列 ion驅動源碼淺析

上一篇文章,在解析初始化GraphicBuffer中,遇到一個ion驅動,對圖元進行管理。首先看看ion是怎麼使用的:

我們按照這個流程分析ion的源碼。

如果對ion使用感興趣,可以去這篇文章下面看 https://blog.csdn.net/hexiaolong2009/article/details/102596744

本文基於Android的Linux內核版本3.1.8

遇到什麼問題歡迎來本文討論 https://www.jianshu.com/p/5fe57566691f

什麼是ion?如果是音視頻,Camera的工程師會對這個驅動比較熟悉。最早的GPU和其他驅動協作申請一塊內存進行繪制是使用比較粗暴的共享內存。在Android系統中使用的是匿名內存。最早由三星實現了一個Display和Camera共享內存的問題,曾經在Linux社區掀起過一段時間。之後各路大牛不斷的改進之下,就成為了dma_buf驅動。並在 Linux-3.3 主線版本合入主線。現在已經廣泛的運用到各大多媒體開發中。

首先介紹dma_buf的2個角色,importer和exporter。importer是dma_buf驅動中的圖元消費者,exporter是dma_buf驅動中的圖元生產者。

這里借用大佬的圖片:

ion是基於dma_buf設計完成的。經過閱讀源碼,其實不少思路和Android的匿名內存有點相似。閱讀本文之前就算不知道dma_buf的設計思想也沒關系,我不會仔細到每一行,我會注重其在gralloc服務中的申請流程,看看ion是如何管理共享內存,為什麼要拋棄ashmem。

我們先來看看ion的file_operation:

只有一個open和ioctl函數。但是沒有mmap映射。因此mmap映射的時候一定其他對象在工作。

我們關注顯卡英偉達的初始化模塊。
文件:/ drivers / staging / android / ion / tegra / tegra_ion.c

mole_platform_driver實際上就是我之前經常提到過的mole_init的一個宏,多了一個register注冊到對應名字的平台中的步驟。在這裡面注冊了一個probe方法指針,probe指向的tegra_ion_probe是載入內核模塊注冊的時候調用。

先來看看對應的結構體:

再來看看對應ion內的堆結構體:

完成的事情如下幾個步驟:

我們不關注debug模式。其實整個就是我們分析了很多次的方法。把這個對象注冊miscdevice中。等到insmod就會把整個整個內核模塊從dev_t的map中關聯出來。

我們來看看這個驅動結構體:

文件:/ drivers / staging / android / ion / ion_heap.c

這里有四個不同堆會申請出來,我們主要來看看默認的ION_HEAP_TYPE_SYSTEM對應的heap流程。

其實真正象徵ion的內存堆是下面這個結構體

不管原來的那個heap,會新建3個ion_system_heap,分別order為8,4,0,大於4為大內存。意思就是這個heap中持有一個ion_page_pool 頁資源池子,裡面只有對應order的2的次冪,內存塊。其實就和夥伴系統有點相似。

還會設置flag為ION_HEAP_FLAG_DEFER_FREE,這個標志位後面會用到。

文件:/ drivers / staging / android / ion / ion_page_pool.c

在pool中分為2個鏈表一個是high_items,另一個是low_items。他們之間的區分在此時就是以2為底4的次冪為分界線。

文件:/ drivers / staging / android / ion / ion.c

因為打開了標志位ION_HEAP_FLAG_DEFER_FREE和heap存在shrink方法。因此會初始化兩個回收函數。

文件:/ drivers / staging / android / ion / ion_heap.c

此時會創建一個內核線程,調用ion_heap_deferred_free內核不斷的循環處理。不過由於這個線程設置的是SCHED_IDLE,這是最低等級的時間片輪轉搶占。和Handler那個adle一樣的處理規則,就是閑時處理。

在這個循環中,不斷的循環銷毀處理heap的free_list裡面已經沒有用的ion_buffer緩沖對象。

文件:/ drivers / staging / android / ion / ion_system_heap.c

注冊了heap的銷毀內存的方法。當系統需要銷毀頁的時候,就會調用通過register_shrinker注冊進來的函數。

文件:/ drivers / staging / android / ion / ion_page_pool.c

整個流程很簡單,其實就是遍歷循環需要銷毀的頁面數量,接著如果是8的次冪就是移除high_items中的page緩存。4和0則銷毀low_items中的page緩存。至於為什麼是2的次冪其實很簡單,為了銷毀和申請簡單。__free_pages能夠整頁的銷毀。

文件:/ drivers / staging / android / ion / ion.c

主要就是初始化ion_client各個參數,最後把ion_client插入到ion_device的clients。來看看ion_client結構體:

核心還是調用ion_alloc申請一個ion緩沖區的句柄。最後把數據拷貝會用戶空間。

這個實際上就是找到最小能承載的大小,去申請內存。如果8kb申請內存,就會拆分積分在0-4kb,4kb-16kb,16kb-128kb區間找。剛好dma也是在128kb之內才能申請。超過這個數字就禁止申請。8kb就會拆成2個4kb保存在第一個pool中。

最後所有的申請的page都添加到pages集合中。

文件:/ drivers / staging / android / ion / ion_page_pool.c

能看到此時會從 ion_page_pool沖取出對應大小區域的空閑頁返回上層,如果最早的時候沒有則會調用ion_page_pool_alloc_pages申請一個新的page。由於引用最終來自ion_page_pool中,因此之後申請之後還是在ion_page_pool中。

這里的處理就是為了避免DMA直接內存造成的緩存差異(一般的申請,默認會帶一個DMA標志位)。換句話說,是否打開cache其實就是,關閉了則使用pool的cache,打開了則不使用pool緩存,只依賴DMA的緩存。

我們可以看另一個dma的heap,它是怎麼做到dma內存的一致性.
文件: drivers / staging / android / ion / ion_cma_heap.c

能看到它為了能辦到dma緩存的一致性,使用了dma_alloc_coherent創建了一個所有強制同步的地址,也就是沒有DMA緩存的地址。

這里出現了幾個新的結構體,sg_table和scatterlist

文件:/ lib / scatterlist.c

這裡面實際上做的事情就是一件:初始化sg_table.
sg_table中有一個核心的對象scatterlist鏈表。如果pages申請的對象數量<PAGE_SIZE/sizeof(scatterlist),每一項sg_table只有一個scatterlist。但是超出這個數字就會增加一個scatterlist。

用公式來說:

換句話說,每一次生成scatterlist的鏈表就會直接盡可能占滿一頁,讓內存更好管理。

返回了sg_table。

初始化ion_handle,並且記錄對應的ion_client是當前打開文件的進程,並且設置ion_buffer到handle中。使得句柄能夠和buffer關聯起來。

每當ion_buffer需要銷毀,

❼ android pci 設備驅動需要depend on 什麼模塊

需要啟動Android驅動模塊Makefile編寫。
PCI是一種外設匯流排規范。我們先來看一下什麼是匯流排:匯流排是一種傳輸信號的路徑或信道。典型情況是,匯流排是連接於一個或多個導體的電氣連線,匯流排上連接的所有設備可在同一時間收到所有的傳輸內容。匯流排由電氣介面和編程介面組成。本文討論Linux 下的設備驅動,所以,重點關注編程介面。
CI是Peripheral Component Interconnect(外圍設備互聯)的簡稱,是普遍使用在桌面及更大型的計算機上的外設匯流排。PCI架構被設計為ISA標準的替代品,他有三個主要目標:獲得在計算機和外設之間傳輸數據時更好的性能;盡可能的平台無關;簡化往系統中添加和刪除外設的工作。

❽ 關於android系統藍牙都用什麼模塊,有單獨的android驅動嗎

Android系統的源碼中藍牙部分的分布式這樣的:
1. App部分主要包括OPP和PBAP以及HFP,當然還有settings部分,代碼分布如下:
(1) /packages/app/Bluetooth/src/com/android/bluetooth/opp
(2) /packages/app/Bluetooth/src/com/android/bluetooth/pbap
(3) /packages/app/Phone/src/com/android/phone/ 中和BT相關的部分,主要是HFHS打電話相關的
(4) /packages/app/Settings/src/com/android/settings/bluetooth/ 主要是藍牙開啟,搜索,配對等

2. Framework部分主要包括BluetoothAdapter,BluetoothService,BluetoothEventLoop,BluetoothA2dpService等核心類,代碼分布如下:
(1)/frameworks/base/core/java/android/server/ 包含BluetoothService,BluetoothEventLoop等核心類,但是並沒有向用戶應用程序提供介面,屬於系統的類。
(2)/frameworks/base/core/java/android/bluetooth 包含了BluetoothAdapter, BluetoothSocket, BluetoothServerSocket等一系列類,這些類是系統向應用程序提供的介面,編寫藍牙相關的應用程序時會用到這些類,檢查BT是否打開,搜索設備等等。如果編寫藍牙應用程序,需要熟悉該部分類的功能。
(3) /frameworks/base/core/jni/ 中包含Bluetooth相關的文件,如 android_server_BluetoothService.cpp 該部分主要是java層和c/c++層進行通信的

3. Bluez部分,主要包括各個協議的實現,如A2dp,AVRCP,AVDTP,HID,HDP,PAN,DUN以及對BT host的實現,通過該部分向BT Controler部分發送HCI命令,代碼分布服下:
/external/bluetooth/bluez

4. BluetDroid部分,主要用於開關藍牙,晶元上電部分(不屬於驅動,可以算是硬體抽象層(HAL)), 代碼分布如下:
/system/bluetooth/

5. kernel部分,主要包括RFCOMM,L2CAP等協議以及HCI的實現,代碼分布如下:
/kernel/net/bluetooth/

6. driver部分,該部分代碼還真沒了解過,代碼分布:
/kernel/drivers/bluetooth/
另外,driver部分和具體晶元密切相關,有時在下面的目錄下也會有:
/vendor/
/device/

❾ 如何寫一個Android USB介面驅動

說到 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 驅動程序的主要頭文件是 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核心實現部分
5.V4l2視頻驅動
V4L2是V4L的升級版本,為linux下視頻設備程序提供了一套介面規范。包括一套數據結構和底層V4L2驅動介面。V4L2提供了很多訪問介面,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所以在使用時需要參考驅動源碼,或仔細閱讀驅動提供者的使用說明。
V4L2的主設備號是81,次設備號:0~255,這些次設備號里也有好幾種設備(視頻設備、Radio設備、Teletext、VBI)。
V4L2的設備節點: /dev/videoX, /dev/vbiX and /dev/radioX
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 驅動程序是 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/*

閱讀全文

與android驅動模塊相關的資料

熱點內容
怎麼解壓鏡像系統 瀏覽:190
程序員求助國企 瀏覽:837
雲伺服器網址租用多少錢 瀏覽:942
行車記錄儀安卓版怎麼用 瀏覽:500
java是不是數字 瀏覽:182
php模擬瀏覽器環境 瀏覽:353
編程誰都能學會嗎 瀏覽:407
使用國家反詐app都要開啟什麼 瀏覽:712
下載民宿APP有什麼用 瀏覽:52
續子語pdf 瀏覽:385
2021年加密貨幣最新行情 瀏覽:162
nfs怎麼加密ipsec 瀏覽:245
國二考試調用編譯器運算選擇題 瀏覽:750
同濟大學高等數學pdf 瀏覽:234
延時的宏命令怎麼設置 瀏覽:596
資料庫有哪些加密 瀏覽:209
改之理反編譯注冊教程 瀏覽:391
什麼是編譯程序和翻譯程序 瀏覽:208
python課程心得總結 瀏覽:17
派派中怎麼看對方在哪個伺服器 瀏覽:796