国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 2904|回復(fù): 0
打印 上一主題 下一主題

RK3568外部IO中斷示例

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-11-3 14:22:21 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)鍵詞: IO

           
  • 外部IO中斷介紹
本篇文章以萬(wàn)象奧科HD-RK3568-IOT評(píng)估板中GPIO30為例,介紹Linux內(nèi)核中斷的注冊(cè)方法,使用中斷的方式檢測(cè)GPIO30是否出現(xiàn)上升沿信號(hào)。中斷在linux、設(shè)備驅(qū)動(dòng)開發(fā)里使用的都非常多,可以更加實(shí)時(shí)的檢測(cè)GPIO30的狀態(tài)。
Linux內(nèi)核提供了中斷的注冊(cè)接口:

           
  • 注冊(cè)中斷
頭文件                        include\linux\interrupt.h
定義文件                    include\linux\interrupt.h
函數(shù)原型                    int request_irq(unsigned int irq,  /* 做實(shí)參傳遞給中斷服務(wù)函數(shù)第1個(gè)參數(shù) */
                                            Irq_handler_t handler,  /* 中斷服務(wù)函數(shù)指針 */
                                            unsigned long flags,
                                            const char *name,
void *dev_id);            /* 做實(shí)參傳遞給中斷服務(wù)函數(shù)第2個(gè)參數(shù) */  
函數(shù)功能:             向內(nèi)核注冊(cè)一個(gè)中斷服務(wù)函數(shù);
當(dāng)發(fā)生中斷號(hào)為irq的中斷時(shí),會(huì)執(zhí)行handler指針函數(shù)。

函數(shù)參數(shù):            
irq:    中斷編號(hào)(每個(gè)中斷有唯一的編號(hào))。
handler:     中斷服務(wù)函數(shù)指針。
                  原型 typedef irqreturn_t(*irq_handler_t)(int, void *)。
flag:           中斷的標(biāo)志,用來描述本中斷的基本特征的。
                  有固定的值,由中斷源的特征決定;
                  比如外中斷有:   上升沿,下降沿觸發(fā)中斷這類標(biāo)志。
name:        中斷名字,注冊(cè)后會(huì)出現(xiàn)cat /proc/interrupts
dev_id:      這個(gè)參數(shù)是傳遞給中斷服務(wù)函數(shù)。
                  對(duì)共享中斷來說,這個(gè)參數(shù)一定有要;
                  當(dāng)注銷共享中斷中的其中一個(gè)時(shí),用這個(gè)標(biāo)識(shí)要注銷哪一個(gè)。
                  對(duì)于有唯一入口的中斷,可以傳遞NULL;
                           但是一般來說都會(huì)傳遞一個(gè)有意義指針,在中斷程序中使用,以方便編程。
         返回值      0       標(biāo)識(shí)成功
         -EINVAL            (無效參數(shù)22) 表示中斷號(hào)無效。
         -EBUSY             (設(shè)備或者資源忙16) 表示中斷已經(jīng)被占用。
2)    注銷中斷
void  free_irq(unsigned int irq, void *dev_id)
irq:    要注銷的中斷號(hào)
dev_id:      其實(shí)就是注冊(cè)時(shí)需要使用的dev參數(shù),在共享中斷必不可少,不能傳遞NULL。
注意:為防止在注銷時(shí)同時(shí)發(fā)生中斷,調(diào)用時(shí)候,先禁掉中斷。
3中斷開啟與關(guān)閉
       禁止中斷:
void disable_irq_nosync(unsigned int irq);
void disable_irq(unsigned int irq);
參數(shù): irq,要禁止的中斷對(duì)應(yīng)的編號(hào)。
注意:在中斷服務(wù)程序中不能使用disable_irq這個(gè)函數(shù),否則內(nèi)核崩潰,可以使用disable_irq_nosync,
disable_irq: 函數(shù)調(diào)用后,函數(shù)不會(huì)馬上返回,而等待中斷程序執(zhí)行完成才返回,在中斷調(diào)用會(huì)導(dǎo)致死鎖。
使能中斷:
         void enable_irq(unsigned int irq);
       參數(shù): irq, 要使能的中斷對(duì)應(yīng)的編號(hào)。
