You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CubeSatSim/libs/libmf/builtsource/uart0init.c

1040 lines
18 KiB

#include "ax8052.h"
#include "libmfuart.h"
#include "libmfuart0.h"
#define UARTS0 UART0S0
#define UARTS1 UART0S1
#define UARTS2 UART0S2
#define UARTS3 UART0S3
#define UARTS4 UART0S4
#define UARTS5 UART0S5
#define USHREG U0SHREG
#define UMODE U0MODE
#define UCTRL U0CTRL
#define USTATUS U0STATUS
#define _USHREG _U0SHREG
#define _UMODE _U0MODE
#define _UCTRL _U0CTRL
#define _USTATUS _U0STATUS
#define IRQENA EIE_4
#define uart_irq_nr 11
#define uart_vector_addr 0x5B
#define uart_init uart0_init
#define uart_stop uart0_stop
#define uart_iocore uart0_iocore
#define _uart_iocore _uart0_iocore
#define uart_irq uart0_irq
#define uart_poll uart0_poll
#define uart_rxbufptr uart0_rxbufptr
#define _uart_rxbufptr _uart0_rxbufptr
#define uart_txbufptr uart0_txbufptr
#define _uart_txbufptr _uart0_txbufptr
#define uart_txfreelinear uart0_txfreelinear
#define _uart_txidle _uart0_txidle
#define uart_txidle uart0_txidle
#define uart_txfree uart0_txfree
#define uart_rxcountlinear uart0_rxcountlinear
#define uart_rxcount uart0_rxcount
#define uart_txbuffersize uart0_txbuffersize
#define uart_rxbuffersize uart0_rxbuffersize
#define uart_wait_txfree uart0_wait_txfree
#define uart_wait_rxcount uart0_wait_rxcount
#define uart_rxpeek uart0_rxpeek
#define uart_txpokehex uart0_txpokehex
#define uart_txpoke uart0_txpoke
#define uart_rxadvance uart0_rxadvance
#define uart_txadvance uart0_txadvance
#define uart_rx uart0_rx
#define uart_tx uart0_tx
#define _uart_txpoke _uart0_txpoke
#define uart_rxbuffer uart0_rxbuffer
#define _uart_rxbuffer _uart0_rxbuffer
#define uart_txbuffer uart0_txbuffer
#define _uart_txbuffer _uart0_txbuffer
#define _uart_buffer_size _uart0_buffer_size
#define _uart_buffer_negsize _uart0_buffer_negsize
#define uart_rxbuffer_size uart0_rxbuffer_size
#define _uart_rxbuffer_size _uart0_rxbuffer_size
#define uart_txbuffer_size uart0_txbuffer_size
#define _uart_txbuffer_size _uart0_txbuffer_size
#define uart_fiforxwr uart0_fiforxwr
#define _uart_fiforxwr _uart0_fiforxwr
#define uart_fiforxrd uart0_fiforxrd
#define _uart_fiforxrd _uart0_fiforxrd
#define uart_fifotxwr uart0_fifotxwr
#define _uart_fifotxwr _uart0_fifotxwr
#define uart_fifotxrd uart0_fifotxrd
#define _uart_fifotxrd _uart0_fifotxrd
static volatile uint8_t __data uart_fiforxwr;
static volatile uint8_t __data uart_fiforxrd;
static volatile uint8_t __data uart_fifotxwr;
static volatile uint8_t __data uart_fifotxrd;
extern uint8_t __xdata uart_rxbuffer[];
extern uint8_t __xdata uart_txbuffer[];
#if !defined(SDCC)
extern const uint8_t __code uart_rxbuffer_size[];
extern const uint8_t __code uart_txbuffer_size[];
#endif
#if defined(SDCC)
static void dummy0(void) __naked
{
__asm;
.area HOME (CODE)
.area UARTS0 (CODE)
.area UARTS1 (CODE)
.area UARTS2 (CODE)
.area UARTS3 (CODE)
.area UARTS4 (CODE)
.area UARTS5 (CODE)
.area HOME (CODE)
__endasm;
}
static __reentrantb void uart_iocore(void) __reentrant __naked;
void uart_irq(void) __interrupt(uart_irq_nr) __naked
{
__asm;
push acc
push psw
push _DPS
push dpl
push dph
push b
mov _DPS,#0
mov psw,#0
lcall _uart_iocore
pop b
pop dph
pop dpl
pop _DPS
pop psw
pop acc
reti
__endasm;
}
uint8_t uart_poll(void) __reentrant __naked
{
__asm;
mov a,#0x80
anl a,_IE
rl a
mov b,a
clr _EA
lcall _uart_iocore
mov a,b
clr c
rrc a
mov _EA,c
mov dpl,a
ret
.area HOME (CODE)
.area UARTS0 (CODE)
.area UARTS1 (CODE)
.area UARTS2 (CODE)
.area UARTS3 (CODE)
.area UARTS4 (CODE)
.area UARTS5 (CODE)
.area UARTS0 (CODE)
__endasm;
}
static __reentrantb void uart_iocore(void) __reentrant __naked
{
__asm;
ar2=0x02
ar3=0x03
ar4=0x04
ar5=0x05
ar6=0x06
ar7=0x07
ar0=0x00
ar1=0x01
mov a,_USTATUS
jnb acc.0,iocnorx
mov dptr,#_uart_rxbuffer
mov a,_uart_fiforxwr
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
mov a,#_uart_buffer_negsize+3-00010$
movc a,@a+pc
00010$: add a,_uart_fiforxwr
jc 00001$
mov a,_uart_fiforxwr
inc a
00001$: cjne a,_uart_fiforxrd,00000$
anl _UCTRL,#~0x04
sjmp iocnorx
00000$: mov _uart_fiforxwr,a
mov a,_USHREG
movx @dptr,a
orl _UCTRL,#0x04
setb _B_1
iocnorx:
mov a,_USTATUS
jnb acc.2,iocnotx
mov a,_uart_fifotxrd
cjne a,_uart_fifotxwr,00000$
anl _UCTRL,#~0x08
sjmp iocnotx
00000$: mov dptr,#_uart_txbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
movx a,@dptr
mov _USHREG,a
mov a,#_uart_buffer_negsize+1-00010$
movc a,@a+pc
00010$: add a,_uart_fifotxrd
jc 00001$
mov a,_uart_fifotxrd
inc a
00001$: mov _uart_fifotxrd,a
orl _UCTRL,#0x08
setb _B_2
iocnotx:
ret
__endasm;
}
void uart_rxadvance(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_uart_buffer_negsize+2-00003$
movc a,@a+pc
00003$: xch a,dpl
jz 00000$
add a,_uart_fiforxrd
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov _uart_fiforxrd,a
orl _UCTRL,#0x04
00000$: ret
__endasm;
}
void uart_txadvance(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_uart_buffer_negsize-00003$
movc a,@a+pc
00003$: xch a,dpl
jz 00000$
add a,_uart_fifotxwr
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov _uart_fifotxwr,a
orl _UCTRL,#0x08
00000$: ret
__endasm;
}
__reentrantb const uint8_t __xdata *uart_rxbufptr(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_uart_buffer_negsize+2-00003$
movc a,@a+pc
00003$: xch a,dpl
add a,_uart_fiforxrd
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov dptr,#_uart_rxbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
ret
__endasm;
}
__reentrantb uint8_t __xdata *uart_txbufptr(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_uart_buffer_negsize-00003$
movc a,@a+pc
00003$: xch a,dpl
add a,_uart_fifotxwr
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov dptr,#_uart_txbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
ret
_uart_buffer_negsize:
.area UARTS3 (CODE)
__endasm;
}
uint8_t uart_txfreelinear(void) __reentrant __naked
{
__asm;
mov a,_uart_fifotxrd
setb c
subb a,_uart_fifotxwr
jnc 00000$
mov a,_uart_fifotxrd
add a,#0xff
cpl c
mov a,#_uart_buffer_size-00001$
movc a,@a+pc
00001$: subb a,_uart_fifotxwr
00000$: mov dpl,a
ret
__endasm;
}
uint8_t uart_txfree(void) __reentrant __naked
{
__asm;
mov a,_uart_fifotxrd
setb c
subb a,_uart_fifotxwr
mov dpl,a
jnc 00000$
mov a,#_uart_buffer_size-00001$
movc a,@a+pc
00001$: add a,dpl
mov dpl,a
00000$: ret
__endasm;
}
uint8_t uart_rxcountlinear(void) __reentrant __naked
{
__asm;
mov a,_uart_fiforxwr
clr c
subb a,_uart_fiforxrd
jnc 00000$
mov a,#_uart_buffer_size+1-00001$
movc a,@a+pc
00001$: clr c
subb a,_uart_fiforxrd
00000$: mov dpl,a
ret
__endasm;
}
uint8_t uart_rxcount(void) __reentrant __naked
{
__asm;
mov a,_uart_fiforxwr
clr c
subb a,_uart_fiforxrd
mov dpl,a
jnc 00000$
mov a,#_uart_buffer_size+1-00001$
movc a,@a+pc
00001$: add a,dpl
mov dpl,a
00000$: ret
__endasm;
}
uint8_t uart_txbuffersize(void) __reentrant __naked
{
__asm;
mov a,#_uart_buffer_size-00000$
movc a,@a+pc
00000$: dec a
mov dpl,a
ret
__endasm;
}
uint8_t uart_rxbuffersize(void) __reentrant __naked
{
__asm;
mov a,#_uart_buffer_size+1-00000$
movc a,@a+pc
00000$: dec a
mov dpl,a
ret
_uart_buffer_size:
.area CSEG (CODE)
__endasm;
}
uint8_t uart_rxpeek(uint8_t idx) __reentrant __naked
{
idx;
__asm;
lcall _uart_rxbufptr
movx a,@dptr
mov dpl,a
ret
__endasm;
}
void uart_txpoke(uint8_t idx, uint8_t ch) __reentrant __naked
{
idx;
ch;
__asm;
push ar0
mov a,sp
add a,#-3
mov r0,a
_uart_txpoke_hexentry:
lcall _uart_txbufptr
mov a,@r0
movx @dptr,a
pop ar0
ret
__endasm;
}
void uart_txpokehex(uint8_t idx, uint8_t ch) __reentrant __naked
{
idx;
ch;
__asm;
push ar0
mov a,sp
add a,#-3
mov r0,a
mov a,@r0
anl a,#0x0F
add a,#256-10
jnc 00000$
add a,#'A-'9-1
00000$: add a,#10+'0 ; '
mov @r0,a
ljmp _uart_txpoke_hexentry
__endasm;
}
uint8_t uart_txidle(void) __reentrant __naked
{
__asm;
mov a,_UCTRL
jnb acc.1,00001$
anl a,#0x08
jnz 00000$
mov a,_USTATUS
anl a,#0x40
jz 00000$
00001$: mov dpl,#1
ret
00000$: mov dpl,#0
ret
__endasm;
}
static void wtimer_cansleep_dummy(void) __naked
{
__asm
.area HOME (CODE)
.area WTCANSLP0 (CODE)
.area WTCANSLP1 (CODE)
.area WTCANSLP2 (CODE)
.area WTCANSLP1 (CODE)
lcall _uart_txidle
mov a,dpl
jnz 00000$
ret
00000$:
.area CSEG (CODE)
__endasm;
}
#elif defined __CX51__ || defined __C51__
static __reentrantb void uart_iocore(void) __reentrant __naked;
void uart_irq(void) interrupt uart_irq_nr
{
#pragma asm
push acc
push psw
push DPS
push dpl
push dph
push b
mov DPS,#0
mov psw,#0
lcall _uart_iocore
pop b
pop dph
pop dpl
pop DPS
pop psw
pop acc
#pragma endasm
}
__reentrantb uint8_t uart_poll(void) __reentrant __naked
{
#pragma asm
mov a,#0x80
anl a,IE
rl a
mov b,a
clr EA
lcall _uart_iocore
mov a,b
clr c
rrc a
mov EA,c
mov r7,a
#pragma endasm
}
static __reentrantb void uart_iocore(void) __reentrant __naked
{
uart_rxbuffer[0];
uart_rxbuffer_size[0];
uart_txbuffer[0];
uart_txbuffer_size[0];
#pragma asm
;ar2 equ 0x02
;ar3 equ 0x03
;ar4 equ 0x04
;ar5 equ 0x05
;ar6 equ 0x06
;ar7 equ 0x07
;ar0 equ 0x00
;ar1 equ 0x01
_uart_iocore:
mov a,USTATUS
jnb acc.0,iocnorx
clr a
mov dptr,#uart_rxbuffer_size+2
movc a,@a+dptr
push acc
mov dptr,#uart_rxbuffer
mov a,uart_fiforxwr
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
pop acc
add a,uart_fiforxwr
jc ioc1
mov a,uart_fiforxwr
inc a
ioc1: cjne a,uart_fiforxrd,ioc0
anl UCTRL,#~0x04
sjmp iocnorx
ioc0: mov uart_fiforxwr,a
mov a,USHREG
movx @dptr,a
orl UCTRL,#0x04
setb B_1
iocnorx:
mov a,USTATUS
jnb acc.2,iocnotx
mov a,uart_fifotxrd
cjne a,uart_fifotxwr,ioc2
anl UCTRL,#~0x08
sjmp iocnotx
ioc2: mov dptr,#uart_txbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
movx a,@dptr
mov USHREG,a
clr a
mov dptr,#uart_txbuffer_size+2
movc a,@a+dptr
add a,uart_fifotxrd
jc ioc3
mov a,uart_fifotxrd
inc a
ioc3: mov uart_fifotxrd,a
orl UCTRL,#0x08
setb B_2
iocnotx:
#pragma endasm
}
__reentrantb void uart_rxadvance(uint8_t idx) __reentrant
{
idx;
#pragma asm
clr a
mov dptr,#uart_rxbuffer_size+1
movc a,@a+dptr
xch a,r7
jz rxad0
add a,uart_fiforxrd
jnc rxad2
add a,r7
sjmp rxad1
rxad2: xch a,r7
add a,r7
jc rxad1
mov a,r7
rxad1: mov uart_fiforxrd,a
orl UCTRL,#0x04
rxad0:
#pragma endasm
}
__reentrantb void uart_txadvance(uint8_t idx) __reentrant
{
idx;
#pragma asm
clr a
mov dptr,#uart_txbuffer_size+1
movc a,@a+dptr
xch a,r7
jz txad0
add a,uart_fifotxwr
jnc txad2
add a,r7
sjmp txad1
txad2: xch a,r7
add a,r7
jc txad1
mov a,r7
txad1: mov uart_fifotxwr,a
orl UCTRL,#0x08
txad0:
#pragma endasm
}
__reentrantb const uint8_t __xdata *uart_rxbufptr(uint8_t idx) __reentrant
{
idx;
#pragma asm
_uart_rxbufptr:
clr a
mov dptr,#uart_rxbuffer_size+1
movc a,@a+dptr
xch a,r7
add a,uart_fiforxrd
jnc rxp2
add a,r7
sjmp rxp1
rxp2: xch a,r7
add a,r7
jc rxp1
mov a,r7
rxp1: mov dptr,#uart_rxbuffer
add a,dpl
mov r7,a
clr a
addc a,dph
mov r6,a
#pragma endasm
}
__reentrantb uint8_t __xdata *uart_txbufptr(uint8_t idx) __reentrant
{
idx;
#pragma asm
_uart_txbufptr:
clr a
mov dptr,#uart_txbuffer_size+1
movc a,@a+dptr
xch a,r7
add a,uart_fifotxwr
jnc txp2
add a,r7
sjmp txp1
txp2: xch a,r7
add a,r7
jc txp1
mov a,r7
txp1: mov dptr,#uart_txbuffer
add a,dpl
mov r7,a
clr a
addc a,dph
mov r6,a
#pragma endasm
}
__reentrantb uint8_t uart_txfreelinear(void) __reentrant
{
#pragma asm
mov a,uart_fifotxrd
setb c
subb a,uart_fifotxwr
mov r7,a
jnc txfrl0
mov a,uart_fifotxrd
add a,#0xff
cpl c
clr a
mov dptr,#uart_txbuffer_size
movc a,@a+dptr
subb a,uart_fifotxwr
txfrl0: mov r7,a
#pragma endasm
}
__reentrantb uint8_t uart_txfree(void) __reentrant
{
#pragma asm
mov a,uart_fifotxrd
setb c
subb a,uart_fifotxwr
mov r7,a
jnc txfr0
clr a
mov dptr,#uart_txbuffer_size
movc a,@a+dptr
add a,r7
mov r7,a
txfr0:
#pragma endasm
}
__reentrantb uint8_t uart_rxcountlinear(void) __reentrant
{
#pragma asm
mov a,uart_fiforxwr
clr c
subb a,uart_fiforxrd
jnc rxcl0
clr a
mov dptr,#uart_rxbuffer_size
movc a,@a+dptr
clr c
subb a,uart_fiforxrd
rxcl0: mov r7,a
#pragma endasm
}
__reentrantb uint8_t uart_rxcount(void) __reentrant
{
#pragma asm
mov a,uart_fiforxwr
clr c
subb a,uart_fiforxrd
mov r7,a
jnc rxc0
clr a
mov dptr,#uart_rxbuffer_size
movc a,@a+dptr
add a,r7
mov r7,a
rxc0:
#pragma endasm
}
__reentrantb uint8_t uart_txbuffersize(void) __reentrant
{
return uart_txbuffer_size[0]-1;
}
__reentrantb uint8_t uart_rxbuffersize(void) __reentrant
{
return uart_rxbuffer_size[0]-1;
}
__reentrantb uint8_t uart_rxpeek(uint8_t idx) __reentrant
{
idx;
#pragma asm
lcall _uart_rxbufptr
mov dpl,r7
mov dph,r6
movx a,@dptr
mov r7,a
#pragma endasm
}
__reentrantb void uart_txpoke(uint8_t idx, uint8_t ch) __reentrant
{
idx;
ch;
#pragma asm
_uart_txpokehex_entry:
lcall _uart_txbufptr
mov dpl,r7
mov dph,r6
mov a,r5
movx @dptr,a
#pragma endasm
}
__reentrantb void uart_txpokehex(uint8_t idx, uint8_t ch) __reentrant
{
idx;
ch;
#pragma asm
mov a,r5
anl a,#0x0F
add a,#256-10
jnc txph0
add a,#'A'-'9'-1
txph0: add a,#10+'0'
mov r5,a
ljmp _uart_txpokehex_entry
#pragma endasm
}
__reentrantb uint8_t uart_txidle(void) __reentrant
{
#pragma asm
mov r7,#0
mov a,UCTRL
jnb acc.1,txidle
anl a,#0x08
jnz txnotidle
mov a,USTATUS
anl a,#0x40
jz txnotidle
txidle:
mov r7,#1
txnotidle:
#pragma endasm
}
#elif defined __ICC8051__
static __reentrantb uint8_t uart_iocore(void) __reentrant;
#pragma vector=uart_vector_addr
__interrupt void uart_irq(void)
{
uint8_t __autodata dpssave = DPS;
DPS = 0;
uart_iocore();
DPS = dpssave;
}
__reentrantb uint8_t uart_poll(void) __reentrant
{
uint8_t flg;
uint8_t irq = IE & 0x80;
EA = 0;
flg = uart_iocore();
IE |= irq;
return flg;
}
static __reentrantb uint8_t uart_iocore(void) __reentrant
{
uint8_t flg = 0;
if (USTATUS & 0x01) {
uint8_t wp = uart_fiforxwr + 1;
uint8_t sz = uart_rxbuffer_size[0];
if (wp >= sz)
wp -= sz;
if (wp != uart_fiforxrd) {
uart_rxbuffer[uart_fiforxwr] = USHREG;
uart_fiforxwr = wp;
UCTRL |= 0x04;
flg |= 1;
} else {
UCTRL &= (uint8_t)~0x04;
}
}
if (USTATUS & 0x04) {
if (uart_fifotxrd != uart_fifotxwr) {
uint8_t rp = uart_fifotxrd + 1;
uint8_t sz = uart_txbuffer_size[0];
USHREG = uart_txbuffer[uart_fifotxrd];
if (rp >= sz)
rp -= sz;
uart_fifotxrd = rp;
UCTRL |= 0x08;
flg |= 2;
} else {
UCTRL &= (uint8_t)~0x08;
}
}
return flg;
}
__reentrantb void uart_rxadvance(uint8_t idx) __reentrant
{
uint8_t rd;
uint8_t sz;
if (!idx)
return;
rd = uart_fiforxrd;
idx += rd;
sz = uart_rxbuffer_size[0];
if (idx < rd || idx >= sz)
idx -= sz;
uart_fiforxrd = idx;
UCTRL |= 0x04;
}
__reentrantb void uart_txadvance(uint8_t idx) __reentrant
{
uint8_t wr;
uint8_t sz;
if (!idx)
return;
wr = uart_fifotxwr;
idx += wr;
sz = uart_txbuffer_size[0];
if (idx < wr || idx >= sz)
idx -= sz;
uart_fifotxwr = idx;
UCTRL |= 0x08;
}
__reentrantb const uint8_t __xdata *uart_rxbufptr(uint8_t idx) __reentrant
{
uint8_t rd = uart_fiforxrd;
uint8_t sz = uart_rxbuffer_size[0];
idx += rd;
if (idx < rd || idx >= sz)
idx -= sz;
return &uart_rxbuffer[idx];
}
__reentrantb uint8_t __xdata *uart_txbufptr(uint8_t idx) __reentrant
{
uint8_t wr = uart_fifotxwr;
uint8_t sz = uart_txbuffer_size[0];
idx += wr;
if (idx < wr || idx >= sz)
idx -= sz;
return &uart_txbuffer[idx];
}
__reentrantb uint8_t uart_txfreelinear(void) __reentrant
{
uint8_t rd = uart_fifotxrd;
uint8_t wr = uart_fifotxwr;
if (rd <= wr) {
uint8_t r = uart_txbuffer_size[0] - wr;
if (!rd)
--r;
return r;
}
return rd - wr - 1;
}
__reentrantb uint8_t uart_txfree(void) __reentrant
{
uint8_t rd = uart_fifotxrd;
uint8_t wr = uart_fifotxwr;
uint8_t r = rd - wr;
if (rd <= wr)
r += uart_txbuffer_size[0];
--r;
return r;
}
__reentrantb uint8_t uart_rxcountlinear(void) __reentrant
{
uint8_t rd = uart_fiforxrd;
uint8_t wr = uart_fiforxwr;
if (wr < rd)
return uart_rxbuffer_size[0] - rd;
return wr - rd;
}
__reentrantb uint8_t uart_rxcount(void) __reentrant
{
uint8_t rd = uart_fiforxrd;
uint8_t wr = uart_fiforxwr;
uint8_t r = wr - rd;
if (wr < rd)
r += uart_rxbuffer_size[0];
return r;
}
__reentrantb uint8_t uart_txbuffersize(void) __reentrant
{
return uart_txbuffer_size[0]-1;
}
__reentrantb uint8_t uart_rxbuffersize(void) __reentrant
{
return uart_rxbuffer_size[0]-1;
}
__reentrantb uint8_t uart_rxpeek(uint8_t idx) __reentrant
{
const uint8_t __xdata *bp = uart_rxbufptr(idx);
return *bp;
}
__reentrantb void uart_txpoke(uint8_t idx, uint8_t ch) __reentrant
{
uint8_t __xdata *bp = uart_txbufptr(idx);
*bp = ch;
}
__reentrantb void uart_txpokehex(uint8_t idx, uint8_t ch) __reentrant
{
ch &= 0x0F;
if (ch >= 10)
ch += 'A' - '9' - 1;
ch += '0';
uart_txpoke(idx, ch);
}
__reentrantb uint8_t uart_txidle(void) __reentrant
{
if (!(UCTRL & 0x02))
return 1;
if ((UCTRL & 0x08) || !(USTATUS & 0x40))
return 0;
return 1;
}
#else
#error "Compiler unsupported"
#endif
void uart_init(uint8_t timernr, uint8_t wl, uint8_t stop)
{
uart_fiforxwr = uart_fiforxrd = uart_fifotxwr = uart_fifotxrd = 0;
UMODE = ((timernr + 1) & 3) | ((wl & 7) << 2) | ((stop >= 2) << 5) | 0x40;
UCTRL = 0x07;
IRQENA = 1;
}

Powered by TurnKey Linux.