linux 内核协助的探测
Linux 內(nèi)核提供了一個低級設(shè)施來探測中斷號. 它只為非共享中斷, 但是大部分能夠在共 享中斷狀態(tài)工作的硬件提供了更好的方法來盡量發(fā)現(xiàn)配置的中斷號.這個設(shè)施包括 2 個函 數(shù), 在<linux/interrupt.h> 中聲明( 也描述了探測機制 ).
?
unsigned long probe_irq_on(void);
?
這個函數(shù)返回一個未安排的中斷的位掩碼. 驅(qū)動必須保留返回的位掩碼, 并且在后 面?zhèn)鬟f給 probe_irq_off. 在這個調(diào)用之后, 驅(qū)動應(yīng)當(dāng)安排它的設(shè)備產(chǎn)生至少一次 中斷.
?
int probe_irq_off(unsigned long);
?
在設(shè)備已請求一個中斷后, 驅(qū)動調(diào)用這個函數(shù), 作為參數(shù)傳遞之前由 probe_irq_on 返回的位掩碼. probe_irq_off 返回在"probe_on"之后發(fā)出的中斷 號. 如果沒有中斷發(fā)生, 返回 0 (因此, IRQ 0 不能探測, 但是沒有用戶設(shè)備能夠 在任何支持的體系上使用它). 如果多于一個中斷發(fā)生( 模糊的探測 ), probe_irq_off 返回一個負值.
?
程序員應(yīng)當(dāng)小心使能設(shè)備上的中斷, 在調(diào)用 probe_irq_on 之后以及在調(diào)用 probe_irq_off 后禁止它們. 另外, 你必須記住服務(wù)你的設(shè)備中掛起的中斷, 在 probe_irq_off 之后.
?
short 模塊演示了如何使用這樣的探測. 如果你加載模塊使用 probe=1, 下列代碼被執(zhí)行 來探測你的中斷線, 如果并口連接器的管腳 9 和 10 連接在一起:
?
int count = 0; do
{
unsigned long mask; mask = probe_irq_on();
outb_p(0x10,short_base+2); /* enable reporting */ outb_p(0x00,short_base); /* clear the bit */ outb_p(0xFF,short_base); /* set the bit: interrupt! */
outb_p(0x00,short_base+2); /* disable reporting */ udelay(5); /* give it some time */
short_irq = probe_irq_off(mask);
?
if (short_irq == 0) { /* none of them? */
printk(KERN_INFO "short: no irq reported by probe\n"); short_irq = -1;
}
?
/*
*? if more than one line has been activated, the result is
*? negative. We should service the interrupt (no need for lpt port)
*? and loop over again. Loop at most five times, then give up
*/
} while (short_irq < 0 && count++ < 5); if (short_irq < 0)
printk("short: probe failed %i times, giving up\n", count);
?
注意 udelay 的使用, 在調(diào)用 probe_irq_off 之前. 依賴你的處理器的速度, 你可能不 得不等待一小段時間來給中斷時間來真正被遞交.
?
探測可能是一個長時間的任務(wù). 雖然對于 short 這不是真的, 例如, 探測一個幀抓取器, 需要一個至少 20 ms 的延時( 對處理器是一個時代 ), 并且其他的設(shè)備可能要更長. 因 此, 最好只探測中斷線一次, 在模塊初始化時, 獨立于你是否在設(shè)備打開時安裝處理(如 同你應(yīng)當(dāng)做的), 或者在初始化函數(shù)當(dāng)中(這個不推薦).
?
有趣的是注意在一些平臺上(PoweerPC, M68K, 大部分 MIPS 實現(xiàn), 以及 2 個 SPARC 版 本)探測是不必要的, 并且, 因此, 之前的函數(shù)只是空的占位者, 有時稱為"無用的 ISA 廢話". 在其他平臺上, 探測只為 ISA 設(shè)備實現(xiàn). 無論如何, 大部分體系定義了函數(shù)( 即 便它們是空的 )來簡化移植現(xiàn)存的設(shè)備驅(qū)動.
轉(zhuǎn)載于:https://www.cnblogs.com/fanweisheng/p/11142275.html
總結(jié)
以上是生活随笔為你收集整理的linux 内核协助的探测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [笔记]VI编辑器的学习
- 下一篇: Linux下判断cpu物理个数,几核,是