📄 upsd3400_usb_app.src
字号:
CLR A
ADDC A,#070H
MOV DPH,A
MOVX A,@DPTR
MOV R7,A
MOV DPL,i?453+01H
MOV DPH,i?453
MOVX A,@DPTR
ORL A,R7
CPL A
JZ ?C0030
; {
; SOURCE LINE # 328
; j = 255;
; SOURCE LINE # 329
MOV j?451,#0FFH
; }
; SOURCE LINE # 330
SJMP ?C0028
?C0030:
; else
; {
; SOURCE LINE # 332
; i++;
; SOURCE LINE # 333
INC i?453+01H
MOV A,i?453+01H
JNZ ?C0117
INC i?453
?C0117:
; j++;
; SOURCE LINE # 334
INC j?451
; }
; SOURCE LINE # 335
; }
; SOURCE LINE # 336
SJMP ?C0028
?C0029:
;
;
; if (j == 255) //check whether the sector needs to be erased or not
; SOURCE LINE # 339
MOV A,j?451
CPL A
JZ $ + 5H
LJMP ?C0032
; {
; SOURCE LINE # 340
; page = UPSD_xreg.PAGE;
; SOURCE LINE # 341
MOV DPTR,#UPSD_xreg+0E0H
MOVX A,@DPTR
MOV page?452,A
; UPSD_xreg.PAGE = 7;
; SOURCE LINE # 342
MOV A,#07H
MOVX @DPTR,A
;
; EraseMainFlashSector(); //erase sector #8;
; SOURCE LINE # 344
LCALL EraseMainFlashSector
; //now calculate the max. FLASH area to be erased
; //TransferLength holds number of 64B packets to be received and written
; if ((TransferLength>=512) || ((PhysicalDataAddr+(TransferLength<<6))<0x8000))
; SOURCE LINE # 347
CLR C
MOV A,TransferLength
SUBB A,#02H
JNC ?C0034
MOV A,TransferLength+01H
MOV R6,TransferLength
MOV R0,#06H
?C0118:
CLR C
RLC A
XCH A,R6
RLC A
XCH A,R6
DJNZ R0,?C0118
ADD A,PhysicalDataAddr+01H
MOV R7,A
MOV A,PhysicalDataAddr
ADDC A,R6
MOV R6,A
CLR C
SUBB A,#080H
JNC ?C0033
?C0034:
; {
; SOURCE LINE # 348
; SectorEndPhysicalDataAddr = 0xFFFF; //the top of memory
; SOURCE LINE # 349
MOV A,#0FFH
MOV SectorEndPhysicalDataAddr?454,A
MOV SectorEndPhysicalDataAddr?454+01H,A
; }
; SOURCE LINE # 350
SJMP ?C0035
?C0033:
; else
; {
; SOURCE LINE # 352
; SectorEndPhysicalDataAddr = PhysicalDataAddr+(((unsigned int)TransferLength)<<6)-1;
; SOURCE LINE # 353
MOV A,R7
ADD A,#0FFH
MOV SectorEndPhysicalDataAddr?454+01H,A
MOV A,R6
ADDC A,#0FFH
MOV SectorEndPhysicalDataAddr?454,A
; }
; SOURCE LINE # 354
?C0035:
;
;
; UPSD_xreg.PAGE = page; // the sector part needs to be erased
; SOURCE LINE # 357
MOV DPTR,#UPSD_xreg+0E0H
MOV A,page?452
MOVX @DPTR,A
; i = 0x8000; //now copy the FLASH sector to the flash sector #8
; SOURCE LINE # 358
MOV i?453,#080H
MOV i?453+01H,#00H
?C0036:
; while (i != 0) // copy only the area without the part we are updating now
; SOURCE LINE # 359
; {
; SOURCE LINE # 360
; if ((i<PhysicalDataAddr) || (i>SectorEndPhysicalDataAddr)) //write back
; SOURCE LINE # 361
CLR C
MOV A,i?453+01H
SUBB A,PhysicalDataAddr+01H
MOV A,i?453
SUBB A,PhysicalDataAddr
JC ?C0039
SETB C
MOV A,i?453+01H
SUBB A,SectorEndPhysicalDataAddr?454+01H
MOV A,i?453
SUBB A,SectorEndPhysicalDataAddr?454
JC ?C0038
?C0039:
; {
; SOURCE LINE # 362
; j = ((unsigned char volatile xdata *) 0)[i];
; SOURCE LINE # 363
MOV DPL,i?453+01H
MOV DPH,i?453
MOVX A,@DPTR
MOV j?451,A
; if (j != 0xFF) // do not write 0xFF
; SOURCE LINE # 364
CPL A
JZ ?C0038
; {
; SOURCE LINE # 365
; UPSD_xreg.PAGE = 7;
; SOURCE LINE # 366
MOV A,#07H
; if (WriteToMainFlash(i,j) == TRUE)
; SOURCE LINE # 367
LCALL L?0127
CJNE R7,#01H,?C0041
; {
; SOURCE LINE # 368
; gbCSWStatus = FAIL; //error during write operation occured!
; SOURCE LINE # 369
MOV gbCSWStatus,#01H
; i = 0xFFFF;
; SOURCE LINE # 370
MOV A,#0FFH
MOV i?453,A
MOV i?453+01H,A
; }
; SOURCE LINE # 371
?C0041:
; UPSD_xreg.PAGE = page;
; SOURCE LINE # 372
MOV DPTR,#UPSD_xreg+0E0H
MOV A,page?452
MOVX @DPTR,A
; }
; SOURCE LINE # 373
; }
; SOURCE LINE # 374
?C0038:
; i++; // this area will be replaced by a new data
; SOURCE LINE # 375
INC i?453+01H
MOV A,i?453+01H
JNZ ?C0119
INC i?453
?C0119:
; }
; SOURCE LINE # 376
ORL A,i?453
JNZ ?C0036
?C0037:
;
; EraseMainFlashSector(); // erase sector
; SOURCE LINE # 378
LCALL EraseMainFlashSector
;
;
; // now we have a copy of data in the sector #8 with the erase area we need to update
;
; i = 0x8000;
; SOURCE LINE # 383
MOV i?453,#080H
MOV i?453+01H,#00H
?C0042:
; while (i != 0) //copy the rest of data back to the orig. sector
; SOURCE LINE # 384
; {
; SOURCE LINE # 385
; UPSD_xreg.PAGE = 7;
; SOURCE LINE # 386
MOV DPTR,#UPSD_xreg+0E0H
MOV A,#07H
MOVX @DPTR,A
; j = ((unsigned char volatile xdata *) 0)[i];
; SOURCE LINE # 387
MOV DPL,i?453+01H
MOV DPH,i?453
MOVX A,@DPTR
MOV j?451,A
; if (j != 0xFF) // do not write 0xFF, already present
; SOURCE LINE # 388
CPL A
JZ ?C0044
; {
; SOURCE LINE # 389
; UPSD_xreg.PAGE = page;
; SOURCE LINE # 390
MOV A,page?452
; if (WriteToMainFlash(i,j) == TRUE)
; SOURCE LINE # 391
LCALL L?0127
CJNE R7,#01H,?C0044
; {
; SOURCE LINE # 392
; gbCSWStatus = FAIL; //error during write operation occured!
; SOURCE LINE # 393
MOV gbCSWStatus,#01H
; i = 0xFFFF; //end loop
; SOURCE LINE # 394
MOV A,#0FFH
MOV i?453,A
MOV i?453+01H,A
; }
; SOURCE LINE # 395
; }
; SOURCE LINE # 396
?C0044:
; i++;
; SOURCE LINE # 397
INC i?453+01H
MOV A,i?453+01H
JNZ ?C0120
INC i?453
?C0120:
; }
; SOURCE LINE # 398
ORL A,i?453
JNZ ?C0042
?C0043:
;
; UPSD_xreg.PAGE = page;
; SOURCE LINE # 400
MOV DPTR,#UPSD_xreg+0E0H
MOV A,page?452
MOVX @DPTR,A
; }
; SOURCE LINE # 401
?C0032:
;
;
; // Now the sector is ready for write
;
; i = PhysicalDataAddr;
; SOURCE LINE # 406
MOV i?453,PhysicalDataAddr
MOV i?453+01H,PhysicalDataAddr+01H
; j =0;
; SOURCE LINE # 407
CLR A
MOV j?451,A
?C0046:
; while (j<64) //now burn the data into flash
; SOURCE LINE # 408
MOV A,j?451
CLR C
SUBB A,#040H
JNC ?C0047
; {
; SOURCE LINE # 409
; if (WriteToMainFlash(i,~USB_FIFO[j]) == TRUE)
; SOURCE LINE # 410
CLR A
ADD A,j?451
MOV DPL,A
CLR A
ADDC A,#070H
MOV DPH,A
MOVX A,@DPTR
CPL A
MOV R5,A
LCALL L?0128
CJNE R7,#01H,?C0048
; {
; SOURCE LINE # 411
; // an error occured, try it again
; gbCSWStatus = FAIL; //error during write operation occured!
; SOURCE LINE # 413
MOV gbCSWStatus,#01H
; j = 255;
; SOURCE LINE # 414
MOV j?451,#0FFH
; }
; SOURCE LINE # 415
SJMP ?C0046
?C0048:
; else
; {
; SOURCE LINE # 417
; i++;
; SOURCE LINE # 418
INC i?453+01H
MOV A,i?453+01H
JNZ ?C0121
INC i?453
?C0121:
; j++;
; SOURCE LINE # 419
INC j?451
; }
; SOURCE LINE # 420
; }
; SOURCE LINE # 421
SJMP ?C0046
?C0047:
;
;
; UCON |= EPFIFO_BSY;
; SOURCE LINE # 424
ORL UCON,#01H
;
;
; SpecificIncrementSectorAddress();
; SOURCE LINE # 427
LCALL SpecificIncrementSectorAddress
; }
; SOURCE LINE # 428
?C0027:
;
; if (TransferLength == 0)
; SOURCE LINE # 430
MOV A,TransferLength+01H
ORL A,TransferLength
JNZ ?C0050
; {
; SOURCE LINE # 431
; ReturnCSW(); // return status
; SOURCE LINE # 432
LCALL ReturnCSW
; }
; SOURCE LINE # 433
?C0050:
;
; UPSD_xreg.DATAOUT_D = 255; // WRITE done, RED LED OFF !
; SOURCE LINE # 435
MOV DPTR,#UPSD_xreg+013H
MOV A,#0FFH
MOVX @DPTR,A
; }
; SOURCE LINE # 436
RET
; END OF WriteBufferToFlash
;
; void ReadBufferFromFlash(void)
RSEG ?PR?ReadBufferFromFlash?UPSD3400_USB_APP
ReadBufferFromFlash:
; SOURCE LINE # 438
; /******************************************************************************
; Function : void ReadBufferFromFlash()
; Parameters : (none)
; Description: Reads (sends) TransferLength sectors with length of 512 bytes
; ******************************************************************************/
; {
; SOURCE LINE # 444
;
;
; if (TransferLength == 0)
; SOURCE LINE # 447
MOV A,TransferLength+01H
ORL A,TransferLength
JNZ ?C0052
; {
; SOURCE LINE # 448
; ReturnCSW(); // return status
; SOURCE LINE # 449
LJMP ReturnCSW
; }
; SOURCE LINE # 450
?C0052:
; else
; {
; SOURCE LINE # 452
; #ifdef __RC51__ //Compiler: Raisonance
; #pragma asm
; ;The following equates are also defined in usb.h
; ; and should be the same in both places.
; ;The following EQUates are only needed when using RIDE.
; USB_BASE_ADDR EQU 7000H ;USB FIFO mapped in XDATA space
; INDIR EQU 0
; SELEP1 EQU 1
; UMSC_IN_ENDPOINT EQU SELEP1
; #pragma endasm
; #endif
; #pragma asm
; mov DPTM,#0
mov DPTM,#0
; mov DPTC,#1
mov DPTC,#1
; mov DPH,PhysicalDataAddr+0
mov DPH,PhysicalDataAddr+0
; mov DPL,PhysicalDataAddr+1
mov DPL,PhysicalDataAddr+1
; mov DPTM,#10
mov DPTM,#10
; mov USEL,#INDIR+UMSC_IN_ENDPOINT
mov USEL,#0x00+0x01
; mov DPTC,#0
mov DPTC,#0
; mov DPTR,#USB_BASE_ADDR
mov DPTR,#0x7000
; mov DPTC,#64+1
mov DPTC,#64+1
; mov B,#64
mov B,#64
; movx A,@DPTR
movx A,@DPTR
; cpl A
cpl A
; movx @DPTR,A
movx @DPTR,A
; djnz B,$-3
djnz B,$-3
; mov USIZE,#64 ; FIRE!
mov USIZE,#64 ; FIRE!
; mov DPTM,#0
mov DPTM,#0
; mov DPTC,#0
mov DPTC,#0
; #pragma endasm
; SpecificIncrementSectorAddress();
; SOURCE LINE # 483
LCALL SpecificIncrementSectorAddress
;
; /*gbCSWStatus = FAIL;*/
; }
; SOURCE LINE # 486
; }
; SOURCE LINE # 487
?C0054:
RET
; END OF ReadBufferFromFlash
;
; void DoReadWrite(void)
RSEG ?PR?DoReadWrite?UPSD3400_USB_APP
DoReadWrite:
USING 0
; SOURCE LINE # 489
; /*--------------------------------------------------------------------
; Function : void DoReadWrite()
; Parameters : none
; Description: Handler for READ and WRITE command
; ---------------------------------------------------------------------*/
; {
; SOURCE LINE # 495
; data unsigned long LogicalBlockAddr;
;
; /* Decode the Command Descriptor Block (CDB)
; Byte 0 OPERATION CODE
; Byte 1 Reserved
; Byte 2,3,4,5 (MSB) LOGICAL BLOCK ADDRESS (LSB)
; Byte 6 Reserved
; Byte 7 (MSB)
; Byte 8 TRANSFER LENGTH (LSB)
; Byte 9 CONTROL = 00h
; The LOGICAL BLOCK ADDRESS field specifies the first logical block of the range
; of logical blocks that shall be read.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -