44 lines
1.3 KiB
C
44 lines
1.3 KiB
C
|
#ifndef SERIAL_H
|
||
|
#define SERIAL_H
|
||
|
|
||
|
/* These serial port routines use both transmit and receive queues.
|
||
|
The actual sending/receiving is handled by the serial_interrupt
|
||
|
functions, which should get called on TXIF or RCIF. */
|
||
|
|
||
|
#include "config.h"
|
||
|
|
||
|
#define STQ_BITS 6 /* transmit queue */
|
||
|
#define SRQ_BITS 6 /* receive queue */
|
||
|
|
||
|
#define STQ_SIZE (1<<(STQ_BITS))
|
||
|
#define SRQ_SIZE (1<<(SRQ_BITS))
|
||
|
#define STQ_MASK (STQ_SIZE-1)
|
||
|
#define SRQ_MASK (SRQ_SIZE-1)
|
||
|
extern volatile uint8_t stq[STQ_SIZE], stq_start, stq_len;
|
||
|
extern volatile bank1 uint8_t srq[SRQ_SIZE], srq_start, srq_len;
|
||
|
|
||
|
/* Initialize serial port, queues, serial interrupt */
|
||
|
void serial_init(void);
|
||
|
|
||
|
/* Call this on (TXIE && TXIF) and (RCIE && RCIF), respectively */
|
||
|
void serial_interrupt_tx(void);
|
||
|
void serial_interrupt_rx(void);
|
||
|
|
||
|
/* Send byte to PC. Blocks iff transmit queue is full. */
|
||
|
void serial_put(uint8_t x);
|
||
|
|
||
|
/* Helper functions */
|
||
|
void serial_put_string(const uint8_t *s);
|
||
|
void serial_crlf(void);
|
||
|
void serial_put_hex(uint8_t x);
|
||
|
void serial_put_hex32(uint32_t x);
|
||
|
|
||
|
/* Get byte from PC. Blocks iff receive queue is empty. */
|
||
|
uint8_t serial_get(void);
|
||
|
|
||
|
/* Returns true if the respective get/put operation would not block */
|
||
|
#define serial_can_get() (srq_len != 0)
|
||
|
#define serial_can_put() (!(stq_len & STQ_SIZE))
|
||
|
|
||
|
#endif
|