X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=test_src%2Fuart_i-asm.S;h=67fe749d3c9a41cdbcc3756a6932816117db9488;hp=e310a48d199744407fb1bd28a849bb405cfcef36;hb=4b5da1dc27a791b5c448274a3db09cd035b33493;hpb=a5cb349f9d72e0d2c82730647b4f142de6b7e485 diff --git a/test_src/uart_i-asm.S b/test_src/uart_i-asm.S index e310a48..67fe749 100644 --- a/test_src/uart_i-asm.S +++ b/test_src/uart_i-asm.S @@ -1,7 +1,7 @@ /* uart_i-asm.S */ /* This file is part of the AVR-uart_i. - Copyright (C) 2009 Daniel Otte (daniel.otte@rub.de) + Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ */ /** * \file uart_i-asm.S - * \email daniel.otte@rub.de + * \email bg@nerilex.org * \author Daniel Otte * \date 2009-07-24 * \license GPLv3 or later @@ -71,6 +71,25 @@ # define RXC0 RXC # define TXB80 TXB8 # define RXB80 RXB8 +# define U2X0 U2X +# define UDRIE0 UDRIE +# define RXCIE0 RXCIE +#endif + +#ifdef USART0_RX_vect +# define RX_ISR USART0_RX_vect +#endif + +#ifdef USART_RXC_vect +# define RX_ISR USART_RXC_vect +#endif + +#ifdef USART0_UDRE_vect +# define TX_ISR USART0_UDRE_vect +#endif + +#ifdef USART_UDRE_vect +# define TX_ISR USART_UDRE_vect #endif #define CBB_SIZE 10 @@ -156,7 +175,6 @@ uart0_init: clr r25 ldi r22, lo8(uart0_ctx+UART0_CBB_RX_OFFSET) ldi r23, hi8(uart0_ctx+UART0_CBB_RX_OFFSET) - ldi r24, UART0_RXBUFFER_SIZE ldi r20, lo8(uart0_rxbuffer) ldi r21, hi8(uart0_rxbuffer) rcall circularbytebuffer_init2 @@ -164,7 +182,6 @@ uart0_init: clr r25 ldi r22, lo8(uart0_ctx+UART0_CBB_TX_OFFSET) ldi r23, hi8(uart0_ctx+UART0_CBB_TX_OFFSET) - ldi r24, UART0_TXBUFFER_SIZE ldi r20, lo8(uart0_txbuffer) ldi r21, hi8(uart0_txbuffer) rcall circularbytebuffer_init2 @@ -175,6 +192,11 @@ uart0_init: std Z+UART0_TXON_OFFSET, r24 std Z+UART0_RXON_OFFSET, r24 #endif +#if UART0_HOOK + std Z+UART0_HOOK_OFFSET, r1 + std Z+UART0_HOOK_OFFSET+1, r1 + std Z+UART0_HOOKR_OFFSET, r1 +#endif ldi r24, UBRRH_VALUE STORE_IO UBRR0H, r24 ldi r24, UBRRL_VALUE @@ -183,7 +205,6 @@ uart0_init: SET_BIT_IO UCSR0A, U2X0, r24 #else CLEAR_BIT_IO UCSR0A, U2X0, r24 -/* UCSR0A */ #endif ldi r24, (UART0_PARATY<<4)|(UART0_STOPBITS<<3)|((UART0_DATABITS&3)<<1) STORE_IO UCSR0C, r24 @@ -210,11 +231,17 @@ uart0_init: * } */ -.global USART0_UDRE_vect -USART0_UDRE_vect: - push_range 21, 26 - push_range 30, 31 +.global TX_ISR +TX_ISR: + push r1 + push r21 + push r22 in r21, _SFR_IO_ADDR(SREG) + CLEAR_BIT_IO UCSR0B, UDRIE0, r22 + sei + push_range 23, 27 + push_range 30, 31 + clr r1 ldi r24, lo8(uart0_ctx+UART0_CBB_TX_OFFSET) ldi r25, hi8(uart0_ctx+UART0_CBB_TX_OFFSET) rcall circularbytebuffer_get_fifo @@ -232,11 +259,14 @@ USART0_UDRE_vect: breq 30b #endif STORE_IO UDR0, r24 + SET_BIT_IO UCSR0B, UDRIE0, r22 99: + ori r21, 0x80 /* set I bit */ out _SFR_IO_ADDR(SREG), r21 pop_range 30, 31 - pop_range 21, 26 - reti + pop_range 21, 27 + pop r1 + ret /******************************************************************************/ /* @@ -270,7 +300,9 @@ uart0_putc: ldi r27, hi8(uart0_ctx+UART0_CBB_TX_OFFSET) 20: movw r24, r26 + cli rcall circularbytebuffer_cnt + sei cpi r24, UART0_TXBUFFER_SIZE breq 20b movw r22, r26 @@ -278,9 +310,8 @@ uart0_putc: clr r25 cli rcall circularbytebuffer_append - sei SET_BIT_IO UCSR0B, UDRIE0, r24 - ret + reti /******************************************************************************/ /* @@ -326,26 +357,56 @@ uart0_putc: * } * */ - .global USART0_RX_vect - USART0_RX_vect: + .global RX_ISR + RX_ISR: push_range 0, 1 push_range 16, 31 - in r18, _SFR_IO_ADDR(SREG) + in r16, _SFR_IO_ADDR(SREG) + clr r1 LOAD_IO r24, UDR0 #if UART0_SWFLOWCTRL - ldi r26, lo8(uart0_ctx+UART0_TXON_OFFSET) + ldi r26, lo8(uart0_ctx+UART0_TXON_OFFSET) ldi r27, hi8(uart0_ctx+UART0_TXON_OFFSET) cpi r24, XON_VALUE - brne 10f - ldi r24, 1 - st X, r24 - rjmp 99f -10: + breq 11f cpi r24, XOFF_VALUE - brne 20f + brne 12f clr r24 - st X, r24 +11: st X, r24 rjmp 99f +12: + push r24 +/* now the "sending" part*/ + ldi r24, lo8(uart0_ctx+UART0_CBB_RX_OFFSET) + ldi r25, hi8(uart0_ctx+UART0_CBB_RX_OFFSET) + rcall circularbytebuffer_cnt + ldi r30, lo8(uart0_ctx+UART0_RXON_OFFSET) + ldi r31, hi8(uart0_ctx+UART0_RXON_OFFSET) + ld r18, Z + tst r18 + breq 15f/* branch if rxon inactive -> we had send an XOFF earlier */ + /* ok, we did not have send an XOFF, should we? */ + cpi r24, UART0_THRESH_HIGH + brlo 90f /* ok, nothing critical, go on */ + st Z, r1 + ldi r24, XOFF_VALUE +; sbi _SFR_IO_ADDR(PORTD), 5 + rjmp 16f +15: + cpi r24, UART0_THRESH_LOW + brsh 90f /* nothing has changed */ + /* if we get here, we had send an XOFF and are now below threshold */ + /* so we sen an XON */ + ldi r24, XON_VALUE + cbi _SFR_IO_ADDR(PORTD), 5 + st Z, r24 +16: + ldi r22, lo8(uart0_ctx+UART0_CBB_TX_OFFSET) + ldi r23, hi8(uart0_ctx+UART0_CBB_TX_OFFSET) + rcall circularbytebuffer_push + SET_BIT_IO UCSR0B, UDRIE0, r24 +90: + pop r24 #endif /* UART0_SWFLOWCTRL */ 20: #if UART0_HOOK @@ -378,35 +439,10 @@ uart0_putc: ldi r22, lo8(uart0_ctx+UART0_CBB_RX_OFFSET) ldi r23, hi8(uart0_ctx+UART0_CBB_RX_OFFSET) clr r25 +; sbi _SFR_IO_ADDR(PORTD), 6 rcall circularbytebuffer_append -#if UART0_SWFLOWCTRL - ldi r24, lo8(uart0_ctx+UART0_CBB_RX_OFFSET) - ldi r25, hi8(uart0_ctx+UART0_CBB_RX_OFFSET) - rcall circularbytebuffer_cnt - ldi r22, lo8(uart0_ctx+UART0_CBB_TX_OFFSET) - ldi r23, hi8(uart0_ctx+UART0_CBB_TX_OFFSET) - ldi r30, lo8(uart0_ctx+UART0_RXON_OFFSET) - ldi r31, hi8(uart0_ctx+UART0_RXON_OFFSET) - ld r16, Z - tst r16 - breq 60f - cpi r24, UART0_THRESH_HIGH+1 - brlo 99f - clr r25 - ldi r24, XOFF_VALUE - rcall circularbytebuffer_push - SET_BIT_IO UCSR0B, UDRIE0, r24 - rjmp 99f -60: - cpi r24, UART0_THRESH_LOW - brge 99f - clr r25 - ldi r24, XON_VALUE - rcall circularbytebuffer_push - SET_BIT_IO UCSR0B, UDRIE0, r24 -#endif /* UART0_SWFLOWCTRL */ 99: - out _SFR_IO_ADDR(SREG), r18 + out _SFR_IO_ADDR(SREG), r16 pop_range 16, 31 pop_range 0, 1 reti @@ -465,5 +501,16 @@ uart0_sethook: st X+, r25 ret #endif + +.global uart0_flush +uart0_flush: +10: + ldi r24, lo8(uart0_ctx+UART0_CBB_TX_OFFSET) + ldi r25, hi8(uart0_ctx+UART0_CBB_TX_OFFSET) + rcall circularbytebuffer_cnt + tst r24 + brne 10b + ret + #endif /* UART0_I */