我正在尝试让E1000在收到数据包时产生中断,
// enable Receiver Timer Interrupt
reg_IMS = (uint32_t *) (base + E1000_IMS);
*reg_IMS = E1000_IMS_RXT0;
不幸的是,中断仅发生一次。我的猜测是中断没有清除。根据{{3}},
中断原因读取寄存器ICR(000C0H; R)
读取时清除所有寄存器位。结果,阅读此 寄存器隐式确认任何未决的中断事件。
和the manual的注释,读取ICR(中断原因读取寄存器)将清除中断,
/* Clear any pending interrupt events. */
icr = E1000_READ_REG(hw, ICR);
但这没用。这是相关的消息(E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER,interrupt
)
e1000: tx disabled
e1000: set_ics 2, ICR 0, IMR 0
e1000: set_ics 0, ICR 2, IMR 80
e1000: set_ics 80, ICR 2, IMR 80
e1000: RCTL: 127, mac_reg[RCTL] = 0x84008002
e1000: set_ics 80, ICR 82, IMR 80
e1000: ICR read: 82
ICR=82
e1000: ICR read: 0
ICR=0
e1000: set_ics 0, ICR 0, IMR 80
...
e1000: set_ics 80, ICR 0, IMR 80
e1000: set_ics 3, ICR 80, IMR 80
ns: 52:54:00:12:34:56 bound to static IP 10.0.2.15
NS: TCP/IP initialized.
opened socket
trying to bind
bound
第一次显示我的网络卡中断处理程序确实读取了ICR(该处理程序打印了ICR = 82并且ICR = 0的信息)。因为以后的“ set_ics 80,ICR 0”没有中断。
有人知道如何清除/确认中断吗?实际上,这是some code的一部分。
谢谢!