日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于ARM A53开发板,使用按键中断及中断底半部实现《led灯状态取反》的驱动

發(fā)布時間:2024/4/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于ARM A53开发板,使用按键中断及中断底半部实现《led灯状态取反》的驱动 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
#include <linux/gpio.h>
#include<linux/interrupt.h>

?//GIPO口的初始化

#define GPIO(m,n) m*32+n
#define GPIOA28 GPIO(0,28)
#define GPIOB12 GPIO(1,12)
#define GPIOE13 GPIO(4,13)

#define GPIOB8 GPIO(1,8)
#define GPIOB16 GPIO(1,16)

int irqno[2] = {GPIOB8,GPIOB16};


int gpiono[] = {GPIOA28,GPIOB12,GPIOE13};

?//延時工作隊列定義結(jié)構(gòu)體

struct delayed_work dwork;

//中斷底板部處理函數(shù) 延時

void myfunc(struct work_struct *work){

printk("%s : %s : %d\n",__FILE__,__func__,__LINE__);
schedule_delayed_work(&dwork,msecs_to_jiffies(1000));
}

//中斷處理函數(shù)
irqreturn_t my_irq_handler(int irq, void *dev){

//紅燈GPIO口狀態(tài)獲取、取反、及設(shè)置回填

int red_statu = gpio_get_value(GPIOA28);
red_statu = red_statu ? 0:1;
gpio_set_value(GPIOA28,red_statu);

//調(diào)用執(zhí)行中斷底板部處理函數(shù)

schedule_delayed_work(&dwork,0);
return IRQ_HANDLED;

}

?

//入口初始化函數(shù)

static int __init work_timer_init(void){

int i,ret;

//釋放系統(tǒng)占用的gpio口

for(i=0; i<ARRAY_SIZE(gpiono); i++){
gpio_free(gpiono[i]);
}
//申請GPIO口(本實(shí)驗只用紅燈)
for(i = 0;i<ARRAY_SIZE(gpiono);i++){

ret = gpio_request(gpiono[i],NULL);
if(ret){
printk("gpio_request %d error",gpiono[i]);
return ret;
}

//輸出方向
gpio_direction_output(gpiono[i],0);
}

//中斷申請? 兩個按鍵
for(i=0;i<ARRAY_SIZE(irqno);i++){
ret = request_irq(gpio_to_irq(irqno[i]),my_irq_handler, IRQF_TRIGGER_FALLING,NULL, NULL);
if(ret){
printk("request_irq error");
return ret;
}
}
//延時工作隊列初始化對象
INIT_DELAYED_WORK(&dwork,myfunc);

return 0;

}

//出口注銷申請資源
static void __exit work_timer_exit(void){

int i;
for(i=0; i<ARRAY_SIZE(gpiono); i++){
gpio_free(gpiono[i]);
}
for(i=0;i<ARRAY_SIZE(irqno);i++)
{
free_irq(gpio_to_irq(irqno[i]), NULL);
}
cancel_delayed_work_sync(&dwork);

}

module_init(work_timer_init);
module_exit(work_timer_exit);
MODULE_LICENSE("GPL");

?

轉(zhuǎn)載于:https://www.cnblogs.com/huiji12321/p/11493976.html

總結(jié)

以上是生活随笔為你收集整理的基于ARM A53开发板,使用按键中断及中断底半部实现《led灯状态取反》的驱动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。