📄 avr-bootloader.lis
字号:
.module AVR-Bootloader.c
.area text(rom, con, rel)
0000 .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
.area lit(rom, con, rel)
0000 _startupString::
0000 506C6561736520707265737320276427 .byte 'P,'l,'e,'a,'s,'e,32,'p,'r,'e,'s,'s,32,39,'d,39
0010 20746F20626F6F746C6F616465722077 .byte 32,'t,'o,32,'b,'o,'o,'t,'l,'o,'a,'d,'e,'r,32,'w
0020 697468696E2033207365636F6E647321 .byte 'i,'t,'h,'i,'n,32,51,32,'s,'e,'c,'o,'n,'d,'s,33
0030 5B456E63727970746564215D0A0D0000 .byte 91,'E,'n,'c,'r,'y,'p,'t,'e,'d,33,93,10,13,0,0
0040 .dbsym e startupString _startupString A[64:64]kc
.area data(ram, con, rel)
0000 .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
0000 _address::
0000 .blkb 4
.area idata
0000 00000000 .word 0,0
.area data(ram, con, rel)
0004 .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
0004 .dbsym e address _address L
.area text(rom, con, rel)
0000 .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
0000 .dbfunc e boot_page_ew _boot_page_ew fV
0000 ; code -> y+4
0000 ; p_address -> y+0
.even
0000 _boot_page_ew::
0000 0E940000 xcall push_arg4
0004 .dbline -1
0004 .dbline 27
0004 ; #include <iom128v.h>
0004 ; #define SPM_PAGESIZE 256
0004 ;
0004 ; #define BAUD_H 0x00
0004 ; #define BAUD_L 0x17
0004 ; #define DATA_BUFFER_SIZE SPM_PAGESIZE
0004 ;
0004 ; //定义Xmodem控制字符
0004 ; #define XMODEM_NUL 0x00
0004 ; #define XMODEM_SOH 0x01
0004 ; #define XMODEM_STX 0x02
0004 ; #define XMODEM_EOT 0x04
0004 ; #define XMODEM_ACK 0x06
0004 ; #define XMODEM_NAK 0x15
0004 ; #define XMODEM_CAN 0x18
0004 ; #define XMODEM_EOF 0x1A
0004 ; #define XMODEM_RECIEVING_WAIT_CHAR 'C'
0004 ;
0004 ; //定义全局变量
0004 ; //const char startupString[]="Type 'd' download,Others run app.\n\r\0";
0004 ; const char startupString[]="Please press 'd' to bootloader within 3 seconds![Encrypted!]\n\r\0";
0004 ; char data[DATA_BUFFER_SIZE];
0004 ; long address=0;
0004 ;
0004 ; //擦除(code==0x03)和写入(code==0x05)一个Flash页
0004 ; void boot_page_ew(long p_address,char code)
0004 ; {
0004 .dbline 28
0004 ; asm("mov r30,r16\n"
0004 E02F mov r30,r16
0006 F12F mov r31,r17
0008 2BBF out 0x3b,r18
000A
000A .dbline 31
000A ; "mov r31,r17\n"
000A ; "out 0x3b,r18\n");
000A ; SPMCSR=code;
000A 0C80 ldd R0,y+4
000C 00926800 sts 104,R0
0010 .dbline 32
0010 ; asm("spm\n");
0010 E895 spm
0012
0012 .dbline -2
0012 L1:
0012 .dbline 0 ; func end
0012 2496 adiw R28,4
0014 0895 ret
0016 .dbsym l code 4 c
0016 .dbsym l p_address 0 L
0016 .dbend
0016 .dbfunc e boot_page_fill _boot_page_fill fV
0016 ; data -> <dead>
0016 ; address -> <dead>
.even
0016 _boot_page_fill::
0016 0E940000 xcall push_arg4
001A .dbline -1
001A .dbline 36
001A ; }
001A ; //填充Flash缓冲页中的一个字
001A ; void boot_page_fill(unsigned int address,int data)
001A ; {
001A .dbline 37
001A ; asm("mov r30,r16\n"
001A E02F mov r30,r16
001C F12F mov r31,r17
001E 022E mov r0,r18
0020 132E mov r1,r19
0022
0022 .dbline 41
0022 ; "mov r31,r17\n"
0022 ; "mov r0,r18\n"
0022 ; "mov r1,r19\n");
0022 ; SPMCSR=0x01;
0022 81E0 ldi R24,1
0024 80936800 sts 104,R24
0028 .dbline 42
0028 ; asm("spm\n");
0028 E895 spm
002A
002A .dbline -2
002A L2:
002A .dbline 0 ; func end
002A 2496 adiw R28,4
002C 0895 ret
002E .dbsym l data 2 I
002E .dbsym l address 0 i
002E .dbend
002E .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
002E _wait_page_rw_ok::
002E .dbline -1
002E .dbline 46
002E ; }
002E ; //等待一个Flash页的写完成
002E ; void wait_page_rw_ok(void)
002E ; {
002E 08C0 xjmp L5
0030 L7:
0030 .dbline 49
0030 ; while(SPMCSR&0x40)
0030 ; {
0030 ; while(SPMCSR&0x01);
0030 L8:
0030 .dbline 49
0030 20906800 lds R2,104
0034 20FC sbrc R2,0
0036 FCCF rjmp L7
0038 X0:
0038 .dbline 50
0038 ; SPMCSR=0x11;
0038 81E1 ldi R24,17
003A 80936800 sts 104,R24
003E .dbline 51
003E ; asm("spm\n");
003E E895 spm
0040
0040 .dbline 52
0040 ; }
0040 L5:
0040 .dbline 47
0040 20906800 lds R2,104
0044 26FC sbrc R2,6
0046 F4CF rjmp L8
0048 X1:
0048 .dbline -2
0048 L3:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbend
004A .dbfunc e de_encryptdata _de_encryptdata fc
004A ; tmpchrL -> R10
004A ; tmpchrH -> R22
004A ; chr -> R20
004A ; i -> R16
.even
004A _de_encryptdata::
004A 0E940000 xcall push_xgsetF00C
004E .dbline -1
004E .dbline 56
004E ; }
004E ; ///对BIN文件的数据进行解密
004E ; char de_encryptdata(char i)
004E ; {
004E .dbline 58
004E ; char chr,tmpchrH,tmpchrL;
004E ; chr=data[i];
004E 80E0 ldi R24,<_data
0050 90E0 ldi R25,>_data
0052 E02F mov R30,R16
0054 FF27 clr R31
0056 E80F add R30,R24
0058 F91F adc R31,R25
005A 4081 ldd R20,z+0
005C .dbline 59
005C ; tmpchrH=0xf0&chr;
005C 642F mov R22,R20
005E 607F andi R22,240
0060 .dbline 60
0060 ; tmpchrL=0x0f&chr;
0060 842F mov R24,R20
0062 8F70 andi R24,15
0064 A82E mov R10,R24
0066 .dbline 61
0066 ; chr=tmpchrH/16+tmpchrL*16;
0066 80E1 ldi R24,16
0068 8A9D mul R24,R10
006A 462F mov R20,R22
006C 4295 swap R20
006E 4F70 andi R20,#0x0F
0070 400D add R20,R0
0072 .dbline 62
0072 ; return (0xff-0x86^chr);
0072 89E7 ldi R24,121
0074 042F mov R16,R20
0076 0827 eor R16,R24
0078 .dbline -2
0078 L10:
0078 .dbline 0 ; func end
0078 0C940000 xjmp pop_xgsetF00C
007C .dbsym r tmpchrL 10 c
007C .dbsym r tmpchrH 22 c
007C .dbsym r chr 20 c
007C .dbsym r i 16 c
007C .dbend
007C .dbfunc e write_one_page _write_one_page fV
007C ; i -> R20,R21
.even
007C _write_one_page::
007C 4A93 st -y,R20
007E 5A93 st -y,R21
0080 2197 sbiw R28,1
0082 .dbline -1
0082 .dbline 66
0082 ; }
0082 ; //更新一个Flash页的完整处理
0082 ; void write_one_page(void)
0082 ; {
0082 .dbline 68
0082 ; int i;
0082 ; boot_page_ew(address,0x03);
0082 83E0 ldi R24,3
0084 8883 std y+0,R24
0086 20910200 lds R18,_address+2
008A 30910300 lds R19,_address+2+1
008E 00910000 lds R16,_address
0092 10910100 lds R17,_address+1
0096 B4DF xcall _boot_page_ew
0098 .dbline 69
0098 ; wait_page_rw_ok();
0098 CADF xcall _wait_page_rw_ok
009A .dbline 70
009A ; for(i=0;i<SPM_PAGESIZE;i+=2)
009A 4427 clr R20
009C 5527 clr R21
009E L12:
009E .dbline 71
009E ; {
009E .dbline 72
009E ; boot_page_fill(i,de_encryptdata(i)+(de_encryptdata(i+1)<<8));
009E 042F mov R16,R20
00A0 D4DF xcall _de_encryptdata
00A2 402E mov R4,R16
00A4 042F mov R16,R20
00A6 0F5F subi R16,255 ; offset = 1
00A8 1F4F sbci R17,255
00AA 4F92 push R4
00AC CEDF xcall _de_encryptdata
00AE 4F90 pop R4
00B0 202E mov R2,R16
00B2 3324 clr R3
00B4 322C mov R3,R2
00B6 2224 clr R2
00B8 242D mov R18,R4
00BA 3327 clr R19
00BC 220D add R18,R2
00BE 331D adc R19,R3
00C0 8A01 movw R16,R20
00C2 A9DF xcall _boot_page_fill
00C4 .dbline 73
00C4 ; }
00C4 L13:
00C4 .dbline 70
00C4 4E5F subi R20,254 ; offset = 2
00C6 5F4F sbci R21,255
00C8 .dbline 70
00C8 4030 cpi R20,0
00CA E1E0 ldi R30,1
00CC 5E07 cpc R21,R30
00CE 3CF3 brlt L12
00D0 X2:
00D0 .dbline 74
00D0 ; boot_page_ew(address,0x05);
00D0 85E0 ldi R24,5
00D2 8883 std y+0,R24
00D4 20910200 lds R18,_address+2
00D8 30910300 lds R19,_address+2+1
00DC 00910000 lds R16,_address
00E0 10910100 lds R17,_address+1
00E4 8DDF xcall _boot_page_ew
00E6 .dbline 75
00E6 ; wait_page_rw_ok();
00E6 A3DF xcall _wait_page_rw_ok
00E8 .dbline -2
00E8 L11:
00E8 .dbline 0 ; func end
00E8 2196 adiw R28,1
00EA 5991 ld R21,y+
00EC 4991 ld R20,y+
00EE 0895 ret
00F0 .dbsym r i 20 I
00F0 .dbend
00F0 .dbfunc e uart_putchar _uart_putchar fV
00F0 ; c -> R16
.even
00F0 _uart_putchar::
00F0 .dbline -1
00F0 .dbline 79
00F0 ; }
00F0 ; //从RS232发送1个字节
00F0 ; void uart_putchar(char c)
00F0 ; {
00F0 L17:
00F0 .dbline 80
00F0 ; while(!(UCSR0A&0x20));
00F0 L18:
00F0 .dbline 80
00F0 5D9B sbis 0xb,5
00F2 FECF rjmp L17
00F4 X3:
00F4 .dbline 81
00F4 ; UDR0=c;
00F4 0CB9 out 0xc,R16
00F6 .dbline -2
00F6 L16:
00F6 .dbline 0 ; func end
00F6 0895 ret
00F8 .dbsym r c 16 c
00F8 .dbend
00F8 .dbfunc e uart_getchar _uart_getchar fI
00F8 ; status -> R18
00F8 ; res -> R16
.even
00F8 _uart_getchar::
00F8 .dbline -1
00F8 .dbline 85
00F8 ; }
00F8 ; //从RS232接收1个字节
00F8 ; int uart_getchar(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -