flashing a device via boot loader works now!!
- use a simple rjmp to start main firmware - add buffer size as a parameter for com2ReceivePacketRaw - fixed bugs in - Flash_StartPage - Flash_FinishPage - Flash_ReadPageIntoPageBuffer - assume irqs disabled in flash routines - increase flash receive buffer size to 128
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
#include <gwenhywfar/buffer.h>
|
||||
|
||||
|
||||
#define AQH_MAXMSGSIZE 24
|
||||
#define AQH_MAXMSGSIZE 128
|
||||
|
||||
|
||||
#define AQH_MSG_OFFS_ALL_DEST_ADDRESS 0
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
firmwareType: .dw FW_TYPE
|
||||
firmwareVersion: .dw FW_VERSION
|
||||
firmwareModules: .dw MODULES_MASK
|
||||
firmwareStart: .dw 0 ; will be overwritten when flashing
|
||||
firmwareStart: rjmp main ; will be overwritten when flashing
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
; ---------------------------------------------------------------------------
|
||||
; Reset and interrupt vectors (will be removed as soon as we can flash data over COM)
|
||||
|
||||
rjmp main ; Reset vector
|
||||
; rjmp 0xd00 ; Reset vector ; use this for flashed system
|
||||
; rjmp main ; Reset vector
|
||||
rjmp 0xd00 ; Reset vector ; use this for flashed system
|
||||
reti ; EXT_INT0
|
||||
rjmp com2IsrPcint0 ; PCI0
|
||||
reti ; PCI1
|
||||
@@ -197,8 +197,7 @@
|
||||
firmwareType: .dw FW_TYPE
|
||||
firmwareVersion: .dw FW_VERSION
|
||||
firmwareModules: .dw MODULES_MASK
|
||||
firmwareStart:
|
||||
rjmp main
|
||||
firmwareStart: rjmp main
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
|
||||
@@ -296,6 +296,7 @@ com2ReceivePacket_bufferAvailable:
|
||||
push xl
|
||||
push xh
|
||||
lds r16, com2Address
|
||||
ldi r17, (COM2_BUFFER_SIZE-3)
|
||||
rcall com2ReceivePacketRaw
|
||||
pop xh
|
||||
pop xl
|
||||
|
||||
@@ -15,12 +15,14 @@
|
||||
;
|
||||
; IN:
|
||||
; - R16: COM address to listen to
|
||||
; - R17: maximum value for accepted msg data (i.e. buffersize minus 3)
|
||||
; - X : buffer to receive to
|
||||
; OUT:
|
||||
; - CFLAG: set if okay (packet received), cleared on error
|
||||
; - R16: error code if CFLAG is cleared
|
||||
; REGS: r16, r17, X (r18, r19, r20, r21, r22)
|
||||
; REGS: r16, r17, r18, X (r19, r20, r21, r22)
|
||||
com2ReceivePacketRaw:
|
||||
mov r18, r17
|
||||
push r16
|
||||
; read destination address
|
||||
rcall com2ReceiveByte ; read byte (R16, R17, R20, R21, R22)
|
||||
@@ -40,7 +42,7 @@ com2ReceivePacketRaw_acceptAddr:
|
||||
rcall com2ReceiveByte ; read packet length (R16, R17, R20, R21, R22)
|
||||
brcc com2ReceivePacketRaw_ioError
|
||||
st X+, r16
|
||||
cpi r16, (COM2_BUFFER_SIZE-3)
|
||||
cp r16, r18 ; (COM2_BUFFER_SIZE-3)
|
||||
brcc com2ReceivePacketRaw_contentError ; packet too long
|
||||
inc r16 ; account for checksum byte
|
||||
mov r17, r16
|
||||
|
||||
@@ -24,18 +24,20 @@ FLASH_BEGIN:
|
||||
; ---------------------------------------------------------------------------
|
||||
; start flashing a page
|
||||
;
|
||||
; Interrupts must be disabled!
|
||||
;
|
||||
; IN:
|
||||
; - Z: Address to work on (byte address as for LPM!)
|
||||
; OUT:
|
||||
; - nothing
|
||||
; REGS: R16 (R0, R1, R15, R16, R20, R24, R25)
|
||||
; REGS: R16 (R0, R1, R16, R20, R24, R25)
|
||||
|
||||
Flash_StartPage:
|
||||
push zh
|
||||
push zl
|
||||
ldi r16, ((PAGESIZE*2)-1)
|
||||
ldi r16, ~((PAGESIZE*2)-1)
|
||||
and zl, r16
|
||||
rcall Flash_ReadPageIntoPageBuffer ; (R0, R1, R15, R16, R20, R24, R25, Z)
|
||||
rcall Flash_ReadPageIntoPageBuffer ; (R0, R1, R16, R20, R24, R25, Z)
|
||||
pop zl
|
||||
pop zh
|
||||
ret
|
||||
@@ -45,6 +47,8 @@ Flash_StartPage:
|
||||
; ---------------------------------------------------------------------------
|
||||
; finish flashing a page
|
||||
;
|
||||
; Interrupts must be disabled!
|
||||
;
|
||||
; IN:
|
||||
; - Z: Address to work on (byte address as for LPM!)
|
||||
; OUT:
|
||||
@@ -52,7 +56,7 @@ Flash_StartPage:
|
||||
; REGS: R16 (R15, R20)
|
||||
|
||||
Flash_FinishPage:
|
||||
ldi r16, ((PAGESIZE*2)-1)
|
||||
ldi r16, ~((PAGESIZE*2)-1)
|
||||
and zl, r16
|
||||
rcall Flash_ErasePage ; (R15, R16, R20)
|
||||
rcall Flash_WritePage ; (R15, R16, R20)
|
||||
@@ -63,16 +67,15 @@ Flash_FinishPage:
|
||||
; ---------------------------------------------------------------------------
|
||||
; Flash_ReadPageIntoPageBuffer
|
||||
;
|
||||
; Interrupts must be disabled!
|
||||
;
|
||||
; IN:
|
||||
; - Z: Address to read from (byte address as for LPM!)
|
||||
; OUT:
|
||||
; - nothing
|
||||
; REGS: R0, R1, R15, R16, R20, R24, R25, Z
|
||||
; REGS: R0, R1, R16, R20, R24, R25, Z
|
||||
|
||||
Flash_ReadPageIntoPageBuffer:
|
||||
in r15, SREG
|
||||
cli
|
||||
ldi r24, LOW(PAGESIZE*2)
|
||||
ldi r25, HIGH(PAGESIZE*2)
|
||||
Flash_ReadPageIntoPageBuffer_loop:
|
||||
@@ -80,11 +83,10 @@ Flash_ReadPageIntoPageBuffer_loop:
|
||||
lpm r1, Z ; read source data from FLASH (high)
|
||||
sbiw ZH:ZL, 1 ; rewind Z address for following SPM
|
||||
ldi r20, (1<<SPMEN) ; enable next SPM, write into temp page buffer
|
||||
rcall utilsDoSpm ; (R16)
|
||||
rcall flashDoSpm ; (R16)
|
||||
adiw ZH:ZL, 2
|
||||
sbiw r25:r24, 2 ; use subi for PAGESIZEB<=256
|
||||
brne Flash_ReadPageIntoPageBuffer_loop
|
||||
out SREG, r15
|
||||
ret
|
||||
|
||||
|
||||
@@ -92,25 +94,19 @@ Flash_ReadPageIntoPageBuffer_loop:
|
||||
; ---------------------------------------------------------------------------
|
||||
; Flash_WriteIntoPage
|
||||
;
|
||||
; Interrupts must be disabled!
|
||||
;
|
||||
; IN:
|
||||
; - Z: Address to write to (byte address as for LPM!)
|
||||
; - R1:R0: Word to write into page
|
||||
; OUT:
|
||||
; - Z: address for next write
|
||||
; MODIFIED REGISTERS: R15, R16
|
||||
; REGS: R16
|
||||
|
||||
Flash_WriteIntoPage:
|
||||
in r15, SREG
|
||||
cli
|
||||
ldi r20, (1<<SPMEN) ; enable next SPM, write into temp page buffer
|
||||
rcall utilsDoSpm ; (R16)
|
||||
ldi r16, 2
|
||||
add zl, r16
|
||||
dec r16 ; doesn't affect carry flag
|
||||
dec r16
|
||||
adc zh, r16
|
||||
out SREG, r15
|
||||
rcall flashDoSpm ; (R16)
|
||||
adiw zh:zl, 2
|
||||
ret
|
||||
|
||||
|
||||
@@ -118,19 +114,17 @@ Flash_WriteIntoPage:
|
||||
; ---------------------------------------------------------------------------
|
||||
; Flash_ErasePage
|
||||
;
|
||||
; Interrupts must be disabled!
|
||||
;
|
||||
; IN:
|
||||
; - Z: Address of the page to erase.
|
||||
; OUT:
|
||||
; - nothing
|
||||
; REGS: R15, R20 (R16)
|
||||
; REGS: R20 (R16)
|
||||
|
||||
Flash_ErasePage:
|
||||
in r15, SREG
|
||||
cli
|
||||
ldi r20, (1<<PGERS) + (1<<SPMEN) ; enable next SPM, erase page (R1/R0 ignored)
|
||||
rcall utilsDoSpm ; (R16)
|
||||
out SREG, r15
|
||||
rcall flashDoSpm ; (R16)
|
||||
ret
|
||||
|
||||
|
||||
@@ -138,6 +132,7 @@ Flash_ErasePage:
|
||||
; ---------------------------------------------------------------------------
|
||||
; Flash_WritePage
|
||||
;
|
||||
; Interrupts must be disabled!
|
||||
;
|
||||
; IN:
|
||||
; - Z: Address of the page to erase.
|
||||
@@ -146,17 +141,14 @@ Flash_ErasePage:
|
||||
; REGS: R15, R20 (R16)
|
||||
|
||||
Flash_WritePage:
|
||||
in r15, SREG
|
||||
cli
|
||||
ldi r20, (1<<PGWRT) + (1<<SPMEN) ; enable next SPM, write page (R1/R0 ignored)
|
||||
rcall utilsDoSpm ; (R16)
|
||||
out SREG, r15
|
||||
rcall flashDoSpm ; (R16)
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; utilsDoSpm
|
||||
; flashDoSpm
|
||||
;
|
||||
; wait until possible previous SPM finished and then issue another SPM.
|
||||
;
|
||||
@@ -169,7 +161,7 @@ Flash_WritePage:
|
||||
; - nothing
|
||||
; REGS: R16
|
||||
|
||||
utilsDoSpm:
|
||||
flashDoSpm:
|
||||
wait: ; wait for possibly previous SPM to complete
|
||||
in r16, SPMCSR
|
||||
sbrc r16, SPMEN
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
.equ FLASH_ERROR_NONE = 0
|
||||
.equ FLASH_ERROR_MSGERROR = 1
|
||||
|
||||
.equ FLASH_RECVBUFFER_MAXLEN = 128
|
||||
.equ FLASH_CMD_FLASH_RSP = 74
|
||||
|
||||
|
||||
@@ -37,8 +38,8 @@
|
||||
|
||||
flashDataBegin:
|
||||
flashUid: .byte 4
|
||||
flashSendBuffer: .byte 64
|
||||
flashRecvBuffer: .byte 64
|
||||
flashSendBuffer: .byte 32
|
||||
flashRecvBuffer: .byte FLASH_RECVBUFFER_MAXLEN
|
||||
flashDataEnd:
|
||||
|
||||
|
||||
@@ -120,21 +121,12 @@ bootLoader_loop1:
|
||||
; try to start firmware
|
||||
bootLoader_startFirmware:
|
||||
sbi PORTA, PORTA3 ; LED off
|
||||
|
||||
cbi PORTA, PORTA2 ; on (debug)
|
||||
ldi r16, 20
|
||||
rcall flashWaitForMulti100ms
|
||||
rjmp firmwareStart
|
||||
|
||||
ldi zl, LOW(firmwareStart*2)
|
||||
ldi zh, HIGH(firmwareStart*2)
|
||||
lpm r20, Z+
|
||||
lpm r21, Z+
|
||||
mov r16, r20
|
||||
or r16, r21
|
||||
breq bootLoader ; restart boot loader
|
||||
|
||||
; jmp via stack
|
||||
push r20
|
||||
push r21
|
||||
ret
|
||||
bootLoader_waitAndRestartBootLoader:
|
||||
sbi PORTA, PORTA3 ; LED off
|
||||
ldi r16, 20
|
||||
@@ -228,6 +220,7 @@ flashWaitForSpecificMessage_loop1:
|
||||
flashWaitForSpecificMessage_isLow: ; is low, receive message, check for msg type
|
||||
push r17
|
||||
ldi r16, COM2_MAINTENANCE_ADDR
|
||||
ldi r17, FLASH_RECVBUFFER_MAXLEN-3
|
||||
ldi xl, LOW(flashRecvBuffer)
|
||||
ldi xh, HIGH(flashRecvBuffer)
|
||||
rcall com2ReceivePacketRaw
|
||||
@@ -545,17 +538,16 @@ flashHandleFlashStart_notMe:
|
||||
|
||||
flashHandleFlashData:
|
||||
adiw xh:xl, FLASH_MSG_OFFS_MSGLEN
|
||||
ld r18, X ; length
|
||||
cpi r18, 2+2+4 ; dest, msglen + cmd, src + addr
|
||||
ld r18, X ; length (subtract 6
|
||||
cpi r18, 6 ; cmd(1), src(1), addr(4)
|
||||
brcs flashHandleFlashData_badData
|
||||
subi r18, 2+2+4 ; remaining length
|
||||
subi r18, 6 ; remaining length
|
||||
adiw xh:xl, FLASH_PACKET_DATA_OFFS_ADDR-FLASH_MSG_OFFS_MSGLEN
|
||||
ld zl, X+ ; address (low)
|
||||
ld zh, X+ ; address (high)
|
||||
adiw xh:xl, 2 ; ignore high bytes, points to first data byte now
|
||||
|
||||
cbi PORTA, PORTA2 ; on (debug)
|
||||
rcall Flash_StartPage ; (R0, R1, R15, R16, R20, R24, R25)
|
||||
; rcall Flash_StartPage ; (R0, R1, R16, R20, R24, R25)
|
||||
push zl
|
||||
push zh
|
||||
flashHandleFlashData_loop:
|
||||
@@ -567,7 +559,6 @@ flashHandleFlashData_loop:
|
||||
pop zh
|
||||
pop zl
|
||||
rcall Flash_FinishPage ; (R15, R16, R20)
|
||||
sbi PORTA, PORTA2 ; off (debug)
|
||||
clr r16
|
||||
rjmp flashHandleFlashData_sendResponse
|
||||
flashHandleFlashData_badData:
|
||||
|
||||
Reference in New Issue
Block a user