From 08d420a8719f9f964c374e082bbc6f28e4a58440 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Sat, 23 Aug 2025 00:08:25 +0200 Subject: [PATCH] avr: added module uart_fd This module uses hardware UART of MCUs in full duplex mode. --- avr/devices/all/includes.asm | 17 + avr/devices/all/main.asm | 8 + avr/devices/all/modules.asm | 23 ++ avr/devices/t03/uartfd/main.asm | 259 ++++++++++++ avr/modules/0BUILD | 1 + avr/modules/uart_fd/0BUILD | 13 + avr/modules/uart_fd/defs.asm | 47 +++ avr/modules/uart_fd/macros.asm | 204 ++++++++++ avr/modules/uart_fd/uartfd0.asm | 687 +++++++++++++++++++++++++++++++ avr/modules/uart_fd/uartfd1.asm | 696 ++++++++++++++++++++++++++++++++ 10 files changed, 1955 insertions(+) create mode 100644 avr/devices/t03/uartfd/main.asm create mode 100644 avr/modules/uart_fd/0BUILD create mode 100644 avr/modules/uart_fd/defs.asm create mode 100644 avr/modules/uart_fd/macros.asm create mode 100644 avr/modules/uart_fd/uartfd0.asm create mode 100644 avr/modules/uart_fd/uartfd1.asm diff --git a/avr/devices/all/includes.asm b/avr/devices/all/includes.asm index e166c09..7755185 100644 --- a/avr/devices/all/includes.asm +++ b/avr/devices/all/includes.asm @@ -133,6 +133,23 @@ #endif + +#ifdef MODULES_UARTFD0 +.include "modules/uart_fd/defs.asm" +.include "modules/uart_fd/macros.asm" +.include "modules/uart_fd/uartfd0.asm" +#endif + + + +#ifdef MODULES_UARTFD1 +.include "modules/uart_fd/defs.asm" +.include "modules/uart_fd/macros.asm" +.include "modules/uart_fd/uartfd1.asm" +#endif + + + #ifdef MODULES_CLOCK .include "modules/clock/main.asm" #endif diff --git a/avr/devices/all/main.asm b/avr/devices/all/main.asm index 1615d36..5aaf331 100644 --- a/avr/devices/all/main.asm +++ b/avr/devices/all/main.asm @@ -127,6 +127,14 @@ onSystemTimerTick: bigcall TtyOnUart1_Periodically #endif +#ifdef MODULES_UARTFD0 + bigcall UARTFD0_Every100ms +#endif + +#ifdef MODULES_UARTFD1 + bigcall UARTFD1_Every100ms +#endif + #ifdef MODULES_COMONUART0 bigcall ComOnUart0_Periodically #endif diff --git a/avr/devices/all/modules.asm b/avr/devices/all/modules.asm index 36862fe..d9be262 100644 --- a/avr/devices/all/modules.asm +++ b/avr/devices/all/modules.asm @@ -73,6 +73,14 @@ initModules: bigcall TtyOnUart1_Init #endif +#ifdef MODULES_UARTFD0 + bigcall UARTFD0_Init +#endif + +#ifdef MODULES_UARTFD1 + bigcall UARTFD1_Init +#endif + #ifdef MODULES_COMONUART0 bigcall ComOnUart0_Init #endif @@ -202,6 +210,21 @@ runModules: pop r16 #endif + +#ifdef MODULES_UARTFD0 + push r16 + bigcall UARTFD0_Run + pop r16 + sbci r16, 0 +#endif + +#ifdef MODULES_UARTFD1 + push r16 + bigcall UARTFD1_Run + pop r16 + sbci r16, 0 +#endif + #ifdef MODULES_COMONUART0 push r16 bigcall ComOnUart0_Run diff --git a/avr/devices/t03/uartfd/main.asm b/avr/devices/t03/uartfd/main.asm new file mode 100644 index 0000000..ca3dbaf --- /dev/null +++ b/avr/devices/t03/uartfd/main.asm @@ -0,0 +1,259 @@ +; *************************************************************************** +; 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. * +; *************************************************************************** + + + + +; *************************************************************************** +; Source file for temperature sensor node on AtTiny 84 +; +; This is for the full system (i.e. not the boot loader). +; +; All definitions and changes should go into this file. +; +; +; *************************************************************************** + + +;.equ clock=1000000 ; Define the clock frequency +.equ clock=8000000 ; Define the clock frequency + + +.nolist +.include "include/tn841def.inc" ; Define device ATtiny841 +.list + +.include "../defs.asm" +.include "version.asm" +;.include "defs_all.asm" + +.include "devices/all/defs.asm" + +.include "common/calls.asm" +.include "common/utils_wait.asm" +.include "common/utils_io.asm" + + + +; *************************************************************************** +; defines + +; --------------------------------------------------------------------------- +; generic + +.equ COMONUART0_IFACENUM = 1 +.equ TTYONUART1_IFACENUM = 2 + + +; --------------------------------------------------------------------------- +; firmware settings including list of modules used + + +#define MAIN_WITHOUT_MSG_HANDLING ; we do message handling ourselfes +#define APP_STATS_NETDEV2 +#define APP_ROUTER_NO_ADDR_MGR + +#define MODULES_CLOCK +;#define MODULES_COM +;#define MODULES_COM_WITH_ADDR_PROTO +;#define MODULES_LED +#define MODULES_LED_SIMPLE +;#define MODULES_TWI_MASTER +;#define MODULES_LCD +;#define LCD_MINIMAL_FONT +;#define MODULES_SI7021 +;#define MODULES_STATS +;#define MODULES_CNY70 +;#define MODULES_REED +;#define MODULES_OWI_MASTER +;#define MODULES_DS18B20 +;#define MODULES_MOTION +#define MODULES_NETWORK +#define MODULES_COM2W +;#define MODULES_COMONUART0 +;#define MODULES_TTYONUART1 +#define MODULES_UARTFD1 +#define APPS_STATS +;#define APPS_NETWORK +#define APPS_ROUTER + + + +.equ NET_BUFFERS_NUM = 10 +.equ NET_MSGNUMINBUF_SIZE = 8 ; max buffer nums in ringbuffer (global incoming) +.equ NET_IFACE_OUTMSGBUF_SIZE = 8 ; max buffer nums in ringbuffer (per interface outbound) + +.equ UART_HW_MSGNUMINBUF_SIZE = 8 +.equ UART_HW_MSGNUMOUTBUF_SIZE = 8 + + + +; --------------------------------------------------------------------------- +; defines for values + +.equ VALUE_ID_DS18B20_TEMP = 0x06 + +.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88 +.equ VALUE_ID_ROUTER_SETRANGE = 0x89 + + + +.equ COM_DATA0_DDR = COM_DATA_DDR +.equ COM_DATA0_INPUT = COM_DATA_INPUT +.equ COM_DATA0_OUTPUT = COM_DATA_OUTPUT +.equ COM_DATA0_PUE = COM_DATA_PUE +.equ COM_DATA0_PIN = COM_DATA_PIN + +.equ COM_CLK0_DDR = COM_CLK_DDR +.equ COM_CLK0_INPUT = COM_CLK_INPUT +.equ COM_CLK0_OUTPUT = COM_CLK_OUTPUT +.equ COM_CLK0_PUE = COM_CLK_PUE +.equ COM_CLK0_PIN = COM_CLK_PIN + +.equ COM_IRQ_ADDR_CLK0 = COM_IRQ_ADDR_CLK +.equ COM_IRQ_BIT_CLK0 = COM_IRQ_BIT_CLK +.equ COM_IRQ_GIFR_CLK0 = COM_IRQ_GIFR_CLK +.equ COM_IRQ_GIMSK_CLK0 = COM_IRQ_GIMSK_CLK + + +; *************************************************************************** +; code segment + +.cseg +.org 000000 + + + +; --------------------------------------------------------------------------- +; Reset and interrupt vectors + + rjmp BOOTLOADER_ADDR ; 1: RESET Reset vector use this for flashed system + reti ; 2: INT0 External Interrupt Request 0 + rjmp com2wPcintIsr ; 3: PCINT0 Pin Change Interrupt 0 + reti ; 4: PCINT1 Pin Change Interrupt 1 + reti ; 5: WDT Watchdog Time-out + reti ; 6: TIM1_CAPT Timer/Counter1 Capture Event + reti ; 7: TIM1_COMPA (OC1A) Timer/Counter1 Compare Match A + reti ; 8: TIM1_COMPB (OC1B) Timer/Counter1 Compare Match B + reti ; 9: TIM1_OVF (OVF1) Timer/Counter1 Overflow + rjmp baseTimerIrqOC0A ; 10: TIM0_COMPA (OC0A) Timer/Counter0 Compare Match A + reti ; 11: TIM0_COMPB (OC0B) Timer/Counter0 Compare Match B + reti ; 12: TIM0_OVF (OVF0) Timer/Counter0 Overflow + reti ; 13: ANA_COMP0 Analog Comparator 0 + reti ; 14: ADC_READY ADC Conversion Complete + reti ; 15: EE_RDY (ERDY) EEPROM Ready + reti ; 16: ANA_COMP1 Analog Comparator 1 + reti ; 17: TIM2_CAPT Timer/Counter2 Capture Event + reti ; 18: TIM2_COMPA (OC2A) Timer/Counter2 Compare Match A + reti ; 19: TIM2_COMPB (OC2B) Timer/Counter2 Compare Match B + reti ; 20: TIM2_OVF (OVF2) Timer/Counter2 Overflow + reti ; 21: SPI SPI Serial Transfer Complete + reti ; 22: USART0_RXS USART0 Rx Start +; rjmp ComOnUart0_RxCharIsr ; 23: USART0_RXC USART0 Rx Complete + reti ; 23: USART0_RXC USART0 Rx Complete + reti ; 24: USART0_DRE USART0 Data Register Empty + reti ; 25: USART0_TXC USART0 Tx Complete + reti ; 26: USART1_RXS USART1 Rx Start + rjmp UARTFD1_RxCharIsr ; 27: USART1_RXC USART1 Rx Complete + rjmp UARTFD1_TxUdreIsr ; 28: USART1_DRE USART1 Data Register Empty + rjmp UARTFD1_TxCharIsr ; 29: USART1_TXC USART1 Tx Complete + reti ; 30: TWI Two-Wire-Interface + reti ; 31: RESERVED reserved + + + +devInfoBlock: ; 12 bytes +devInfoManufacturer: .db 'A', 'Q', 'U', 'A' +devInfoId: .db DEVICEINFO_ID, 0 +devInfoVersion: .db DEVICEINFO_VERSION, DEVICEINFO_REVISION ; version, revision +firmwareVersion: .db FIRMWARE_VARIANT_TEMP_WINDOW, FIRMWARE_VERSION_MAJOR + .db FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_PATCHLEVEL + + + +; --------------------------------------------------------------------------- +; @routine firmwareStart @global + +firmwareStart: + rjmp main +; @end + + + +; --------------------------------------------------------------------------- +; @routine onSystemStart + +onSystemStart: + ldi r16, 0xf0 + sts netInterfaceData+NET_IFACE_OFFS_ADDRESS, r16 + sts netInterfaceData2+NET_IFACE_OFFS_ADDRESS, r16 + ret +; @end + + + +onEvery100ms: +onEverySecond: +onEveryMinute: +onEveryHour: +onEveryDay: + ret + + + +; --------------------------------------------------------------------------- +; @routine onEveryLoop +; +; Called on every loop (i.e. after awakening from sleep). + +onEveryLoop: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine onMessageReceived +; +; Called on every message received + +onMessageReceived: + clc + ret +; @end + + + + + + +; *************************************************************************** +; includes + +.include "devices/all/hw_tn841.asm" +.include "devices/all/includes.asm" +.include "common/debug.asm" + + + + +; --------------------------------------------------------------------------- +; defines for network interface + +.equ netInterfaceData = uartFd1_iface +.equ netInterfaceData2 = com2w_iface + + +; debug +push r18 + push r19 + rcall LedSimple_SetFastTiming + pop r19 +pop r18 + diff --git a/avr/modules/0BUILD b/avr/modules/0BUILD index 6b7dfdf..781cd54 100644 --- a/avr/modules/0BUILD +++ b/avr/modules/0BUILD @@ -31,6 +31,7 @@ uart_bitbang uart_bitbang2 uart_irq + uart_fd uart_hw bootloader f_keepup diff --git a/avr/modules/uart_fd/0BUILD b/avr/modules/uart_fd/0BUILD new file mode 100644 index 0000000..49f7dd3 --- /dev/null +++ b/avr/modules/uart_fd/0BUILD @@ -0,0 +1,13 @@ + + + + + + defs.asm + macros.asm + uartfd0.asm + + + + + diff --git a/avr/modules/uart_fd/defs.asm b/avr/modules/uart_fd/defs.asm new file mode 100644 index 0000000..a095773 --- /dev/null +++ b/avr/modules/uart_fd/defs.asm @@ -0,0 +1,47 @@ +; *************************************************************************** +; 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. * +; *************************************************************************** + +#ifndef AVR_MODULES_UARTFD_DEFS_ASM +#define AVR_MODULES_UARTFD_DEFS_ASM + + +.equ UARTFD_SKIPPING_TIME = 2 +.equ UARTFD_READ_TIMEOUT = 2 +.equ UARTFD_WRITE_TIMEOUT = 2 + + +.equ UARTFD_IFACE_STATUS_BIT_OVERRUN = 0 +.equ UARTFD_IFACE_STATUS_BIT_HWERR = 1 +.equ UARTFD_IFACE_STATUS_BIT_BADMSGSIZE = 2 +.equ UARTFD_IFACE_STATUS_BIT_SKIPPING = 3 + + + +.equ UARTFD_IFACE_SIZE_BUFFER = NET_BUFFERS_SIZE-1 + +.equ UARTFD_IFACE_OFFS_BEGIN = NET_IFACE_SIZE +.equ UARTFD_IFACE_OFFS_STATUS = UARTFD_IFACE_OFFS_BEGIN +.equ UARTFD_IFACE_OFFS_WPOS_LOW = UARTFD_IFACE_OFFS_BEGIN+1 +.equ UARTFD_IFACE_OFFS_WPOS_HIGH = UARTFD_IFACE_OFFS_BEGIN+2 +.equ UARTFD_IFACE_OFFS_WBUFLEFT = UARTFD_IFACE_OFFS_BEGIN+3 +.equ UARTFD_IFACE_OFFS_WBUFNUM = UARTFD_IFACE_OFFS_BEGIN+4 +.equ UARTFD_IFACE_OFFS_RPOS_LOW = UARTFD_IFACE_OFFS_BEGIN+5 +.equ UARTFD_IFACE_OFFS_RPOS_HIGH = UARTFD_IFACE_OFFS_BEGIN+6 +.equ UARTFD_IFACE_OFFS_RBUFUSED = UARTFD_IFACE_OFFS_BEGIN+7 +.equ UARTFD_IFACE_OFFS_RBUFLEFT = UARTFD_IFACE_OFFS_BEGIN+8 +.equ UARTFD_IFACE_OFFS_RBUFFER = UARTFD_IFACE_OFFS_BEGIN+9 +.equ UARTFD_IFACE_SIZE = UARTFD_IFACE_OFFS_RBUFFER+UARTFD_IFACE_SIZE_BUFFER + + + + +#endif + + + diff --git a/avr/modules/uart_fd/macros.asm b/avr/modules/uart_fd/macros.asm new file mode 100644 index 0000000..3e5b72e --- /dev/null +++ b/avr/modules/uart_fd/macros.asm @@ -0,0 +1,204 @@ +; *************************************************************************** +; 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. * +; *************************************************************************** + +#ifndef AVR_MODULES_UARTFD_MACROS_ASM +#define AVR_MODULES_UARTFD_MACROS_ASM + + +.macro M_UARTFD_SET_CHARFORMAT + ldi r16, (1<