2012-04-09 20 views
1

我正在開發IRQ編號爲8的驅動程序,該編號對應於RTC時鐘。我有以下問題。當我用request_irq請求IRQ時,我得到一個EBUSY錯誤。我認爲首先使用free_irq(8,NULL)應該可以解決問題(至少它可以與內核版本2.6.24-23-generic一起使用)。但是,當我使用它時,出現錯誤「試圖釋放已免費的IRQ 8」。檢查的/ proc /中斷我看到以下內容:request_irq返回EBUSY並且free_irq表示IRQ是免費的

8: 1 0 IO-APIC-edge rtc0

這是錯誤我在dmesg的獲得:

[14876.256173] ------------[ cut here ]------------ 
[14876.256182] WARNING: at kernel/irq/manage.c:1195 __free_irq+0x91/0x190() 
[14876.256185] Hardware name: Aspire 7720  
[14876.256187] Trying to free already-free IRQ 8 
[14876.256189] Modules linked in: cmos_driver_alarm(O+) cmos_driver_ioctl(O) nls_cp437 vfat fat usb_storage uas listapci_driver(O) cmos_driver_read(O) aes_i586 cryptd aes_generic fuse mxl5005s zl10353 dvb_usb_ce6230 dvb_usb dvb_core arc4 joydev nouveau iwl3945 iwlegacy mac80211 ir_lirc_codec lirc_dev drm_kms_helper snd_hda_codec_realtek ir_mce_kbd_decoder ttm ir_sanyo_decoder firewire_ohci sdhci_pci sdhci cfg80211 drm ir_sony_decoder ir_jvc_decoder snd_hda_intel snd_hda_codec snd_pcm mmc_core tg3 intel_agp intel_gtt agpgart r852 sm_common nand nand_ecc ir_rc6_decoder iTCO_wdt firewire_core snd_page_alloc i2c_i801 r592 snd_hwdep serio_raw nand_ids ir_rc5_decoder libphy iTCO_vendor_support crc_itu_t i2c_core mtd memstick psmouse rc_rc6_mce ir_nec_decoder thermal battery pcspkr processor video button ac acer_wmi mxm_wmi evdev sparse_keymap rfkill ene_ir wmi rc_core vboxnetflt(O) vboxdrv(O) vhba(O) snd_seq snd_timer snd_seq_device snd soundcore ext4 crc16 jbd2 mbcache sr_mod cdrom sd_mod pata_acpi hid_logitech_dj usbhid hid ata_generic ata_piix libata scsi_mod uhci_hcd ehci_hcd usbcore usb_common [last unloaded: cmos_driver_alarm] 
[14876.256283] Pid: 10363, comm: insmod Tainted: G  W O 3.3.1-1-ARCH #1 
[14876.256286] Call Trace: 
[14876.256292] [<c01351f2>] warn_slowpath_common+0x72/0xa0 
[14876.256296] [<c01a89e1>] ? __free_irq+0x91/0x190 
[14876.256299] [<c01a89e1>] ? __free_irq+0x91/0x190 
[14876.256303] [<c01352c3>] warn_slowpath_fmt+0x33/0x40 
[14876.256306] [<c01a89e1>] __free_irq+0x91/0x190 
[14876.256310] [<c01a8b23>] free_irq+0x43/0xa0 
[14876.256314] [<f803501e>] init_driver+0x1e/0xc8 [cmos_driver_alarm] 
[14876.256318] [<c0101124>] do_one_initcall+0x34/0x170 
[14876.256325] [<f8035000>] ? 0xf8034fff 
[14876.256330] [<c018f295>] sys_init_module+0x8c5/0x1a70 
[14876.256342] [<c04ae85f>] sysenter_do_call+0x12/0x28 
[14876.256345] ---[ end trace 81112f980bdc845e ]--- 

什麼我做錯了任何想法?預先感謝您

回答

2

事情是你通過NULL作爲參數free_irq。該功能會在允許您釋放它之前檢查它是否與request_irq相匹配。

試想一下,在功能​​:

/* desc is obtained via irq_to_desc */ 
action_ptr = &desc->action; 
for (;;) { 
     action = *action_ptr; 

     if (!action) { 
       WARN(1, "Trying to free already-free IRQ %d\n", irq); 
       raw_spin_unlock_irqrestore(&desc->lock, flags); 

       return NULL; 
     } 

     /* If dev_id doesn't match it just goes on. */ 
     if (action->dev_id == dev_id) 
       break; 

     action_ptr = &action->next; 
} 
+0

我該怎麼做才能完全釋放特定的IRQ?我怎樣才能得到dev_id? – 2012-04-09 13:13:08

+0

@ JavierJ.SalmeronGarcia最好的方法是獲得rtc來釋放它。 – cnicutar 2012-04-09 13:16:04

+0

我該怎麼做?有沒有RTC的API? – 2012-04-09 13:31:27

0

有機會,筆者一直不夠好,請求IRQ線與標誌IRQF_SHARED集。在這種情況下,調用request_irqIRQF_SHARED應允許您的模塊與RTC模塊共享IRQ線。