?? upsd3400_usb_app.src
字號:
JNC ?C0002
; {
; SOURCE LINE # 135
; PhysicalDataAddr += 0x8000; // adjust address to the top half of memory
; SOURCE LINE # 136
CLR A
ADD A,PhysicalDataAddr+01H
MOV PhysicalDataAddr+01H,A
MOV A,#080H
ADDC A,PhysicalDataAddr
MOV PhysicalDataAddr,A
; UPSD_xreg.PAGE += 1; // adjust PAGE
; SOURCE LINE # 137
MOV DPTR,#UPSD_xreg+0E0H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
; }
; SOURCE LINE # 138
?C0002:
; TransferLength--; // decrement sector counter
; SOURCE LINE # 139
MOV A,TransferLength+01H
DEC TransferLength+01H
JNZ ?C0116
DEC TransferLength
?C0116:
; }
; SOURCE LINE # 140
RET
; END OF SpecificIncrementSectorAddress
;
; // Flash parameters
; #define NVM_DATA_POLL 0x80 // flash status "data poll" bit at DQ7
; #define NVM_DATA_TOGGLE 0x40 // flash status "toggle poll" bit at DQ6
; #define NVM_ERROR 0x20 // flash status "error" bit at DQ5
;
;
; BOOL EraseMainFlashSector(void)
RSEG ?PR?EraseMainFlashSector?UPSD3400_USB_APP
EraseMainFlashSector:
USING 0
; SOURCE LINE # 148
; /******************************************************************************
; Function : BOOL EraseMainFlashSector()
; Parameters : (unsigned int addr,unsigned char wbyte)
; Description: Erases Main Flash Sector
; ******************************************************************************/
; {
; SOURCE LINE # 154
; data unsigned char err,error,done;
; data unsigned char poll;
;
; done = FALSE;
; SOURCE LINE # 158
;---- Variable 'done?242' assigned to Register 'R7' ----
CLR A
MOV R7,A
; err = FALSE;
; SOURCE LINE # 159
;---- Variable 'err?240' assigned to Register 'R6' ----
MOV R6,A
;
; ((unsigned char volatile xdata *) 0x8000)[0x0555] = 0xAA;
; SOURCE LINE # 161
MOV DPTR,#08555H
MOV A,#0AAH
MOVX @DPTR,A
; // unlock main flash, write 0xAA to addess 0xX555
; ((unsigned char volatile xdata *) 0x8000)[0x0AAA] = 0x55;
; SOURCE LINE # 163
MOV DPTR,#08AAAH
MOV A,#055H
MOVX @DPTR,A
; // unlock main flash, write 0x55 to addess 0xXAAA
; ((unsigned char volatile xdata *) 0x8000)[0x0555] = 0x80;
; SOURCE LINE # 165
MOV DPTR,#08555H
MOV A,#080H
MOVX @DPTR,A
; // write 0x80 command to erase sector
; ((unsigned char volatile xdata *) 0x8000)[0x0555] = 0xAA;
; SOURCE LINE # 167
MOV A,#0AAH
MOVX @DPTR,A
; // continue unlock sequence
; ((unsigned char volatile xdata *) 0x8000)[0x0AAA] = 0x55;
; SOURCE LINE # 169
MOV DPTR,#08AAAH
MOV A,#055H
MOVX @DPTR,A
; // continue unlock sequence
; ((unsigned char volatile xdata *) 0x8000)[0x0000] = 0x30;
; SOURCE LINE # 171
MOV DPTR,#08000H
MOV A,#030H
MOVX @DPTR,A
?C0006:
; // write 0x30 to sector address to erase
;
; do // now use dat polling method to verify successful erase
; {
; SOURCE LINE # 175
; poll = ((unsigned char volatile xdata *) 0x8000)[0x0000];
; SOURCE LINE # 176
MOV DPTR,#08000H
MOVX A,@DPTR
MOV R5,A
;---- Variable 'poll?243' assigned to Register 'R5' ----
; // read flash status from any address
; // within the defined flash address space
; error = poll & NVM_ERROR; // save timeout error bit at DQ5
; SOURCE LINE # 179
ANL A,#020H
MOV R4,A
;---- Variable 'error?241' assigned to Register 'R4' ----
; poll = poll & NVM_DATA_POLL; // look at D7
; SOURCE LINE # 180
XCH A,R5
ANL A,#080H
XCH A,R5
; if (poll == NVM_DATA_POLL) // compare DQ7
; SOURCE LINE # 181
CJNE R5,#080H,?C0007
; {
; SOURCE LINE # 182
; done = TRUE; // bulk erase OK, indicate successful exit criteria
; SOURCE LINE # 183
MOV R7,#01H
; }
; SOURCE LINE # 184
SJMP ?C0004
?C0007:
; else if (error == NVM_ERROR) // check for timeout error
; SOURCE LINE # 185
CJNE R4,#020H,?C0004
; {
; SOURCE LINE # 186
; err = TRUE; // indicate timeout error occurred
; SOURCE LINE # 187
MOV R6,#01H
; }
; SOURCE LINE # 188
;
; }
; SOURCE LINE # 190
?C0004:
; while((done == FALSE) && (err == FALSE));
; SOURCE LINE # 191
MOV A,R7
JNZ ?C0005
MOV A,R6
JZ ?C0006
?C0005:
;
;
; if (err == TRUE) // make sure timeout error and dat poll didn't
; SOURCE LINE # 194
CJNE R6,#01H,?C0011
; // occur simultaneously
; {
; SOURCE LINE # 196
; poll = ((unsigned char volatile xdata *) 0x8000)[0x000];
; SOURCE LINE # 197
MOV DPTR,#08000H
MOVX A,@DPTR
MOV R5,A
; // Read flash status again
; poll = poll & NVM_DATA_POLL; // get DQ7 of poll byte read from flash
; SOURCE LINE # 199
XCH A,R5
ANL A,#080H
XCH A,R5
; if (poll == NVM_DATA_POLL) // compare DQ7
; SOURCE LINE # 200
CJNE R5,#080H,?C0012
; {
; SOURCE LINE # 201
; done = TRUE; // the flash erased OK at the same
; SOURCE LINE # 202
MOV R7,#01H
; // time timout error occured, indicate successful exit criteria
; err = FALSE;
; SOURCE LINE # 204
CLR A
MOV R6,A
; }
; SOURCE LINE # 205
SJMP ?C0011
?C0012:
; else
; {
; SOURCE LINE # 207
; ((unsigned char volatile xdata *) 0x8000)[0x0555] = 0xF0;
; SOURCE LINE # 208
MOV DPTR,#08555H
MOV A,#0F0H
MOVX @DPTR,A
; // reset the flash array (short reset instruction)
; }
; SOURCE LINE # 210
; }
; SOURCE LINE # 211
?C0011:
;
; return err;
; SOURCE LINE # 213
XCH A,R7
MOV A,R6
XCH A,R7
; }
; SOURCE LINE # 214
?C0014:
RET
; END OF EraseMainFlashSector
;
;
;
;
;
;
;
; BOOL WriteToMainFlash(unsigned int addr,unsigned char wdat)
RSEG ?PR?_WriteToMainFlash?UPSD3400_USB_APP
L?0127:
USING 0
MOV DPTR,#UPSD_xreg+0E0H
MOVX @DPTR,A
MOV R5,j?451
L?0128:
MOV R7,i?453+01H
MOV R6,i?453
_WriteToMainFlash:
USING 0
; SOURCE LINE # 222
;---- Variable 'addr?344' assigned to Register 'R6/R7' ----
;---- Variable 'wdat?345' assigned to Register 'R5' ----
; /******************************************************************************
; Function : BOOL WriteToMainFlash()
; Parameters : (unsigned int addr,unsigned char wbyte)
; Description: Writes 1 byte to Main Flash
; ******************************************************************************/
; {
; SOURCE LINE # 228
; data unsigned char err,error,done;
; data unsigned char poll,dat;
;
; err = FALSE;
; SOURCE LINE # 232
;---- Variable 'err?346' assigned to Register 'R4' ----
CLR A
MOV R4,A
;
; if ( ((unsigned char volatile xdata *) 0)[addr] != wdat)
; SOURCE LINE # 234
MOV DPL,R7
MOV DPH,R6
MOVX A,@DPTR
XRL A,R5
JZ ?C0015
; {
; SOURCE LINE # 235
; done = FALSE;
; SOURCE LINE # 236
;---- Variable 'done?348' assigned to Register 'R1' ----
CLR A
MOV R1,A
; ((unsigned char volatile xdata *) 0)[0x8555] = 0xAA;
; SOURCE LINE # 237
MOV DPTR,#08555H
MOV A,#0AAH
MOVX @DPTR,A
; // unlock main flash, write 0xAA to addess 0xX555
; ((unsigned char volatile xdata *) 0)[0x8AAA] = 0x55;
; SOURCE LINE # 239
MOV DPTR,#08AAAH
MOV A,#055H
MOVX @DPTR,A
; // unlock main flash, write 0x55 to addess 0xXAAA
; ((unsigned char volatile xdata *) 0)[0x8555] = 0xA0;
; SOURCE LINE # 241
MOV DPTR,#08555H
MOV A,#0A0H
MOVX @DPTR,A
; // write 0xA0 command to program
; ((unsigned char volatile xdata *) 0)[addr] = wdat;
; SOURCE LINE # 243
MOV DPL,R7
MOV DPH,R6
MOV A,R5
MOVX @DPTR,A
; // write byte to flash
; dat = wdat & NVM_DATA_POLL; // get bit DQ7 of the original dat
; SOURCE LINE # 245
ANL A,#080H
MOV R5,A
;---- Variable 'dat?350' assigned to Register 'R5' ----
?C0018:
;
; do // now use dat polling method to verify successful write
; {
; SOURCE LINE # 248
; poll = ((unsigned char volatile xdata *) 0)[addr];
; SOURCE LINE # 249
MOV DPL,R7
MOV DPH,R6
MOVX A,@DPTR
MOV R3,A
;---- Variable 'poll?349' assigned to Register 'R3' ----
; // Read the location that was just programmed
; error = poll & NVM_ERROR; // save timeout error bit at DQ5
; SOURCE LINE # 251
ANL A,#020H
MOV R2,A
;---- Variable 'error?347' assigned to Register 'R2' ----
; poll = poll & NVM_DATA_POLL; // get DQ7 of poll byte read from flash
; SOURCE LINE # 252
XCH A,R3
ANL A,#080H
XCH A,R3
;
; if (dat == poll) // compare DQ7
; SOURCE LINE # 254
MOV A,R5
XRL A,R3
JNZ ?C0019
; {
; SOURCE LINE # 255
; done = TRUE; // dat byte programmed into flash OK,
; SOURCE LINE # 256
MOV R1,#01H
; // indicate successful exit criteria
; }
; SOURCE LINE # 258
SJMP ?C0016
?C0019:
; else if (error == NVM_ERROR ) // check for timeout error
; SOURCE LINE # 259
CJNE R2,#020H,?C0016
; {
; SOURCE LINE # 260
; err = TRUE; // indicate timeout error occurred
; SOURCE LINE # 261
MOV R4,#01H
; }
; SOURCE LINE # 262
;
; }
; SOURCE LINE # 264
?C0016:
; while((done == FALSE) && (err == FALSE));
; SOURCE LINE # 265
MOV A,R1
JNZ ?C0017
MOV A,R4
JZ ?C0018
?C0017:
;
; if (err == TRUE) // make sure timeout error and dat poll didn't
; SOURCE LINE # 267
CJNE R4,#01H,?C0015
; // occur simultaneously
; {
; SOURCE LINE # 269
; poll = ((unsigned char volatile xdata *) 0)[addr];
; SOURCE LINE # 270
MOV DPL,R7
MOV DPH,R6
MOVX A,@DPTR
MOV R3,A
; // Read location in flash again
; poll = poll & NVM_DATA_POLL; // get DQ7 of poll byte read from flash
; SOURCE LINE # 272
XCH A,R3
ANL A,#080H
XCH A,R3
; if (dat == poll) // compare DQ7
; SOURCE LINE # 273
MOV A,R5
XRL A,R3
JNZ ?C0024
; {
; SOURCE LINE # 274
; done = TRUE; // data byte programmed into flash OK at the same
; SOURCE LINE # 275
; // time timout error occured, indicate successful exit criteria
; err = FALSE;
; SOURCE LINE # 277
MOV R4,A
; }
; SOURCE LINE # 278
SJMP ?C0015
?C0024:
; else
; {
; SOURCE LINE # 280
; ((unsigned char volatile xdata *) 0)[0x8555] = 0xF0;
; SOURCE LINE # 281
MOV DPTR,#08555H
MOV A,#0F0H
MOVX @DPTR,A
; // reset the flash array (short reset instruction)
; }
; SOURCE LINE # 283
; }
; SOURCE LINE # 284
; }
; SOURCE LINE # 285
?C0015:
; return err;
; SOURCE LINE # 286
XCH A,R7
MOV A,R4
XCH A,R7
; }
; SOURCE LINE # 287
?C0026:
RET
; END OF _WriteToMainFlash
;
;
;
;
;
;
;
; void WriteBufferToFlash(void)
RSEG ?PR?WriteBufferToFlash?UPSD3400_USB_APP
WriteBufferToFlash:
USING 0
; SOURCE LINE # 295
; /******************************************************************************
; Function : void WriteBufferToFlash()
; Parameters : (none)
; Description: Receives (writes) TransferLength sectors with length of 512 Bytes
;
; How it works:
; This SW burns data into internal uPSD NOR FLASH. To save FLASH RW cycles,
; it is looking for empty sector part you are burning in.
; If the area is filled by 0xFF only, the sector part is assumed
; to be erased before, so only data are written directly to the selected flash
; sector.
; If not, the sector is copied to the last flash sector #8,
; erased afterwards and written back (with the updated data block).
; ******************************************************************************/
; {
; SOURCE LINE # 310
; data unsigned char j,page;
; data unsigned int i,SectorEndPhysicalDataAddr;
;
;
; UPSD_xreg.DATAOUT_D = 0; // WRITE, RED LED ON !
; SOURCE LINE # 315
CLR A
MOV DPTR,#UPSD_xreg+013H
MOVX @DPTR,A
;
; if (TransferLength != 0)
; SOURCE LINE # 317
MOV A,TransferLength+01H
ORL A,TransferLength
JNZ $ + 5H
LJMP ?C0027
; {
; SOURCE LINE # 318
; // Test the block (following 64B).
; USEL = OUTDIR | UMSC_OUT_ENDPOINT; // Select EP3 OUT
; SOURCE LINE # 320
MOV USEL,#081H
;
; i = PhysicalDataAddr;
; SOURCE LINE # 322
MOV i?453,PhysicalDataAddr
MOV i?453+01H,PhysicalDataAddr+01H
; j = 0;
; SOURCE LINE # 323
CLR A
MOV j?451,A
?C0028:
; // now check whether is necessary to erase the block or not; it saves Flash RW cycles
; while (j<64)
; SOURCE LINE # 325
MOV A,j?451
CLR C
SUBB A,#040H
JNC ?C0029
; {
; SOURCE LINE # 326
; if (( ( ((unsigned char volatile xdata *) 0)[i]) | USB_FIFO[j]) != 0xFF)
; SOURCE LINE # 327
CLR A
ADD A,j?451
MOV DPL,A
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -