AR# 53563

14.7 EDK GIC - ドライバーが Zynq の 2 つ目の CPU(CPU1) への割り込みをサポートしない

説明

cpu1 が 2 つ以上のソフト割り込みをそれ自身に送信した場合、ドライバーでは最初の割り込みしか認識されません。 

2 つ目の割り込みは保留となります。


この動作の根本原因は、XScuGic_InterruptHandler() での ICCEOIR レジスタの書き込み動作にあります。

書き込みには ICCIAR の値全体が使用される必要があります。

元のドライバーは次のとおりです。


void XScuGic_InterruptHandler(XScuGic *InstancePtr)
{

 
    u32 IntID;
    XScuGic_VectorTableEntry *TablePtr;
    Xil_AssertVoid(InstancePtr != NULL);
    IntID = XScuGic_CPUReadReg(InstancePtr, XSCUGIC_INT_ACK_OFFSET) &
   XSCUGIC_ACK_INTID_MASK;
    if(XSCUGIC_MAX_NUM_INTR_INPUTS < IntID){
 goto IntrExit;
    }
        TablePtr = &(InstancePtr->Config->HandlerTable[IntID]);
        TablePtr->Handler(TablePtr->CallBackRef);
IntrExit:
    XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_EOI_OFFSET, IntID);
}

ソリューション




この問題を解決するには、XScuGic_InterruptHandler() を使用してファンクションを作成してください。
 void XScuGic_InterruptHandler1(XScuGic *InstancePtr)
{

 
    u32 IntID;
    u32 IntIDFull;
    XScuGic_VectorTableEntry *TablePtr;
    Xil_AssertVoid(InstancePtr != NULL);
    IntIDFull = XScuGic_CPUReadReg(InstancePtr, XSCUGIC_INT_ACK_OFFSET);
    IntID = IntIDFull & XSCUGIC_ACK_INTID_MASK;
    if(XSCUGIC_MAX_NUM_INTR_INPUTS < IntID){
     goto IntrExit;
    }
        TablePtr = &(InstancePtr->Config->HandlerTable[IntID]);
        TablePtr->Handler(TablePtr->CallBackRef);
IntrExit:
    XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_EOI_OFFSET, IntIDFull);
}
AR# 53563
日付 05/19/2014
ステータス アクティブ
種類 一般
デバイス
ツール