基于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里面定義了:
我們需要指定這個事件。
- 中斷的名字
這個使用#cat /proc/interrupts 查看當前內核中斷資源的時候就可以看到你指定注冊的名字。
- 中斷服務程序
這個我們自己定一個函數就可以,然后一會兒使用中斷申請的時候將數據傳輸進去就好。我們在中斷服務函數里面進行按鍵進行波形切換:
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DataTable的Ajax使用
- 下一篇: codeforce R 491 (div