UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

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
ステータス アクティブ
種類 一般
デバイス
  • Zynq-7000
ツール
  • EDK - 14.7
このページをブックマークに追加