avr: started working on base system vs. main system.

base system will be a base system which can be used to flash and start
the main system.
This commit is contained in:
Martin Preuss
2023-02-20 23:47:30 +01:00
parent a12d6ae133
commit 8119cba750
8 changed files with 446 additions and 363 deletions

View File

@@ -18,6 +18,12 @@
.equ CPRO_CMD_DENY_ADDRESS = 63
.equ CPRO_CMD_ADDRESS_RANGE = 64
.equ CPRO_CMD_FLASH_START = 70
.equ CPRO_CMD_FLASH_END = 71
.equ CPRO_CMD_FLASH_ADDR = 72
.equ CPRO_CMD_FLASH_DATA = 73
.equ CPRO_CMD_FLASH_RSP = 74
; flags for variable payload enqueue function
.equ CPRO_PAYLOAD_FLAGS_SECONDS = 0x01
@@ -31,15 +37,20 @@
.equ CPRO_PAYLOAD_FLAGS_SHIFT_NUM = 5
.equ CPRO_PACKET_OFFS_DESTADDR = 0
.equ CPRO_PACKET_OFFS_MSGLEN = 1
.equ CPRO_PACKET_OFFS_CMD = 2
.equ CPRO_PACKET_OFFS_SRCADDR = 3
.equ CPRO_PACKET_OFFS_PAYLOAD = 4
.equ CPRO_PACKET_HAVEADDR_OFFS_ADDRESS = COM_MSG_OFFS_PAYLOAD+4
.equ CPRO_PACKET_CLAIMADDR_OFFS_ADDRESS = COM_MSG_OFFS_PAYLOAD+4
.equ CPRO_PACKET_DENYADDR_OFFS_ADDRESS = COM_MSG_OFFS_PAYLOAD+4
.equ CPRO_PACKET_FLASH_START_OFFS_MSGNUM = COM_MSG_OFFS_PAYLOAD+0 ; 2 bytes
.equ CPRO_PACKET_FLASH_START_OFFS_ADDR = COM_MSG_OFFS_PAYLOAD+2 ; 2 bytes
.equ CPRO_PACKET_FLASH_ADDR_OFFS_MSGNUM = COM_MSG_OFFS_PAYLOAD+0 ; 2 bytes
.equ CPRO_PACKET_FLASH_ADDR_OFFS_ADDR = COM_MSG_OFFS_PAYLOAD+2 ; 2 bytes
.equ CPRO_PACKET_FLASH_DATA_OFFS_MSGNUM = COM_MSG_OFFS_PAYLOAD+0 ; 2 bytes
.equ CPRO_PACKET_FLASH_DATA_OFFS_ADDR = COM_MSG_OFFS_PAYLOAD+2 ; 2 bytes
.equ CPRO_PACKET_FLASH_DATA_OFFS_DATA = COM_MSG_OFFS_PAYLOAD+4 ; 2 bytes
.equ CPRO_PACKET_HAVEADDR_OFFS_ADDRESS = 8
.equ CPRO_PACKET_CLAIMADDR_OFFS_ADDRESS = 8
.equ CPRO_PACKET_DENYADDR_OFFS_ADDRESS = 8
.equ CPRO_WAITTIME_GETADDR = 130
.equ CPRO_WAITTIME_CLAIMADDR = 17
@@ -64,11 +75,13 @@
cproDataBegin:
#ifndef BASE_SYSTEM
cproMode: .byte 1 ; "normal", "waitForHaveAddress", "samplingAddresses", "claimAddress"
cproAddrRangeBegin: .byte 1
cproAddrRangeEnd: .byte 1
cproAddressWaitCounter: .byte 1 ; counter for seconds to wait for all nodes to respond
cproUsedAddresses: .byte 16 ; one bit per address known to b in use
#endif
cproDataEnd:
@@ -93,6 +106,7 @@ CPRO_Init:
CPRO_OnEverySecond:
#ifndef BASE_SYSTEM
lds r17, cproMode
cpi r17, CPRO_MODE_NORMAL
breq CPRO_OnEverySecond_done
@@ -121,6 +135,7 @@ CPRO_OnEverySecond_l6:
brne CPRO_OnEverySecond_done
rjmp cproHandle1sReclaimingAddr
CPRO_OnEverySecond_done:
#endif
ret
@@ -137,11 +152,12 @@ CPRO_OnEverySecond_done:
; USED: depending on called routines
CPRO_OnPacketReceived:
ldd r16, y+(COM_BUFFER_OFFS_DATA+CPRO_PACKET_OFFS_CMD)
ldd r16, y+(COM_BUFFER_OFFS_DATA+COM_MSG_OFFS_CMD)
cpi r16, CPRO_CMD_PING
brne CPRO_OnPacketReceived_l1
rjmp cproHandlePing
CPRO_OnPacketReceived_l1:
#ifndef BASE_SYSTEM
cpi r16, CPRO_CMD_NEED_ADDRESS
brne CPRO_OnPacketReceived_l2
rjmp cproHandlePckNeedAddr
@@ -162,12 +178,13 @@ CPRO_OnPacketReceived_l5:
brne CPRO_OnPacketReceived_l6
rjmp cproHandlePckClaimAddr
CPRO_OnPacketReceived_l6:
#endif
clc
ret
cproHandlePing:
ldd r16, y+(COM_BUFFER_OFFS_DATA+CPRO_PACKET_OFFS_SRCADDR)
ldd r16, y+(COM_BUFFER_OFFS_DATA+COM_MSG_OFFS_SRCADDR)
tst r16
breq cproHandlePing_notHandled
rcall CPRO_EnqueuePong
@@ -214,6 +231,7 @@ CPRO_EnqueuePong:
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a COM Send stats packet.
;
@@ -266,9 +284,11 @@ CPRO_EnqueueComSendStats_error:
out SREG, r15
clc
ret
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a TWI Bus Member packet.
;
@@ -316,9 +336,11 @@ CPRO_EnqueueTwiBusMember:
CPRO_EnqueueTwiBusMember_error:
clc
ret
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a DEBUG packet.
;
@@ -366,9 +388,11 @@ CPRO_EnqueueDebug:
CPRO_EnqueueDebug_error:
clc
ret
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a VALUE packet.
;
@@ -419,9 +443,11 @@ CPRO_EnqueueValue:
CPRO_EnqueueValue_error:
clc
ret
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a NEEDADDRESS packet.
;
@@ -434,9 +460,11 @@ CPRO_EnqueueValue_error:
CPRO_EnqueueNeedAddress:
ldi r18, CPRO_CMD_NEED_ADDRESS
rjmp cproEnqueueAddressPacket
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a HAVE_ADDRESS packet.
;
@@ -450,9 +478,11 @@ CPRO_EnqueueHaveAddress:
ldi r18, CPRO_CMD_HAVE_ADDRESS
lds r19, comAddress
rjmp cproEnqueueAddressPacket
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a CLAIM_ADDRESS packet.
;
@@ -465,9 +495,11 @@ CPRO_EnqueueHaveAddress:
CPRO_EnqueueClaimAddress:
ldi r18, CPRO_CMD_CLAIM_ADDRESS
rjmp cproEnqueueAddressPacket
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; Enqueue a DENY_ADDRESS packet.
;
@@ -481,9 +513,11 @@ CPRO_EnqueueDenyAddress:
ldi r18, CPRO_CMD_DENY_ADDRESS
lds r19, comAddress
rjmp cproEnqueueAddressPacket
#endif
#ifndef BASE_SYSTEM
; ---------------------------------------------------------------------------
; cproEnqueueAddressPacket
; Enqueue a NEED/HAVE/CLAIM ADDRESS packet.
@@ -518,6 +552,7 @@ cproEnqueueAddressPacket:
cproEnqueueAddressPacket_error:
clc
ret
#endif
@@ -667,6 +702,51 @@ cproCalcPayloadSize_l2:
#ifdef WITH_FLASH
; ---------------------------------------------------------------------------
; Enqueue a FLASHDATA_ACK packet.
;
; IN:
; - R16: destination address
; - R17: ACK(1) or NAK(0)
; - R19:R18: msg num
; OUT:
; - CFLAG: set if okay, clear otherwise
; MODIFIED REGS: R6, R7, R8, R9, R10, R11, R12, R16, R17, X, Y (R3, R4, R15, R16, R17, R18, R19, R20, R21)
CPRO_EnqueueFlashRsp:
mov r6, r16
mov r7, r17
mov r8, r18
mov r9, r19
rcall COM_AllocBufferAndGetXY ; (r16, r17, r21)
brcc CPRO_EnqueueFlashRsp_error
push xh
push xl
mov r16, r6
ldi r17, CPRO_PAYLOAD_FLAGS_SECONDS | (3<<CPRO_PAYLOAD_FLAGS_SHIFT_NUM)
ldi r18, CPRO_CMD_FLASH_RSP
rcall cproBeginMsgWithVariablePayload ; (R3, R4, R16, R17, R18, R19, R20, R21, X)
st X+, r8 ; 4: msg num (low)
st X+, r9 ; 5: msg num (high)
st X+, r7 ; 6: ACK or NAK
pop xl
pop xh
rcall cproCalcAndAddChecksumByte
; mark buffer as enqueued with PRIO "important" (higher number of retries)
ldi r20, COM_BUFFER_PRIO_IMPORTANT
rcall COM_EnqueuePacket ; (R15, R16)
brcc CPRO_EnqueueFlashRsp_error
sec
ret
CPRO_EnqueueFlashRsp_error:
clc
ret
#endif