📄 isojtag_avr910_3.4.s
字号:
w6:
cpi u_data,0x79 // 'y' Clear LED (ignored)
brne w7
rcall getc // ignore data byte
sbi LEDPORT,LEDBIT
rjmp put_ret
//**** Enter Programming Mode ****
// We require that the device code be selected before any of the other commands
w7:
//@@ Changes (V3.0)** V3.3 uses temp2 instead of r16 in V3.0 as temp reg
//r16 is already used for device and caused a bug
push temp2 //Save temp2
ldi ZL,lo8(pm(device_codes)) //Point Z to device code table
ldi ZH,hi8(pm(device_codes))
lsl ZL
rol ZH
w7_lp:
rcall get_codes //Returns device code in dev_code
mov temp2,dev_code
cpi temp2,0xff //Check for end of table
breq device_err //Device code not found
cp temp2,device //Found device code?
breq x_w7_lp //Yes
rjmp w7_lp //Next device code
x_w7_lp:
pop temp2 //Restore temp2
rjmp w72
device_err:
pop temp2 //Restore temp2
rjmp put_err //Goto put_err()//
//@@
w72:
cpi u_data,0x50 // 'P' Enter programming mode
brne w8
rcall spiinit // spiinit()//
rjmp put_ret
//**** Write Program Memory, High Byte ****
w8:
cpi u_data,0x43 // 'C' Write program memory, high byte
brne w9
rcall getc
w81:
ldi s_data,0x48 // wrser(0x48)// // SPI write (byte 1)
rcall wrser
mov s_data,addrh // wrser(addrh)// // SPI write (byte 2)
rcall wrser
mov s_data,addrl // wrser(addrl)// // SPI write (byte 3)
rcall wrser
mov s_data,u_data // wrser(u_data)// // SPI write (byte 4)
rcall wrser
ldi temp1,0x01 // Auto increment address!!!!
clr temp2
add addrl,temp1
adc addrh,temp2
rjmp writeFLASHdelay
//**** Write Program Memory, Low Byte ****
w9:
cpi u_data,0x63 // 'c' Write program memory, low byte
brne w12
rcall getc
ldi s_data,0x40 // wrser(0x40)// // SPI write (byte 1)
rcall wrser
mov s_data,addrh // s_data = addrh//
w91: // }
rcall wrser // wrser(s_data)// // SPI write (byte 2)
mov s_data,addrl // wrser(addrl)// // SPI write (byte 3)
rcall wrser
mov s_data,u_data // wrser(u_data)// // SPI write (byte 4)
rcall wrser
writeFLASHdelay:
//@@ Changes (V3.0)
tst pgm_mode
brne w92 //No delay if page mode (non zero value)
//@@
ldi temp1,0x20 // delay(0x20)// // 24585 cycles delay
rcall delay // // Page mode requires no delay!
w92:
rjmp put_ret // goto reply()//
//**** Read Program Memory ****
w12:
cpi u_data,0x52 // 'R' Read program memory
brne w10 //
ldi s_data,0x28 // wrser(0x28)// // SPI write (byte 1)
rcall wrser
mov s_data,addrh // s_data = addrh//
rcall wrser // wrser(s_data)// // SPI write (byte 2)
mov s_data,addrl // wrser(addrl)// // SPI write (byte 3)
rcall wrser
rcall rdser // putc(rdser())// // Send data (byte 4)
mov u_data,s_data
rcall putc
ldi s_data,0x20 // wrser(0x20)// // SPI write (byte 1)
rcall wrser
mov s_data,addrh // wrser(addrh)// // SPI write (byte 2)
rcall wrser
mov s_data,addrl // wrser(addrl)// // SPI write (byte 3)
rcall wrser
rcall rdser // putc(rdser())// // Send data (byte 4)
mov u_data,s_data
rcall putc
rjmp readaddrinc
//**** Load Address ****
w10:
cpi u_data,0x41 // 'A' Load address
brne w11
rcall getc // addrh = getc()//
mov addrh,u_data
rcall getc // addrl = getc()//
mov addrl,u_data
rjmp put_ret // goto reply()//
//**** Write Data Memory ****
w11:
cpi u_data,0x44 // 'D' Write data memory
brne w13
rcall getc
ldi s_data,0xc0
rcall wrser
mov s_data,addrh
rcall wrser
mov s_data,addrl
rcall wrser
mov s_data,u_data
rcall wrser
ldi temp1,0x20
rcall delay
ldi temp1,0x01 // Auto increment address!!!!
clr temp2
add addrl,temp1
adc addrh,temp2
rjmp put_ret
//**** Read Data Memory ****
w13:
cpi u_data,0x64 // 'd' Read data memory
brne w14
ldi s_data,0xa0 // wrser(0xA0)// // SPI write (byte 1)
rcall wrser
mov s_data,addrh // s_data = addrh//
rcall wrser // wrser(s_data)// // SPI write (byte 2)
mov s_data,addrl // wrser(addrl)// // SPI write (byte 3)
rcall wrser
rcall rdser // putc(rdser())// // Send data (byte 4)
mov u_data,s_data
rcall putc
readaddrinc:
ldi temp1,0x01 // Auto increment address!!!!
clr temp2
add addrl,temp1
adc addrh,temp2
rjmp waitcmd // goto waitcmd()//
//**** Leave Programming Mode ****
w14:
cpi u_data,0x4c // 'L' Leave programming mode
brne w15
ldi temp1,(1<<resetpin)
out DDRB,temp1 // PB4 (RESET) is output, the rest is input
set_reset // set RESET = 1
rjmp put_ret
//**** Chip Erase ****
w15:
cpi u_data,0x65 // 'e' Chip erase
brne w16
ldi s_data,0xac
rcall wrser
ldi s_data,0x80
rcall wrser
ldi s_data,0x04
rcall wrser
ldi s_data,0x00
rcall wrser
ldi temp1,0x30
rcall delay
rjmp put_ret
//**** Write Lock Bits ****
w16:
cpi u_data,0x6c // 'l' Write lock bits
brne w17
rcall getc
ldi s_data,0xac
rcall wrser
mov s_data,u_data
andi s_data,0x06
ori s_data,0xe0
rcall wrser
ldi s_data,0x00
rcall wrser
w162:
ldi s_data,0x00
rcall wrser
ldi temp1,0x30
rcall delay
rjmp put_ret
//**** Read Signature Bytes ****
w17:
cpi u_data,0x73 // 's' Read signature bytes
brne w18
ldi param1,0x02
rcall w17call
ldi param1,0x01
rcall w17call
ldi param1,0x00
rcall w17call
rjmp waitcmd
w17call:
ldi s_data,0x30
rcall wrser
ldi s_data,0x00
rcall wrser
mov s_data,param1
rcall wrser
rcall rdser
mov u_data,s_data
rcall putc
ret
//**** Write Program Memory Page ****
w18:
cpi u_data,0x6D // 'm' Write Program Memory Page
brne w19
ldi s_data,0x4c // wrser(0x4c)// // SPI write (byte 1)
rcall wrser
mov s_data,addrh // wrser(addrh)// // SPI write (byte 2)
rcall wrser
mov s_data,addrl // wrser(addrl)// // SPI write (byte 3)
rcall wrser
ldi s_data,0x00 // wrser(0x00)// // SPI write (byte 4)
rcall wrser
ldi temp1,0xff // delay(0xFF)// // 0x20 = 24585 cycles delay
rcall delay
rjmp put_ret
//**** Universal Command ****
w19:
cpi u_data,0x3A // ':' Universal Command
brne w191
rcall getc
mov cmd1,u_data
rcall getc
mov cmd2,u_data
rcall getc
mov cmd3,u_data
clr u_data
rcall NewUniversal
ldi temp1,0xff // delay(0xFF)// // 0x20 = 24585 cycles delay
rcall delay
rjmp put_ret
//**** New Universal Command ****
w191:
cpi u_data,'.' // '.' New Universal Command
brne w99
rcall getc
mov cmd1,u_data
rcall getc
mov cmd2,u_data
rcall getc
mov cmd3,u_data
rcall getc
rcall NewUniversal
ldi temp1,0xff // delay(0xFF)// // 0x20 = 24585 cycles delay
rcall delay
rjmp put_ret
NewUniversal:
mov s_data,cmd1
rcall wrser
mov s_data,cmd2
rcall wrser
mov s_data,cmd3
rcall wrser
mov s_data,u_data
rcall wrser
mov u_data,rd_s_data
rcall putc
ret
w99:
//**** Command Error ****
put_err:
ldi u_data,0x3f // putc('?')// \\ send '?'
rcall putc
rjmp waitcmd
//**** Reply Command ****
put_ret:
ldi u_data,0x0d // putc(0x0D)// \\ send CR
rcall putc
rjmp waitcmd
delay1us: // count R16
nop
cpi temp1,0x03
breq finished
nop
nop
loop:
dec temp1
cpi temp1,0x03
brne loop
finished:
ret
//@@ Changes (V3.0)
//msg_out Output string of ASCII bytes starting at Z
//until end of message ($00)
msg_out:
lpm //read char into r0
mov u_data,r0 //Copy to r20
cpi u_data,0x00 //End of message?
breq END_MSG //Yes
rcall putc //output character
adiw ZL,1
rjmp msg_out
END_MSG:
ret
//get_codes return code in dev_code and program mode in pgm_mode
get_codes:
lpm //Read device code from table
mov dev_code,r0 //Copy to dev_code
adiw ZL,1 //Increment pointer
lpm //Read program mode from table
mov pgm_mode,r0 //Copy to pgm_mode
adiw ZL,1 //Increment pointer
ret
//Programmer ID
ID:
.asciz "AVR ISP"
//Device codes and program mode table (0(zero)=byte mode, <>0=page mode)
//i.e. 'P' can be used for page mode for easier reading.
device_codes:
//AT90S1200 rev. A //From 0x00-0x0f unused yet
.byte 0x10,0
//AT90S1200 rev. B
.byte 0x11,0
//AT90S1200 rev. C
.byte 0x12,0
//AT90S1200
.byte 0x13,0 //From 0x14-0x1f unused yet
//AT90S2313
.byte 0x20,0 //From 0x21-0x27 unused yet
//AT90S4414
.byte 0x28,0 //From 0x29-0x2f unused yet
//AT90S4433
.byte 0x30,0 //From 0x31-0x33 unused yet
//AT90S2333
.byte 0x34,0 //From 0x35-0x37 unused yet
//AT90S8515
.byte 0x38,0 //0x39 unused yet
//ATmega8515
.byte 0x3A,0x01
//ATmega8515 BOOT
.byte 0x3B,0x01 //From 0x3c-0x40 unused yet
//ATmega103
.byte 0x41,0x01
//ATmega603
.byte 0x42,0x01
//ATmega128
.byte 0x43,0x01
//ATmega128 BOOT
.byte 0x44,0x01
//ATmega64
.byte 0x45,0x01 //* v1.40
//ATmega64 BOOT
.byte 0x46,0x01 //* v1.40 0x47 unused yet
//AT90S2323
.byte 0x48,0 //From 0x49-0x4b unused yet
//AT90S2343
.byte 0x4C,0 //From 0x4d-0x4f unused yet
//0x50,0x51 used. From 0x52-0x54 unused yet
//
//ATtiny12
.byte 0x55,0
//ATtiny15
.byte 0x56,0 //0x57 unused yet
//ATtiny19
.byte 0x58,0 //From 0x59-0x5b unused yet
//ATtiny28
.byte 0x5C,0 //0x5d unused yet
//ATtiny26
.byte 0x5E,0x01 //0x5f unused yet
//
//ATmega161
.byte 0x60,0x01
//ATmega161 BOOT
.byte 0x61,0x01 //0x62-0x63 unused yet
//ATmega163
.byte 0x64,0x01
//ATmega83
.byte 0x65,0x01
//ATmega163 BOOT
.byte 0x66,0x01
//ATmega83 BOOT
.byte 0x67,0x01
//AT90S8535
.byte 0x68,0
//ATmega8535
.byte 0x69,0x01 //* v1.40 From 0x6a-0x6b unused yet
//***ATmega8535 BOOT??
// .byte 0x6a,0x01
//
//AT90S4434
.byte 0x6C,0 //From 0x6d-0x6f unused yet
//AT90C8534
.byte 0x70,0
//AT90C8544
.byte 0x71,0
//ATmega32
.byte 0x72,'P'
//ATmega32 BOOT
.byte 0x73,0x01
//ATmega16
.byte 0x74,0x01
//ATmega16 BOOT
.byte 0x75,0x01
//ATmega8
.byte 0x76,0x01
//ATmega8 BOOT
.byte 0x77,0x01
//ATmega169
.byte 0x78,0x01 //* v1.40
//ATmega169 BOOT
.byte 0x79,0x01 //* v1.40 From 0x7a-0x7f unused yet
//test
// .byte 0x08,0x01
// .byte 0x09,0x01
// .byte 0x0a,0x01
// .byte 0x0b,0x01
//These devices are not supported by this hardware
//ATtiny10
// .byte 0x51,0
//ATtiny11
// .byte 0x50,0
//AT89C1051
// .byte 0x80,0
//AT89C2051
// .byte 0x81,0 //From 0x82-0x85 unused yet
//AT89S8252
// .byte 0x86,0
//AT89S53
// .byte 0x87,0 //From 0x88-0x9f unused yet
end_of_device_codes:
.word 0xffff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -