From 0a10d136d53c29e3b8705bb2d9ccfbd1a82b946f Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 20 Jan 2025 23:47:13 +0100 Subject: [PATCH] avr: bootloader partially works now but stops after 3 messages... --- avr/devices/t03/boot.asm | 255 +++++-------- avr/devices/t03/main.asm | 352 ++++-------------- avr/main_all.asm | 6 +- avr/modules/0BUILD | 1 + avr/modules/bootloader/0BUILD | 11 + .../bootloader2.asm => bootloader/main.asm} | 51 ++- avr/modules/flash/0BUILD | 13 +- avr/modules/flash/README | 2 +- avr/modules/flash/bootloader.asm | 218 ----------- avr/modules/flash/flash_ready.asm | 61 --- avr/modules/flash/flash_rsp.asm | 66 ---- avr/modules/flash/flashprocess.asm | 51 ++- avr/modules/flash/hdl_flash_data.asm | 62 --- avr/modules/flash/hdl_flash_end.asm | 38 -- avr/modules/flash/hdl_flash_start.asm | 73 ---- avr/modules/flash/io.asm | 22 +- avr/modules/flash/io_attn.asm | 57 ++- avr/modules/flash/io_bitbang.asm | 87 +++++ avr/modules/flash/io_uart1.asm | 22 +- avr/modules/flash/recv.asm | 123 ------ avr/modules/flash/send.asm | 65 ---- avr/modules/uart_hw/lowlevel_uart1.asm | 4 - avr/modules/uart_hw/raw_uart1.asm | 18 +- 23 files changed, 398 insertions(+), 1260 deletions(-) create mode 100644 avr/modules/bootloader/0BUILD rename avr/modules/{flash/bootloader2.asm => bootloader/main.asm} (66%) delete mode 100644 avr/modules/flash/bootloader.asm delete mode 100644 avr/modules/flash/flash_ready.asm delete mode 100644 avr/modules/flash/flash_rsp.asm delete mode 100644 avr/modules/flash/hdl_flash_data.asm delete mode 100644 avr/modules/flash/hdl_flash_end.asm delete mode 100644 avr/modules/flash/hdl_flash_start.asm create mode 100644 avr/modules/flash/io_bitbang.asm delete mode 100644 avr/modules/flash/recv.asm delete mode 100644 avr/modules/flash/send.asm diff --git a/avr/devices/t03/boot.asm b/avr/devices/t03/boot.asm index c5ddd5a..870c910 100644 --- a/avr/devices/t03/boot.asm +++ b/avr/devices/t03/boot.asm @@ -38,6 +38,9 @@ .equ FIRMWARE_VERSION_PATCHLEVEL = 1 +;#define COM_ACCEPT_ALL_DEST 1 + + ; --------------------------------------------------------------------------- ; LED @@ -112,38 +115,8 @@ firmwareStart: rjmp main ; will be overwritten when flashing main: - cli - ; setup stack - .ifdef SPH ; if SPH is defined - ldi r16, High(RAMEND) - out SPH, r16 ; init MSB stack pointer - .endif - ldi r16, Low(RAMEND) - out SPL, r16 ; init LSB stack pointer - -#if 1 - ; start by setting all ports as inputs and enable internal pull-up resistors - ldi r16, 0xff - clr r17 -.ifdef PORTA - out DDRA, r17 ; all input - out PORTA, r16 ; enable pull-up on all -.endif - -.ifdef PORTB - out DDRB, r17 ; all input - out PORTB, r16 ; enable pull-up on all -.endif - -.ifdef PORTC - out DDRC, r17 ; all input - out PORTC, r16 ; enable pull-up on all -.endif -#endif - - rcall systemSetSpeed -; rjmp debugUsart2 - rjmp bootLoader ; this routine is in modules/flash/bootloader2.asm +; rjmp debugEchoUart1 + rjmp bootLoader ; this routine is in modules/bootloader/main.asm @@ -151,8 +124,6 @@ main: ; *************************************************************************** ; includes -;.include "modules/uart_bitbang/bytelevel.asm" -;.include "modules/uart_bitbang/packetlevel.asm" .include "modules/uart_hw/raw_uart1.asm" .include "modules/com2/crc.asm" .include "common/crc8.asm" @@ -160,140 +131,12 @@ main: .include "common/utils_copy_from_flash.asm" .include "common/utils_copy_sdram.asm" .include "modules/flash/defs.asm" -.include "modules/flash/bootloader2.asm" .include "modules/flash/io.asm" .include "modules/flash/io_uart1.asm" .include "modules/flash/flash.asm" .include "modules/flash/flashprocess.asm" -;.include "modules/flash/recv.asm" -;.include "modules/flash/send.asm" .include "modules/flash/wait.asm" -;.include "modules/flash/hdl_flash_start.asm" -;.include "modules/flash/hdl_flash_data.asm" -;.include "modules/flash/hdl_flash_end.asm" -;include "modules/flash/flash_rsp.asm" -;include "modules/flash/flash_ready.asm" - - -#if 0 -debugUsart1: - sbi LED_DDR, LED_PINNUM ; out - cbi LED_PORT, LED_PINNUM ; on - - ldi r16, 3 ; (19.2Kb/s at 1MHz) - ldi r17, 0 - sts UBRR1H, r17 - sts UBRR1L, r16 - - ldi r16, (3< diff --git a/avr/modules/bootloader/0BUILD b/avr/modules/bootloader/0BUILD new file mode 100644 index 0000000..febd367 --- /dev/null +++ b/avr/modules/bootloader/0BUILD @@ -0,0 +1,11 @@ + + + + + + main.asm + + + + + diff --git a/avr/modules/flash/bootloader2.asm b/avr/modules/bootloader/main.asm similarity index 66% rename from avr/modules/flash/bootloader2.asm rename to avr/modules/bootloader/main.asm index d88ef84..6684692 100644 --- a/avr/modules/flash/bootloader2.asm +++ b/avr/modules/bootloader/main.asm @@ -9,42 +9,53 @@ -; *************************************************************************** -; data - - -.dseg - -flashDataBegin: - flashUid: .byte 4 - flashSendBuffer: .byte 32 - flashRecvBuffer: .byte FLASH_RECVBUFFER_MAXLEN -flashDataEnd: - - - - ; *************************************************************************** ; code - .cseg -FLASH_PROTO_BEGIN: +BOOTLOADER_BEGIN: bootLoader: + cli + ; setup stack + .ifdef SPH ; if SPH is defined + ldi r16, High(RAMEND) + out SPH, r16 ; init MSB stack pointer + .endif + ldi r16, Low(RAMEND) + out SPL, r16 ; init LSB stack pointer + + ; start by setting all ports as inputs and enable internal pull-up resistors + ldi r16, 0xff + clr r17 +.ifdef PORTA + out DDRA, r17 ; all input + out PORTA, r16 ; enable pull-up on all +.endif + +.ifdef PORTB + out DDRB, r17 ; all input + out PORTB, r16 ; enable pull-up on all +.endif + +.ifdef PORTC + out DDRC, r17 ; all input + out PORTC, r16 ; enable pull-up on all +.endif + + rcall systemSetSpeed ; rcall watchdogOff ; turn off watchdog timer (sometimes it stays on after reboot) sbi LED_DDR, LED_PINNUM ; out cbi LED_PORT, LED_PINNUM ; on ldi r16, 30 rcall flashWaitForMulti100ms - rcall flashReadUidIntoSdram ; R16, X, Y rcall checkFlash ; (r16, r17, r18, r19, r20, r22, x, y, z) brcc bootLoader_startFirmware ; no flash process, try to start installed firmware rcall flashProcess ; received a FLASH START msg, handle flashing @@ -75,7 +86,7 @@ bootSecRet: -FLASH_PROTO_END: -.equ MODULE_SIZE_FLASH_PROTO = FLASH_PROTO_END-FLASH_PROTO_BEGIN +BOOTLOADER_END: +.equ MODULE_SIZE_BOOTLOADER = BOOTLOADER_END-BOOTLOADER_BEGIN diff --git a/avr/modules/flash/0BUILD b/avr/modules/flash/0BUILD index 9465679..9ec9a77 100644 --- a/avr/modules/flash/0BUILD +++ b/avr/modules/flash/0BUILD @@ -3,16 +3,13 @@ - bootloader.asm defs.asm flash.asm - flash_ready.asm - flash_rsp.asm - hdl_flash_data.asm - hdl_flash_end.asm - hdl_flash_start.asm - recv.asm - send.asm + flashprocess.asm + io.asm + io_attn.asm + io_bitbang.asm + io_uart1.asm wait.asm diff --git a/avr/modules/flash/README b/avr/modules/flash/README index 62274f9..e77b6ed 100644 --- a/avr/modules/flash/README +++ b/avr/modules/flash/README @@ -1,5 +1,5 @@ -This implements the boot loader. It can be used to flash new firmware to node. +This implements the boot loader. It can be used to flash new firmware to nodes. How it works diff --git a/avr/modules/flash/bootloader.asm b/avr/modules/flash/bootloader.asm deleted file mode 100644 index 2183bb4..0000000 --- a/avr/modules/flash/bootloader.asm +++ /dev/null @@ -1,218 +0,0 @@ -; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss -; email : martin@libchipcard.de -; -; *************************************************************************** -; * This file is part of the project "AqHome". * -; * Please see toplevel file COPYING of that project for license details. * -; *************************************************************************** - - - -.equ FLASH_ERROR_NONE = 0 -.equ FLASH_ERROR_MSGERROR = 1 - -.equ FLASH_RECVBUFFER_MAXLEN = 128 -.equ FLASH_CMD_FLASH_RSP = 74 - - -.equ FLASH_MSG_OFFS_DESTADDR = 0 -.equ FLASH_MSG_OFFS_MSGLEN = 1 -.equ FLASH_MSG_OFFS_MSGDATA = 2 -.equ FLASH_MSG_OFFS_CMD = 2 ; first at COM2_MSG_OFFS_MSGDATA -.equ FLASH_MSG_OFFS_SRCADDR = 3 -.equ FLASH_MSG_OFFS_PAYLOAD = 4 ; payload for the cmd follows here - - -.equ FLASH_PACKET_DATA_OFFS_ADDR = FLASH_MSG_OFFS_PAYLOAD+0 ; 4 bytes -.equ FLASH_PACKET_DATA_OFFS_DATA = FLASH_MSG_OFFS_PAYLOAD+4 ; n bytes - -.equ FLASH_PACKET_START_OFFS_UID = FLASH_MSG_OFFS_PAYLOAD+0 ; 4 bytes - - -; *************************************************************************** -; data - - -.dseg - -flashDataBegin: - flashUid: .byte 4 - flashSendBuffer: .byte 32 - flashRecvBuffer: .byte FLASH_RECVBUFFER_MAXLEN -flashDataEnd: - - - - -; *************************************************************************** -; code - - -.cseg - - - -FLASH_PROTO_BEGIN: - - - - -bootLoader: - cli ; disable interrupts throughout the whole process - - ; setup stack - .ifdef SPH ; if SPH is defined - ldi r16, High(RAMEND) - out SPH, r16 ; init MSB stack pointer - .endif - ldi r16, Low(RAMEND) - out SPL, r16 ; init LSB stack pointer - - ; start by setting all ports as inputs and enable internal pull-up resistors - ldi r16, 0xff - clr r17 -.ifdef PORTA - out DDRA, r17 ; all input - out PORTA, r16 ; enable pull-up on all -.endif - -.ifdef PORTB - out DDRB, r17 ; all input - out PORTB, r16 ; enable pull-up on all -.endif - -.ifdef PORTC - out DDRC, r17 ; all input - out PORTC, r16 ; enable pull-up on all -.endif - - -; rcall watchdogOff ; turn off watchdog timer (sometimes it stays on after reboot) - - ; setup pins and interrupts - cbi COM_DATA_DDR, COM_DATA_PIN ; set TXD port as input - cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for TXD - - cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN port as input - cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable internal pullup for ATTN - - sbi LED_DDR, LED_PINNUM ; out - cbi LED_PORT, LED_PINNUM ; on - - rcall flashReadUid - ldi xh, HIGH(flashUid) - ldi xl, LOW(flashUid) - st X+, r18 - st X+, r19 - st X+, r20 - st X+, r21 - - ; wait for 3 secs before doing anything else - ldi r16, 30 - rcall flashWaitForMulti100ms - - rcall bootCheckFlash - brcc bootLoader_startFirmware ; no flash process, try start installed firmware - rcall bootLoaderFlash ; received a FLASH START msg, handle flashing - brcc bootLoader_waitAndRestartBootLoader - - ; try to start firmware -bootLoader_startFirmware: - cbi LED_PORT, LED_PINNUM ; on - ldi r16, 10 - rcall flashWaitForMulti100ms - sbi LED_PORT, LED_PINNUM ; off - ldi r16, 3 - rcall flashWaitForMulti100ms - cbi LED_PORT, LED_PINNUM ; on - ldi r16, 10 - rcall flashWaitForMulti100ms - sbi LED_PORT, LED_PINNUM ; off - rjmp firmwareStart - -bootLoader_waitAndRestartBootLoader: - sbi LED_PORT, LED_PINNUM ; off - ldi r16, 20 - rcall flashWaitForMulti100ms - rjmp bootLoader - - - -; --------------------------------------------------------------------------- -; check for incoming flash request -; -; send a FLASH_READY message and wait for about 10s for incoming FLASH_START which is then handled. -; -; IN: -; - R16: message type to receive -; - R17: wait time in 100ms (1=100ms, 2=200ms etc.) -; OUT: -; - CFLAG: set if incoming flash request received, cleared otherwise -; - R16: message type received (if CFLAG set) -; REGS: R16, R17, X, Y, (R1, R2, R18, R19, R20, R21, R22, R24, R25) - -bootCheckFlash: - ; send flash ready message - ldi xl, LOW(flashSendBuffer) - ldi xh, HIGH(flashSendBuffer) - rcall flashWriteFlashReady ; (R16, R17, R18, R19, R20, Y, Z) - rcall flashSendPacketUntilSuccess ; (R16, R17, R18, R21, R22, R24, R25, X) - -bootCheckFlash_loop: - ; wait up to 10s for incoming FLASH_START message - ldi r16, CPRO_CMD_FLASH_START - ldi r17, 100 ; 100*100ms=10s - rcall flashWaitForSpecificMessageWithLed ; R2, R16, R17 (R1, R24, R25, X) - brcc bootRet - - ; either FLASH_START or FLASH_END received - cpi r16, CPRO_CMD_FLASH_START ; not FLASH_START, no flashing requested - brne bootClcRet - - ; received FLASH_START - rcall flashHandleFlashStart - brcc bootCheckFlash_loop - ret ; ret with CARRY flag set - - - - - -bootLoaderFlash: -bootLoaderFlash_loop1: - ; wait up to 10s for incoming FLASH_DATA message - ldi r16, CPRO_CMD_FLASH_DATA - ldi r17, 100 ; 100*100ms=10s - rcall flashWaitForSpecificMessageWithLed - brcc bootRet - - ; either FLASH_DATA or FLASH_END received - cpi r16, CPRO_CMD_FLASH_DATA ; not FLASH_DATA, flashing ended/aborted - brne bootSecRet ; FLASH_END received, done - ; flash data - rcall flashHandleFlashData - rjmp bootLoaderFlash_loop1 - -bootLoaderFlash_endReceived: - rjmp flashHandleFlashEnd - - - -bootClcRet: - clc -bootRet: - ret - - - -bootSecRet: - sec - ret - - - -FLASH_PROTO_END: -.equ MODULE_SIZE_FLASH_PROTO = FLASH_PROTO_END-FLASH_PROTO_BEGIN - - diff --git a/avr/modules/flash/flash_ready.asm b/avr/modules/flash/flash_ready.asm deleted file mode 100644 index c01d1ed..0000000 --- a/avr/modules/flash/flash_ready.asm +++ /dev/null @@ -1,61 +0,0 @@ -; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss -; email : martin@libchipcard.de -; -; *************************************************************************** -; * This file is part of the project "AqHome". * -; * Please see toplevel file COPYING of that project for license details. * -; *************************************************************************** - - - -; *************************************************************************** -; code - - -.cseg - - - -; --------------------------------------------------------------------------- -; Write a FLASH_READY packet. -; -; IN: -; - X : buffer to write to -; OUT: -; - nothing -; MODIFIED REGS: R16, R18, Y, Z (R17, R19, R20) - -flashWriteFlashReady: - ldi r16, 0xff - st X+, r16 ; dest address (unused) - ldi r16, 20 ; msg code+src address+18 payload bytes - st X+, r16 ; msg len - ldi r16, CPRO_CMD_FLASH_READY - st X+, r16 ; msg code - ldi r16, COM2_MAINTENANCE_ADDR - st X+, r16 ; src address - - ; payload - ldi yh, HIGH(flashUid) ; 4 bytes - ldi yl, LOW(flashUid) - ldi r18, 4 - rcall Utils_Copy_SDRAM ; (R17, R18, X, Y) - - ldi zl, LOW(devInfoBlock*2) ; 12 bytes - ldi zh, HIGH(devInfoBlock*2) - ldi r18, 12 - rcall Utils_CopyFromFlash ; (R16, R18, X, Z) - - ldi r16, LOW(PAGESIZE*2) ; 2 bytes - st X+, r16 - ldi r16, HIGH(PAGESIZE*2) - st X+, r16 - - sbiw xh:xl, 22 ; go back to beginning of message - rcall com2CalcAndAddChecksumByte ; (R16, R17, R18, R19, R20, X) - sbiw xh:xl, 23 ; go back to beginning of message - ret - - - diff --git a/avr/modules/flash/flash_rsp.asm b/avr/modules/flash/flash_rsp.asm deleted file mode 100644 index 6fb1423..0000000 --- a/avr/modules/flash/flash_rsp.asm +++ /dev/null @@ -1,66 +0,0 @@ -; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss -; email : martin@libchipcard.de -; -; *************************************************************************** -; * This file is part of the project "AqHome". * -; * Please see toplevel file COPYING of that project for license details. * -; *************************************************************************** - - - -; *************************************************************************** -; code - - -.cseg - - -#if 0 -; --------------------------------------------------------------------------- -; Create and send a FLASH RESPONSE packet -; -; IN: -; - R16: response code to send -; OUT: -; - nothing -; REGS: r16, X (R15, R17, R18, R19, R20, R21, R22) - -flashSendFlashResponse: - ; send flash ready message - ldi xl, LOW(flashSendBuffer) - ldi xh, HIGH(flashSendBuffer) - rcall flashWriteFlashRsp ; (R16, R17, R18, R19, R20) - rjmp flashSendPacketUntilSuccess ; (R15, R16, R17, R21, R22, X) -#endif - - - - -; --------------------------------------------------------------------------- -; Write a FLASH_RESPONSE packet. -; -; IN: -; - R16: response code (0 if ok, error code otherwise) -; - X : buffer to write to -; OUT: -; - nothing -; MODIFIED REGS: R16, R17 (R18, R19, R20) - -flashWriteFlashRsp: - clr r18 - st X+, r18 ; dest address (unused) - ldi r18, 3 ; msg code+src address+one payload byte - st X+, r18 ; msg len - ldi r17, CPRO_CMD_FLASH_RSP - st X+, r17 ; msg code - clr r17 - st X+, r17 ; src address (not used) - st X+, r16 ; payload byte - sbiw xh:xl, 5 - rcall com2CalcAndAddChecksumByte ; (R16, R17, R18, R19, R20, X) - sbiw xh:xl, 6 - ret - - - diff --git a/avr/modules/flash/flashprocess.asm b/avr/modules/flash/flashprocess.asm index 919e694..79a8843 100644 --- a/avr/modules/flash/flashprocess.asm +++ b/avr/modules/flash/flashprocess.asm @@ -9,6 +9,22 @@ +; *************************************************************************** +; data + +.dseg + +flashDataBegin: + flashUid: .byte 4 + flashSendBuffer: .byte 32 + flashRecvBuffer: .byte FLASH_RECVBUFFER_MAXLEN +flashDataEnd: + + + +; *************************************************************************** +; code + .cseg @@ -23,15 +39,16 @@ ; @clobbers r16, r20, X, (r17, r18, r19, r22, y, z) checkFlash: - rcall flashInitIo ; (R16, R17) + rcall flashReadUidIntoSdram ; R16, X, Y + rcall ioRawInit ; (R16, R17) ldi xl, LOW(flashSendBuffer) ldi xh, HIGH(flashSendBuffer) rcall flashProcessWriteFlashReady ; (R16, R17, R18, R19, R20, Y, Z) - rcall flashRawSendMsg ; (r16, r17, X) + rcall ioRawSendMsg ; (r16, r17, X) ldi r16, CPRO_CMD_FLASH_START ldi r20, 10 ; wait for up to 10s - rcall flashWaitForGivenMsg ; (r16, r17, r18, r19, r20, r22, X) + rcall ioWaitForGivenMsg ; (r16, r17, r18, r19, r20, r22, X) brcc checkFlash_end cpi r16, CPRO_CMD_FLASH_START @@ -66,8 +83,8 @@ flashProcess: flashProcess_loop1: ; wait up to 10s for incoming FLASH_DATA message ldi r16, CPRO_CMD_FLASH_DATA - ldi r20, 5 ; wait for 5s - rcall flashWaitForGivenMsg ; (r16, r17, r18, r19, r20, r22, X) + ldi r20, 5 ; wait for 5s (not used!) + rcall ioWaitForGivenMsg ; (r16, r17, r18, r19, r20, r22, X) brcc flashProcess_end ; no FLASH_DATA or FLASH_END msg ; either FLASH_DATA or FLASH_END received ldi xl, LOW(flashRecvBuffer) @@ -156,17 +173,17 @@ flashProcessHandleFlashData: ld zh, X+ ; address (high) adiw xh:xl, 2 ; ignore high bytes, points to first data byte now - push zl - push zh -flashProcessHandleFlashData_loop: - ld r0, X+ - ld r1, X+ - rcall Flash_WriteIntoPage ; (R15, R16, Z+) - subi r18, 2 - brne flashProcessHandleFlashData_loop - pop zh - pop zl - rcall Flash_FinishPage ; (R15, R16, R20) +; push zl +; push zh +;flashProcessHandleFlashData_loop: +; ld r0, X+ +; ld r1, X+ +; rcall Flash_WriteIntoPage ; (R15, R16, Z+) +; subi r18, 2 +; brne flashProcessHandleFlashData_loop +; pop zh +; pop zl +; rcall Flash_FinishPage ; (R15, R16, R20) clr r16 rjmp flashProcessHandleFlashData_sendResponse flashProcessHandleFlashData_badData: @@ -210,7 +227,7 @@ flashProcessSendFlashResponse: ldi xl, LOW(flashSendBuffer) ldi xh, HIGH(flashSendBuffer) rcall flashProcessWriteFlashRsp ; (R16, R17, R18, R19, R20, X) - rjmp flashRawSendMsg ; (R16, R17, X) + rjmp ioRawSendMsg ; (R16, R17, X) ; @end diff --git a/avr/modules/flash/hdl_flash_data.asm b/avr/modules/flash/hdl_flash_data.asm deleted file mode 100644 index 94a6736..0000000 --- a/avr/modules/flash/hdl_flash_data.asm +++ /dev/null @@ -1,62 +0,0 @@ -; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss -; email : martin@libchipcard.de -; -; *************************************************************************** -; * This file is part of the project "AqHome". * -; * Please see toplevel file COPYING of that project for license details. * -; *************************************************************************** - - - -; *************************************************************************** -; code - - -.cseg - - - -; --------------------------------------------------------------------------- -; Handle FLASH DATA packet. -; -; IN: -; - X : buffer containing the message -; OUT: -; - CFLAG: set if message is for us, cleared otherwise -; REGS: R0, R1, R15, R16, R17, R18, R19, R20, R21, R24, R25, X, Z - -flashHandleFlashData: - adiw xh:xl, FLASH_MSG_OFFS_MSGLEN - ld r18, X ; length (subtract 6 - cpi r18, 6 ; cmd(1), src(1), addr(4) - brcs flashHandleFlashData_badData - 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 - -; rcall Flash_StartPage ; (R0, R1, R16, R20, R24, R25) - push zl - push zh -flashHandleFlashData_loop: - ld r0, X+ - ld r1, X+ - rcall Flash_WriteIntoPage ; (R15, R16, Z+) - subi r18, 2 - brne flashHandleFlashData_loop - pop zh - pop zl - rcall Flash_FinishPage ; (R15, R16, R20) - clr r16 - rjmp flashHandleFlashData_sendResponse -flashHandleFlashData_badData: - ldi r16, FLASH_ERROR_MSGERROR -flashHandleFlashData_sendResponse: - rcall flashSendFlashResponse ; (R15, R16, R17, R18, R19, R20, R21, R22, X) - sec - ret - - - diff --git a/avr/modules/flash/hdl_flash_end.asm b/avr/modules/flash/hdl_flash_end.asm deleted file mode 100644 index dd4f0ab..0000000 --- a/avr/modules/flash/hdl_flash_end.asm +++ /dev/null @@ -1,38 +0,0 @@ -; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss -; email : martin@libchipcard.de -; -; *************************************************************************** -; * This file is part of the project "AqHome". * -; * Please see toplevel file COPYING of that project for license details. * -; *************************************************************************** - - - -; *************************************************************************** -; code - - -.cseg - - - - -; --------------------------------------------------------------------------- -; Handle FLASH END packet. -; -; IN: -; - X : buffer containing the message -; OUT: -; - CFLAG: set if message is for us, cleared otherwise -; REGS: r16, r18. r19. r20, r21, X (R15, R17, R22) - -flashHandleFlashEnd: - rcall flashWaitFor100ms - clr r16 - rcall flashSendFlashResponse ; (R15, R16, R17, R18, R19, R20, R21, R22, X) - sec - ret - - - diff --git a/avr/modules/flash/hdl_flash_start.asm b/avr/modules/flash/hdl_flash_start.asm deleted file mode 100644 index 1d2fdbb..0000000 --- a/avr/modules/flash/hdl_flash_start.asm +++ /dev/null @@ -1,73 +0,0 @@ -; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss -; email : martin@libchipcard.de -; -; *************************************************************************** -; * This file is part of the project "AqHome". * -; * Please see toplevel file COPYING of that project for license details. * -; *************************************************************************** - - - -; *************************************************************************** -; code - - -.cseg - - - - -; --------------------------------------------------------------------------- -; @routine flashHandleFlashStart -; Handle FLASH START packet. -; -; @return CFLAG set if message is for us, cleared otherwise -; @param X buffer containing the message -; @clobbers r16, (R15, R17, R18, R19, R20, R21, R22, X) - -flashHandleFlashStart: - rcall flashCheckFlashStart - brcc flashHandleFlashStart_notMe - ; okay, flash start message is for us - rcall flashWaitFor100ms - clr r16 - rcall flashSendFlashResponse ; (R15, R16, R17, R18, R19, R20, R21, R22, X) - sec - ret -flashHandleFlashStart_notMe: - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine flashCheckFlashStart -; -; Check whether the UID in the given msg matches our UID. -; -; @return CFLAG set if message is for us, cleared otherwise -; @param X buffer containing the message -; @clobbers r16, r17, r18, X, Y - -flashCheckFlashStart: - ldi yh, HIGH(flashUid) - ldi yl, LOW(flashUid) - adiw xh:xl, FLASH_PACKET_START_OFFS_UID - ldi r18, 4 -flashCheckFlashStart_loop: - ld r16, X+ - ld r17, Y+ - cp r16, r17 - brne flashCheckFlashStart_notMe - dec r18 - brne flashCheckFlashStart_loop - sec - ret -flashCheckFlashStart_notMe: - clc - ret -; @end - - - diff --git a/avr/modules/flash/io.asm b/avr/modules/flash/io.asm index f51a539..730c944 100644 --- a/avr/modules/flash/io.asm +++ b/avr/modules/flash/io.asm @@ -16,7 +16,7 @@ ; --------------------------------------------------------------------------- -; @routine flashWaitForGivenMsg +; @routine ioWaitForGivenMsg ; Wait for incoming msg with given command ; ; @return CFLAG set if okay (packet received), cleared on error @@ -25,28 +25,28 @@ ; @param r20 time in seconds to wait for a message ; @clobbers: r16, r17, r20, X (r18, r19, r22) -flashWaitForGivenMsg: -flashWaitForGivenMsg_loop: +ioWaitForGivenMsg: +ioWaitForGivenMsg_loop: push r16 - rcall flashRawWaitForValidMsg ; (r16, r17, r18, r19, r22, X) + rcall ioRawWaitForValidMsg ; (r16, r17, r18, r19, r22, X) pop r16 - brcc flashWaitForGivenMsg_end + brcc ioWaitForGivenMsg_end ldi xl, LOW(flashRecvBuffer) ldi xh, HIGH(flashRecvBuffer) adiw xh:xl, COM2_MSG_OFFS_CMD ld r17, X sbiw xh:xl, COM2_MSG_OFFS_CMD cp r16, r17 - breq flashWaitForGivenMsg_gotIt + breq ioWaitForGivenMsg_gotIt cpi r16, CPRO_CMD_FLASH_END - breq flashWaitForGivenMsg_gotIt + breq ioWaitForGivenMsg_gotIt dec r20 - brne flashWaitForGivenMsg_loop + brne ioWaitForGivenMsg_loop clc - rjmp flashWaitForGivenMsg_end -flashWaitForGivenMsg_gotIt: + rjmp ioWaitForGivenMsg_end +ioWaitForGivenMsg_gotIt: sec -flashWaitForGivenMsg_end: +ioWaitForGivenMsg_end: ret ; @end diff --git a/avr/modules/flash/io_attn.asm b/avr/modules/flash/io_attn.asm index e5bb1e3..388f753 100644 --- a/avr/modules/flash/io_attn.asm +++ b/avr/modules/flash/io_attn.asm @@ -16,28 +16,52 @@ ; --------------------------------------------------------------------------- -; @routine flashWaitForAttnState +; @routine ioWaitForAttnState100ms ; ; @param r16 expected state (0x00 or 0xff) -; @param r17 time to wait for expected state (in milliseconds) -; @clobbers +; @param r17 time to wait for expected state (in 100 ms units) +; @clobbers R17 (R22, R24) -flashWaitForAttnState: -flashWaitForAttnState_loop: - rcall flashWaitForAttnState1ms ; (R22, R24) - brcs flashWaitForAttnState_stateReached +ioWaitForAttnState100ms: +ioWaitForAttnState100ms_loop: + push r17 + ldi r17, 100 + rcall ioWaitForAttnStateMilliSeconds ; (R22, R24) + pop r17 + brcs ioWaitForAttnState100ms_stateReached dec r17 - brne flashWaitForAttnState_loop + brne ioWaitForAttnState100ms_loop clc ret -flashWaitForAttnState_stateReached: +ioWaitForAttnState100ms_stateReached: ret ; @end ; --------------------------------------------------------------------------- -; @routine flashWaitForAttnState1ms +; @routine ioWaitForAttnStateMilliSeconds +; +; @param r16 expected state (0x00 or 0xff) +; @param r17 time to wait for expected state (in milliseconds) +; @clobbers R17 (R22, R24) + +ioWaitForAttnStateMilliSeconds: +ioWaitForAttnStateMilliSeconds_loop: + rcall ioWaitForAttnState1ms ; (R22, R24) + brcs ioWaitForAttnStateMilliSeconds_stateReached + dec r17 + brne ioWaitForAttnStateMilliSeconds_loop + clc + ret +ioWaitForAttnStateMilliSeconds_stateReached: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ioWaitForAttnState1ms ; ; Wait for up to 1ms for ATTN line to reach the given state ; @@ -45,22 +69,23 @@ flashWaitForAttnState_stateReached: ; @param R16 expected state (0xff for high, 0 for low) ; @clobbers R24 (R22) -flashWaitForAttnState1ms: +ioWaitForAttnState1ms: cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN port as input cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable internal pullup for ATTN ldi r24, 100 -flashWaitForAttnState1ms_loop: +ioWaitForAttnState1ms_loop: push r17 in r17, COM_ATTN_INPUT eor r17, r16 andi r17, (1<