中斷部分:
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暫存器的值會改寫已經設定好了的...