設定gpio的輸入輸出其實就是寫gpio_dir暫存器
首先需要找管腳對應gpio組的暫存器的基位址
在基位址的基礎上再加要操作暫存器的偏移位址(這是乙個組的管腳的暫存器的位址)
在這個位址上有8位,每一位對應乙個管腳的輸入(0)輸出(1)
有些時候直接設定gpio_dir暫存器的值會改寫已經設定好了的gpio管腳的狀態,所以在設定gpio_dir前應該先讀一下暫存器的值
這裡實際上是操作gpio_data暫存器,當配置gpio_dir 中對應位為輸出時,寫入gpio_data 暫存器的值將會輸出到相應的管腳(注意需要配置正確的管腳復用);如果配置為輸入時,將會讀取相應輸入管腳的值。
操作格式:himin 操作的gpio的暫存器位址(gpio組的基位址+暫存器偏移位址) 輸入暫存器的值
需要操作哪乙個引腳,就對它賦值。 若位址為0x3fc,則可以對全部引腳進行處理(全選)
我們只對gpio6_7設定輸出1,那麼就應該輸入:himm 0x201a0200 0xff(雖然設定了0xff,但是只對gpio_data[7]有用)
ioremap函式
ioremap函式用於獲取指定實體地址空間對應的虛擬位址空間定義在arch/arm/include/asm/io.h中
#define ioremap(cookie,size) __arm_ioremap((cookie), (size), mt_device)
iounmp函式
iounmp是在解除安裝驅動的時候釋放ioremap所做的對映
void iounmap (volatile void __iomem *addr)
addr就是要取消的虛擬對映的首位址
2、i/o記憶體訪問函式
linux不允許直接指標訪問通過ioremap對映的記憶體,所以提供讀寫函式。
讀函式
u8 readb(const volatile void __iomem *addr)
u16 readw(const volatile void __iomem *addr)
u32 readl(const volatile void __iomem *addr)
對應8bit,16bit,和32bit讀寫操作。addr就是用過ioremap對映得到的虛擬記憶體。
寫函式
void writeb(u8 value, volatile void __iomem *addr)
void writew(u16 value, volatile void __iomem *addr)
void writel(u32 value, volatile void __iomem *addr)
value:要寫入的數值 海思晶元上GPIO操作
gpio的設定一般為三步 1 設定gpio埠復用 2 設定gpio口的方向 3 讀取或者寫入gpio值 第一步不是每個gpio口都是要配置的,如果你設定的gpio埠有復用功能,那麼你需要對gpio對應復用暫存器進行配置,例如 文件中gpio5 5是有復用功能的,0 pwm out0 1 gpio5 ...
海思GPIO和中斷操作
中斷部分 1.關於gpio的操作 1 gpio request gpio num,null 註冊 gpio 2 設定gpio方向 對於輸入 gpio direction input gpio num 對於輸出 gpio direction output gpio num,gpio out val 3...
海思晶元上GPIO和PWM操作
一 gpio的配置 gpio的設定一般為三步 1 設定gpio埠復用 2 設定gpio口的方向 3 讀取或者寫入gpio值 第一步不是每個gpio口都是要配置的,如果你設定的gpio埠有復用功能,那麼你需要對gpio對應復用暫存器進行配置,例如 文件中gpio5 5是有復用功能的,0 pwm out...