4)    獲取irq中斷號(hào)
         Int gpio_to_irq(unsigned int irq);
       參數(shù): irq,要使能的中斷對(duì)應(yīng)的編號(hào)

           
  • 外部IO中斷驅(qū)動(dòng)編寫

                     
    • IO原理圖
圖 2.1 GPIO0_D6
         GPIO0_D6=0*32+(4-1)-8+6=30

           


    •                
    • 驅(qū)動(dòng)示例代碼
             
           
#include
#include
#include
#include
#include

#define GPIO_PIN 30  // 替換為你的GPIO引腳

static unsigned int irq_number;

// GPIO中斷處理函數(shù)
static irqreturn_t gpio_irq_handler(int irq, void *dev_id) {
    printk("GPIO中斷觸發(fā)!\n");
    return IRQ_HANDLED;
}
static int __init mymodule_init(void) {
    int ret;
    // 請(qǐng)求GPIO
    ret = gpio_request(GPIO_PIN, "my_gpio");
    if (ret) {
        printk("無法請(qǐng)求GPIO %d\n", GPIO_PIN);
        return ret;
    }

    // 配置GPIO引腳為輸入
    ret = gpio_direction_input(GPIO_PIN);
    if (ret) {
        printk("無法配置GPIO %d 為輸入\n", GPIO_PIN);
        gpio_free(GPIO_PIN);
        return ret;
    }

    // 請(qǐng)求GPIO中斷
    irq_number = gpio_to_irq(GPIO_PIN);           
ret = request_irq(irq_number, gpio_irq_handler, IRQF_TRIGGER_RISING, "my_gpio_irq", NULL);
/* IRQF_TRIGGER_RISING  上升沿有效  */
    if (ret) {      
        printk("無法請(qǐng)求GPIO中斷 %d\n", irq_number);
        gpio_free(GPIO_PIN);
        return ret;
    }
    printk("模塊加載成功\n");
    return 0;
}
static void __exit mymodule_exit(void) {
    // 釋放GPIO中斷
    free_irq(irq_number, NULL);
         
    // 釋放GPIO
    gpio_free(GPIO_PIN);

    printk("模塊卸載成功\n");
}

module_init(mymodule_init);
module_exit(mymodule_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zou");
MODULE_DESCRIPTION("Sample GPIO and Timer Interrupt Kernel Module");

           
  • 外部IO中斷驗(yàn)證
將驅(qū)動(dòng)編譯成模塊,insmod加載模塊后。 由于驅(qū)動(dòng)檢測(cè)GPIO0_D6上升沿有效,當(dāng)給該引腳提供高電平時(shí),會(huì)觸發(fā)中斷執(zhí)行中斷處理函數(shù)。
圖3.1 觸發(fā)IO中斷

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲综合网在线观看| 日本三级韩国三级美三级91| 人人爽人人爱| 日韩毛片| 人人看人人干| 日本黄大片免播放视播放器| 亚洲国产精品国产自在在线| 视频一区国产精戏刘婷| 亚洲午夜视频| 台湾美女古装一级毛片| 三级网站在线播放| 人妖另类xx00视频| 亚洲国产35p| 漂亮大学生一级毛片| 午夜精品久久久久久| 日韩欧美亚洲国产精品字幕久久久| 亚洲aⅴ在线| 欧美精品一二三区| 日本高清com| 四虎成人影院网址| 亚洲成年| 午夜不卡福利| 奇米影视亚洲狠狠色777不卡| 欧美破处在线| 亚洲精品成人网久久久久久| 色综合久久五月| 四虎影视国产永久免费| 亚洲欧美日韩天堂| 视频一区中文字幕| 亚洲高清色图| 三级黄色免费片| 全黄大全大色全免费大片| 青草视频免费观看| 欧美日韩欧美| 日本亚洲成高清一区二区三区| 亚洲精品综合久久| 日韩一级免费毛片| 亚a在线| 稀缺资源呦视频在线网站| 亚洲欧美无人区乱码| 全免费午夜一级毛片真人|