yang2007 发布于 2007-6-12 15:07:08
这是一段USB中断服务程序,找个明白人给分析一下 void ep0_isr(void) { u8_t usb_setup_pkg[8]; sl811hs_write(UsbIntStatusReg,EP0_DONE); ep0a_status = sl811hs_read(EP0A_StatusReg); ep0a_byte_rcv = sl811hs_read(EP0A_LenReg) - \ (这个符号的含义???) sl811hs_read(EP0A_TxCntReg); if(ep0a_status & EP_ACK) { if(Slave_UsbAddr){ sl811hs_write(UsbAddrReg,Slave_UsbAddr); Slave_UsbAddr=0; } if(ep0a_status & EP_SETUP) { u8_t req_type; sl811hs_buf_read(EP0A_SLAVE_BUF,&setuppkg[setup_cnt][0],ep0a_byte_rcv); sl811hs_buf_read(EP0A_SLAVE_BUF,&usb_setup_pkg[0],ep0a_byte_rcv); setup_pkg_usb2arm(&dReq,&usb_setup_pkg[0]); setup_cnt++; len_req = (u8_t)dReq.wLength; in_buffer_idx = 0; IN_NULL = FALSE; IN_EXACT = FALSE; req_type = (dReq.bmRequestType & 0x60)>>5; switch(req_type){ case STD_REQUEST: /* standard usb req */ std_request_response(); break; case CLASS_REQUEST: /* spce class req */ class_request_response(); break; case VENDOR_REQUEST: /* spec vendor req */ sl811hs_write(EP0A_CtrlReg,SEND_STALL); break; default: /* unsupported req */ sl811hs_write(EP0A_CtrlReg,SEND_STALL); break; }//switch(req_type){ }//if(ep0a_status & EP_SETUP){ else{ if(sl811hs_read(EP0A_CtrlReg) & DIRECTION){ in_cnt++; if(len_req) { u8_t data_seq; data_seq=(((sl811hs_read(EP0A_CtrlReg)&DATAX)==0)?1:0); len_tx=(len_req>=EP0_LEN)?EP0_LEN:len_req; if(FALSE==IN_NULL) EP0A_IN_Arm(EP0A_SLAVE_BUF+in_buffer_idx,len_tx,data_seq); else EP0A_IN_Arm(0,0,data_seq); in_buffer_idx+=len_tx; len_req-=len_tx; if(len_req==0 && len_tx==EP0_LEN && (FALSE == IN_EXACT)){ len_req=1; IN_NULL=TRUE; } } else EP0A_OUT_Arm(EP0_LEN); } else { out_cnt++; EP0A_OUT_Arm(EP0_LEN); } } }
else if(sl811hs_read(EP0A_CtrlReg) & 0x20) EP0A_OUT_Arm(EP0_LEN); }
|