📄 usb_lib.c
字号:
} if(!nHwLength) { HEP0TXCTR = 0; M_NOP; } //. skip_hub_nodata_set M_BC1(USB_STATUS); M_BC0(USB_STATUS); //_asm // MOV A,#_HbmRequestType //_endasm; StageOne(); if(M_ISBS0(USB_STATUS)) {//. h_stall M_BS1(HEP0RXCSR); M_NOP; M_BS1(HEP0TXCSR); M_NOP; } else {//. next_h_inout goto Next_H_Inout; } } else {//. h_out_package HEP0RXTR = 254; //#0b11111110 M_NOP; } Next_H_Inout: M_BC1(HEP0RXCSR); M_NOP; M_BC1(HEP0TXCSR); M_NOP; M_BC0(HEP0RXCSR); M_NOP; M_BC0(HEP0TXCSR); M_NOP; Back_To_Mloop: #if(_USB_AUTO_STORE_IAP0) { IAP0=STACK_IAP0; M_NOP; } #endif #if(_USB_DIS_ANO_INT) M_ENI; #endif return;}#endif//////////////////////////////////////////////////////////#if _USB_HUB//. HIN0_ISRvoid Int_Hint0Ine() interrupt INT_HINT0INE using USBBANK{ #if(_USB_AUTO_SET_BANK ||_USB_AUTO_STORE_IAP0) UsbIntPre(); #endif HINTR = 251;// #0b11111011 M_NOP; Back_To_Mloop: #if(_USB_AUTO_STORE_IAP0) { IAP0=STACK_IAP0; M_NOP; } #endif #if(_USB_DIS_ANO_INT) M_ENI; #endif return; }#endif#if _USB_HUB//. HTX0_ISRvoid Int_Hint0Txe() interrupt INT_HINT0TXE using USBBANK{ #if(_USB_AUTO_SET_BANK ||_USB_AUTO_STORE_IAP0) UsbIntPre(); #endif if(M_ISBS1(HINTR)) {//. HTX0_ISR1 HINTR = 253; M_NOP; HAR = ADDRESS_BUFh; M_NOP; //. skip_hub_address_set if(!HTBLL) {//. exit_htx0 HEP0TXCTR = 0; M_NOP; } else if(HwLengthL) {//. skip_hub_address_set1 nTable = nRomAdr; M_NOP; HubTransmitTable(); } else if(!HwLengthH) {//. exit_htx0 HEP0TXCTR = 0; M_NOP; } } else {//. HTX1_ISR M_BC1(HEP1TXCSR); M_NOP; if(M_ISBS3(HUB_STATUS)) { M_BC0(HEP1TXCSR); } else {//. not_cleared_yet M_BS0(HEP1TXCSR); } M_NOP; HINTR = 247;//#0b11110111 M_NOP; goto Back_To_Mloop; } Next_H_Inout: M_BC1(HEP0RXCSR); M_NOP; M_BC1(HEP0TXCSR); M_NOP; M_BC0(HEP0RXCSR); M_NOP; M_BC0(HEP0TXCSR); M_NOP; Back_To_Mloop: #if(_USB_AUTO_STORE_IAP0) { IAP0=STACK_IAP0; M_NOP; } #endif #if(_USB_DIS_ANO_INT) M_ENI; #endif return;}#endif#if _USB_HUB//. HPSTSC_ISRvoid Int_HpstscInte() interrupt INT_HPSTSCINTE using USBBANK{ #if(_USB_AUTO_SET_BANK ||_USB_AUTO_STORE_IAP0) UsbIntPre(); #endif M_BC3(HUB_STATUS); HINTR = 127; //#0b01111111 M_NOP; if(12 & HSR) //#0b00001100 M_BS0(STATUS_BUF); if(31 & HPSCR1)//#0b00011111 M_BS1(STATUS_BUF); if(31 & HPSCR2)//#0b00011111 M_BS2(STATUS_BUF); if(31 & HPSCR3)//#0b00011111 M_BS3(STATUS_BUF); if(31 & HPSCR4)//#0b00011111 M_BS4(STATUS_BUF); if(!(30 & STATUS_BUF) && M_ISBC0(STATUS_BUF))//#0b00011110 {//. response_nak// if(M_ISBC0(STATUS_BUF)) { M_BC1(HEP1TXCSR); M_NOP; M_BC0(HEP1TXCSR); M_NOP; goto Back_To_Mloop; } } _asm MOV _HEP1TXDAR,A _endasm; M_NOP; //. CHECK_PORT1_STATUS if(M_ISBS1(STATUS_BUF)) { _asm MOV A,#_HSR+1 MOV _IAP0,A NOP _endasm; if(M_ISBS4(IAC0)) goto NOT_ENABLE_HEP1; } if(M_ISBS1(STATUS_BUF)) { _asm MOV A,#_HSR+2 MOV _IAP0,A NOP _endasm; if(M_ISBS4(IAC0)) goto NOT_ENABLE_HEP1; } if(M_ISBS1(STATUS_BUF)) { _asm MOV A,#_HSR+3 MOV _IAP0,A NOP _endasm; if(M_ISBS4(IAC0)) goto NOT_ENABLE_HEP1; } if(M_ISBS1(STATUS_BUF)) { _asm MOV A,#_HSR+4 MOV _IAP0,A NOP _endasm; if(M_ISBS4(IAC0)) goto NOT_ENABLE_HEP1; } M_BC1(HEP1TXCSR); M_NOP; M_BC0(HEP1TXCSR); M_NOP; goto Back_To_Mloop; //. NOT_ENABLE_HEP1 NOT_ENABLE_HEP1: HEP1_CNT = 16; Back_To_Mloop: #if(_USB_AUTO_STORE_IAP0) { IAP0=STACK_IAP0; M_NOP; } #endif #if(_USB_DIS_ANO_INT) M_ENI; #endif return; }#endif//. SOF_ISRvoid Int_SofInte() interrupt INT_SOFINTE using USBBANK{#if(_USB_AUTO_SET_BANK ||_USB_AUTO_STORE_IAP0) UsbIntPre();#endif HINTR = 191;//#0b10111111 M_NOP; //. call macro _ADD_USB_SOF_INT_SUB AddUsbSof(); if(HEP1_CNT) { if(--HEP1_CNT) {//. ENABLE_HEP1 M_BC1(HEP1TXCSR); M_NOP; M_BS0(HEP1TXCSR); M_NOP; } } Back_To_Mloop: #if(_USB_AUTO_STORE_IAP0) { IAP0=STACK_IAP0; M_NOP; }#endif #if(_USB_DIS_ANO_INT) M_ENI;#endif return; }void HubTransmitTable() using USBBANK{ CTR_BUF = 0; do { _asm TBRDP _HEP0TXDAR INC _CTR_BUF _endasm; nHwLength--; HTBLL--; if(!HTBLL && M_ISBS3(CTR_BUF)) break; } while(nHwLength );//&& HTBLL); HEP0TXCTR = CTR_BUF; M_NOP; HROMADRH = HTBL; HROMADRL = LTBL; return;}void fTransmitTable() using USBBANK{ CTR_BUF = 0; do { _asm TBRDP _EP0TXDAR INC _CTR_BUF _endasm; nwLength--; TBLL--; if(!TBLL || (M_ISBS6(CTR_BUF)) ) break; } while(nwLength);//&& HTBLL); EP0TXCTR = CTR_BUF; M_NOP; ROMADRH = HTBL; ROMADRL = LTBL; return;}// SEARCH_CHANGE_PORTvoid SearchChangePort() using USBBANK{ _asm MOV A,#_HPSR4 ADD A,_HwIndexL MOV _IAP0,A _endasm; return;} void StageOne() using USBBANK{ _asm MOV A,#_bmRequestType MOV _IAP0,A NOP _endasm; TEMP_UREG = IAC0; if(_RequestType_0X00 && (TEMP_UREG==0)) {//. RequestType00 TEMP_UREG = IAC0; //Clear Feature if(_RT0X00_Request_0X01 && (TEMP_UREG == request_clear_feature)) { // ClearRemoteWakeup if(!(_RT0X00_R0X01_Value0001*_USB_HUB) || M_ISBC1(USB_STATUS)) { if(IAC0 == device_remote_wakeup) { M_BC2(HGSR); M_NOP; M_BC4(HGSR); M_NOP; M_BC3(STAINTE); M_NOP; return; } } } //Set Feature else if(_RT0X00_Request_0X03 && (TEMP_UREG == request_set_feature)) {//. SetRemoteWakeup if(!(_RT0X00_R0X03_Value0001*_USB_HUB) || M_ISBC1(USB_STATUS)) { if(IAC0 == device_remote_wakeup) { M_BS4(HGSR); M_NOP; M_BS3(STAINTE); M_NOP; return; } } } //Set Address else if(_RT0X00_Request_0X05 && (TEMP_UREG == request_set_address)) {//. SetAddress if((_USB_HUB) && M_ISBC1(USB_STATUS)) { ADDRESS_BUFh = IAC0; return; } ADDRESS_BUFf = IAC0; return; } //Set Descriptor else if(_RT0X00_Request_0X07&& (TEMP_UREG == request_set_descriptor)) {//. SetDescriptor } //Set Configuration else if(_RT0X00_Request_0X09&& (TEMP_UREG == request_set_configuration)) {//. SetConfiguration if((_USB_HUB) && M_ISBC1(USB_STATUS)) { // Clear any stall condition M_BC1(HEP0RXCSR); M_NOP; M_BC1(HEP0TXCSR); M_NOP; M_BC1(HEP1TXCSR); M_NOP; // Load configuration status if(HwValueL) { M_BS5(HGSR); M_NOP; M_BS5(GCNTR); M_NOP; } else M_BC5(HGSR); return; } else {//. FcConfiguration //Embeded fc initilize: interrupt _ENABLE, ep _ENABLE and config EP1CNTR = _USB_EP1_CON; M_NOP; EP2CNTR = _USB_EP2_CON; M_NOP; EP3CNTR = _USB_EP3_CON; M_NOP; //Clear any stall condition M_BC1(EP0RXCSR); M_NOP; M_BC1(EP0TXCSR); M_NOP; M_BC1(EP1CSR); M_NOP; M_BC1(EP2CSR); M_NOP; M_BC1(EP3CSR); M_NOP; //Load configuration status if(!wValueL) {//. fc_un_configured M_BC4(FC_STATUS); M_NOP; M_BC0(EP1CSR); M_NOP; M_BC0(EP2CSR); M_NOP; M_BC0(EP3CSR); M_NOP; } else { M_BS4(FC_STATUS); M_NOP; M_BC0(EP1CSR); M_NOP; M_BC0(EP2CSR); M_NOP; M_BC0(EP3CSR); M_NOP; // call macro _ADD_USB_DEVICE_CONFIG_OK AddUsbDeviceConfigOk(); } return; } } } //. call macro _ADD_USB_RT0X00_Request //AddUsbRt0x00Request(); else if(_RequestType_0X01 && (TEMP_UREG==1)) {//. RequestType01 if(_RT0X01_Request_0X0B && (IAC0 =request_set_interface)) {//. SetInterface if(!(_USB_HUB) || M_ISBS1(USB_STATUS)) A_INTERFACE = IAC0; return; } //. call macro _ADD_USB_RT0X01_Request AddUsbRt0x01Request(); //_ADD_USB_RT0X01_Request } else if(_RequestType_0X02 && (TEMP_UREG==2))// == 0x02) {//. RequestType02 //Clear Feature if(_RT0X02_Request_0X01) { TEMP_UREG = IAC0; if(TEMP_UREG = request_clear_feature) {//. ClearEndpointStall if(_RT0X02_R0X01_Value0000 && (IAC0 = endpoint_stalled)) { IAP0++; if(_USB_HUB && M_ISBC1(USB_STATUS)) { if(IAC0==0) {//. ClearHEndpointStall00 M_BS1(HEP0RXCSR); M_NOP; return; } else if(IAC0 == hub_endpoint80) {//. ClearHEndpointStall80 M_BS1(HEP0TXCSR);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -