海思GPIO和中斷操作

2021-10-07 08:43:59 字數 2829 閱讀 7890

中斷部分:

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 輸入值或設定 gpio 輸出值

gpio_get_value 檢視輸入值

輸出低: gpio_set_value

(gpio_num,0)

輸出高: gpio_set_value

(gpio_num,1)

;gpio_free 釋放gpio

2.關於gpio中斷操作

<

1>

gpio_request

(gpio_num,

null

); 註冊 gpio

<

2>

gpio_direction_input

(gpio_num) 對於要作為中斷源的 gpio 引腳, 方向必須配置為輸入

而且這個地方要注意配置為上拉輸入,還是下拉輸入。

<

3>irq_num =

gpio_to_irq

(gpio_num)

; 對映操作的 gpio 編號對應的中斷號, 中斷號為 gpio_to_irq

(gpio_num)的返回值。

<

4>

request_irq

(irq_num, gpio_dev_test_isr, irqflags,

"gpio_dev_test"

,&gpio_irq_type)

)irqflags 為需要註冊的中斷型別, 常用型別有

irqf_shared : 共享中斷;

irqf_trigger_rising : 上公升沿觸發;

irqf_trigger_falling : 下降沿觸發;

irqf_trigger_high : 高電平觸發;

irqf_trigger_low : 低電平觸發。

為什麼會有共享中斷呢?

irqf_shared, 因為有時候會有幾個裝置共用乙個soc的gpio去通知soc,那麼這時候怎麼辦?

這時候就要用到共享中斷。

那麼發生中斷的時候,怎麼去判斷到底是哪個裝置有中斷通知呢?

在中斷申請的過程中有乙個引數:gpio_irq_type,是乙個 void

*型別。不同的裝置在申請的時候在這裡傳

不同的引數,再在gpio_dev_test_isr中去判斷是哪個引數就可以了。

例如裝置1:

int attr =0;

request_irq

(irq_num, gpio_dev_test_isr, irqflags,

"gpio_dev_test"

,&attr)

)裝置2:

int attr =1;

request_irq

(irq_num, gpio_dev_test_isr, irqflags,

"gpio_dev_test"

,&attr)

)在中斷處理函式:

static irqreturn_t gpio_dev_test_isr

(int irqno,

void

* attr)

elseif(

1==*(

(int

*)attr))}

<

4>結束時釋放註冊的中斷和 gpio 編號

free_irq

(gpio_to_irq

(gpio_num)

,&gpio_irq_type)

gpio_free

(gpio_num)

;3.中斷是分上半部和下半部的

<

1>在中斷的上半部,處理緊急的事情

<

2>在中斷的下半部,可以處理可以延後的事情

在中斷的下半部,有三種處理機制:

軟中斷、tasklet、工作佇列,還有核心執行緒

<

3>一般在中斷的上半部機會disable中斷, 下半部處理完了才會

去enable中斷,這樣的話,如果中斷來的太密集,就會丟掉。

<

4>tasklet 使用: 如果推後執行的任務不需要睡眠,那麼就選擇tasklet

void

func

(void

)//定義tasklet並繫結tasklet排程函式

declare_tasklet

(mytasklet, func,0)

;//中斷的上半步

static irqreturn_t button_interrupt

(int irq,

void

*dummy)

<

5>workqueue使用:可以被排程,因此可以睡眠

void

func

(void

)//定義workqueue並繫結workqueue排程函式

declare_work

(mywork, func)

;//中斷的上半步

static irqreturn_t button_interrupt

(int irq,

void

*dummy)

海思晶元上GPIO操作

gpio的設定一般為三步 1 設定gpio埠復用 2 設定gpio口的方向 3 讀取或者寫入gpio值 第一步不是每個gpio口都是要配置的,如果你設定的gpio埠有復用功能,那麼你需要對gpio對應復用暫存器進行配置,例如 文件中gpio5 5是有復用功能的,0 pwm out0 1 gpio5 ...

海思晶元上GPIO和PWM操作

一 gpio的配置 gpio的設定一般為三步 1 設定gpio埠復用 2 設定gpio口的方向 3 讀取或者寫入gpio值 第一步不是每個gpio口都是要配置的,如果你設定的gpio埠有復用功能,那麼你需要對gpio對應復用暫存器進行配置,例如 文件中gpio5 5是有復用功能的,0 pwm out...

在海思平台操作GPIO(1)

設定gpio的輸入輸出其實就是寫gpio dir暫存器 首先需要找管腳對應gpio組的暫存器的基位址 在基位址的基礎上再加要操作暫存器的偏移位址 這是乙個組的管腳的暫存器的位址 在這個位址上有8位,每一位對應乙個管腳的輸入 0 輸出 1 有些時候直接設定gpio dir暫存器的值會改寫已經設定好了的...