在海思平台操作GPIO(1)

2021-10-07 23:02:14 字數 1440 閱讀 7398

設定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...