⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 upsd3400_usb_app.src

📁 U-disk reference design
💻 SRC
📖 第 1 页 / 共 5 页
字号:
			; SOURCE LINE # 688
	RET  	
; END OF OnModeSense6

; 
; void OnModeSelect10(void)

	RSEG  ?PR?OnModeSelect10?UPSD3400_USB_APP
OnModeSelect10:
			; SOURCE LINE # 690
; /******************************************************************************
;  Function   : void OnModeSelect10()
;  Parameters : (void)
;  Description: The MODE SELECT(10) command provides a means for
;               the application client to specify medium,
;               logical unit, or peripheral device parameters to the device server.
;               Application clients should issue MODE SENSE(10) prior
;               to each MODE SELECT(10) to determine supported mode pages,
;               mode page lengths, and other parameters.
;               Device servers that implement the MODE SELECT(10) command shall
;               also implement the MODE SENSE(10) command.
;  ******************************************************************************/
;  {
			; SOURCE LINE # 703
;   gbCSWStatus = FAIL;
			; SOURCE LINE # 704
	MOV  	gbCSWStatus,#01H
;   ReturnCSW();                               // return status
			; SOURCE LINE # 705
	LJMP 	ReturnCSW
; END OF OnModeSelect10

;  }
; 
; void OnModeSense10(void)

	RSEG  ?PR?OnModeSense10?UPSD3400_USB_APP
OnModeSense10:
			; SOURCE LINE # 708
; /******************************************************************************
;  Function   : void OnModeSense10()
;  Parameters : none
;  Description: Handler for ModeSense10 command
;  ******************************************************************************/
;  {
			; SOURCE LINE # 714
;   USEL  = INDIR | UMSC_IN_ENDPOINT;          //Select EP1 IN
			; SOURCE LINE # 715
	MOV  	USEL,#01H
; 
;   USB_FIFO[ 0] = 0x00;
			; SOURCE LINE # 717
	MOV  	DPTR,#07000H
	CLR  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 1] = 0x06;
			; SOURCE LINE # 718
	INC  	DPTR
	MOV  	A,#06H
	MOVX 	@DPTR,A
;   USB_FIFO[ 2] = 0x00;
			; SOURCE LINE # 719
	INC  	DPTR
	CLR  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 3] = 0x00;
			; SOURCE LINE # 720
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 4] = 0x00;
			; SOURCE LINE # 721
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 5] = 0x00;
			; SOURCE LINE # 722
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 6] = 0x00;
			; SOURCE LINE # 723
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 7] = 0x00;
			; SOURCE LINE # 724
	INC  	DPTR
	MOVX 	@DPTR,A
; 
;   USIZE = 8;
			; SOURCE LINE # 726
	MOV  	USIZE,#08H
; 
;   gbBulkPipeStage = BS_CSW_PHASE;
			; SOURCE LINE # 728
	MOV  	gbBulkPipeStage,#02H
;  }
			; SOURCE LINE # 729
	RET  	
; END OF OnModeSense10

; 
; void DoReadCapacity(void)

	RSEG  ?PR?DoReadCapacity?UPSD3400_USB_APP
DoReadCapacity:
			; SOURCE LINE # 731
; /*--------------------------------------------------------------------
;  Function   : void DoReadCapacity()
;  Parameters : none
;  Description: Handler for ReadCapacity command
;               This routine returns real capacity of the device-1
; ---------------------------------------------------------------------*/
;  {
			; SOURCE LINE # 738
;   USEL  = INDIR | UMSC_IN_ENDPOINT;          //Select EP1 IN
			; SOURCE LINE # 739
	MOV  	USEL,#01H
; 
;   USB_FIFO[ 0] = 0x00;                       //Last logical block
			; SOURCE LINE # 741
	MOV  	DPTR,#07000H
	CLR  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 1] = 0x00;
			; SOURCE LINE # 742
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 2] = 0x01;
			; SOURCE LINE # 743
	INC  	DPTR
	INC  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 3] = 0xBF;                       //7*32768B
			; SOURCE LINE # 744
	INC  	DPTR
	MOV  	A,#0BFH
	MOVX 	@DPTR,A
