基于OHCI的USB主机 —— 中断处理程序
|
/**
* OHCI中断处理程序
*/
void AT91F_UHP_Handler(void)
{
unsigned int status;
unsigned char idx;
unsigned char cc;
//unsigned
int control;
//得到HcInterruptStatus寄存器的内容
status = ohciGetIntrStatus();
//检查WDH位,判断是否有TD传输完毕
if ((status & OHCI_HC_INTR_WDH) != 0)
{
//根据当前执行的命令类型,确定TD的数量
switch(usbCmdState.cmdType)
{
case USB_CMD_TYPE_BULK_WRITE:
case USB_CMD_TYPE_BULK_READ:
idx = 3;
break;
case USB_CMD_TYPE_CTRL_READ:
idx = 2;
break;
case USB_CMD_TYPE_CTRL_WRITE:
idx = 1;
break;
default:
usbCmdState.state = USB_CMD_OVER;
ohciClearIntrStatus();
return ;
}
//取得当前完成的TD的Complete Code值
cc = getTdCC(ohciGetHccaDoneHead());
//判断当前完成的TD是否是命令的最后一个TD
if (ohciGetHccaDoneHead() ==
usbGetLastTdAddr(idx))
{
usbCmdState.cmdResult = cc;
usbCmdState.state = USB_CMD_OVER;
}
else
{
//当前TD不是最后一个TD,但是执行失败,不会继续处理TD列表,因此需要返回
if (cc)
{
usbCmdState.cmdResult = cc;
usbCmdState.state = USB_CMD_OVER;
}
else
//当前TD不是最后一个TD,等待继续处理
usbCmdState.state++;
}
}
//清除HcInterruptStatus寄存器的内容,以便能够产生新的中断
ohciClearIntrStatus();
}
|
本文出自 “rainman” 博客,请务必保留此出处http://lancelot.blog.51cto.com/393579/261181
1人 |
了这篇文章 |