118 lines
2.6 KiB
NASM
118 lines
2.6 KiB
NASM
; ***************************************************************************
|
|
; copyright : (C) 2025 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
|
|
|
|
|
|
|
|
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
|
|
sbi LED_PORT, LED_PINNUM ; off
|
|
|
|
ldi r19, 10 ; loop count
|
|
ldi r20, 2 ; on time
|
|
ldi r21, 2 ; off time
|
|
rcall bootLoaderBlinkLed
|
|
|
|
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
|
|
brcc bootLoader_waitAndRestartBootLoader
|
|
; try to start firmware
|
|
bootLoader_startFirmware:
|
|
ldi r19, 6 ; loop count
|
|
ldi r20, 4 ; on time
|
|
ldi r21, 1 ; off time
|
|
rcall bootLoaderBlinkLed
|
|
rjmp firmwareStart
|
|
bootLoader_waitAndRestartBootLoader:
|
|
ldi r19, 3 ; loop count
|
|
ldi r20, 1 ; on time
|
|
ldi r21, 8 ; off time
|
|
rcall bootLoaderBlinkLed
|
|
rjmp bootLoader
|
|
|
|
|
|
|
|
; @param r19 loop count
|
|
; @param r20 on time
|
|
; @param r21 off time
|
|
; @clobbers (R16, R18, R22, R24, R25)
|
|
|
|
bootLoaderBlinkLed:
|
|
cbi LED_PORT, LED_PINNUM ; on
|
|
mov r16, r20
|
|
rcall flashWaitForMulti100ms ; (R16, R18, R22, R24, R25)
|
|
sbi LED_PORT, LED_PINNUM ; on
|
|
mov r16, r21
|
|
rcall flashWaitForMulti100ms ; (R16, R18, R22, R24, R25)
|
|
dec r19
|
|
brne bootLoaderBlinkLed
|
|
ret
|
|
|
|
|
|
bootClcRet:
|
|
clc
|
|
bootRet:
|
|
ret
|
|
|
|
bootSecRet:
|
|
sec
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOTLOADER_END:
|
|
.equ MODULE_SIZE_BOOTLOADER = BOOTLOADER_END-BOOTLOADER_BEGIN
|
|
|
|
|