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:
Martin Preuss
2023-04-20 23:57:13 +02:00
parent 9b568393cd
commit 82c7626783
7 changed files with 56 additions and 71 deletions

View File

@@ -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: