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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ

發布時間:2024/4/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于OMAPL138的字符驅動_GPIO驅動AD9833(三)之中斷申請IRQ

0. 導語

學習進入到了下一個階段,還是以AD9833為例,這次學習是向設備申請中斷,實現觸發,在未來很多場景,比如做用戶級的SPI傳輸完畢數據之后,怎么知道從設備要發數據呢,則需要一個IO信號通知主設備來讀從設備的數據,那么就需要一個外部的IO中斷信號,所以呢,對于中斷的處理十分重要,本demo實現這樣的一個功能增加一個GPIO口,這個GPIO口接的是一個按鍵,通過觸發信號,進入中斷服務函數,在中斷服務函數內改變AD9833的波形。以此達到學習實驗目的。

之前的代碼都是一樣的,在這里盡量剝離AD9833驅動和Linux的代碼模板,只寫中斷相關相關程序。

效果演示視頻: https://v.youku.com/v_show/id_XMzY4MjAwOTA0MA==.html?spm=a2h3j.8428770.3416059.1

1. 前篇導讀:

  • 基于OMAPL138的字符驅動_GPIO驅動AD9833(一)之ioctl

  • 基于OMAPL138的Linux字符驅動_GPIO驅動AD9833(二)之cdev與read、write

  • Linux GPIO鍵盤驅動開發記錄_OMAPL138

  • 原理圖:

    2. 申請中斷準備

    • 首先需要兩個頭文件:
    • #include <linux/interrupt.h>
    • #include <linux/irq.h>

    • IO口配置準備
      在此次使用中斷中,主要用的是GPIO口,我們使用電平跳變使之進入到中斷處理程序中,所以作為IO口,需要配置IO口的方向為輸入方向。我的OMAPL138中給的IO口操作使用GPIO_TO_PIN這個宏函數進行,在IO口操作上每個平臺都會給定自己的尋IO口的方法,然后使用linux通用gpio_direction_output進行設定該GPIO口為輸入方向,如上面的原理圖,本demo的驅動使用的GPIO6[1],所以as follow:gpio_direction_output( GPIO_TO_PIN(6, 1) , 0 );

    • 硬件中斷號IRQ
      我參考了很多文獻,也找了很多書籍,對于硬件中斷號碼從哪里得到一筆帶過,也沒有具體說明,不過,經過一下午的努力,我找到了查找中斷號碼的方法。使用gpio_to_irq這個函數方法可以得到irq。我之前找到手冊,看到了手冊里面說GPIO6 BANK的IRQ為48號,我嘗試加載到內核里面,每次初始化的時候都告訴我中斷申請失敗,這個號看來不是datasheet給定的48號,在Linux內核里面對于硬件IRQ又進行了重新映射。

    • 中斷事件
      在內核中斷申請的時候,需要指定中斷事件是什么,邊沿信號,高電平觸發,低電平觸發,在irq.h里面定義了:

    IRQ_TYPE_NONE = 0x00000000,IRQ_TYPE_EDGE_RISING = 0x00000001,IRQ_TYPE_EDGE_FALLING = 0x00000002,IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),IRQ_TYPE_LEVEL_HIGH = 0x00000004,IRQ_TYPE_LEVEL_LOW = 0x00000008,IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),IRQ_TYPE_SENSE_MASK = 0x0000000f

    我們需要指定這個事件。

    • 中斷的名字
      這個使用#cat /proc/interrupts 查看當前內核中斷資源的時候就可以看到你指定注冊的名字。

    • 中斷服務程序
      這個我們自己定一個函數就可以,然后一會兒使用中斷申請的時候將數據傳輸進去就好。我們在中斷服務函數里面進行按鍵進行波形切換:
    static int key_count = 0; static irqreturn_t ad9833_press_intHandle( int irq, void *dev_id ) {printk( DRV_NAME "\t press trigger!\n" );if( key_count == 0 ) {ad9833->set_wave_type( ad9833, SIN );printk( DRV_NAME "\tSet wave is SIN.\n" );}else if( key_count == 2 ) {ad9833->set_wave_type( ad9833, TRI );printk( DRV_NAME "\tSet wave is TRI.\n" );}else if( key_count == 4 ) {ad9833->set_wave_type( ad9833, SQU );printk( DRV_NAME "\tSet wave is SQU.\n" );}key_count ++;if( key_count >= 5 )key_count = 0;return IRQ_RETVAL( IRQ_HANDLED ); }

    3. 申請中斷準備

    使用request_irq函數就好,我們在初始化函數里面,申請irq。在申請irq前,為了更好的管理中斷函數,我們定義了一個結構體,專門進行irq配置。

    struct gpio_irq_desc {int irq;unsigned long flags;char *name;} press_dev_desc = {0,IRQ_TYPE_EDGE_FALLING,"sw6_push_button"};

    第一個是irq,我們在向內核申請中斷的時候會使用gpio_to_irq進行irq的賦值,flags就是中斷事件的觸發條件,這里是下降邊沿觸發,最后一個name就是上面注冊號中斷分配的名字,初始化程序如下:

    /** interrupt apply* */press_dev_desc.irq = gpio_to_irq(ad9833_gpios[3]);ret = request_irq( press_dev_desc.irq , &ad9833_press_intHandle, press_dev_desc.flags, press_dev_desc.name, (void*)0 );if( ret ) {printk( DRV_NAME "\terror %d: IRQ = %d number failed!\n",ret,gpio_to_irq(ad9833_gpios[3]) );ret = -EBUSY;unregister_chrdev_region( devno,1 );for( i = 0; i < ARRAY_SIZE(ad9833_gpios); i++)gpio_free( ad9833_gpios[i] );kfree(ad9833);return ret;}printk( DRV_NAME "\tiqr apply ok!!\n" );

    到此我們就完成了中斷配置。

    4. 中斷釋放

    使用freqq_irq進行釋放。這個函數應該放在exit驅動的函數里面。
    free_irq( press_dev_desc.irq, (void*)0 );

    源代碼下載

    鏈接: https://pan.baidu.com/s/1JgPgGP1Ag_oixHmHOy3QEw 密碼: 5x84

    參考文獻

    [1] 創龍電子科技, OMAPL138的GPIO輸出輸入, 百度文庫, 2014年5月8日

    [2] wh_19910525, Linux的 標準GPIO及中斷API函數, CSDN博客, 2013年12月25日

    [3] wangcong02345, Linux內核---44.關于中斷號與中斷引腳, CSDN博客, 2016年7月9日

    [4] GreenHand#, Linux設備驅動中斷機制, CNBLOGS, 2016年12月27日

    轉載于:https://www.cnblogs.com/sigma0/p/9217675.html

    總結

    以上是生活随笔為你收集整理的基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。