; 
;   USB_FIFO[ 4] = 0x00;                       //block length
			; SOURCE LINE # 746
	INC  	DPTR
	CLR  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 5] = 0x00;
			; SOURCE LINE # 747
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 6] = 0x02;                       //512B
			; SOURCE LINE # 748
	INC  	DPTR
	MOV  	A,#02H
	MOVX 	@DPTR,A
;   USB_FIFO[ 7] = 0x00;
			; SOURCE LINE # 749
	INC  	DPTR
	CLR  	A
	MOVX 	@DPTR,A
; 
;   USIZE = 8;
			; SOURCE LINE # 751
	MOV  	USIZE,#08H
; 
;   gbBulkPipeStage = BS_CSW_PHASE;
			; SOURCE LINE # 753
	MOV  	gbBulkPipeStage,#02H
;  }
			; SOURCE LINE # 754
	RET  	
; END OF DoReadCapacity

; 
; void DoReadFormatCapacity(void)

	RSEG  ?PR?DoReadFormatCapacity?UPSD3400_USB_APP
DoReadFormatCapacity:
			; SOURCE LINE # 756
; /*--------------------------------------------------------------------
;  Function   : void DoReadFormatCapacity()
;  Parameters : none
;  Description: Handler for ReadFormatCapacity command
; ---------------------------------------------------------------------*/
;  {
			; SOURCE LINE # 762
;   USEL  = INDIR | UMSC_IN_ENDPOINT;          //Select EP1 IN
			; SOURCE LINE # 763
	MOV  	USEL,#01H
; 
;   USB_FIFO[ 0] = 0x00;
			; SOURCE LINE # 765
	MOV  	DPTR,#07000H
	CLR  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 1] = 0x00;
			; SOURCE LINE # 766
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 2] = 0x00;
			; SOURCE LINE # 767
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 3] = 0x08;                       //capacity list length
			; SOURCE LINE # 768
	INC  	DPTR
	MOV  	A,#08H
	MOVX 	@DPTR,A
; 
; /* The following values are used during disk format */
;   USB_FIFO[ 4] = 0x00;                       //block count
			; SOURCE LINE # 771
	INC  	DPTR
	CLR  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 5] = 0x00;
			; SOURCE LINE # 772
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[ 6] = 0x01;
			; SOURCE LINE # 773
	INC  	DPTR
	INC  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 7] = 0xBB;
			; SOURCE LINE # 774
	INC  	DPTR
	MOV  	A,#0BBH
	MOVX 	@DPTR,A
;   USB_FIFO[ 8] = 0x00;                       //block length
			; SOURCE LINE # 775
	INC  	DPTR
	CLR  	A
	MOVX 	@DPTR,A
;   USB_FIFO[ 9] = 0x00;
			; SOURCE LINE # 776
	INC  	DPTR
	MOVX 	@DPTR,A
;   USB_FIFO[10] = 0x02;                       //512B
			; SOURCE LINE # 777
	INC  	DPTR
	MOV  	A,#02H
	MOVX 	@DPTR,A
;   USB_FIFO[11] = 0x00;
			; SOURCE LINE # 778
	INC  	DPTR
	CLR  	A
	MOVX 	@DPTR,A
; 
;   USIZE = 12;
			; SOURCE LINE # 780
	MOV  	USIZE,#0CH
; 
;   gbBulkPipeStage = BS_CSW_PHASE;
			; SOURCE LINE # 782
	MOV  	gbBulkPipeStage,#02H
;  }
			; SOURCE LINE # 783
	RET  	
; END OF DoReadFormatCapacity

; 
; void CheckReceiveCBW(void)

	RSEG  ?PR?CheckReceiveCBW?UPSD3400_USB_APP
CheckReceiveCBW:
	USING	0
			; SOURCE LINE # 785
; /******************************************************************************
;   Function   : void CheckReceiveCBW()
;   Parameters : none
;   Description: Handle CBW package.
;                Command Block Wrapper (CBW) shall start on a packet boundary
;                and shall end as a short packet with exactly 31 (1Fh)
;                bytes transferred. Fields appear aligned to byte offsets equal to
;                a multiple of their byte size. All subsequent data and the CSW
;                shall start at a new packet boundary.
;                All CBW transfers shall be ordered with the LSB (byte 0) first
;                (little endian). 
;   ******************************************************************************/
;  {
			; SOURCE LINE # 798
;   data unsigned char i;                      // FOR variable
; 
;   USEL     = OUTDIR | UMSC_OUT_ENDPOINT;     // Select EP OUT
			; SOURCE LINE # 801
	MOV  	USEL,#081H
; 
; /* dCBWSignature:
;   Signature that helps identify this data packet as a CBW. The signature field
;   shall contain the value 43425355h (little endian), indicating a CBW.*/
;   if((USB_FIFO[0]==0x55) && (USB_FIFO[1]==0x53) &&
;   (USB_FIFO[2]==0x42) && (USB_FIFO[3]==0x43))
			; SOURCE LINE # 807
	MOV  	DPTR,#07000H
	MOVX 	A,@DPTR
	XRL  	A,#055H
	JZ   	$ + 5H
	LJMP 	?C0065
	INC  	DPTR
	MOVX 	A,@DPTR
	XRL  	A,#053H
	JZ   	$ + 5H
	LJMP 	?C0065
	INC  	DPTR
	MOVX 	A,@DPTR
	XRL  	A,#042H
	JZ   	$ + 5H
	LJMP 	?C0065
	INC  	DPTR
	MOVX 	A,@DPTR
	XRL  	A,#043H
	JZ   	$ + 5H
	LJMP 	?C0065
;    {
			; SOURCE LINE # 808
; /* dCBWTag:
;     A Command Block Tag sent by the host. The device shall echo the contents of
;     this field back to the host in the dCSWTag field of the associated CSW. The
;     dCSWTag positively associates a CSW with the corresponding CBW.*/
;     *((uchar *)&gdwCBWTag+3) = USB_FIFO[4];  // LSB first
			; SOURCE LINE # 813
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWTag+03H,A
;     *((uchar *)&gdwCBWTag+2) = USB_FIFO[5];
			; SOURCE LINE # 814
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWTag+02H,A
;     *((uchar *)&gdwCBWTag+1) = USB_FIFO[6];
			; SOURCE LINE # 815
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWTag+01H,A
;     *((uchar *)&gdwCBWTag+0) = USB_FIFO[7];
			; SOURCE LINE # 816
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWTag,A
; /* dCBWDataTransferLength:
;     The number of bytes of data that the host expects to transfer on the Bulk-In
;     or Bulk-Out endpoint (as indicated by the Direction bit) during the execution
;     of this command. If this field is zero, the device and the host shall transfer
;     no data between the CBW and the associated CSW, and the device shall ignore
;     the value of the Direction bit in bmCBWFlags.*/
;     *((uchar *)&gdwCBWDataTransferLength+3) = USB_FIFO[ 8];           // LSB first
			; SOURCE LINE # 823
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWDataTransferLength+03H,A
;     *((uchar *)&gdwCBWDataTransferLength+2) = USB_FIFO[ 9];
			; SOURCE LINE # 824
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWDataTransferLength+02H,A
;     *((uchar *)&gdwCBWDataTransferLength+1) = USB_FIFO[10];
			; SOURCE LINE # 825
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWDataTransferLength+01H,A
;     *((uchar *)&gdwCBWDataTransferLength+0) = USB_FIFO[11];
			; SOURCE LINE # 826
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gdwCBWDataTransferLength,A
; /* bmCBWFlags:
;     The bits of this field are defined as follows:
;     Bit 7 Direction - the device shall ignore this bit if the dCBWDataTransferLength
;     field is zero, otherwise:
;     0 = Data-Out from host to the device, 1 = Data-In from the device to the host.
;     Bit 6 Obsolete. The host shall set this bit to zero.
;     Bits 5..0 Reserved - the host shall set these bits to zero.*/
;     gbCBWFlags = USB_FIFO[12];
			; SOURCE LINE # 834
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gbCBWFlags,A
; /* bCBWLUN:
;     The device Logical Unit Number (LUN) to which the command block is being sent.
;     For devices that support multiple LUNs, the host shall place into this field
;     the LUN to which this command block is addressed. Otherwise, the host shall
;     set this field to zero. */
;     gbCBWLUN  = USB_FIFO[13];
			; SOURCE LINE # 840
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gbCBWLUN,A
; /* bCBWCBLength:
;     The valid length of the CBWCB in bytes. This defines the valid length of the
;     command block. The only legal values are 1 through 16 (01h through 10h). All
;     other values are reserved. */
;     gbCBWCBLength = USB_FIFO[14];
			; SOURCE LINE # 845
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	gbCBWCBLength,A
; 
;     if (gbCBWCBLength>16)
			; SOURCE LINE # 847
	SETB 	C
	SUBB 	A,#010H
	JC   	?C0066
;      {
			; SOURCE LINE # 848
;       gbCBWCBLength = 16;
			; SOURCE LINE # 849
	MOV  	gbCBWCBLength,#010H
;      }
			; SOURCE LINE # 850
?C0066:
; /* CBWCB:
;     The command block to be executed by the device. The device shall interpret
;     the first bCBWCBLength bytes in this field as a command block as defined by
;     the command set identified by bInterfaceSubClass. If the command set supported
;     by the device uses command blocks of fewer than 16 (10h) bytes in
;     length, the significant bytes shall be transferred first, beginning with the
;     byte at offset 15 (Fh). The device shall ignore the content of the CBWCB field
;     past the byte at offset (15 + bCBWCBLength - 1).
;     */
;     for(i = 0; i<gbCBWCBLength; i++)
			; SOURCE LINE # 860
;---- Variable 'i?1556' assigned to Register 'R7' ----
	CLR  	A
	MOV  	R7,A
?C0067:
	MOV  	A,R7
	CLR  	C
	SUBB 	A,gbCBWCBLength
	JNC  	?C0068
;      {
			; SOURCE LINE # 861
;       gbCBWCB[i] = USB_FIFO[15+i];
			; SOURCE LINE # 862
	MOV  	A,#0FH
	ADD  	A,R7
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#070H
	MOV  	DPH,A
	MOVX 	A,@DPTR
	MOV  	R6,A
	MOV  	A,#LOW (gbCBWCB)
	ADD  	A,R7
	MOV  	R0,A
	XCH  	A,@R0
	MOV  	A,R6
	XCH  	A,@R0
;      }
			; SOURCE LINE # 863
	INC  	R7
	SJMP 	?C0067
?C0068:
; 
;     UCON |= EPFIFO_BSY;
			; SOURCE LINE # 865
	ORL  	UCON,#01H
; 
; 
; 
;     gbCSWStatus     = PASS;                  // default CSW Status
			; SOURCE LINE # 869
	CLR  	A
	MOV  	gbCSWStatus,A
;     gbBulkPipeStage = BS_DATA_PHASE;
			; SOURCE LINE # 870
	MOV  	gbBulkPipeStage,#01H
; 
;     if (gbCBWCBLength>0)
			; SOURCE LINE # 872
	MOV  	A,gbCBWCBLength
	SETB 	C
	SUBB 	A,#00H
	JC   	?C0070
;      {
			; SOURCE LINE # 873
; /* Now decode the CBWCB; the command block to be executed by the device. */
;       switch (gbCBWCB[0])
			; SOURCE LINE # 875
	MOV  	A,gbCBWCB
	LCALL	?C?CCASE
	DW   	?C0074
	DB   	00H
	DW   	?C0075
	DB   	03H
	DW   	?C0076
	DB   	012H
	DW   	?C0080
	DB   	015H
	DW   	?C0079
	DB   	01AH
	DW   	?C0083
	DB   	01EH
	DW   	?C0082
	DB   	023H
	DW   	?C0081
	DB   	025H
	DW   	?C0072
	DB   	028H
	DW   	?C0073
	DB   	02AH
	DW   	?C0083
	DB   	02FH
	DW  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -