isojtag_avr910_3.8.s
来自「GCC source code for do it yoursel a avr 」· S 代码 · 共 1,955 行 · 第 1/4 页
S
1,955 行
rol ZH
rcall put_string // put hardware version rjmp waitcmd//====== 't' - Show Supported Devices =======================================w3: cpi u_data,'t' // 't' Show supported devices brne w4 //table Dev_S ldi ZL,lo8(pm(Dev_S)) // low ldi ZH,hi8(pm(Dev_S)) // high lsl ZL
rol ZH
rcall put_table // put supported devices codes //table Dev_M ldi ZL,lo8(pm(Dev_M)) // low ldi ZH,hi8(pm(Dev_M)) // high lsl ZL
rol ZH
rcall put_table // put supported devices codes ldi u_data,0x00 // putc(0x00) - end of device list rcall putc rjmp waitcmd//====== 'p' - Return Programmer Type =======================================w4: cpi u_data,'p' // 'p' Return programmer type brne w5 ldi u_data,'S' // putc('S') - serial programmer rcall putc rjmp waitcmd//====== 'a' - Return autoincrement address support =========================w5: cpi u_data,'a' // 'a' Return address auto increment brne w51 ldi u_data,'Y' // putc('Y') - supports autoinc rcall putc rjmp waitcmd//====== 'M' - Return enhanced Mode support (Note 14) ========================w51: // cpi u_data,'M' // 'M' Return enhanced mode Support// brne w52// ldi u_data,'Y' // putc('Y') - supports enhanced Mode// rcall putc// rjmp waitcmd//====== 'i' - Return Chip ID (Note 14) ======================================w52: cpi u_data,'i' // 'i' Return Chip ID brne w53 //table ChipID ldi ZL,lo8(pm(ChipID)) // low ldi ZH,hi8(pm(ChipID)) // high lsl ZL
rol ZH
rcall put_string // put Chip ID string ldi u_data,0x0a // putc(LF) rcall putc rjmp put_ret//====== 'b' - Return Block write Mode support (Note 17) ========================w53: cpi u_data,'b' // 'b' Return enhanced mode Support brne w6 ldi u_data,'Y' // putc('Y') - supports enhanced Mode rcall putc ldi u_data,hi8(pm(BUFSIZE))// putc((BUFSIZE>>8) & 0xff)// rcall putc ldi u_data,lo8(pm(BUFSIZE)) // putc(BUFSIZE&0xff)// rcall putc rjmp waitcmd//====== 'x' - Set LED ======================================================w6: cpi u_data,'x' // 'x' Set LED (LED off or green) brne w61 rcall getc // get parameter set_LED rjmp put_ret//====== 'y' - Clear LED ====================================================w61: cpi u_data,'y' // 'y' Clear LED (LED on or red) brne w7 rcall getc // get parameter clr_LED rjmp put_ret//===========================================================================// We require that the device code be selected before any of the other commandsw7: //table Dev_S // load pointer ldi ZL,lo8(pm(Dev_S)) // low ldi ZH,hi8(pm(Dev_S)) // high lsl ZL
rol ZH
rcall bel_table brcc w71 // device belongs to table //table Dev_M ldi ZL,lo8(pm(Dev_M)) // low ldi ZH,hi8(pm(Dev_M)) // high lsl ZL
rol ZH
rcall bel_table brcc w71 // device belongs to table rjmp put_err // not match, goto put_err()////====== 'P' - Enter Programming Mode =======================================w71: cpi u_data,'P' // 'P' Enter programming mode breq w70 rjmp w8w70: clr_LED // LED on rcall catch_ports // catch ports clr_SCK // clear SCK rcall pas_RESET // set RESET passive ldi temp1,50 // delay 50mS// rcall delay rcall act_RESET // set RESET active ldi temp1,50 // delay 50mS// rcall delay ldi s_data,0xac rcall wrser // wrser(0xac) SPI write (byte 1) ldi s_data,0x53 rcall wrser // wrser(0x53) SPI write (byte 2) // SPI Synchronization (fix!) cpi device,0x20 // if ( (device >= 0x20) && (device <= 0x7F) ) brlo s2 tst device brmi s2 ldi temp3,32 // count = 32//s1: rcall rdser // SPI read (byte 3) cpi s_data,0x53 // if (rdser == 0x53) breq s3 // break ldi s_data,0x00 rcall wrser // wrser(0x00) SPI write (byte 4) rcall pulse_SCK // pulse SCK ldi s_data,0xac rcall wrser // wrser(0xac) SPI write (byte 1) ldi s_data,0x53 rcall wrser // wrser(0x53) SPI write (byte 2) dec temp3 // count-1 brne s1 // loop rjmp s3 // elses2: ldi s_data,0x00 rcall wrser // wrser(0x00) SPI write (byte 3)s3: tst device brmi s4 // S89 device ldi s_data,0x00 rcall wrser // wrser(0x00) SPI write (byte 4)s4: ldi temp1,4 // delay 4mS// rcall delay rjmp put_ret//====== 'c' - Write Program Memory, Low Byte ===============================w8: cpi u_data,'c' // 'c' Write program memory, low byte brne w9 rcall getc // get data bytew8b: ldi s_data,0x40 mov pol_cmd,s_data // save command for polling tst device brmi w81 // S89 device rcall wrser // wrser(0x40) SPI write (byte 1) mov s_data,addrh rjmp w82w81: mov s_data,addrh // s_data = (addrh << 3) | 0x02// rcall shift_s_data3 ori s_data,0x02w82: rcall wrser // wrser(addrh) SPI write (byte 2) mov s_data,addrl rcall wrser // wrser(addrl) SPI write (byte 3) mov s_data,u_data rcall wrser // wrser(u_data) SPI write (byte 4) mov p_data,u_data // save data for polling mov pol_al,addrl // save address for polling mov pol_ah,addrh tst device brpl w83 adiw addrl,1 // Auto increment address for S89 devicew83: rjmp wait_S // write FLASH delay//====== 'C' - Write Program Memory, High Byte ==============================w9: cpi u_data,'C' // 'C' Write program memory, high byte brne w92 rcall getc // get data bytew9a: tst device brmi w91 // S89 device ldi s_data,0x48 mov pol_cmd,s_data // save command for polling rcall wrser // wrser(0x48) SPI write (byte 1) mov s_data,addrh rcall wrser // wrser(addrh) SPI write (byte 2) mov s_data,addrl rcall wrser // wrser(addrl) SPI write (byte 3) mov s_data,u_data // wrser(u_data) SPI write (byte 4) rcall wrser mov p_data,u_data // save data for polling mov pol_al,addrl // save address for polling mov pol_ah,addrh adiw addrl,1 // Auto increment address rjmp wait_S // write FLASH delayw91: rjmp put_err // S89 device have byte wide program memory! //====== 'B' Block Write Memory (see Note 17) ======================w92: cpi u_data,'B' // 'B' Block Write Program Memory breq w92a rjmp w10w92a: rcall getc // get count High Byte tst u_data breq w92b ldi u_data,1 rjmp put_err w92b: rcall getc // get count Low Byte cpi u_data,BUFSIZE+1 // check maximum count brlo w92c ldi u_data,2 rjmp put_errw92c: mov Bcnt1, u_data // ignore BUFSIZE high Byte (must be 0 here) mov Bcnt2, u_data rcall getc // get Memory type to write mov Memtype,u_data // Flag for Memtype clr XH ldi XL, RAMSTART // set X pointer to SRAM beginw93: rcall getc // get data until Bcnt1 is reached st X+, u_data // store data to SRAM dec Bcnt1 brne w93 clr XH ldi XL, RAMSTART // set X pointer to SRAM begin ldi temp3,1 mov B_Mode,temp3 // B_Mode != 0 mov u_data,Memtype // restore Memtype cpi u_data,'F' // 'F' Flash Memory ist to write breq w94a cpi u_data,'E' // 'E' eeprom Memory ist to write breq w94 // Entry Point for Data Memory Block write ldi u_data,3 rjmp put_errw94: // write Data (EEPROM) Memory ld u_data,X+ rcall eeprom_write dec Bcnt2 brne w94 rjmp put_ret//Entry Point for Flash Block writew94a: //table Dev_M ldi ZL,lo8(pm(Dev_M)) // low ldi ZH,hi8(pm(Dev_M)) // high lsl ZL
rol ZH
rcall bel_table brcc w95 // device belongs to table rjmp w96 // not match, goto "non Paged" Modew95: // Entry Point for AVRProg Block Flash write ldi s_data,0x40 // write low byte rcall spi123 ld s_data, X+ rcall wrser // wrser(s_data) SPI write (byte 4) ldi s_data,0x48 // write high byte mov pol_cmd,s_data // save command for polling rcall spi123 ld s_data, X+ mov p_data,s_data // save data for polling mov pol_al,addrl // save address for polling mov pol_ah,addrh rcall wrser // wrser(u_data) SPI write (byte 4) adiw addrl,1 // Auto increment address dec Bcnt2 breq w95b dec Bcnt2 breq w95b tst B_Mode breq w95 // Loop for "Block Mode Commands" see Note 16 dec Bcnt3 // count Bytes for Pagesize brne w95w95b: tst B_Mode brne w95c rjmp put_retw95c: dec Bcnt3 // Bcnt3 will be set correct after write ldi s_data,0x4c // write Memory Page rcall wrser // wrser(0x4c) SPI write (byte 1) mov s_data,pol_ah // last written Adress is in Page to be programmed! rcall wrser // wrser(addrh) SPI write (byte 2) mov s_data,pol_al // last written Adress is in Page to be programmed! rcall wrser // wrser(addrl) SPI write (byte 3) ldi s_data,0x00 rcall wrser // wrser(0x00) SPI write (byte 4) mov Bcnt3,Pagewords // reload Counter für Pagesize rjmp wait_M//#@KL4 test for 89S8252 Devicew96: // Non Page Mode Flash write tst device brmi w96b // S89 device ld p_data, X+ // load byte to Poll data cpi p_data,0xFF // if (p_data == 0xFF) breq w961 // skip burning ldi s_data,0x40 // write low byte mov pol_cmd,s_data // save command for polling rcall spi123 mov s_data,p_data // reload data from Poll data rcall wrser // wrser(s_data) SPI write (byte 4) mov pol_al,addrl // save address for polling mov pol_ah,addrh rcall Bws_polw961: dec Bcnt2 ld p_data, X+ // load byte to Poll data cpi p_data,0xFF // if (p_data == 0xFF) breq w962 ldi s_data,0x48 // write high byte mov pol_cmd,s_data // save command for polling rcall spi123 mov s_data,p_data // reload data from Poll data rcall wrser // wrser(u_data) SPI write (byte 4)w96a: mov pol_al,addrl // save address for polling mov pol_ah,addrh rcall Bws_polw962: adiw addrl,1 // Auto increment address dec Bcnt2 brne w96 rjmp put_ret // replyw96b: // Code for 89S8252// ldi s_data,0x40// mov pol_cmd,s_data // save command for polling mov s_data,addrh // s_data = (addrh << 3) | 0x02// rcall shift_s_data3 ori s_data,0x02 rcall wrser // wrser(addrh) SPI write (byte 1) mov s_data,addrl rcall wrser // wrser(addrl) SPI write (byte 2) ld s_data, X+ mov p_data,s_data // save data for polling rcall wrser // wrser(u_data) SPI write (byte 3) rjmp w96a//====== 'R' - Read Program Memory ==========================================w10: cpi u_data,'R' // 'R' Read program memory brne w10B tst device brmi rpm1 // S89 device ldi s_data,0x28 // read high Byte (order is different from Block Read!) rcall wrser // wrser(0x28) SPI write (byte 1) mov s_data,addrh rjmp rpm2rpm1: mov s_data,addrh // s_data = (addrh << 3) | 0x01// rcall shift_s_data3 ori s_data,0x01rpm2: rcall wrser // wrser(addrh) SPI write (byte 2) mov s_data,addrl rcall wrser // wrser(addrl) SPI write (byte 3) rcall rdser // SPI read (byte 4) mov u_data,s_data rcall putc // send data tst device brmi rpm3 // S89 device ldi s_data,0x20 // read Low Byte rcall wrser // wrser(0x20) SPI write (byte 1) mov s_data,addrh rcall wrser // wrser(addrh) SPI write (byte 2) mov s_data,addrl rcall wrser // wrser(addrl) SPI write (byte 3) rcall rdser // SPI read (byte 4) mov u_data,s_data rcall putc // send datarpm3: adiw addrl,1 // Auto increment address rjmp waitcmd // goto waitcmd()////====== 'g' - Block Read Memory (See Note 17) ======================w10B: cpi u_data,'g' // 'g' Block Read Program Memory brne w11 rcall getc // XH = getc()// mov XH,u_data rcall getc // XL = getc()// mov XL,u_data rcall getc // getc(Memorytype)// cpi u_data,'F' breq w10B2 cpi u_data,'E' breq w10B1 rjmp put_errw10B1: rcall read_send_datamem sbiw XL, 1 brne w10B1 rjmp waitcmd // goto waitcmd()//w10B2: rcall read_send_progmem tst device brmi w10B3 sbiw XL, 2 brne w10B2 rjmp waitcmdw10B3: sbiw XL, 1 brne w10B2 rjmp waitcmd // goto waitcmd()////====== 'A' - Load Address =================================================w11: cpi u_data,'A' // 'A' Load address brne w12 rcall getc // addrh = getc()// mov addrh,u_data rcall getc // addrl = getc()// mov addrl,u_data rjmp put_ret // goto reply()////====== 'D' - Write Data Memory ============================================w12: cpi u_data,'D' // 'D' Write data memory brne w13 rcall getc // get data rcall eeprom_write rjmp put_ret//====== 'd' - Read Data Memory =============================================w13: cpi u_data,'d' // 'd' Read data memory brne w14 rcall read_send_datamem rjmp waitcmd // goto waitcmd()////====== 'L' - Leave Programming Mode =======================================w14: cpi u_data,'L' // 'L' Leave programming mode brne w142w141: rcall pas_RESET // set RESET passive rcall release_ports // release ports set_LED // LED off rjmp put_ret//====== 'E' - Exit , release all Ports, inhibit AVR910 =====================w142:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?