驅動筆記++++++漢艾爾特

第一週:
Android 手機開機後,會先運行 bootloader。 Bootloader 會根據某些判定條件(比如按某個特殊鍵)決定是否進入 recovery 模式。
Recovery 模式會裝載 recovery 分區,  該分區包含recovery.img。recovery.img 包含了標準內核(和boot.img中的內核相同)以及 recovery 根文件系統。
boot.img是一種特殊的Android定製格式,由boot header,壓縮的內核,ramdisk以及second stage loader(可選)組成

ramdisk-recovery文件系統是TARGET_PRODUCT_OUT/recovery/root的壓縮。TARGET_PRODUCT_OUT/recovery/root是在build/core/Makefile定義生成。
在recovery/root/init和root/init是同一個可執行文件,都是內核啓動後執行的第一個進程

misc=>開機啓動動畫60k。cache=》OTA更新用的分區 cache/recovery/command,/cache/recovery/intent,/cache/recovery/log
Bootloader –>Boot(Kernel) –> init –>zygote –> SystemServer。設置了一系列的環境變量,重啓後會根據設置的uboot環境變量進入不同的模式 從而實現升級 還原等一系列操作
    
android rom可以說是系統固件。是給系統升級用的。Firmware是一種軟件的代名詞,它是一種固化在集成電路內部的代碼,而集成電路的功能就是由這些程序決定的。ROM不過只是Firmware的載體,而我們通常所說的BIOS正是固化了系統主板Firmware的ROM芯片。
rom相當於電腦硬盤。ram相當於電腦內存。firmware相當於電腦操作系統。BIOS是被固化在ROM(只讀存儲器)芯片的一組程序=>firmwarePOST(Power on Self Test 上電自檢)

NAND Flash和NOR Flash是目前市場上兩種主要的非易失閃存芯片。應用程序可以直接在FIash閃存內運行,不必再把代碼讀到系統RAM中。NAND Flash更適合於大容量數據存儲的嵌入式系統。
RAM有兩大類,一種稱爲靜態RAM(Static RAM/SRAM),SRAM速度非常快非常昂貴.CPU的一級緩衝,二級緩衝. 另一種稱爲動態RAM(Dynamic RAM/DRAM),計算機內存就是DRAM的。
FLASH存儲器又稱閃存,它結合了ROM和RAM的長處,不僅具備電子可擦除可編程(EEPROM)的性能,還不會斷電丟失數據同時可以快速讀取數據(NVRAM的優勢),U盤和MP3裏用的就是這種存儲器。在過去的20年裏,嵌入式系統一直使用ROM(EPROM)作爲它們的存儲設備,然而近年來Flash全面代替了ROM(EPROM)在嵌入式系統中的地位,用作存儲Bootloader以及操作系統.

linux內核衆子系統的初始化,並在過這 程中發現了初始化段的存在,利用初始化段實現了該功能
執行過程:start_kernel->rest_init系統在啓動後在rest_init中會創建init內核線程init->do_basic_setup->do_initcall 中會把.initcall.init.中的函數依次執行一遍:這個__initcall_start是在文件<arch/xxx/kernel/vmlinux.lds.S>定義的

內核在啓動時已經檢測到了系統的硬件設備,由系統初始化腳本掛載到/sys上,生成對應的硬件設備文件。
匿名共享內存(ashmem)爲進程間提供大塊共享內存,爲內核提供回收和管理這個內存的機制。PMEM(Physical),向用戶空間提供連續的物理內存區域,DSP和某些設備只能工作在連續的物理內存上。

Linux的中斷宏觀分爲兩種:軟中斷和硬中斷。聲明一下,這裏的軟和硬的意思是指和軟件相關以及和硬件相關,而不是軟件實現的中斷或硬件實現的中斷。Linux通過信號來產生對進程的各種中斷操作
驅動通過request_irq和free_irq來申請和釋放中斷號。
調用request_irq的正確位置應該是在設備第一次打開,硬件被告知產生中斷之前;調用free_irq的正確位置應該是在最後一次關閉設備,硬件被告知不要再中斷處理之後。
彙編語言(Assembly Language)是面向機器的程序設計語言.彙編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性並能直接控制硬件的語言。

I2C有兩根線的半雙工的串線,SDA-數據線,SCL-時鐘線. SCL高的時候,SDA數據有效,SCL SDA都高,表示總線處於等待狀態.SCL高 SDA由高向低,表示傳輸開始,反之則表示傳輸結束.
同一條 I2C 總線上可以掛接很多個器件,一般可達數十個以上,甚至更多。器件之間是靠不同的編址來區分的,而不需要附加的 I/O 線或地址譯碼部件。帶有 I2C 總線的器件除了有從機地址(Slave Address)外,還可能有子地址。從機地址是指該器件在 I2C 總線上被主機尋址的地址,而子地址是指該器件內部不同部件或存儲單元的編址。
GPIO:General Purpose InputOutput(通用輸入/輸出)簡稱爲GPIO或總線擴展器,當微控制器或芯片組沒有足夠的I/O端口,或當系統需要採用遠端串行通信或控制時,GPIO提供額外的控制監視功能。

driver和device是兩個軟件上的概念,每個driver對應一個主設備號,每個device對應一個次設備號。adapter和client是兩個硬件上的概念。adapter對於嵌入式而言相當於我們板子上的i2c控制器,這個控制器可以根據我們的要求產生i2c時序。client是對於嵌入式而言相當於於個支持i2c的設備。
i2c-core.c相當於提供了一個可用的函數庫,供處部調用,因此我們在裏面經常看到的就是:EXPORT_SYMBOL();這個宏將這些函數作爲符號導出,使其它文件中的函數可以使用,而不必包含相應的頭文件。

i2c_client對應一個真實的物理設備,則把探測到的i2c_client->adapter指向其依附的適配器,,把i2c_client->driver指向其依附的 i2c_driver結構bus_for_each_drvice正是通過這個成員找到所有驅動,並執行一次i2c_do_add_adapter.也即執行drv->attach_adapter
led-dev.c 一、註冊一個字符設備驅動。二、向sysfs註冊了一個類。三、向上添加了一個驅動結構=>i2c-core.c對於一個驅動程序有兩個元素不可或缺,即設備和驅動,一般驅動都是通過設備名和驅動名的匹配建立關係的。i2c-dev.c並沒有針對特定的設備而設計,只是提供了通用的read()、write()和ioctl()等接口
i2c_driver對應一套驅動方法,是純粹的用於輔助作用的數據結構,它不對應於任何的物理實體。i2c_client對應於真實的物理設備,每個I2C設備都需要一個i2c_client來描述。

i2c_transfer()函數本身不具備驅動適配器物理硬件完成消息交互的能力,它只是尋找到i2c_adapter對應的i2c_algorithm,並使用i2c_algorithm的master_xfer()函數真正驅動硬件流程
設備驅動要使用i2c_driver和i2c_client數據結構並填充其中的成員函數,I2C設備模塊=> i2c_adapter; i2c-client,即i2c從設備從機,這個東西代表的是接到s3c2440芯片上的設備
通過register_chrdev()函數將I2C設備註冊爲一個字符設備。Aaron add=>i2c_register_board_info:  name:pm8058-core, addr:0x55, bus:6=>i2c_device.board_info.addr

模塊加載時會在/sys/class/中創建名爲hello_class的邏輯設備,在/dev/中創建hello的物理設備文件。一個邏輯設備總是對應於一個物理設備,但是一個物理設備卻可能對應於多個邏輯設備。驅動模塊加載時負責自動創建設備類別和設備文件。這個功能有兩個步驟,創建設備類別文件class_create();   創建邏輯設備文件device_create();i2c_client隨着設備文件的打開而產 生,並隨設備文件的關閉而撤銷,。i2c-dev.c針對每個I2C適配器生成一個主設備爲89的設備文件,實現了i2c_driver的成員函數以及文件操作接口。
和設備交互的數據我們總稱爲“數據”,但是大致可劃分爲兩種:“功能數據”:我們要輸入設備處理的和設備處理完之後輸出的數據。“控制數據”:我們用來控制設備特性功能的命令和參數。

I2C驅動體系結構有相當的複雜度,它主要由3部分組成,即I2C核心、I2C總線驅動和I2C設備驅動。I2C核心是I2C總線驅動和I2C設備驅動的 中間樞紐,它以通用的、與平臺無關的接口實現了I2C中設備與適配器的溝通。I2C總線驅動填充i2c_adapter和i2c_algorithm結構 體,I2C設備驅動填充i2c_driver和i2c_client結構體。
i2c-dev.c文件定義的主設備號爲89的設備可以給應用程序提供讀寫I2C設備寄存器的能力,IIC總線用於連接微處理器及其外圍設備。i2c_add_adapter將這模塊註冊到操作系統裏,總線驅動就算裝上了。

