📄 f34x_msd_usb_isr.src
字号:
SJMP ?C0042
; case SET_CONFIGURATION:
; SOURCE LINE # 217
?C0051:
; Set_Configuration();
; SOURCE LINE # 218
LCALL Set_Configuration
; break;
; SOURCE LINE # 219
SJMP ?C0042
; case GET_INTERFACE:
; SOURCE LINE # 220
?C0052:
; Get_Interface();
; SOURCE LINE # 221
LCALL Get_Interface
; break;
; SOURCE LINE # 222
SJMP ?C0042
; case SET_INTERFACE:
; SOURCE LINE # 223
?C0053:
; Set_Interface();
; SOURCE LINE # 224
LCALL Set_Interface
; break;
; SOURCE LINE # 225
SJMP ?C0042
; /*
; /* Removed these to safe some memory space (not called on Windows platform anyway).
; /*
; case MSD_RESET:
; Reset_Msd();
; break;
; case MSD_GET_MAX_LUN:
; Get_MaxLUN();
; break;
; */
; default:
; SOURCE LINE # 236
?C0054:
; Force_Stall(); // Send stall to host if invalid request
; SOURCE LINE # 237
LCALL Force_Stall
; break;
; SOURCE LINE # 238
; }
; SOURCE LINE # 239
; }
; SOURCE LINE # 240
; }
; SOURCE LINE # 241
?C0042:
;
; if (Ep_Status[0] == EP_TX) // See if the endpoint has data to transmit to host
; SOURCE LINE # 243
MOV DPTR,#Ep_Status
MOVX A,@DPTR
XRL A,#01H
JZ $ + 5H
LJMP ?C0036
; {
; SOURCE LINE # 244
; if (!(control_reg & rbINPRDY)) // Make sure you don't overwrite last packet
; SOURCE LINE # 245
MOV DPTR,#control_reg?344
MOVX A,@DPTR
JNB ACC.1,$ + 6H
LJMP ?C0036
; {
; SOURCE LINE # 246
?C0057:
; // Endpoint 0 transmit mode
; //Delay();
; POLL_READ_BYTE(E0CSR, control_reg);
; SOURCE LINE # 249
MOV A,USB0ADR
JB ACC.7,?C0057
?C0058:
MOV USB0ADR,#091H
?C0059:
MOV A,USB0ADR
JB ACC.7,?C0059
?C0060:
MOV DPTR,#control_reg?344
MOV A,USB0DAT
MOVX @DPTR,A
; // Read control register
;
; if ((!(control_reg & rbSUEND)) || (!(control_reg & rbOPRDY)))
; SOURCE LINE # 252
MOVX A,@DPTR
JNB ACC.4,?C0062
JNB ACC.0,$ + 6H
LJMP ?C0036
?C0062:
; // Check to see if Setup End or Out Packet received, if so
; // do not put any new data on FIFO
; {
; SOURCE LINE # 255
; TempReg = rbINPRDY; // Add In Packet ready flag to E0CSR bitmask
; SOURCE LINE # 256
MOV DPTR,#TempReg?345
MOV A,#02H
MOVX @DPTR,A
;
; // Break Data into multiple packets if larger than Max Packet
; if (Data_Size >= EP0_PACKET_SIZE)
; SOURCE LINE # 259
CLR C
MOV DPTR,#Data_Size+01H
MOVX A,@DPTR
SUBB A,#040H
MOV DPTR,#Data_Size
MOVX A,@DPTR
SUBB A,#00H
MOV DPTR,#Data_Ptr
LCALL L?0140
JC ?C0063
; {
; SOURCE LINE # 260
; Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE, (BYTE *)Data_Ptr);// Put Data on Fifo
; SOURCE LINE # 261
MOV R4,#00H
MOV R5,#040H
MOV R7,#020H
LCALL _?Fifo_Write
; Data_Ptr += EP0_PACKET_SIZE; // Advance data pointer
; SOURCE LINE # 262
MOV DPTR,#Data_Ptr+01H
CLR A
MOV B,#040H
LCALL ?C?IILDX
; Data_Size -= EP0_PACKET_SIZE; // Decrement data size
; SOURCE LINE # 263
MOV DPTR,#Data_Size+01H
MOVX A,@DPTR
ADD A,#0C0H
MOVX @DPTR,A
MOV DPTR,#Data_Size
MOVX A,@DPTR
ADDC A,#0FFH
MOVX @DPTR,A
; Data_Sent += EP0_PACKET_SIZE; // Increment data sent counter
; SOURCE LINE # 264
MOV DPTR,#Data_Sent+01H
MOVX A,@DPTR
ADD A,#040H
MOVX @DPTR,A
MOV DPTR,#Data_Sent
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
; }
; SOURCE LINE # 265
SJMP ?C0064
?C0063:
; else // If data is less than Max Packet size or zero
; {
; SOURCE LINE # 267
; Fifo_Write(FIFO_EP0, Data_Size, (BYTE *)Data_Ptr); // Put Data on Fifo
; SOURCE LINE # 268
MOV DPTR,#Data_Size
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
MOV R7,#020H
LCALL _?Fifo_Write
; TempReg |= rbDATAEND; // Add Data End bit to bitmask
; SOURCE LINE # 269
; Ep_Status[0] = EP_IDLE; // Return EP 0 to idle state
; SOURCE LINE # 270
LCALL L?0142
; }
; SOURCE LINE # 271
?C0064:
; if (Data_Sent == Setup.wLength.i)
; SOURCE LINE # 272
MOV DPTR,#Setup+06H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#Data_Sent
MOVX A,@DPTR
XRL A,R6
JNZ ?C0134
INC DPTR
MOVX A,@DPTR
XRL A,R7
?C0134:
JNZ ?C0066
; // This case exists when the host requests an even multiple of
; // your endpoint zero max packet size, and you need to exit
; // transmit mode without sending a zero length packet
; {
; SOURCE LINE # 276
; TempReg |= rbDATAEND; // Add Data End bit to mask
; SOURCE LINE # 277
; Ep_Status[0] = EP_IDLE; // and return Endpoint 0 to an idle state
; SOURCE LINE # 278
LCALL L?0142
; }
; SOURCE LINE # 279
?C0066:
; POLL_WRITE_BYTE(E0CSR, TempReg); // Write mask to E0CSR
; SOURCE LINE # 280
MOV A,USB0ADR
JB ACC.7,?C0066
?C0067:
MOV USB0ADR,#011H
MOV DPTR,#TempReg?345
MOVX A,@DPTR
MOV USB0DAT,A
; }
; SOURCE LINE # 281
; }
; SOURCE LINE # 282
; }
; SOURCE LINE # 283
; }
; SOURCE LINE # 284
?C0036:
RET
; END OF Handle_Setup
;
;
; //----------------------------------------------------------------------------
; // Handle_In1
; //----------------------------------------------------------------------------
; //
; // - This routine loads the current value from In_Packet on the Endpoint 1
; // fifo, after an interrupt is received from the last packet being
; // transmitted
; //
; // Parameters : ptr_buf - pointer to buffer with in_pocket
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Handle_In1(BYTE* ptr_buf)
RSEG ?PR?_Handle_In1?F34X_MSD_USB_ISR
_Handle_In1:
USING 0
; SOURCE LINE # 299
;---- Variable 'ptr_buf?446' assigned to Register 'R1/R2/R3' ----
; {
; SOURCE LINE # 300
?C0068:
; BYTE control_reg;
;
; POLL_WRITE_BYTE(INDEX, EP1_IN_IDX); // Set index to endpoint 1 registers
; SOURCE LINE # 303
MOV A,USB0ADR
JB ACC.7,?C0068
?C0069:
MOV USB0ADR,#0EH
MOV USB0DAT,#01H
?C0070:
; POLL_READ_BYTE(EINCSR1, control_reg); // Read contol register for EP 1
; SOURCE LINE # 304
MOV A,USB0ADR
JB ACC.7,?C0070
?C0071:
MOV USB0ADR,#091H
?C0072:
MOV A,USB0ADR
JB ACC.7,?C0072
?C0073:
;---- Variable 'control_reg?447' assigned to Register 'R7' ----
MOV R7,USB0DAT
;
; if (Ep_Status[1] == EP_HALT) // If endpoint is currently halted, send a stall
; SOURCE LINE # 306
MOV DPTR,#Ep_Status+01H
MOVX A,@DPTR
CJNE A,#03H,?C0074
; {
; SOURCE LINE # 307
?C0075:
; POLL_WRITE_BYTE(EINCSR1, rbInSDSTL);
; SOURCE LINE # 308
MOV A,USB0ADR
JB ACC.7,?C0075
?C0076:
MOV USB0ADR,#011H
MOV USB0DAT,#010H
; }
; SOURCE LINE # 309
RET
?C0074:
;
; else // Otherwise send last updated data to host
; {
; SOURCE LINE # 312
; if (control_reg & rbInSTSTL) // Clear sent stall if last packet returned a stall
; SOURCE LINE # 313
MOV A,R7
JNB ACC.5,?C0078
; {
; SOURCE LINE # 314
?C0079:
; POLL_WRITE_BYTE(EINCSR1, rbInCLRDT);
; SOURCE LINE # 315
MOV A,USB0ADR
JB ACC.7,?C0079
?C0080:
MOV USB0ADR,#011H
MOV USB0DAT,#040H
; }
; SOURCE LINE # 316
?C0078:
;
; if (control_reg & rbInUNDRUN) // Clear underrun bit if it was set
; SOURCE LINE # 318
MOV A,R7
JNB ACC.2,?C0081
; {
; SOURCE LINE # 319
?C0082:
; POLL_WRITE_BYTE(EINCSR1, 0x00);
; SOURCE LINE # 320
MOV A,USB0ADR
JB ACC.7,?C0082
?C0083:
MOV USB0ADR,#011H
CLR A
MOV USB0DAT,A
; }
; SOURCE LINE # 321
?C0081:
;
; // Put new data on Fifo
; // Fifo_Write(FIFO_EP1, EP1_PACKET_SIZE, (BYTE *)IN_PACKET);
; Fifo_Write(FIFO_EP1, In_count, (BYTE *)ptr_buf);
; SOURCE LINE # 325
MOV DPTR,#In_count
MOVX A,@DPTR
MOV R5,A
MOV R4,#00H
MOV R7,#021H
LCALL _?Fifo_Write
?C0084:
; POLL_WRITE_BYTE(EINCSR1, rbInINPRDY);
; SOURCE LINE # 326
MOV A,USB0ADR
JB ACC.7,?C0084
?C0085:
MOV USB0ADR,#011H
MOV USB0DAT,#01H
; // Set In Packet ready bit, indicating fresh data
; } // on Fifo 1
; SOURCE LINE # 328
; }
; SOURCE LINE # 329
?C0086:
RET
; END OF _Handle_In1
;
; //----------------------------------------------------------------------------
; // USB_Bulk_Init
; //----------------------------------------------------------------------------
; //
; // Function rests the input and output counters for USB
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void USB_Bulk_Init() {
RSEG ?PR?USB_Bulk_Init?F34X_MSD_USB_ISR
USB_Bulk_Init:
; SOURCE LINE # 341
; In_count=0;
; SOURCE LINE # 342
CLR A
MOV DPTR,#In_count
MOVX @DPTR,A
; Out_Count=0;
; SOURCE LINE # 343
MOV DPTR,#Out_Count
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; }
; SOURCE LINE # 344
RET
; END OF USB_Bulk_Init
;
; //----------------------------------------------------------------------------
; // USB_In
; //----------------------------------------------------------------------------
; //
; // The function sends the series of characters via USB
; //
; // Parameters : ptr_buf - pointer to buffer,
; // count - number of bytes
; // Return Value :
; //----------------------------------------------------------------------------
;
; void USB_In(BYTE* ptr_buf,unsigned count) {
RSEG ?PR?_USB_In?F34X_MSD_USB_ISR
_USB_In:
USING 0
; SOURCE LINE # 357
MOV DPTR,#ptr_buf?648
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R4
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A
; DWORD t1=tickcount+500;
; SOURCE LINE # 358
MOV DPTR,#tickcount
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
ADD A,#0F4H
MOV R7,A
MOV A,R6
ADDC A,#01H
MOV R6,A
CLR A
ADDC A,R5
MOV R5,A
CLR A
ADDC A,R4
MOV R4,A
MOV DPTR,#t1?650
LCALL ?C?LSTXDATA
?C0088:
; while(In_count && (tickcount<t1))
; SOURCE LINE # 359
MOV DPTR,#In_count
MOVX A,@DPTR
JZ ?C0089
MOV DPTR,#t1?650
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#tickcount
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
CLR C
LCALL ?C?ULCMP
JC ?C0088
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -