📄 stk500_isp.lst
字号:
38F 9330 0070 STS address+3,R19
391 9320 006F STS address+2,R18
(0300) address |= ((unsigned long)msg_buffer[2])<<16;
393 9020 0077 LDS R2,msg_buffer+2
395 2433 CLR R3
396 2444 CLR R4
397 2455 CLR R5
398 0121 MOVW R4,R2
399 2422 CLR R2
39A 2433 CLR R3
39B 0138 MOVW R6,R16
39C 0149 MOVW R8,R18
39D 2862 OR R6,R2
39E 2873 OR R7,R3
39F 2884 OR R8,R4
3A0 2895 OR R9,R5
3A1 9270 006E STS address+1,R7
3A3 9260 006D STS address,R6
3A5 9290 0070 STS address+3,R9
3A7 9280 006F STS address+2,R8
(0301) address |= ((unsigned long)msg_buffer[3])<<8;
3A9 E088 LDI R24,0x8
3AA E090 LDI R25,0
3AB 9100 0078 LDS R16,msg_buffer+3
3AD 2711 CLR R17
3AE 2722 CLR R18
3AF 2733 CLR R19
3B0 938A ST R24,-Y
3B1 940E 0B3A CALL lsl32
3B3 9040 006F LDS R4,address+2
3B5 9050 0070 LDS R5,address+3
3B7 9020 006D LDS R2,address
3B9 9030 006E LDS R3,address+1
3BB 2A20 OR R2,R16
3BC 2A31 OR R3,R17
3BD 2A42 OR R4,R18
3BE 2A53 OR R5,R19
3BF 9230 006E STS address+1,R3
3C1 9220 006D STS address,R2
3C3 9250 0070 STS address+3,R5
3C5 9240 006F STS address+2,R4
(0302) address |= ((unsigned long)msg_buffer[4]);
3C7 9020 0079 LDS R2,0x0079
3C9 2433 CLR R3
3CA 2444 CLR R4
3CB 2455 CLR R5
3CC 9080 006F LDS R8,address+2
3CE 9090 0070 LDS R9,address+3
3D0 9060 006D LDS R6,address
3D2 9070 006E LDS R7,address+1
3D4 2862 OR R6,R2
3D5 2873 OR R7,R3
3D6 2884 OR R8,R4
3D7 2895 OR R9,R5
3D8 9270 006E STS address+1,R7
3DA 9260 006D STS address,R6
3DC 9290 0070 STS address+3,R9
3DE 9280 006F STS address+2,R8
(0303)
(0304) num_bytes = 2;
3E0 E082 LDI R24,2
3E1 E090 LDI R25,0
3E2 015C MOVW R10,R24
(0305) msg_buffer[0] = CMD_LOAD_ADDRESS;
3E3 E086 LDI R24,6
3E4 9380 0075 STS msg_buffer,R24
(0306) msg_buffer[1] = STATUS_CMD_OK;
3E6 2422 CLR R2
3E7 9220 0076 STS msg_buffer+1,R2
(0307) }
3E9 C6E4 RJMP 0x0ACE
(0308) //////////////////////////////////////
(0309) //CMD_ENTER_PROGMODE_ISP
(0310) //////////////////////////////////////
(0311) else if (cmd==CMD_ENTER_PROGMODE_ISP)
3EA 858A LDD R24,Y+10
3EB 3180 CPI R24,0x10
3EC F009 BEQ 0x03EE
3ED C07F RJMP 0x046D
(0312) {
(0313) //msg_buffer[1] //timeout //Command time-out (in ms)
(0314) //msg_buffer[2] //stabDelay //Delay (in ms) used for pin stabilization
(0315) //msg_buffer[3] //cmdexeDelay //Delay (in ms) in connection with the EnterProgMode command execution
(0316) //msg_buffer[4] //synchLoops //Number of synchronization loops
(0317) //msg_buffer[5] //byteDelay //Delay (in ms) between each byte in the EnterProgMode command.
(0318) //msg_buffer[6] //pollValue //Poll value: 0x53 for AVR, 0x69 for AT89xx
(0319) //msg_buffer[7] //pollIndex //Start address, received byte: 0 = no polling, 3 = AVR, 4 = AT89xx
(0320) //msg_buffer[8] //cmd1 //Command Byte # 1 to be transmitted
(0321) //msg_buffer[9] //cmd2 //Command Byte # 2 to be transmitted
(0322) //msg_buffer[10]//cmd3 //Command Byte # 3 to be transmitted
(0323) //msg_buffer[11]//cmd4 //Command Byte # 4 to be transmitted
(0324)
(0325) prgmode=1;
3EE E081 LDI R24,1
3EF 9380 0071 STS prgmode,R24
(0326)
(0327) spi_enable();
3F1 940E 0093 CALL _spi_enable
(0328)
(0329) wait_ms(msg_buffer[2]);
3F3 9100 0077 LDS R16,msg_buffer+2
3F5 2711 CLR R17
3F6 940E 01E4 CALL _wait_ms
(0330)
(0331) LED_GN_ON;
3F8 9A92 SBI 0x12,2
(0332) LED_RT_ON;
3F9 9A93 SBI 0x12,3
(0333)
(0334) //Try to get connection with the target chip
(0335) for (i=0;i<msg_buffer[4];i++)
3FA 24CC CLR R12
3FB 24DD CLR R13
3FC C056 RJMP 0x0453
(0336) {
(0337) //spi_transfer_16(0xAC53);
(0338) spi_transfer_8(msg_buffer[8]);
3FD 9100 007D LDS R16,0x007D
3FF 940E 0125 CALL _spi_transfer_8
(0339) wait_ms(msg_buffer[5]);
401 9100 007A LDS R16,0x007A
403 2711 CLR R17
404 940E 01E4 CALL _wait_ms
(0340) spi_transfer_8(msg_buffer[9]);
406 9100 007E LDS R16,0x007E
408 940E 0125 CALL _spi_transfer_8
(0341) wait_ms(msg_buffer[5]);
40A 9100 007A LDS R16,0x007A
40C 2711 CLR R17
40D 940E 01E4 CALL _wait_ms
(0342)
(0343) if (msg_buffer[7]==3)
40F 9180 007C LDS R24,0x007C
411 3083 CPI R24,3
412 F4A1 BNE 0x0427
(0344) {
(0345) tmp=spi_transfer_8(msg_buffer[10]);
413 9100 007F LDS R16,0x007F
415 940E 0125 CALL _spi_transfer_8
417 2EE0 MOV R14,R16
(0346) wait_ms(msg_buffer[5]);
418 9100 007A LDS R16,0x007A
41A 2711 CLR R17
41B 940E 01E4 CALL _wait_ms
(0347) spi_transfer_8(msg_buffer[11]);
41D 9100 0080 LDS R16,0x0080
41F 940E 0125 CALL _spi_transfer_8
(0348) wait_ms(msg_buffer[5]);
421 9100 007A LDS R16,0x007A
423 2711 CLR R17
424 940E 01E4 CALL _wait_ms
(0349) }
426 C015 RJMP 0x043C
(0350) else
(0351) {
(0352) spi_transfer_8(msg_buffer[10]);
427 9100 007F LDS R16,0x007F
429 940E 0125 CALL _spi_transfer_8
(0353) wait_ms(msg_buffer[5]);
42B 9100 007A LDS R16,0x007A
42D 2711 CLR R17
42E 940E 01E4 CALL _wait_ms
(0354) tmp=spi_transfer_8(msg_buffer[11]);
430 9100 0080 LDS R16,0x0080
432 940E 0125 CALL _spi_transfer_8
434 871F STD Y+15,R17
435 870E STD Y+14,R16
436 0178 MOVW R14,R16
(0355) wait_ms(msg_buffer[5]);
437 9100 007A LDS R16,0x007A
439 2711 CLR R17
43A 940E 01E4 CALL _wait_ms
(0356) }
(0357)
(0358) if ((tmp==msg_buffer[6])||(msg_buffer[7]==0))
43C 9020 007B LDS R2,0x007B
43E 14E2 CP R14,R2
43F F021 BEQ 0x0444
440 9020 007C LDS R2,0x007C
442 2022 TST R2
443 F451 BNE 0x044E
(0359) {
(0360) LED_GN_OFF;
444 EF8B LDI R24,0xFB
445 EF9F LDI R25,0xFF
446 B222 IN R2,0x12
447 2228 AND R2,R24
448 BA22 OUT 0x12,R2
(0361) LED_RT_ON;
449 9A93 SBI 0x12,3
(0362) i=0xFF;
44A EF8F LDI R24,0xFF
44B E090 LDI R25,0
44C 016C MOVW R12,R24
(0363) break;
44D C00C RJMP 0x045A
(0364) }
(0365)
(0366) spi_clock_pulse();
44E 940E 0110 CALL _spi_clock_pulse
450 01C6 MOVW R24,R12
451 9601 ADIW R24,1
452 016C MOVW R12,R24
453 9020 0079 LDS R2,0x0079
455 2433 CLR R3
456 14C2 CP R12,R2
457 04D3 CPC R13,R3
458 F408 BCC 0x045A
459 CFA3 RJMP 0x03FD
(0367) }
(0368)
(0369) num_bytes = 2;
45A E082 LDI R24,2
45B E090 LDI R25,0
45C 015C MOVW R10,R24
(0370) msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
45D E180 LDI R24,0x10
45E 9380 0075 STS msg_buffer,R24
(0371)
(0372) if (i==0xFF)
460 01C6 MOVW R24,R12
461 3F8F CPI R24,0xFF
462 E0E0 LDI R30,0
463 079E CPC R25,R30
464 F421 BNE 0x0469
(0373) {
(0374) msg_buffer[1] = STATUS_CMD_OK;
465 2422 CLR R2
466 9220 0076 STS msg_buffer+1,R2
(0375) }
468 C665 RJMP 0x0ACE
(0376) else
(0377) {
(0378) msg_buffer[1] = STATUS_CMD_FAILED;
469 EC80 LDI R24,0xC0
46A 9380 0076 STS msg_buffer+1,R24
(0379) }
(0380) }
46C C661 RJMP 0x0ACE
(0381) //////////////////////////////////////
(0382) //CMD_LEAVE_PROGMODE_ISP
(0383) //////////////////////////////////////
(0384) else if (cmd==CMD_LEAVE_PROGMODE_ISP)
46D 858A LDD R24,Y+10
46E 3181 CPI R24,0x11
46F F4A9 BNE 0x0485
(0385) {
(0386) prgmode=0;
470 2422 CLR R2
471 9220 0071 STS prgmode,R2
(0387)
(0388) spi_disable();
473 940E 00CA CALL _spi_disable
(0389)
(0390) LED_RT_OFF;
475 EF87 LDI R24,0xF7
476 EF9F LDI R25,0xFF
477 B222 IN R2,0x12
478 2228 AND R2,R24
479 BA22 OUT 0x12,R2
(0391) LED_GN_ON;
47A 9A92 SBI 0x12,2
(0392)
(0393) num_bytes = 2;
47B E082 LDI R24,2
47C E090 LDI R25,0
47D 015C MOVW R10,R24
(0394) msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
47E E181 LDI R24,0x11
47F 9380 0075 STS msg_buffer,R24
(0395) msg_buffer[1] = STATUS_CMD_OK;
481 2422 CLR R2
482 9220 0076 STS msg_buffer+1,R2
(0396) }
484 C649 RJMP 0x0ACE
(0397) //////////////////////////////////////
(0398) //CMD_CHIP_ERASE_ISP
(0399) //////////////////////////////////////
(0400) else if (cmd==CMD_CHIP_ERASE_ISP)
485 858A LDD R24,Y+10
486 3182 CPI R24,0x12
487 F569 BNE 0x04B5
(0401) {
(0402) spi_transfer_8(msg_buffer[3]);
488 9100 0078 LDS R16,msg_buffer+3
48A 940E 0125 CALL _spi_transfer_8
(0403) spi_transfer_8(msg_buffer[4]);
48C 9100 0079 LDS R16,0x0079
48E 940E 0125 CALL _spi_transfer_8
(0404) spi_transfer_8(msg_buffer[5]);
490 9100 007A LDS R16,0x007A
492 940E 0125 CALL _spi_transfer_8
(0405) spi_transfer_8(msg_buffer[6]);
494 9100 007B LDS R16,0x007B
496 940E 0125 CALL _spi_transfer_8
(0406)
(0407) //Newer AVR's seems to have a busy bit
(0408) //cant test this because I don't have any of these new chips
(0409) if (msg_buffer[2]==0)
498 9020 0077 LDS R2,msg_buffer+2
49A 2022 TST R2
49B F431 BNE 0x04A2
(0410) {
(0411) wait_ms(msg_buffer[1]);
49C 9100 0076 LDS R16,msg_buffer+1
49E 2711 CLR R17
49F 940E 01E4 CALL _wait_ms
(0412) }
4A1 C009 RJMP 0x04AB
(0413) else //if(msg_buffer[2]==1)
(0414) {
(0415) while (spi_transfer_32(0xF0000000)&1);
4A2 E000 LDI R16,0
4A3 E010 LDI R17,0
4A4 E020 LDI R18,0
4A5 EF30 LDI R19,0xF0
4A6 940E 017B CALL _spi_transfer_32
4A8 2EC0 MOV R12,R16
4A9 FD00 SBRC R16,0
4AA CFF7 RJMP 0x04A2
(0416) }
(0417)
(0418) num_bytes = 2;
4AB E082 LDI R24,2
4AC E090 LDI R25,0
4AD 015C MOVW R10,R24
(0419) msg_buffer[0] = CMD_CHIP_ERASE_ISP;
4AE E182 LDI R24,0x12
4AF 9380 0075 STS msg_buffer,R24
(0420) msg_buffer[1] = STATUS_CMD_OK;
4B1 2422 CLR R2
4B2 9220 0076 STS msg_buffer+1,R2
(0421) }
4B4 C619 RJMP 0x0ACE
(0422) //////////////////////////////////////
(0423) //CMD_PROGRAM_FLASH_ISP
(0424) //////////////////////////////////////
(0425) else if (cmd==CMD_PROGRAM_FLASH_ISP)
4B5 858A LDD R24,Y+10
4B6 3183 CPI R24,0x13
4B7 F009 BEQ 0x04B9
4B8 C1F5 RJMP 0x06AE
(0426) {
(0427) block_size = ((unsigned int)msg_buffer[1])<<8;
4B9 9020 0076 LDS R2,msg_buffer+1
4BB 2433 CLR R3
4BC 2C32 MOV R3,R2
4BD 2422 CLR R2
4BE 863F STD Y+15,R3
4BF 862E STD Y+14,R2
(0428) block_size |= msg_buffer[2];
4C0 9020 0077 LDS R2,msg_buffer+2
4C2 2433 CLR R3
4C3 840E LDD R0,Y+14
4C4 841F LDD R1,Y+15
4C5 2802 OR R0,R2
4C6 2813 OR R1,R3
4C7 861F STD Y+15,R1
4C8 860E STD Y+14,R0
(0429) mode = msg_buffer[3];
4C9 9020 0078 LDS R2,msg_buffer+3
4CB 862C STD Y+12,R2
(0430)
(0431) //Word Mode
(0432) if ((mode&1) == 0)
4CC 2C02 MOV R0,R2
4CD FC20 SBRC R2,0
4CE C0CA RJMP 0x0599
(0433) {
(0434) for (i=0;i<block_size;i++)
4CF 24EE CLR R14
4D0 24FF CLR R15
4D1 C0C0 RJMP 0x0592
(0435) {
(0436) //If we have an uneven byte programm the
(0437) //high byte
(0438) if (i&1)
4D2 01C7 MOVW R24,R14
4D3 7081 ANDI R24,1
4D4 7090 ANDI R25,0
4D5 016C MOVW R12,R24
4D6 3080 CPI R24,0
4D7 0789 CPC R24,R25
4D8 F031 BEQ 0x04DF
(0439) {
(0440) spi_transfer_8(msg_buffer[5]|(1<<3));
4D9 9100 007A LDS R16,0x007A
4DB 6008 ORI R16,0x8
4DC 940E 0125 CALL _spi_transfer_8
(0441) }
4DE C004 RJMP 0x04E3
(0442) else
(0443) {
(0444) spi_transfer_8(msg_buffer[5]);
4DF 9100 007A LDS R16,0x007A
4E1 940E 0125 CALL _spi_transfer_8
(0445) }
(0446)
(0447) spi_transfer_16(address&0xFFFF);
4E3 EF4F LDI R20,0xFF
4E4 EF5F LDI R21,0xFF
4E5 E060 LDI R22,0
4E6 E070 LDI R23,0
4E7 9040 006F LDS R4,address+2
4E9 9050 0070 LDS R5,address+3
4EB 9020 006D LDS R2,address
4ED 9030 006E LDS R3,address+1
4EF 2224 AND R2,R20
4F0 2235 AND R3,R21
4F1 2246 AND R4,R22
4F2 2257 AND R5,R23
4F3 0181 MOVW R16,R2
4F4 940E 016D CALL _spi_transfer_16
(0448) spi_transfer_8(msg_buffer[i+10]);
4F6 01C7 MOVW R24,R14
4F7 960A ADIW R24,0xA
4F8 8B99 STD Y+17,R25
4F9 8B88 STD Y+16,R24
4FA E785 LDI R24,0x75
4FB E090 LDI R25,0
4FC 89E8 LDD R30,Y+16
4FD 89F9 LDD R31,Y+17
4FE 0FE8 ADD R30,R24
4FF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -