main.s
来自「文档里面的代码是可以正常使用的」· S 代码 · 共 3,673 行 · 第 1/5 页
S
3,673 行
breq L71
.dbline 212
.dbline 213
; eeprom_sck_period = clock_speed;
sts _eeprom_sck_period,R2
.dbline 214
; }
L71:
.dbline 215
; spi_set_speed(clock_speed);
lds R16,_clock_speed
rcall _spi_set_speed
.dbline 216
; break;
rjmp L49
L73:
.dbline 218
; case PARAM_RESET_POLARITY:
; reset_polarity = msg_buffer[2];
lds R2,_msg_buffer+2
sts _reset_polarity,R2
.dbline 219
; break;
rjmp L49
L75:
.dbline 221
; case PARAM_CONTROLLER_INIT:
; param_controller_init = msg_buffer[2];
lds R2,_msg_buffer+2
sts _param_controller_init,R2
.dbline 222
; break;
L48:
L49:
.dbline 225
; }
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 226
; msg_buffer[0] = CMD_SET_PARAMETER;
sts _msg_buffer,R24
.dbline 227
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 228
; }
rjmp L47
L46:
.dbline 232
; //////////////////////////////////////
; //CMD_GET_PARAMETER
; //////////////////////////////////////
; else if(cmd==CMD_GET_PARAMETER)
ldd R24,y+12
cpi R24,3
breq X11
rjmp L79
X11:
.dbline 233
; {
.dbline 234
; switch(msg_buffer[1])
lds R10,_msg_buffer+1
clr R11
movw R24,R10
cpi R24,144
ldi R30,0
cpc R25,R30
breq L87
cpi R24,145
ldi R30,0
cpc R25,R30
breq L88
cpi R24,146
ldi R30,0
cpc R25,R30
breq L89
ldi R24,146
cp R24,R10
cpc R25,R11
brlt L94
L93:
movw R24,R10
cpi R24,128
ldi R30,0
cpc R25,R30
breq L85
cpi R24,129
ldi R30,0
cpc R25,R30
breq L86
rjmp L81
L94:
movw R24,R10
cpi R24,152
ldi R30,0
cpc R25,R30
breq L90
cpi R24,152
ldi R30,0
cpc R25,R30
brlt L81
L95:
movw R24,R10
cpi R24,158
ldi R30,0
cpc R25,R30
breq L91
cpi R24,159
ldi R30,0
cpc R25,R30
breq L92
rjmp L81
X4:
.dbline 235
; {
L85:
.dbline 237
; case PARAM_BUILD_NUMBER_LOW:
; tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
clr R0
std y+13,R0
.dbline 238
; break;
rjmp L82
L86:
.dbline 240
; case PARAM_BUILD_NUMBER_HIGH:
; tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
clr R0
std y+13,R0
.dbline 241
; break;
rjmp L82
L87:
.dbline 243
; case PARAM_HW_VER:
; tmp = CONFIG_PARAM_HW_VER;
ldi R24,15
std y+13,R24
.dbline 244
; break;
rjmp L82
L88:
.dbline 246
; case PARAM_SW_MAJOR:
; tmp = CONFIG_PARAM_SW_MAJOR;
ldi R24,2
std y+13,R24
.dbline 247
; break;
rjmp L82
L89:
.dbline 249
; case PARAM_SW_MINOR:
; tmp = CONFIG_PARAM_SW_MINOR;
ldi R24,10
std y+13,R24
.dbline 250
; break;
rjmp L82
L90:
.dbline 252
; case PARAM_SCK_DURATION:
; tmp = clock_speed;
lds R2,_clock_speed
std y+13,R2
.dbline 253
; break;
rjmp L82
L91:
.dbline 255
; case PARAM_RESET_POLARITY:
; tmp = reset_polarity;
lds R2,_reset_polarity
std y+13,R2
.dbline 256
; break;
rjmp L82
L92:
.dbline 258
; case PARAM_CONTROLLER_INIT:
; tmp = param_controller_init;
lds R2,_param_controller_init
std y+13,R2
.dbline 259
; break;
L81:
L82:
.dbline 262
; }
;
; num_bytes = 3;
ldi R24,3
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 263
; msg_buffer[0] = CMD_GET_PARAMETER;
sts _msg_buffer,R24
.dbline 264
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 265
; msg_buffer[2] = tmp;
ldd R0,y+13
sts _msg_buffer+2,R0
.dbline 266
; }
rjmp L80
L79:
.dbline 270
; //////////////////////////////////////
; //CMD_LOAD_ADDRESS
; //////////////////////////////////////
; else if(cmd==CMD_LOAD_ADDRESS)
ldd R24,y+12
cpi R24,6
breq X12
rjmp L98
X12:
.dbline 271
; {
.dbline 272
; 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 273
; 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 274
; 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 275
; 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 277
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 278
; msg_buffer[0] = CMD_LOAD_ADDRESS;
ldi R24,6
sts _msg_buffer,R24
.dbline 279
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 280
; }
rjmp L99
L98:
.dbline 284
; //////////////////////////////////////
; //CMD_ENTER_PROGMODE_ISP
; //////////////////////////////////////
; else if(cmd==CMD_ENTER_PROGMODE_ISP)
ldd R24,y+12
cpi R24,16
breq X13
rjmp L105
X13:
.dbline 285
; {
.dbline 298
; //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 300
;
; spi_enable();
rcall _spi_enable
.dbline 302
;
; wait_ms(msg_buffer[2]);
lds R16,_msg_buffer+2
clr R17
rcall _wait_ms
.dbline 304
;
; LED_GN_ON;
sbi 0x5,0
.dbline 305
; LED_RT_ON;
sbi 0x5,1
.dbline 308
;
; //Try to get connection with the target chip
; for(i=0;i<msg_buffer[4];i++)
clr R12
clr R13
rjmp L111
L108:
.dbline 309
; {
.dbline 311
; //spi_transfer_16(0xAC53);
; spi_transfer_8(msg_buffer[8]);
lds R16,_msg_buffer+8
rcall _spi_transfer_8
.dbline 312
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 313
; spi_transfer_8(msg_buffer[9]);
lds R16,_msg_buffer+9
rcall _spi_transfer_8
.dbline 314
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 316
;
; if(msg_buffer[7]==3)
lds R24,_msg_buffer+7
cpi R24,3
brne L117
.dbline 317
; {
.dbline 318
; tmp=spi_transfer_8(msg_buffer[10]);
lds R16,_msg_buffer+10
rcall _spi_transfer_8
std y+13,R16
.dbline 319
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 320
; spi_transfer_8(msg_buffer[11]);
lds R16,_msg_buffer+11
rcall _spi_transfer_8
.dbline 321
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 322
; }
rjmp L118
L117:
.dbline 324
; else
; {
.dbline 325
; spi_transfer_8(msg_buffer[10]);
lds R16,_msg_buffer+10
rcall _spi_transfer_8
.dbline 326
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 327
; tmp=spi_transfer_8(msg_buffer[11]);
lds R16,_msg_buffer+11
rcall _spi_transfer_8
std y+13,R16
.dbline 328
; wait_ms(msg_buffer[5]);
lds R16,_msg_buffer+5
clr R17
rcall _wait_ms
.dbline 329
; }
L118:
.dbline 331
;
; if((tmp==msg_buffer[6])||(msg_buffer[7]==0))
lds R2,_msg_buffer+6
ldd R0,y+13
cp R0,R2
breq L132
lds R2,_msg_buffer+7
tst R2
brne L128
L132:
.dbline 332
; {
.dbline 333
; LED_GN_OFF;
ldi R24,-2
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
.dbline 334
; LED_RT_ON;
sbi 0x5,1
.dbline 335
; i=0xFF;
ldi R24,255
ldi R25,0
movw R12,R24
.dbline 336
; break;
rjmp L110
L128:
.dbline 339
rcall _spi_clock_pulse
.dbline 340
L109:
.dbline 308
movw R24,R12
adiw R24,1
movw R12,R24
L111:
.dbline 308
lds R2,_msg_buffer+4
clr R3
cp R12,R2
cpc R13,R3
brsh X14
rjmp L108
X14:
L110:
.dbline 342
; }
;
; spi_clock_pulse();
; }
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 343
; msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
ldi R24,16
sts _msg_buffer,R24
.dbline 345
;
; if(i==0xFF)
movw R24,R12
cpi R24,255
ldi R30,0
cpc R25,R30
brne L133
.dbline 346
; {
.dbline 347
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 348
; }
rjmp L106
L133:
.dbline 350
; else
; {
.dbline 351
; msg_buffer[1] = STATUS_CMD_FAILED;
ldi R24,192
sts _msg_buffer+1,R24
.dbline 352
; }
.dbline 353
; }
rjmp L106
L105:
.dbline 357
; //////////////////////////////////////
; //CMD_LEAVE_PROGMODE_ISP
; //////////////////////////////////////
; else if(cmd==CMD_LEAVE_PROGMODE_ISP)
ldd R24,y+12
cpi R24,17
brne L137
.dbline 358
; {
.dbline 359
; prgmode=0;
clr R2
sts _prgmode,R2
.dbline 361
;
; spi_disable();
rcall _spi_disable
.dbline 363
;
; LED_RT_OFF;
ldi R24,-3
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
.dbline 364
; LED_GN_ON;
sbi 0x5,0
.dbline 366
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 367
; msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
ldi R24,17
sts _msg_buffer,R24
.dbline 368
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 369
; }
rjmp L138
L137:
.dbline 373
; //////////////////////////////////////
; //CMD_CHIP_ERASE_ISP
; //////////////////////////////////////
; else if(cmd==CMD_CHIP_ERASE_ISP)
ldd R24,y+12
cpi R24,18
brne L140
.dbline 374
; {
.dbline 375
; spi_transfer_8(msg_buffer[3]);
lds R16,_msg_buffer+3
rcall _spi_transfer_8
.dbline 376
; spi_transfer_8(msg_buffer[4]);
lds R16,_msg_buffer+4
rcall _spi_transfer_8
.dbline 377
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
rcall _spi_transfer_8
.dbline 378
; spi_transfer_8(msg_buffer[6]);
lds R16,_msg_buffer+6
rcall _spi_transfer_8
.dbline 382
;
; //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 L151
.dbline 383
; {
.dbline 384
; wait_ms(msg_buffer[1]);
lds R16,_msg_buffer+1
clr R17
rcall _wait_ms
.dbline 385
; }
rjmp L147
X5:
.dbline 387
; else //if(msg_buffer[2]==1)
; {
L150:
.dbline 388
L151:
.dbline 388
; 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 L150
.dbline 389
; }
L147:
.dbline 391
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 392
; msg_buffer[0] = CMD_CHIP_ERASE_ISP;
ldi R24,18
sts _msg_buffer,R24
.dbline 393
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 394
; }
rjmp L141
L140:
.dbline 398
; //////////////////////////////////////
; //CMD_PROGRAM_FLASH_ISP
; //////////////////////////////////////
; else if(cmd==CMD_PROGRAM_FLASH_ISP)
ldd R24,y+12
cpi R24,19
breq X15
rjmp L154
X15:
.dbline 399
; {
.dbline 400
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R10,_msg_buffer+1
clr R11
mov R11,R10
clr R10
.dbline 401
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
or R10,R2
or R11,R3
.dbline 402
; mode = msg_buffer[3];
lds R14,_msg_buffer+3
.dbline 405
;
; //Word Mode
; if((mode&1) == 0)
sbrc R14,0
rjmp L159
.dbline 406
; {
.dbline 407
; for(i=0;i<block_size;i++)
clr R12
clr R13
rjmp L164
L161:
.dbline 408
; {
.dbline 411
; //If we have an uneven byte programm the
; //high byte
; if(i&1)
sbrs R12,0
rjmp L165
.dbline 412
; {
.dbline 413
; spi_transfer_8(msg_buffer[5]|(1<<3));
lds R16,_msg_buffer+5
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?