📄 main.s
字号:
L66:
movw R24,R10
cpi R24,152
ldi R30,0
cpc R25,R30
breq L62
cpi R24,152
ldi R30,0
cpc R25,R30
brlt L53
L67:
movw R24,R10
cpi R24,158
ldi R30,0
cpc R25,R30
breq L63
cpi R24,159
ldi R30,0
cpc R25,R30
breq L64
rjmp L53
X4:
.dbline 231
; {
L57:
.dbline 233
; case PARAM_BUILD_NUMBER_LOW:
; tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
clr R0
std y+13,R0
.dbline 234
; break;
rjmp L54
L58:
.dbline 236
; case PARAM_BUILD_NUMBER_HIGH:
; tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
clr R0
std y+13,R0
.dbline 237
; break;
rjmp L54
L59:
.dbline 239
; case PARAM_HW_VER:
; tmp = CONFIG_PARAM_HW_VER;
ldi R24,15
std y+13,R24
.dbline 240
; break;
rjmp L54
L60:
.dbline 242
; case PARAM_SW_MAJOR:
; tmp = CONFIG_PARAM_SW_MAJOR;
ldi R24,2
std y+13,R24
.dbline 243
; break;
rjmp L54
L61:
.dbline 245
; case PARAM_SW_MINOR:
; tmp = CONFIG_PARAM_SW_MINOR;
ldi R24,10
std y+13,R24
.dbline 246
; break;
rjmp L54
L62:
.dbline 248
; case PARAM_SCK_DURATION:
; tmp = clock_speed;
lds R2,_clock_speed
std y+13,R2
.dbline 249
; break;
rjmp L54
L63:
.dbline 251
; case PARAM_RESET_POLARITY:
; tmp = reset_polarity;
lds R2,_reset_polarity
std y+13,R2
.dbline 252
; break;
rjmp L54
L64:
.dbline 254
; case PARAM_CONTROLLER_INIT:
; tmp = param_controller_init;
lds R2,_param_controller_init
std y+13,R2
.dbline 255
; break;
L53:
L54:
.dbline 258
; }
;
; num_bytes = 3;
ldi R24,3
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 259
; msg_buffer[0] = CMD_GET_PARAMETER;
sts _msg_buffer,R24
.dbline 260
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 261
; msg_buffer[2] = tmp;
ldd R0,y+13
sts _msg_buffer+2,R0
.dbline 262
; }
rjmp L52
L51:
.dbline 266
; //////////////////////////////////////
; //CMD_LOAD_ADDRESS
; //////////////////////////////////////
; else if(cmd==CMD_LOAD_ADDRESS)
ldd R24,y+12
cpi R24,6
breq X8
rjmp L70
X8:
.dbline 267
; {
.dbline 268
; address = ((unsigned long)msg_buffer[1])<<24;
ldi R24,24
ldi R25,0
lds R2,_msg_buffer+1
clr R3
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
rcall lsl32
sts _address+1,R17
sts _address,R16
sts _address+2+1,R19
sts _address+2,R18
.dbline 269
; address |= ((unsigned long)msg_buffer[2])<<16;
lds R2,_msg_buffer+2
clr R3
clr R4
clr R5
movw R4,R2
clr R2
clr R3
movw R6,R16
movw R8,R18
or R6,R2
or R7,R3
or R8,R4
or R9,R5
sts _address+1,R7
sts _address,R6
sts _address+2+1,R9
sts _address+2,R8
.dbline 270
; address |= ((unsigned long)msg_buffer[3])<<8;
ldi R24,8
ldi R25,0
lds R2,_msg_buffer+3
clr R3
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
rcall lsl32
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
or R2,R16
or R3,R17
or R4,R18
or R5,R19
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 271
; address |= ((unsigned long)msg_buffer[4]);
lds R2,_msg_buffer+4
clr R3
clr R4
clr R5
lds R8,_address+2
lds R9,_address+2+1
lds R6,_address
lds R7,_address+1
or R6,R2
or R7,R3
or R8,R4
or R9,R5
sts _address+1,R7
sts _address,R6
sts _address+2+1,R9
sts _address+2,R8
.dbline 273
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 274
; msg_buffer[0] = CMD_LOAD_ADDRESS;
ldi R24,6
sts _msg_buffer,R24
.dbline 275
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 276
; }
rjmp L71
L70:
.dbline 280
; //////////////////////////////////////
; //CMD_ENTER_PROGMODE_ISP
; //////////////////////////////////////
; else if(cmd==CMD_ENTER_PROGMODE_ISP)
ldd R24,y+12
cpi R24,16
breq X9
rjmp L77
X9:
.dbline 281
; {
.dbline 294
; //msg_buffer[1] //timeout //Command time-out (in ms)
; //msg_buffer[2] //stabDelay //Delay (in ms) used for pin stabilization
; //msg_buffer[3] //cmdexeDelay //Delay (in ms) in connection with the EnterProgMode command execution
; //msg_buffer[4] //synchLoops //Number of synchronization loops
; //msg_buffer[5] //byteDelay //Delay (in ms) between each byte in the EnterProgMode command.
; //msg_buffer[6] //pollValue //Poll value: 0x53 for AVR, 0x69 for AT89xx
; //msg_buffer[7] //pollIndex //Start address, received byte: 0 = no polling, 3 = AVR, 4 = AT89xx
; //msg_buffer[8] //cmd1 //Command Byte # 1 to be transmitted
; //msg_buffer[9] //cmd2 //Command Byte # 2 to be transmitted
; //msg_buffer[10]//cmd3 //Command Byte # 3 to be transmitted
; //msg_buffer[11]//cmd4 //Command Byte # 4 to be transmitted
;
; prgmode=1;
ldi R24,1
sts _prgmode,R24
.dbline 296
;
; spi_enable();
rcall _spi_enable
.dbline 298
;
; wait_ms(msg_buffer[2]);
lds R16,_msg_buffer+2
clr R17
rcall _wait_ms
.dbline 300
;
; LED_GN_ON;
sbi 0x18,0
.dbline 301
; LED_RT_ON;
sbi 0x18,1
.dbline 304
;
; //Try to get connection with the target chip
; for(i=0;i<msg_buffer[4];i++)
clr R12
clr R13
rjmp L83
L80:
.dbline 305
; {
.dbline 307
; //spi_transfer_16(0xAC53);
; spi_transfer_8(msg_buffer[8]);
lds R16,_msg_buffer+8
rcall _spi_transfer_8
.dbline 308
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 309
; spi_transfer_8(msg_buffer[9]);
lds R16,_msg_buffer+9
rcall _spi_transfer_8
.dbline 310
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 312
;
; if(msg_buffer[7]==3)
lds R24,_msg_buffer+7
cpi R24,3
brne L89
.dbline 313
; {
.dbline 314
; tmp=spi_transfer_8(msg_buffer[10]);
lds R16,_msg_buffer+10
rcall _spi_transfer_8
std y+13,R16
.dbline 315
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 316
; spi_transfer_8(msg_buffer[11]);
lds R16,_msg_buffer+11
rcall _spi_transfer_8
.dbline 317
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 318
; }
rjmp L90
L89:
.dbline 320
; else
; {
.dbline 321
; spi_transfer_8(msg_buffer[10]);
lds R16,_msg_buffer+10
rcall _spi_transfer_8
.dbline 322
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 323
; tmp=spi_transfer_8(msg_buffer[11]);
lds R16,_msg_buffer+11
rcall _spi_transfer_8
std y+13,R16
.dbline 324
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 325
; }
L90:
.dbline 327
;
; if((tmp==msg_buffer[6])||(msg_buffer[7]==0))
lds R2,_msg_buffer+6
ldd R0,y+13
cp R0,R2
breq L104
lds R2,_msg_buffer+7
tst R2
brne L100
L104:
.dbline 328
; {
.dbline 329
; LED_GN_OFF;
ldi R24,-2
ldi R25,-1
in R2,0x18
and R2,R24
out 0x18,R2
.dbline 330
; LED_RT_ON;
sbi 0x18,1
.dbline 331
; i=0xFF;
ldi R24,255
ldi R25,0
movw R12,R24
.dbline 332
; break;
rjmp L82
L100:
.dbline 335
rcall _spi_clock_pulse
.dbline 336
L81:
.dbline 304
movw R24,R12
adiw R24,1
movw R12,R24
L83:
.dbline 304
lds R2,_msg_buffer+4
clr R3
cp R12,R2
cpc R13,R3
brsh X10
rjmp L80
X10:
L82:
.dbline 338
; }
;
; spi_clock_pulse();
; }
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 339
; msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
ldi R24,16
sts _msg_buffer,R24
.dbline 341
;
; if(i==0xFF)
movw R24,R12
cpi R24,255
ldi R30,0
cpc R25,R30
brne L105
.dbline 342
; {
.dbline 343
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 344
; }
rjmp L78
L105:
.dbline 346
; else
; {
.dbline 347
; msg_buffer[1] = STATUS_CMD_FAILED;
ldi R24,192
sts _msg_buffer+1,R24
.dbline 348
; }
.dbline 349
; }
rjmp L78
L77:
.dbline 353
; //////////////////////////////////////
; //CMD_LEAVE_PROGMODE_ISP
; //////////////////////////////////////
; else if(cmd==CMD_LEAVE_PROGMODE_ISP)
ldd R24,y+12
cpi R24,17
brne L109
.dbline 354
; {
.dbline 355
; prgmode=0;
clr R2
sts _prgmode,R2
.dbline 357
;
; spi_disable();
rcall _spi_disable
.dbline 359
;
; LED_RT_OFF;
ldi R24,-3
ldi R25,-1
in R2,0x18
and R2,R24
out 0x18,R2
.dbline 360
; LED_GN_ON;
sbi 0x18,0
.dbline 362
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 363
; msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
ldi R24,17
sts _msg_buffer,R24
.dbline 364
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 365
; }
rjmp L110
L109:
.dbline 369
; //////////////////////////////////////
; //CMD_CHIP_ERASE_ISP
; //////////////////////////////////////
; else if(cmd==CMD_CHIP_ERASE_ISP)
ldd R24,y+12
cpi R24,18
brne L112
.dbline 370
; {
.dbline 371
; spi_transfer_8(msg_buffer[3]);
lds R16,_msg_buffer+3
rcall _spi_transfer_8
.dbline 372
; spi_transfer_8(msg_buffer[4]);
lds R16,_msg_buffer+4
rcall _spi_transfer_8
.dbline 373
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
rcall _spi_transfer_8
.dbline 374
; spi_transfer_8(msg_buffer[6]);
lds R16,_msg_buffer+6
rcall _spi_transfer_8
.dbline 378
;
; //Newer AVR's seems to have a busy bit
; //cant test this because I don't have any of these new chips
; if(msg_buffer[2]==0)
lds R2,_msg_buffer+2
tst R2
brne L123
.dbline 379
; {
.dbline 380
; wait_ms(msg_buffer[1]);
lds R16,_msg_buffer+1
clr R17
rcall _wait_ms
.dbline 381
; }
rjmp L119
X5:
.dbline 383
; else //if(msg_buffer[2]==1)
; {
L122:
.dbline 384
L123:
.dbline 384
; while(spi_transfer_32(0xF0000000)&1);
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,240
rcall _spi_transfer_32
sbrc R16,0
rjmp L122
.dbline 385
; }
L119:
.dbline 387
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 388
; msg_buffer[0] = CMD_CHIP_ERASE_ISP;
ldi R24,18
sts _msg_buffer,R24
.dbline 389
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 390
; }
rjmp L113
L112:
.dbline 394
; //////////////////////////////////////
; //CMD_PROGRAM_FLASH_ISP
; //////////////////////////////////////
; else if(cmd==CMD_PROGRAM_FLASH_ISP)
ldd R24,y+12
cpi R24,19
breq X11
rjmp L126
X11:
.dbline 395
; {
.dbline 396
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R10,_msg_buffer+1
clr R11
mov R11,R10
clr R10
.dbline 397
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
or R10,R2
or R11,R3
.dbline 398
; mode = msg_buffer[3];
lds R14,_msg_buffer+3
.dbline 401
;
; //Word Mode
; if((mode&1) == 0)
sbrc R14,0
rjmp L131
.dbline 402
; {
.dbline 403
; for(i=0;i<block_size;i++)
clr R12
clr R13
rjmp L136
L133:
.dbline 404
; {
.dbline 407
; //If we have an uneven byte programm the
; //high byte
; if(i&1)
sbrs R12,0
rjmp L137
.dbline 408
; {
.dbline 409
; spi_transfer_8(msg_buffer[5]|(1<<3));
lds R16,_msg_buffer+5
ori R16,8
rcall _spi_transfer_8
.dbline 410
; }
rjmp L138
L137:
.dbline 412
; else
; {
.dbline 413
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
rcall _spi_transfer_8
.dbline 414
; }
L138:
.dbline 416
;
; spi_transfer_16(address&0xFFFF);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
rcall _spi_transfer_16
.dbline 417
; spi_transfer_8(msg_buffer[i+10]);
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _spi_transfer_8
.dbline 420
;
; //Check if we can do polling
; if(msg_buffer[8]!=msg_buffer[i+10])
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R2,z+0
lds R3,_msg_buffer+8
cp R3,R2
breq L141
.dbline 421
; {
.dbline 422
; polling_address = address&0xFFFF;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -