天天看點

【linux】驅動-4-LED晶片手冊分析

目錄

前言

4. LED晶片手冊分析

4.1 記憶體管理單元MMU

4.1.1 MMU的功能

4.1.2 TLB的作用

4.2 位址轉換函數

4.2.1 ioremap函數

4.2.2 iounmap函數

4.3 LED驅動

4.3.1 配置GPIO時鐘

4.3.2 配置引腳複用

4.3.3 引腳屬性

4.3.4 引腳控制

參考:

《IMX6ULLRM(6ULL使用者手冊).pdf》

李柱明部落格:https://www.cnblogs.com/lizhuming/

本文連結:https://www.cnblogs.com/lizhuming/p/14588172.html

本章節記錄實作LED寄存器配置,晶片手冊分析。

簡單介紹一下MMU。

功能:

将虛拟位址翻譯為實體位址。

管理、保護記憶體。

不同的程序有各自的虛拟位址空間,某個程序中的程式不能修改另外一個程序所使用的實體位址,以此使得程序之間互不幹擾,互相隔離。

作用:

* 保護記憶體:MMU給一些指定的記憶體設定了讀寫權限。存在于頁表中。當有程式操作該記憶體時,MMU會查找頁表中的權限繼續比對。

* 實作虛拟位址到實體位址的轉換:CPU可以運作在虛拟的記憶體當中,虛拟記憶體一般要比實際記憶體大很多,使得CPU可以運作比較大的應用程式。(原理可百度)

【linux】驅動-4-LED晶片手冊分析

TLB(Translation Lookaside Buffer)。

問題:當隻有一級頁表進行位址轉換的時候,CPU每次讀寫資料都需要通路兩次記憶體, 第一次是通路記憶體中的頁表,第二次是根據頁表找到真正需要讀寫資料的記憶體位址; 如果使用兩級了表,那麼CPU每次讀寫資料都需要通路3次記憶體。。。這樣就很繁瑣。

解決:MMU最先通路TLB,假設TLB中包含可以直接轉換此虛拟位址的位址描述符, 則會直接使用這個位址描述符檢查權限和位址轉換,如果TLB中沒有這個位址描述符, MMU才會去通路頁表并找到位址描述符之後進行權限檢查和位址轉換, 然後再将這個描述符填入到TLB中以便下次使用。

映射函數:<code>ioremap()</code>。

取消映射函數:<code>iounmap()</code>。

函數原型:<code>void __iomem *ioremap(phys_addr_t paddr, unsigned long size)</code>

參數:

paddr:被映射的 IO 起始位址(實體位址)。

size:需要映射的空間大小,以位元組為機關。

傳回值:

一個指向 __iomem 類型的指針,當映射成功後便傳回一段虛拟位址空間的起始位址。

通過傳回的虛拟空間起始位址可以對記憶體進行讀寫。為了提高平台的可移植性,建議使用以下讀寫函數:

與以上函數相似的函數:<code>writeb、writew、writel、readb、readw、readl</code>。

注意:其中 writex 與 iowritex 的差別是,writex 不進行端序檢查。

函數原型:<code>void iounmap(void *addr)</code>

addr:需要取消 ioremap 映射之後的起始位址(虛拟位址)。

已知:

以 IMX6 為例。

RGB引腳分别為 GPIO1_IO04、GPIO4_IO20、GPIO4_19。

簡要步驟:

檢視原理圖,分析出 LED 是低電平亮還是高電平亮。找出對應的 GPIO。

對 GPIO 寄存器進行操作:(寄存器表在 《IMX6ULLRM(6ULL使用者手冊).pdf》 中查找)

使能時鐘:使能 GPIO 對應的時鐘;

引腳複用:設定引腳複用為 GPIO;

引腳屬性:配置引腳屬性(上下拉、速率、驅動能力);

控制引腳:控制GPIO引腳,輸出高低電平。

分層、分離:

上層為系統,子產品的出入口函數。

下層為硬體:分離:

各種闆卡, 提供不同的引腳資料。

驅動實作。

寄存器表在 《IMX6ULLRM(6ULL使用者手冊).pdf》 中查找。

【linux】驅動-4-LED晶片手冊分析

由圖可知,GPIO1 的時鐘是由寄存器 CCM_CCGR1 中的 [27-26] bit控制。

該寄存器位址為:Address: 20C_4000h base + 6Ch offset = 20C_406Ch。

【linux】驅動-4-LED晶片手冊分析

寄存器值配置參考上圖。

使能 GPIO1時鐘:寄存器 CCM_CCGR1 中的 [27-26] bit 配置為 [27-26]: 0b11。

配置引腳複用為 GPIO。

檢視手冊 IOMUX 章節。

【linux】驅動-4-LED晶片手冊分析

由上圖可以看出,寄存器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04 [3-0] 設定為 0b0101 時。GPIO1_IO04 就配置為 GPIO1 模式。

配置引腳屬性。

【linux】驅動-4-LED晶片手冊分析
【linux】驅動-4-LED晶片手冊分析

由上圖得,寄存器為 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO04。位址為 Address: 20E_0000h base + 2F8h offset = 20E_02F8h

分析:

HYS(bit16):用來使能遲滞比較器 。

PUS(bit15-bit14):用來設定上下拉電阻大小。

PUE(bit13):當 IO 作為輸入的時候,這個位用來設定 IO 使用上下拉還是狀态保持器。

PKE(bit12):用來使能或者禁止上下拉/狀态保持器功能。

ODE(bit11):IO 作為輸出的時候,此位用來禁止或者使能開漏輸出。

SPEED(bit7-bit6):當 IO 用作輸出的時候,此位用來設定 IO 速度。

DSE(bit5-bit3):當 IO 用作輸出的時候用來設定 IO 的驅動能力。

SRE(bit0):設定壓擺率。

把該寄存器配置為:0x1F838,即為 1 1111 1000 0011 1000。

參考 《IMX6ULLRM(6ULL使用者手冊).pdf》 中的 28.5 GPIO Memory Map/Register Definition 章節。

控制引腳輸入還是輸出。

【linux】驅動-4-LED晶片手冊分析
【linux】驅動-4-LED晶片手冊分析

由上圖可知,GPIO1的資料基位址為 Base address = 0x0209C000。

而 GPIOx_GDIR 位址為 Base address + 4h = 0x0209C004

輸出高低電平。

【linux】驅動-4-LED晶片手冊分析

位址為 Base address = 0x0209C000。

當該引腳配置為 GPIO OUTPUT MODE 時,即可通過設定該引腳來輸出高低電平。

同時,該引腳在 GPIO 模式時,不管 OUTPUT 還是 INPUT。都可以通過讀該寄存器值來判斷該引腳的高低電平。

繼續閱讀