zoom/testdac/pic/serial.h

44 lines
1.3 KiB
C
Raw Permalink Normal View History

#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