Zynq Linux下 PL中斷PS記錄
掃描二維碼
隨時(shí)隨地手機(jī)看文章
最近ZYNQ的項(xiàng)目需要,調(diào)試了PL中斷PS的部分,下面將其中了解到信息記錄下來(lái),以防遺忘,如圖一,圖二所示,PL到PS的中斷分為16個(gè)共享中斷(SPI)和4個(gè)私有中斷(PPI)。本文用到了共享中斷,著重介紹SPI中斷。

PL 側(cè)16個(gè)SPI中斷硬件中斷號(hào)為6168,8491.支持高電平觸發(fā)和上升沿觸發(fā)兩種觸發(fā)方式。
PL中斷PS觸發(fā)方式可以在PS端編程控制對(duì)應(yīng)寄存器設(shè)置為高電平觸發(fā)和上升邊緣觸發(fā)。在這個(gè)我們認(rèn)為中斷源的滿足中斷和不滿足中斷分別用1和0表示。高電平就是中斷的條件滿足了,表現(xiàn)為邏輯1。上升邊緣觸發(fā)表示之前從中斷沒有發(fā)生到中斷發(fā)生的這個(gè)跳變,也就是從邏輯0到邏輯1的跳變。在Z7系統(tǒng)中允許設(shè)置PL的中斷觸發(fā)方式。
當(dāng)設(shè)置電平觸發(fā)時(shí)候,只要中斷條件一直滿足,也就是中斷請(qǐng)求線上電平是高,則觸發(fā)處理器產(chǎn)生中斷。當(dāng)設(shè)置上升邊緣觸發(fā)時(shí)候,當(dāng)且僅當(dāng)中斷條件從不滿足到滿足的跳變上,也就是中斷請(qǐng)求線表現(xiàn)成了一個(gè)上升邊緣,并且保持高電平至少2個(gè)CPU_2X3X周期(也就是說(shuō)4個(gè)以上處理器的時(shí)鐘周期)。就會(huì)產(chǎn)生觸發(fā)處理器產(chǎn)生中斷。邊緣觸發(fā)方式下高電平最少保持處理器時(shí)鐘周期的兩倍,一般建議時(shí)間長(zhǎng)一些,20NS。
這兩種中斷觸發(fā)方式強(qiáng)調(diào)的側(cè)重點(diǎn)不一樣,電平觸發(fā)強(qiáng)調(diào)的是特定中斷事件之要沒有撤銷就要反復(fù)進(jìn)行處理。比方說(shuō)在具體應(yīng)用中一個(gè)來(lái)自外界的報(bào)警信號(hào),只要報(bào)警信號(hào)存在說(shuō)明危險(xiǎn)沒有被消除,需要繼續(xù)中斷處理器,繼續(xù)處理。上升緣觸發(fā)方式強(qiáng)調(diào)特定中斷事件發(fā)生了,對(duì)于這個(gè)此次特定發(fā)生的中斷事件,處理器只要做一次處理就可以。如果外設(shè)還要再次請(qǐng)求中斷處理器,則需要將中斷再次產(chǎn)生一個(gè)上升邊緣進(jìn)行進(jìn)行請(qǐng)求。
在Linux下調(diào)試PL到PS側(cè)的中斷,在整個(gè)系統(tǒng)中,對(duì)于一個(gè)PL中斷源,存在三個(gè)中斷號(hào),拿PL側(cè)的第一個(gè)SPI中斷為例,ZYNQ的硬件中斷號(hào)為61,在設(shè)備樹里面,此中斷的中斷號(hào)記錄為61-32=29,在linux系統(tǒng)內(nèi)的邏輯中斷號(hào)則又不同,在linux下調(diào)用int request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)時(shí),第一個(gè)輸入?yún)?shù)irq為何值,經(jīng)過(guò)測(cè)試,此irq應(yīng)為L(zhǎng)inux分配的邏輯中斷號(hào)。那么問(wèn)題來(lái)了,在linux下,如何獲得61硬件中斷號(hào)對(duì)應(yīng)的邏輯中斷號(hào)呢,此時(shí)就要用到設(shè)備樹和驅(qū)動(dòng)的配合來(lái)獲得。
設(shè)備樹里面對(duì)中斷的主要描述如下:
irq: irq@0{
compatible = “hello,irq”;
interrupt-parent = <&intc>;
interrupts =;
};
compatible = “hello,irq”;這條語(yǔ)句在驅(qū)動(dòng)里面與platform架構(gòu)的驅(qū)動(dòng)匹配時(shí)需要用到
interrupt-parent = <&intc>;指明父節(jié)點(diǎn)
interrupts =;
-
參數(shù)0代表是SPI中斷還是PPI中斷,0代表SPI中斷,1代表PPI中斷。
-
參數(shù)29代表中斷號(hào),經(jīng)過(guò)觀察發(fā)現(xiàn),這個(gè)地方所填的數(shù)值與硬件中斷號(hào)的關(guān)系為:當(dāng)中斷為SPI中斷時(shí),為硬件中斷號(hào)-32;當(dāng)為PPI中斷時(shí),為硬件中斷號(hào)-16。
-
參數(shù)2代表觸發(fā)方式,2代表高電平觸發(fā),1代表上升沿觸發(fā)。Linux讀取設(shè)備樹的信息,然后為此中斷分配一個(gè)邏輯中斷號(hào),以前注冊(cè)中斷號(hào)是通過(guò)手工在 C 代碼中填入中斷號(hào),現(xiàn)在這種方法不可行了,請(qǐng)使用虛擬中斷號(hào)的方法。
如圖三所示,經(jīng)過(guò)查看,應(yīng)該是寫反了,SPI中斷加32,非SPI中斷加16。
設(shè)備樹里描述好中斷的信息后,再涉及到修改自己的Linux驅(qū)動(dòng)了。Linux驅(qū)動(dòng)要改為platform架構(gòu)方式,具體的platform架構(gòu)方式,網(wǎng)上查資料有很多。
如圖所示,這里一定要與設(shè)備樹里面中端部分的.compatible屬性對(duì)應(yīng)起來(lái),驅(qū)動(dòng)就是通過(guò)設(shè)備樹的這個(gè)屬性來(lái)進(jìn)行匹配并獲得Linux分配的邏輯中斷號(hào)的,通過(guò)irq=platform_get_irq函數(shù)獲得邏輯中斷號(hào)后,就可以將邏輯中斷號(hào)代入rquest_irq函數(shù)申請(qǐng)中斷了。





