2007年7月27日星期五

External Interrupt in S3C2440

S3C2440的EINT (Extend INT)中斷示意
s3c2440int

EINT也算是SUB INTERRUPT,但是完全沒有相似於SUBSRCPND的解說。只有register 說明,而且是安排在GPIO的部份... (好吧,該GPIO的mux function有Interrupt,所以算OK吧)

偉大的EINT的registerg的說明中,EINTMASK、EINTPEND這兩個register只有table,沒有多餘的說明。

本來以為EINTPEND是指「經過mask後的interrupt」,結果不是,是mask前。所以要處理 EINT時要這注意,要將 EINTPEND和EINTMASK「處理」後,才是真正產生中斷的中斷源。


跟trigger mode有關係,當是外部controller觸發,設定成edge trigger時,因為未回應外部controller時,trigger signal不會改變,不會再有一次edge波形發生,所以即使先ACK這個INT也沒關係。反而是未能要能正確,無漏失的catch next edge,ISR要儘快的ACK這個interrupt,免得edge 出現時,interrupt還未ACK而miss。

.. 真是麻煩呀...

這樣的連動是不是要用class包裝起來?當設定edge trigger,該isr先ACK。當設定level triiger,作post ACK?

回到上面的圖,SRCPND經過priority arbitration,Mask後,選出一個bit 到INTPND。實際產生中斷。

INTPND和SRCPND都是要「手動」清除的。
DataSheet (14. Interrupt Controller - Interrupt Pending Register) 是說..
Like the SRCPND register, this reister has to be cleaned in interrupt service routine after cleaning the SRCPND register.
所以,中斷發生後,一定要clear SRCPND和INTPND。而且順序是
  1. SRCPND
  2. INTPND
原因和上面說的一樣..如果先clear到INTPND,但是SRCPND還沒清,則同一個中斷馬上又從SRCPND浮上來,導致一樣的INTPND。

沒有留言: