2013-04-08 95 views
3

我正在爲Linux內核中的虛擬設備編寫設備驅動程序。因爲它是虛擬的,請問是否有任何命令或技巧手動引發中斷來測試我的中斷處理程序?如何手動導致中斷?

目前我的中斷處理程序是如此簡單:

static irqreturn_t interrupt_handler(int irq, void *dev_id){ 
    printk(KERN_ALERT "Interrupt handler executed!\n"); 
    return IRQ_HANDLED; 
} 

而且它是通過探測函數調用:

static int probe (struct platform_device *pdev) { 
    printk("-----------------------------------------PROBE CALLED \n"); 
    ret = misc_register(&mydevice); 
    printk("-----------------------------------------GOT MINOR:%i\n",mydevice.minor); 
    struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
    if(r == NULL) { 
     printk("platform_get_resource failed\n"); 
     return -ENODEV; 
    } 
    irq = platform_get_irq(pdev,0); 
    if (irq < 0) { 
     printk("platform_get_irq failed\n"); 
     return -ENODEV; 
    } 
    printk("Got irq =%d\n",irq); 
    ret = request_irq(irq, interrupt_handler, IRQF_DISABLED, pdev->name, NULL); 
    printk("Got irq, function returns %d\n.", ret); 
    return ret; 
} 

虛擬設備在板定義爲:

static struct resource mydevice_resources[] ={ 
    [0]    = { 
     .start  = 20, 
     .end  = 20, 
     .flags  = IORESOURCE_IRQ 
    }, 
    [2]    = { 
     .start  = 0xC0100000, 
     .end  = 0xC0200000, 
     .flags  = IORESOURCE_MEM 
    } 
}; 

static struct platform_device mydevice = { 
    .name   = "mydevice", 
    .id    = 0, 
    .num_resources   = ARRAY_SIZE(mydevice_resources), 
    .resource  = mydevice_resources 
}; 

而且,不知何故,mydevice的預定義中斷爲20,但探測器f unction總是說它收到中斷17.

我很欣賞任何提示。謝謝。

+1

中斷號碼的差異可能是由於您的設備驅動程序收到'已翻譯的'IRQ號碼。 Linux提供了一種方法,可爲每個中斷源分配具有多箇中斷控制器的系統的自己的虛擬IRQ編號(例如,對於GPIO,即使GPIO硬件只能有一個IRQ編號,也可爲每個獨立端口分配一個虛擬IRQ編號)。 – tangrs 2013-04-09 03:12:20

+1

如果它是虛擬的,爲什麼你需要一箇中斷處理程序?計時器不夠好嗎? – ugoren 2013-04-09 05:57:49

+0

@tangrs:謝謝,現在問題已解決。我仍然不知道如何發出中斷。 – 2013-04-09 06:11:52

回答

0

這是關閉我的問題。 沒有辦法手動發出中斷。 如果使用android的虛擬機,可以使用控制檯命令虛擬調用一組有限的中斷和信號。該控制檯可以通過telnet localhost 5554打開到虛擬機。