📄 stk500i.lst
字号:
(0343) msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
0340 E180 LDI R24,0x10
0341 93800114 STS msg_buffer,R24
(0344)
(0345) if(i==0xFF)
0343 01C6 MOVW R24,R12
0344 3F8F CPI R24,0xFF
0345 E0E0 LDI R30,0
0346 079E CPC R25,R30
0347 F421 BNE 0x034C
(0346) {
(0347) msg_buffer[1] = STATUS_CMD_OK;
0348 2422 CLR R2
0349 92200115 STS msg_buffer+1,R2
(0348) }
034B C579 RJMP 0x08C5
(0349) else
(0350) {
(0351) msg_buffer[1] = STATUS_CMD_FAILED;
034C EC80 LDI R24,0xC0
034D 93800115 STS msg_buffer+1,R24
(0352) }
(0353) }
034F C575 RJMP 0x08C5
(0354) //////////////////////////////////////
(0355) //CMD_LEAVE_PROGMODE_ISP
(0356) //////////////////////////////////////
(0357) else if(cmd==CMD_LEAVE_PROGMODE_ISP)
0350 858C LDD R24,Y+12
0351 3181 CPI R24,0x11
0352 F4A9 BNE 0x0368
(0358) {
(0359) prgmode=0;
0353 2422 CLR R2
0354 92200110 STS prgmode,R2
(0360)
(0361) spi_disable();
0356 D5D5 RCALL _spi_disable
(0362)
(0363) LED_RT_OFF;
0357 EF8D LDI R24,0xFD
0358 EF9F LDI R25,0xFF
0359 B025 IN R2,0x05
035A 2228 AND R2,R24
035B B825 OUT 0x05,R2
(0364) LED_GN_ON;
035C 9A28 SBI 0x05,0
(0365)
(0366) num_bytes = 2;
035D E082 LDI R24,2
035E E090 LDI R25,0
035F 879B STD Y+11,R25
0360 878A STD Y+10,R24
(0367) msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
0361 E181 LDI R24,0x11
0362 93800114 STS msg_buffer,R24
(0368) msg_buffer[1] = STATUS_CMD_OK;
0364 2422 CLR R2
0365 92200115 STS msg_buffer+1,R2
(0369) }
0367 C55D RJMP 0x08C5
(0370) //////////////////////////////////////
(0371) //CMD_CHIP_ERASE_ISP
(0372) //////////////////////////////////////
(0373) else if(cmd==CMD_CHIP_ERASE_ISP)
0368 858C LDD R24,Y+12
0369 3182 CPI R24,0x12
036A F539 BNE 0x0392
(0374) {
(0375) spi_transfer_8(msg_buffer[3]);
036B 91000117 LDS R16,msg_buffer+3
036D D62D RCALL _spi_transfer_8
(0376) spi_transfer_8(msg_buffer[4]);
036E 91000118 LDS R16,0x118
0370 D62A RCALL _spi_transfer_8
(0377) spi_transfer_8(msg_buffer[5]);
0371 91000119 LDS R16,0x119
0373 D627 RCALL _spi_transfer_8
(0378) spi_transfer_8(msg_buffer[6]);
0374 9100011A LDS R16,0x11A
0376 D624 RCALL _spi_transfer_8
(0379)
(0380) //Newer AVR's seems to have a busy bit
(0381) //cant test this because I don't have any of these new chips
(0382) if(msg_buffer[2]==0)
0377 90200116 LDS R2,msg_buffer+2
0379 2022 TST R2
037A F429 BNE 0x0380
(0383) {
(0384) wait_ms(msg_buffer[1]);
037B 91000115 LDS R16,msg_buffer+1
037D 2711 CLR R17
037E DCD5 RCALL _wait_ms
(0385) }
037F C007 RJMP 0x0387
(0386) else //if(msg_buffer[2]==1)
(0387) {
(0388) while(spi_transfer_32(0xF0000000)&1);
0380 E000 LDI R16,0
0381 E010 LDI R17,0
0382 E020 LDI R18,0
0383 EF30 LDI R19,0xF0
0384 D628 RCALL _spi_transfer_32
0385 FD00 SBRC R16,0
0386 CFF9 RJMP 0x0380
(0389) }
(0390)
(0391) num_bytes = 2;
0387 E082 LDI R24,2
0388 E090 LDI R25,0
0389 879B STD Y+11,R25
038A 878A STD Y+10,R24
(0392) msg_buffer[0] = CMD_CHIP_ERASE_ISP;
038B E182 LDI R24,0x12
038C 93800114 STS msg_buffer,R24
(0393) msg_buffer[1] = STATUS_CMD_OK;
038E 2422 CLR R2
038F 92200115 STS msg_buffer+1,R2
(0394) }
0391 C533 RJMP 0x08C5
(0395) //////////////////////////////////////
(0396) //CMD_PROGRAM_FLASH_ISP
(0397) //////////////////////////////////////
(0398) else if(cmd==CMD_PROGRAM_FLASH_ISP)
0392 858C LDD R24,Y+12
0393 3183 CPI R24,0x13
0394 F009 BEQ 0x0396
0395 C1BC RJMP 0x0552
(0399) {
(0400) block_size = ((unsigned int)msg_buffer[1])<<8;
0396 90A00115 LDS R10,msg_buffer+1
0398 24BB CLR R11
0399 2CBA MOV R11,R10
039A 24AA CLR R10
(0401) block_size |= msg_buffer[2];
039B 90200116 LDS R2,msg_buffer+2
039D 2433 CLR R3
039E 28A2 OR R10,R2
039F 28B3 OR R11,R3
(0402) mode = msg_buffer[3];
03A0 90E00117 LDS R14,msg_buffer+3
(0403)
(0404) //Word Mode
(0405) if((mode&1) == 0)
03A2 FCE0 SBRC R14,0
03A3 C0A2 RJMP 0x0446
(0406) {
(0407) for(i=0;i<block_size;i++)
03A4 24CC CLR R12
03A5 24DD CLR R13
03A6 C09A RJMP 0x0441
(0408) {
(0409) //If we have an uneven byte programm the
(0410) //high byte
(0411) if(i&1)
03A7 FEC0 SBRS R12,0
03A8 C005 RJMP 0x03AE
(0412) {
(0413) spi_transfer_8(msg_buffer[5]|(1<<3));
03A9 91000119 LDS R16,0x119
03AB 6008 ORI R16,0x8
03AC D5EE RCALL _spi_transfer_8
(0414) }
03AD C003 RJMP 0x03B1
(0415) else
(0416) {
(0417) spi_transfer_8(msg_buffer[5]);
03AE 91000119 LDS R16,0x119
03B0 D5EA RCALL _spi_transfer_8
(0418) }
(0419)
(0420) spi_transfer_16(address&0xFFFF);
03B1 EF4F LDI R20,0xFF
03B2 EF5F LDI R21,0xFF
03B3 E060 LDI R22,0
03B4 E070 LDI R23,0
03B5 9040010E LDS R4,address+2
03B7 9050010F LDS R5,address+3
03B9 9020010C LDS R2,address
03BB 9030010D LDS R3,address+1
03BD 2224 AND R2,R20
03BE 2235 AND R3,R21
03BF 2246 AND R4,R22
03C0 2257 AND R5,R23
03C1 0181 MOVW R16,R2
03C2 D5DE RCALL _spi_transfer_16
(0421) spi_transfer_8(msg_buffer[i+10]);
03C3 E184 LDI R24,0x14
03C4 E091 LDI R25,1
03C5 01F6 MOVW R30,R12
03C6 963A ADIW R30,0xA
03C7 0FE8 ADD R30,R24
03C8 1FF9 ADC R31,R25
03C9 8100 LDD R16,Z+0
03CA D5D0 RCALL _spi_transfer_8
(0422)
(0423) //Check if we can do polling
(0424) if(msg_buffer[8]!=msg_buffer[i+10])
03CB E184 LDI R24,0x14
03CC E091 LDI R25,1
03CD 01F6 MOVW R30,R12
03CE 963A ADIW R30,0xA
03CF 0FE8 ADD R30,R24
03D0 1FF9 ADC R31,R25
03D1 8020 LDD R2,Z+0
03D2 9030011C LDS R3,0x11C
03D4 1432 CP R3,R2
03D5 F0B1 BEQ 0x03EC
(0425) {
(0426) polling_address = address&0xFFFF;
03D6 EF4F LDI R20,0xFF
03D7 EF5F LDI R21,0xFF
03D8 E060 LDI R22,0
03D9 E070 LDI R23,0
03DA 9040010E LDS R4,address+2
03DC 9050010F LDS R5,address+3
03DE 9020010C LDS R2,address
03E0 9030010D LDS R3,address+1
03E2 2224 AND R2,R20
03E3 2235 AND R3,R21
03E4 2246 AND R4,R22
03E5 2257 AND R5,R23
03E6 01FE MOVW R30,R28
03E7 8222 STD Z+2,R2
03E8 8233 STD Z+3,R3
03E9 8244 STD Z+4,R4
03EA 8255 STD Z+5,R5
(0427) }
03EB C004 RJMP 0x03F0
(0428) //If not switch the mode hard waiting
(0429) else
(0430) {
(0431) mode = (mode&(~0x0E)) | 0x02;
03EC 2D8E MOV R24,R14
03ED 7F81 ANDI R24,0xF1
03EE 6082 ORI R24,2
03EF 2EE8 MOV R14,R24
(0432) }
(0433)
(0434) //Different polling methods
(0435) //Hard waiting
(0436) if((mode&0x0E) == 0x02)
03F0 2D8E MOV R24,R14
03F1 708E ANDI R24,0xE
03F2 3082 CPI R24,2
03F3 F429 BNE 0x03F9
(0437) {
(0438) wait_ms(msg_buffer[4]);
03F4 91000118 LDS R16,0x118
03F6 2711 CLR R17
03F7 DC5C RCALL _wait_ms
(0439) }
03F8 C02B RJMP 0x0424
(0440) //Data polling
(0441) else if((mode&0x0E) == 0x04)
03F9 2D8E MOV R24,R14
03FA 708E ANDI R24,0xE
03FB 3084 CPI R24,4
03FC F4B9 BNE 0x0414
(0442) {
(0443) do{
(0444) //If we have an uneven byte read the
(0445) //high byte
(0446) if(i&1)
03FD FEC0 SBRS R12,0
03FE C005 RJMP 0x0404
(0447) {
(0448) spi_transfer_8(msg_buffer[7]|(1<<3));
03FF 9100011B LDS R16,0x11B
0401 6008 ORI R16,0x8
0402 D598 RCALL _spi_transfer_8
(0449) }
0403 C003 RJMP 0x0407
(0450) else
(0451) {
(0452) spi_transfer_8(msg_buffer[7]);
0404 9100011B LDS R16,0x11B
0406 D594 RCALL _spi_transfer_8
(0453) }
(0454) spi_transfer_16(polling_address);
0407 01FE MOVW R30,R28
0408 8102 LDD R16,Z+2
0409 8113 LDD R17,Z+3
040A D596 RCALL _spi_transfer_16
(0455) tmp=spi_transfer_8(0x00);
040B 2700 CLR R16
040C D58E RCALL _spi_transfer_8
040D 870D STD Y+13,R16
(0456) }while(tmp==msg_buffer[8]);
040E 9020011C LDS R2,0x11C
0410 840D LDD R0,Y+13
0411 1402 CP R0,R2
0412 F351 BEQ 0x03FD
(0457) }
0413 C010 RJMP 0x0424
(0458) //RDY/BSY polling
(0459) else if((mode&0x0E) == 0x08)
0414 2D8E MOV R24,R14
0415 708E ANDI R24,0xE
0416 3088 CPI R24,0x8
0417 F441 BNE 0x0420
(0460) {
(0461) while(spi_transfer_32(0xF0000000)&1);
0418 E000 LDI R16,0
0419 E010 LDI R17,0
041A E020 LDI R18,0
041B EF30 LDI R19,0xF0
041C D590 RCALL _spi_transfer_32
041D FD00 SBRC R16,0
041E CFF9 RJMP 0x0418
(0462) }
041F C004 RJMP 0x0424
(0463) //If something was not correct with the given mode do
(0464) //hard waiting. Should never reach this point
(0465) else
(0466) {
(0467) wait_ms(msg_buffer[4]);
0420 91000118 LDS R16,0x118
0422 2711 CLR R17
0423 DC30 RCALL _wait_ms
(0468) }
(0469)
(0470) //increment (word) address only when we have an uneven (byte) address
(0471) if(i&1) address++;
0424 FEC0 SBRS R12,0
0425 C018 RJMP 0x043E
0426 E041 LDI R20,1
0427 E050 LDI R21,0
0428 E060 LDI R22,0
0429 E070 LDI R23,0
042A 9040010E LDS R4,address+2
042C 9050010F LDS R5,address+3
042E 9020010C LDS R2,address
0430 9030010D LDS R3,address+1
0432 0E24 ADD R2,R20
0433 1E35 ADC R3,R21
0434 1E46 ADC R4,R22
0435 1E57 ADC R5,R23
0436 9230010D STS address+1,R3
0438 9220010C STS address,R2
043A 9250010F STS address+3,R5
043C 9240010E STS address+2,R4
043E 01C6 MOVW R24,R12
043F 9601 ADIW R24,1
0440 016C MOVW R12,R24
0441 14CA CP R12,R10
0442 04DB CPC R13,R11
0443 F408 BCC 0x0445
0444 CF62 RJMP 0x03A7
(0472) }
(0473) }
0445 C101 RJMP 0x0547
(0474) //Page Mode
(0475) else
(0476) {
(0477) for(i=0;i<block_size;i++)
0446 24CC CLR R12
0447 24DD CLR R13
0448 C081 RJMP 0x04CA
(0478) {
(0479) //If we have an uneven byte programm the
(0480) //high byte
(0481) if(i&1)
0449 FEC0 SBRS R12,0
044A C005 RJMP 0x0450
(0482) {
(0483) spi_transfer_8(msg_buffer[5]|(1<<3));
044B 91000119 LDS R16,0x119
044D 6008 ORI R16,0x8
044E D54C RCALL _spi_transfer_8
(0484) }
044F C003 RJMP 0x0453
(0485) else
(0486) {
(0487) spi_transfer_8(msg_buffer[5]);
0450 91000119 LDS R16,0x119
0452 D548 RCALL _spi_transfer_8
(0488) }
(0489)
(0490) spi_transfer_16(address&0xFFFF);
0453 EF4F LDI R20,0xFF
0454 EF5F LDI R21,0xFF
0455 E060 LDI R22,0
0456 E070 LDI R23,0
0457 9040010E LDS R4,address+2
0459 9050010F LDS R5,address+3
045B 9020010C LDS R2,address
045D 9030010D LDS R3,address+1
045F 2224 AND R2,R20
0460 2235 AND R3,R21
0461 2246 AND R4,R22
0462 2257 AND R5,R23
0463 0181 MOVW R16,R2
0464 D53C RCALL _spi_transfer_16
(0491) spi_transfer_8(msg_buffer[i+10]);
0465 E184 LDI R24,0x14
0466 E091 LDI R25,1
0467 01F6 MOVW R30,R12
0468 963A ADIW R30,0xA
0469 0FE8 ADD R30,R24
046A 1FF9 ADC R31,R25
046B 8100 LDD R16,Z+0
046C D52E RCALL _spi_transfer_8
(0492)
(0493) //Check if we can do polling
(0494) if(msg_buffer[8]!=msg_buffer[i+10])
046D E184 LDI R24,0x14
046E E091 LDI R25,1
046F 01F6 MOVW R30,R12
0470 963A ADIW R30,0xA
0471 0FE8 ADD R30,R24
0472 1FF9 ADC R31,R25
0473 8020 LDD R2,Z+0
0474 9030011C LDS R3,0x11C
0476 1432 CP R3,R2
0477 F409 BNE 0x0479
0478 C034 RJMP 0x04AD
(0495) {
(0496) //We have to check if we have an uneven byte.
(0497) //Set the polling address to a byte address
(0498) //so that we can poll the right location
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -