Files
aqhomecontrol/avr/modules/uart_hw/lowlevel_tty.asm
2025-01-16 17:05:42 +01:00

169 lines
3.7 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. *
; ***************************************************************************
.dseg
; uartHw_TtyOn1Interface: .byte UART_HW_IFACE_SIZE
.cseg
; ---------------------------------------------------------------------------
; @routine UART_HW_TtyOn1_Init @global
;
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
; @clobbers R16, R17, X
UART_HW_TtyOn1_Init:
rcall UART_HW_InitInterface
; set baudrate
.if clock == 8000000
ldi r16, 25 ; (19.2Kb/s at 8MHz)
ldi r17, 0
.endif
.if clock == 1000000
ldi r16, 3 ; (19.2Kb/s at 1MHz)
ldi r17, 0
.endif
out UBRR1H, r17
out UBRR1L, r16
; set character format
ldi r16, (1<<USBS1)|(3<<UCSZ10)
out UCSR1C, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_TtyOn1_StartRx @global
;
; @clobbers none
UART_HW_TtyOn1_StartRx:
; enable RX complete interrupt
sbi UCSR1B, RXCIE1
; enable receive
sbi UCSR1B, RXEN1
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_TtyOn1_StopRx @global
;
; @clobbers none
UART_HW_TtyOn1_StopRx:
; disable RX complete interrupt
cbi UCSR1B, RXCIE1
; disable receive
cbi UCSR1B, RXEN1
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_TtyOn1_StartTx @global
;
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
; @clobbers none
UART_HW_TtyOn1_StartTx:
; enable TX data register empty interrupt
sbi UCSR1B, UDRIE1
; enable transmit
sbi UCSR1B, TXEN1
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_TtyOn1_StopTx @global
;
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
; @clobbers none
UART_HW_TtyOn1_StopTx:
; enable TX data register empty interrupt
cbi UCSR1B, UDRIE1
; enable transmit
cbi UCSR1B, TXEN1
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_TtyOn1_RxCharIsr @global
;
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
; @clobbers R16 (R17, R18, X)
UART_HW_TtyOn1_RxCharIsr:
sbis UCSR1A, RXC1
rjmp UART_HW_TtyOn1_RxCharIsr_end ; no data
in r16, UDR1
rcall UART_HW_InterfaceAddReadByte ; (R17, R18, X)
UART_HW_TtyOn1_RxCharIsr_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_TtyOn1_TxCharIsr @global
;
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
; @clobbers R16, X
UART_HW_TtyOn1_TxCharIsr:
sbis UCSR1A,UDRE1
rjmp UART_HW_TtyOn1_TxCharIsr_end ; not ready
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEBUFFERNUM
cpi r16, 0xff
breq UART_HW_TtyOn1_TxCharIsr_end ; no current write buffer
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEBUFFERLEFT
tst r16
breq UART_HW_TtyOn1_TxCharIsr_end ; nothing to send
dec r16
std Y+UART_HW_IFACE_OFFS_WRITEBUFFERLEFT, r16
ldd xl, Y+UART_HW_IFACE_OFFS_WRITEBUFFERPTR
ldd xh, Y+UART_HW_IFACE_OFFS_WRITEBUFFERPTR+1
ld r16, X+
std Y+UART_HW_IFACE_OFFS_WRITEBUFFERPTR, xl
std Y+UART_HW_IFACE_OFFS_WRITEBUFFERPTR+1, xh
out UDR1, r16
UART_HW_TtyOn1_TxCharIsr_end:
ret
; @end