發光二極管簡稱爲LED。LED 是英文 light emitting diode(發光二極管)的縮寫,它的基本結構是一塊電致發光的半導體材料.LED顯示屏(LED display):是由LED點陣組成,通過紅色或綠色燈珠的亮滅來顯示文字、圖片、動畫、視頻,內容可以隨時更換,各部分組件都是模塊化結構的顯示器件。
MCU(Micro Control Unit)中文名稱爲微控制單元,又稱單片微型計算機(Single Chip Microcomputer)或者單片機,是指隨着大規模集成電路的出現及其發展,將計算機的CPU、RAM、ROM、定時計數器和多種I/O接口集成在一片芯片上,形成芯片級的計算機,爲不同的應用場合做不同組合控制常見存儲器件。

在I2C總線上傳送的每一位數據都有一個時鐘脈衝相對應(或同步控制),I2C總線上的所有數據都是以8位字節傳送的,發送器每發送一個字節,就在時鐘脈衝9期間釋放數據線,由接收器反饋一個應答信號。
啓動信號是一種電平跳變時序信號,而不是一個電平信號。啓動信號是由主控器主動建立的,在建立該信號之前I2C總線必須處於空閒狀態。只有在SCL爲低電平期間,才允許SDA上的電平改變狀態。邏輯0的電平爲低電壓,而邏輯1的電平取決於器件本身的正電源電壓VDD(當使用獨立電源時)

總線傳送的每1幀數據均是1個字節。在啓動總線後的第1個字節的低7位是對從機的尋址地址,第8位爲方向位(“0”表示主機對從機的寫操 作;“1”表示主機對從機的讀操作),其餘的字節爲操作數據.在I2C總線發送起始信號後,發送從機的7位尋址地址和1位表示這次操作性質的讀寫位,在有應答信號後開始傳送數據,直到發送停止信號。主機每發送1個字節就要檢測SDA線上有沒有收到應答信號,有則繼續發送,否則將停止發送。
    
I2C-core框架:提供了核心數據結構的定義和相關接口函數,用來實現I2C適配器驅動和設備驅動的註冊、註銷管理.
I2C總線驅動只是提供了對一條總線的讀寫機制,本身並不會去做通信。通信是由I2C設備驅動來做的,設備驅動透過I2C總線同具體的設備進行通訊。一個設備驅動有兩個模塊來描述,struct i2c_client和struct i2c_driver。i2c_client用來描述一個具體的I2C設備,i2c_driver結構提供了i2c_adapter與 i2c_client之間的通信方式。
attach_adapter利用適配器驅動提供的I2C總線訪問方法,利用設備驅動程序模塊中提供的地址線索信息,檢測可能存在的設備及其地址。如 果成功發現設備,則創建一個struct i2c_client來標識這個設備,並向該適配器的數據結構註冊。detach_client用於從總線上註銷設備、並釋放i2c_client及相應 的私有數據結構。command是用戶接口中的ioctl功能的底層實現。

LED的特性曲線就像二極管的一樣,在工作範圍內,電壓相差一點,電流變化很大,而且LED的亮度是由電流控制的,如果用恆壓的話,亮度會導致很難控制。LED不像普通的白熾燈泡,可以直接連接220V的交流市電。 LED是2~3伏的低電壓驅動,必須要設計複雜的變換電路,不同用途的LED燈,要配備不同的電源適配器。
電流信號:在規定負載阻抗範圍內(一般500、250歐以下),電流恆定,電壓隨負載變化而變化。 電壓信號:在規定負載阻抗範圍內(一般5K、10K歐以上),電壓恆定,電流隨負載變化而變化。

每一個I2C適配器都被分配一個設備,主設備號都爲89,次設備號爲0~255。應用程序通過 “i2c-%d” 文件名並使用文件操作接口open()、write()、read()、ioctl()和close()等來訪問這個設備。
i2c-dev.c並沒有針對特定的設備而設計,只是提供了通用的read()、write()和ioctl()等接口,應用層可以借用這些接口訪問掛接在適配器上的I2C設備的存儲空間或寄存器並控制I2C設備的工作方式。i2c_adapter 對應於物理上的一個適配器,而i2c_algorithm對應一套通信方法。

第六週
fd = open(argv[1], O_RDWR);ioctl(fd, I2C_SLAVE, 0x50); /* 設置eeprom地址 */ write(fd, &tmp.addr, 2); read(fd, &buf[idx], 1);close(fd);
platform_driver_register()註冊過程
在really_probe()中:爲設備指派管理該設備的驅動:dev->driver = drv, 調用probe()函數初始化設備:drv->probe(dev)
platform_device該結構一個重要的元素是 resource ,該元素存入了最爲重要的設備資源信息.驅動註冊時需要匹配內核中所以已註冊的設 備名。
arch_initcall 的優先級高於 module_init 。所以會在 Platform 驅動註冊之前調用。
只有找到相同的名稱的 platfomr_device 才能註冊 成功,當註冊成功時會調用 platform_driver 結構元素 probe 函數指針,


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