diff --git a/avr/flashproto.asm b/avr/flashproto.asm index b70b85a..3dbbc51 100644 --- a/avr/flashproto.asm +++ b/avr/flashproto.asm @@ -69,27 +69,43 @@ bootLoader: ldi r16, Low(RAMEND) out SPL, r16 ; init LSB stack pointer - sbi DDRA, PORTA3 ; out -; sbi PINA, PORTA3 ; toggle + ; setup pins and interrupts + cbi COM_PORT_DATA, COM_PINNUM_DATA ; disable internal pullup for DATA + cbi COM_DDR_DATA, COM_PINNUM_DATA ; set DATA port as input + + cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; disable internal pullup for ATTN + cbi COM_DDR_ATTN, COM_PINNUM_ATTN ; set ATTN port as input + + + sbi DDRA, PORTA3 ; out cbi PORTA, PORTA3 ; on -; sbi PORTA, PORTA3 ; off + sbi DDRA, PORTA2 ; out (debug) + sbi PORTA, PORTA2 ; off (debug) + rcall flashReadUid sts flashUid, r18 sts flashUid+1, r19 sts flashUid+2, r20 sts flashUid+3, r21 - + + ; wait for 3 secs before sending message + ldi r16, 30 + rcall flashWaitForMulti100ms + ; send flash ready message ldi xl, LOW(flashSendBuffer) ldi xh, HIGH(flashSendBuffer) rcall flashWriteFlashReady rcall flashSendPacketUntilSuccess + sbi PORTA, PORTA3 ; LED off + ; wait up to 10s for incoming FLASH_START message ldi r16, CPRO_CMD_FLASH_START ldi r17, 100 ; 100*100ms=10s rcall flashWaitForSpecificMessageWithLed brcc bootLoader_startFirmware + ; either FLASH_START or FLASH_END received cpi r16, CPRO_CMD_FLASH_START ; not FLASH_START, no flashing requested brne bootLoader_startFirmware @@ -97,11 +113,18 @@ bootLoader: ; try to start firmware bootLoader_startFirmware: - lds r20, firmwareStart - lds r21, firmwareStart+1 + sbi PORTA, PORTA3 ; LED off + ldi r16, 20 + rcall flashWaitForMulti100ms + + 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 @@ -149,7 +172,7 @@ flashWaitForSpecificMessageWithLed_received: ; ; IN: ; - R16: msg command to wait for -; - R17: time to wait for packet (in milliseconds) (low) +; - R17: time to wait for packet (in milliseconds) ; OUT: ; - CFLAG: set if msg received, cleared on timeout ; - R16 : message type received @@ -159,9 +182,11 @@ flashWaitForSpecificMessage: mov r1, r16 ; expected message type ; wait for ATTN to go low + +flashWaitForSpecificMessage_loop0: flashWaitForSpecificMessage_loop1: ldi r16, 0 ; wait for low - rcall flashWaitForAttnState1ms ; (R24, R25) + rcall flashWaitForAttnState1ms ; (R22, R24) brcs flashWaitForSpecificMessage_isLow dec r17 brne flashWaitForSpecificMessage_loop1 @@ -193,14 +218,14 @@ flashWaitForSpecificMessage_waitAttnHigh: ; wait for ATTN to go high flashWaitForSpecificMessage_loop2: ldi r16, 0xff ; wait for high - rcall flashWaitForAttnState1ms ; (R24, R25) + rcall flashWaitForAttnState1ms ; (R22, R24) brcs flashWaitForSpecificMessage_isHigh dec r17 brne flashWaitForSpecificMessage_loop2 rjmp flashWaitForSpecificMessage_timeout flashWaitForSpecificMessage_isHigh: - rjmp flashWaitForSpecificMessage_loop1 + rjmp flashWaitForSpecificMessage_loop0 flashWaitForSpecificMessage_received: ; R16 contains message type sec @@ -218,18 +243,20 @@ flashWaitForSpecificMessage_timeout: ; - R16: expected state (0xff for high, 0 for low) ; OUT: ; - CFLAG: set if state reached, cleared otherwise -; REGS: R24, R25 +; REGS: R24 (R22) flashWaitForAttnState1ms: - ldi r24, LOW(1000) - ldi r25, HIGH(1000) - + ldi r24, 100 flashWaitForAttnState1ms_loop: - in r17, COM_PIN_ATTN - eor r17, r16 - andi r17, (1<