目錄
前言
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可以運作比較大的應用程式。(原理可百度)

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》 中查找。
由圖可知,GPIO1 的時鐘是由寄存器 CCM_CCGR1 中的 [27-26] bit控制。
該寄存器位址為:Address: 20C_4000h base + 6Ch offset = 20C_406Ch。
寄存器值配置參考上圖。
使能 GPIO1時鐘:寄存器 CCM_CCGR1 中的 [27-26] bit 配置為 [27-26]: 0b11。
配置引腳複用為 GPIO。
檢視手冊 IOMUX 章節。
由上圖可以看出,寄存器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04 [3-0] 設定為 0b0101 時。GPIO1_IO04 就配置為 GPIO1 模式。
配置引腳屬性。
由上圖得,寄存器為 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 章節。
控制引腳輸入還是輸出。
由上圖可知,GPIO1的資料基位址為 Base address = 0x0209C000。
而 GPIOx_GDIR 位址為 Base address + 4h = 0x0209C004
輸出高低電平。
位址為 Base address = 0x0209C000。
當該引腳配置為 GPIO OUTPUT MODE 時,即可通過設定該引腳來輸出高低電平。
同時,該引腳在 GPIO 模式時,不管 OUTPUT 還是 INPUT。都可以通過讀該寄存器值來判斷該引腳的高低電平。