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



前言

4. LED芯片手冊分析

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

4.1 內存管理單元MMU

簡單介紹一下MMU。

4.1.1 MMU的功能

功能:

  • 虛擬地址翻譯為物理地址
  • 管理、保護內存。

不同的進程有各自的虛擬地址空間,某個進程中的程序不能修改另外一個進程所使用的物理地址,以此使得進程之間互不干擾,相互隔離。

作用:
* 保護內存:MMU給一些指定的內存設置了讀寫權限。存在於頁表中。當有程序操作該內存時,MMU會查找頁表中的權限繼續匹配。
* 實現虛擬地址到物理地址的轉換:CPU可以運行在虛擬的內存當中,虛擬內存一般要比實際內存大很多,使得CPU可以運行比較大的應用程序。(原理可百度

4.1.2 TLB的作用

TLB(Translation Lookaside Buffer)。

問題:當只有一級頁表進行地址轉換的時候,CPU每次讀寫數據都需要訪問兩次內存, 第一次是訪問內存中的頁表,第二次是根據頁表找到真正需要讀寫數據的內存地址; 如果使用兩級了表,那么CPU每次讀寫數據都需要訪問3次內存。。。這樣就很繁瑣。
解決:MMU最先訪問TLB,假設TLB中包含可以直接轉換此虛擬地址的地址描述符, 則會直接使用這個地址描述符檢查權限和地址轉換,如果TLB中沒有這個地址描述符, MMU才會去訪問頁表並找到地址描述符之后進行權限檢查和地址轉換, 然后再將這個描述符填入到TLB中以便下次使用。

4.2 地址轉換函數

映射函數:ioremap()
取消映射函數:iounmap()

4.2.1 ioremap函數

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

  • 參數:
    • paddr:被映射的 IO 起始地址(物理地址)。
    • size:需要映射的空間大小,以字節為單位。
  • 返回值:
    • 一個指向 __iomem 類型的指針,當映射成功后便返回一段虛擬地址空間的起始地址。

通過返回的虛擬空間起始地址可以對內存進行讀寫。為了提高平台的可移植性,建議使用以下讀寫函數:

unsigned int ioread8(void __iomem *addr)
unsigned int ioread16(void __iomem *addr)
unsigned int ioread32(void __iomem *addr)

void iowrite8(u8 b, void __iomem *addr)
void iowrite16(u16 b, void __iomem *addr)
void iowrite32(u32 b, void __iomem *addr)

與以上函數相似的函數:writeb、writew、writel、readb、readw、readl
注意:其中 writexiowritex 的區別是,writex 不進行端序檢查。

4.2.2 iounmap函數

函數原型:void iounmap(void *addr)

  • 參數:
    • addr:需要取消 ioremap 映射之后的起始地址(虛擬地址)。

4.3 LED驅動

已知:

  • 以 IMX6 為例。
  • RGB引腳分別為 GPIO1_IO04、GPIO4_IO20、GPIO4_19
    簡要步驟:
  1. 查看原理圖,分析出 LED 是低電平亮還是高電平亮。找出對應的 GPIO
  2. GPIO 寄存器進行操作:(寄存器表在 《IMX6ULLRM(6ULL用戶手冊).pdf》 中查找)
    1. 使能時鍾:使能 GPIO 對應的時鍾;
    2. 引腳復用:設置引腳復用為 GPIO
    3. 引腳屬性:配置引腳屬性(上下拉、速率、驅動能力);
    4. 控制引腳:控制GPIO引腳,輸出高低電平。
  3. 分層、分離:
    1. 上層為系統,模塊的出入口函數。
    2. 下層為硬件:分離:
      1. 各種板卡, 提供不同的引腳數據。
      2. 驅動實現。

4.3.1 配置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

4.3.2 配置引腳復用

配置引腳復用為 GPIO
查看手冊 IOMUX 章節。

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

4.3.3 引腳屬性

配置引腳屬性。

由上圖得,寄存器為 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

4.3.4 引腳控制

參考 《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。都可以通過讀該寄存器值來判斷該引腳的高低電平。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM