📄 avr-bootloader.s
字号:
.module AVR-Bootloader.c
.area text(rom, con, rel)
.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
.area lit(rom, con, rel)
_startupString::
.byte 'P,'l,'e,'a,'s,'e,32,'p,'r,'e,'s,'s,32,39,'d,39
.byte 32,'t,'o,32,'b,'o,'o,'t,'l,'o,'a,'d,'e,'r,32,'w
.byte 'i,'t,'h,'i,'n,32,51,32,'s,'e,'c,'o,'n,'d,'s,33
.byte 91,'E,'n,'c,'r,'y,'p,'t,'e,'d,33,93,10,13,0,0
.dbsym e startupString _startupString A[64:64]kc
.area data(ram, con, rel)
.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
_address::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
.dbsym e address _address L
.area text(rom, con, rel)
.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
.dbfunc e boot_page_ew _boot_page_ew fV
; code -> y+4
; p_address -> y+0
.even
_boot_page_ew::
xcall push_arg4
.dbline -1
.dbline 27
; #include <iom128v.h>
; #define SPM_PAGESIZE 256
;
; #define BAUD_H 0x00
; #define BAUD_L 0x17
; #define DATA_BUFFER_SIZE SPM_PAGESIZE
;
; //定义Xmodem控制字符
; #define XMODEM_NUL 0x00
; #define XMODEM_SOH 0x01
; #define XMODEM_STX 0x02
; #define XMODEM_EOT 0x04
; #define XMODEM_ACK 0x06
; #define XMODEM_NAK 0x15
; #define XMODEM_CAN 0x18
; #define XMODEM_EOF 0x1A
; #define XMODEM_RECIEVING_WAIT_CHAR 'C'
;
; //定义全局变量
; //const char startupString[]="Type 'd' download,Others run app.\n\r\0";
; const char startupString[]="Please press 'd' to bootloader within 3 seconds![Encrypted!]\n\r\0";
; char data[DATA_BUFFER_SIZE];
; long address=0;
;
; //擦除(code==0x03)和写入(code==0x05)一个Flash页
; void boot_page_ew(long p_address,char code)
; {
.dbline 28
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
out 0x3b,r18
.dbline 31
; "mov r31,r17\n"
; "out 0x3b,r18\n");
; SPMCSR=code;
ldd R0,y+4
sts 104,R0
.dbline 32
; asm("spm\n");
spm
.dbline -2
L1:
.dbline 0 ; func end
adiw R28,4
ret
.dbsym l code 4 c
.dbsym l p_address 0 L
.dbend
.dbfunc e boot_page_fill _boot_page_fill fV
; data -> <dead>
; address -> <dead>
.even
_boot_page_fill::
xcall push_arg4
.dbline -1
.dbline 36
; }
; //填充Flash缓冲页中的一个字
; void boot_page_fill(unsigned int address,int data)
; {
.dbline 37
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
mov r0,r18
mov r1,r19
.dbline 41
; "mov r31,r17\n"
; "mov r0,r18\n"
; "mov r1,r19\n");
; SPMCSR=0x01;
ldi R24,1
sts 104,R24
.dbline 42
; asm("spm\n");
spm
.dbline -2
L2:
.dbline 0 ; func end
adiw R28,4
ret
.dbsym l data 2 I
.dbsym l address 0 i
.dbend
.dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
_wait_page_rw_ok::
.dbline -1
.dbline 46
; }
; //等待一个Flash页的写完成
; void wait_page_rw_ok(void)
; {
xjmp L5
L7:
.dbline 49
; while(SPMCSR&0x40)
; {
; while(SPMCSR&0x01);
L8:
.dbline 49
lds R2,104
sbrc R2,0
rjmp L7
X0:
.dbline 50
; SPMCSR=0x11;
ldi R24,17
sts 104,R24
.dbline 51
; asm("spm\n");
spm
.dbline 52
; }
L5:
.dbline 47
lds R2,104
sbrc R2,6
rjmp L8
X1:
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e de_encryptdata _de_encryptdata fc
; tmpchrL -> R10
; tmpchrH -> R22
; chr -> R20
; i -> R16
.even
_de_encryptdata::
xcall push_xgsetF00C
.dbline -1
.dbline 56
; }
; ///对BIN文件的数据进行解密
; char de_encryptdata(char i)
; {
.dbline 58
; char chr,tmpchrH,tmpchrL;
; chr=data[i];
ldi R24,<_data
ldi R25,>_data
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R20,z+0
.dbline 59
; tmpchrH=0xf0&chr;
mov R22,R20
andi R22,240
.dbline 60
; tmpchrL=0x0f&chr;
mov R24,R20
andi R24,15
mov R10,R24
.dbline 61
; chr=tmpchrH/16+tmpchrL*16;
ldi R24,16
mul R24,R10
mov R20,R22
swap R20
andi R20,#0x0F
add R20,R0
.dbline 62
; return (0xff-0x86^chr);
ldi R24,121
mov R16,R20
eor R16,R24
.dbline -2
L10:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r tmpchrL 10 c
.dbsym r tmpchrH 22 c
.dbsym r chr 20 c
.dbsym r i 16 c
.dbend
.dbfunc e write_one_page _write_one_page fV
; i -> R20,R21
.even
_write_one_page::
st -y,R20
st -y,R21
sbiw R28,1
.dbline -1
.dbline 66
; }
; //更新一个Flash页的完整处理
; void write_one_page(void)
; {
.dbline 68
; int i;
; boot_page_ew(address,0x03);
ldi R24,3
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 69
; wait_page_rw_ok();
xcall _wait_page_rw_ok
.dbline 70
; for(i=0;i<SPM_PAGESIZE;i+=2)
clr R20
clr R21
L12:
.dbline 71
; {
.dbline 72
; boot_page_fill(i,de_encryptdata(i)+(de_encryptdata(i+1)<<8));
mov R16,R20
xcall _de_encryptdata
mov R4,R16
mov R16,R20
subi R16,255 ; offset = 1
sbci R17,255
push R4
xcall _de_encryptdata
pop R4
mov R2,R16
clr R3
mov R3,R2
clr R2
mov R18,R4
clr R19
add R18,R2
adc R19,R3
movw R16,R20
xcall _boot_page_fill
.dbline 73
; }
L13:
.dbline 70
subi R20,254 ; offset = 2
sbci R21,255
.dbline 70
cpi R20,0
ldi R30,1
cpc R21,R30
brlt L12
X2:
.dbline 74
; boot_page_ew(address,0x05);
ldi R24,5
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 75
; wait_page_rw_ok();
xcall _wait_page_rw_ok
.dbline -2
L11:
.dbline 0 ; func end
adiw R28,1
ld R21,y+
ld R20,y+
ret
.dbsym r i 20 I
.dbend
.dbfunc e uart_putchar _uart_putchar fV
; c -> R16
.even
_uart_putchar::
.dbline -1
.dbline 79
; }
; //从RS232发送1个字节
; void uart_putchar(char c)
; {
L17:
.dbline 80
; while(!(UCSR0A&0x20));
L18:
.dbline 80
sbis 0xb,5
rjmp L17
X3:
.dbline 81
; UDR0=c;
out 0xc,R16
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e uart_getchar _uart_getchar fI
; status -> R18
; res -> R16
.even
_uart_getchar::
.dbline -1
.dbline 85
; }
; //从RS232接收1个字节
; int uart_getchar(void)
; {
.dbline 87
; unsigned char status,res;
; if(!(UCSR0A&0x80)) return -1;
sbic 0xb,7
rjmp L21
X4:
.dbline 87
ldi R16,-1
ldi R17,-1
xjmp L20
L21:
.dbline 88
; status=UCSR0A;
in R18,0xb
.dbline 89
; res=UDR0;
in R16,0xc
.dbline 90
; res=res;
.dbline 91
; if(status&0x1c) return -1;
mov R24,R18
andi R24,28
breq L23
X5:
.dbline 91
ldi R16,-1
ldi R17,-1
xjmp L20
L23:
.dbline 92
; return res;
clr R17
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbsym r status 18 c
.dbsym r res 16 c
.dbend
.dbfunc e uart_waitchar _uart_waitchar fc
; c -> R10,R11
.even
_uart_waitchar::
st -y,R10
st -y,R11
.dbline -1
.dbline 96
; }
; //等待从RS232接收1个有效字节
; char uart_waitchar(void)
; {
L26:
.dbline 98
; int c;
; while((c=uart_getchar())==-1);
L27:
.dbline 98
xcall _uart_getchar
movw R10,R16
cpi R16,255
ldi R30,255
cpc R17,R30
breq L26
X6:
.dbline 99
; return (char)c;
.dbline -2
L25:
.dbline 0 ; func end
ld R11,y+
ld R10,y+
ret
.dbsym r c 10 I
.dbend
.dbfunc e calcrc _calcrc fI
; i -> R20
; crc -> R10,R11
; count -> R18,R19
; ptr -> R16,R17
.even
_calcrc::
xcall push_xgset300C
.dbline -1
.dbline 103
; }
; //计算CRC
; int calcrc(char *ptr,int count)
; {
.dbline 104
; int crc=0;
clr R10
clr R11
xjmp L31
L30:
.dbline 107
; char i;
; while(--count>=0)
; {
.dbline 108
; crc=crc^(int)*ptr++<<8;
movw R30,R16
ld R2,Z+
movw R16,R30
clr R3
mov R3,R2
clr R2
eor R10,R2
eor R11,R3
.dbline 109
; i=8;
ldi R20,8
L33:
.dbline 111
; do
; {
.dbline 112
; if(crc&0x8000)
sbrs R11,7
rjmp L36
X7:
.dbline 113
; crc=crc<<1^0x1021;
ldi R24,4129
ldi R25,16
movw R2,R10
lsl R2
rol R3
eor R2,R24
eor R3,R25
movw R10,R2
xjmp L37
L36:
.dbline 115
; else
; crc=crc<<1;
lsl R10
rol R11
L37:
.dbline 116
; }
L34:
.dbline 117
; while(--i);
mov R24,R20
subi R24,1
mov R20,R24
tst R20
brne L33
X8:
.dbline 118
; }
L31:
.dbline 106
movw R24,R18
sbiw R24,1
movw R18,R24
cpi R18,0
ldi R30,0
cpc R19,R30
brge L30
X9:
.dbline 119
; return (crc);
movw R16,R10
.dbline -2
L29:
.dbline 0 ; func end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -