68 #define SERIAL_BREAK_CR // Break input stream on CR if specified 69 #define SERIAL_BREAK_NL // Break input stream on NL if specified 72 #define _LIBC_FUNCTION __attribute__((__weak__, __section__(".libc"))) 75 #define CHAR_ACCESS 0x4000 76 #define DATA_ACCESS 0x8000 //this flag assumed if CHAR_ACCESS not set 77 #define READ_ACCESS 0x0 78 #define WRITE_ACCESS 0x1 79 #define READ_WRITE_ACCESS 0x2 80 #define ACCESS_RW_MASK 0x3 // bits set to 0 or 2 for read and 1 or 2 for write 81 #define ACCESS_SET_OPEN DATA_ACCESS // expedient - reuse bit position to indicate open 84 #ifndef DEFAULT_BAUDRATE1 85 #define DEFAULT_BAUDRATE1 DEFAULT_BAUDRATE 87 #ifndef DEFAULT_BAUDRATE2 88 #define DEFAULT_BAUDRATE2 DEFAULT_BAUDRATE 90 #ifndef DEFAULT_BAUDRATE3 91 #define DEFAULT_BAUDRATE3 DEFAULT_BAUDRATE 93 #ifndef DEFAULT_BAUDRATE4 94 #define DEFAULT_BAUDRATE4 DEFAULT_BAUDRATE 97 #define MAX_ALLOWED_HANDLES (NUM_UART_MODS+3) // number of handles allowed 98 #define RANGECK_HANDLE(xxhandlexx) ((xxhandlexx >= 0) && (xxhandlexx < MAX_ALLOWED_HANDLES)) 99 enum ALLOWED_HANDLES {
112 uint16_t u16_read_access;
113 uint16_t u16_write_access;
114 } FILES[MAX_ALLOWED_HANDLES] = {
118 #if (NUM_UART_MODS >= 1) 121 #if (NUM_UART_MODS >= 2) 122 { &outChar2, &inChar2 },
124 #if (NUM_UART_MODS >= 3) 125 { &outChar3, &inChar3 },
127 #if (NUM_UART_MODS >= 4) 128 { &outChar4, &inChar4 }
144 #if (NUM_UART_MODS >= 1) 145 if (__C30_UART == 1) {
146 FILES[HANDLE_STDERR].pfnv_outChar = (
void *)&
outChar1;
147 FILES[HANDLE_STDOUT].pfnv_outChar = (
void *)&
outChar1;
148 FILES[HANDLE_STDIN].pfn_inChar = &
inChar1;
149 if (!U1MODEbits.UARTEN) {
155 #if (NUM_UART_MODS >= 2) 156 if (__C30_UART == 2) {
157 FILES[HANDLE_STDERR].pfnv_outChar = (
void *)&outChar2;
158 FILES[HANDLE_STDOUT].pfnv_outChar = (
void *)&outChar2;
159 FILES[HANDLE_STDIN].pfn_inChar = &inChar2;
160 if (!U2MODEbits.UARTEN) {
161 configUART2(DEFAULT_BAUDRATE2);
166 #if (NUM_UART_MODS >= 3) 167 if (__C30_UART == 3) {
168 FILES[HANDLE_STDERR].pfnv_outChar = (
void *)&outChar3;
169 FILES[HANDLE_STDOUT].pfnv_outChar = (
void *)&outChar3;
170 FILES[HANDLE_STDIN].pfn_inChar = &inChar3;
171 if (!U3MODEbits.UARTEN) {
172 configUART3(DEFAULT_BAUDRATE3);
177 #if (NUM_UART_MODS >= 4) 178 if (__C30_UART == 4) {
179 FILES[HANDLE_STDERR].pfnv_outChar = (
void *)&outChar4;
180 FILES[HANDLE_STDOUT].pfnv_outChar = (
void *)&outChar4;
181 FILES[HANDLE_STDIN].pfn_inChar = &inChar4;
182 if (!U4MODEbits.UARTEN) {
183 configUART4(DEFAULT_BAUDRATE4);
215 open(
const char *name,
int access,
int mode) {
216 enum ALLOWED_HANDLES ie_handle;
217 uint16_t u16_masked_access;
218 uint16_t u16_set_access;
223 ie_handle = HANDLE_STDIN;
227 ie_handle = HANDLE_STDOUT;
231 ie_handle = HANDLE_STDERR;
233 #if (NUM_UART_MODS >= 1) 235 if (__C30_UART == 1)
return FAIL;
236 if (!U1MODEbits.UARTEN) {
239 ie_handle = HANDLE_UART1;
242 #if (NUM_UART_MODS >= 2) 244 if (__C30_UART == 2)
return FAIL;
245 if (!U2MODEbits.UARTEN) {
246 configUART2(DEFAULT_BAUDRATE2);
248 ie_handle = HANDLE_UART2;
251 #if (NUM_UART_MODS >= 3) 253 if (__C30_UART == 3)
return FAIL;
254 if (!U3MODEbits.UARTEN) {
255 configUART3(DEFAULT_BAUDRATE3);
257 ie_handle = HANDLE_UART3;
260 #if (NUM_UART_MODS >= 4) 262 if (__C30_UART == 4)
return FAIL;
263 if (!U4MODEbits.UARTEN) {
264 configUART4(DEFAULT_BAUDRATE4);
266 ie_handle = HANDLE_UART4;
273 u16_masked_access = access & ACCESS_RW_MASK;
274 u16_set_access = ACCESS_SET_OPEN | access;
275 if ((u16_masked_access == READ_ACCESS) || (u16_masked_access == READ_WRITE_ACCESS)) {
276 FILES[ie_handle].u16_read_access = u16_set_access;
278 if ((u16_masked_access == WRITE_ACCESS) || (u16_masked_access == READ_WRITE_ACCESS)) {
279 FILES[ie_handle].u16_write_access = u16_set_access;
295 read(
int handle,
void *buffer,
unsigned int len) {
296 uint16_t u16_char_count;
298 if(!RANGECK_HANDLE(handle))
return FAIL;
299 if ((handle == HANDLE_STDIN) && !(FILES[HANDLE_STDIN].u16_read_access & ACCESS_SET_OPEN)) {
300 open(
"stdin", (CHAR_ACCESS | READ_ACCESS), 0);
302 if (!FILES[handle].u16_read_access)
return FAIL;
303 for (u16_char_count = 0; u16_char_count < len; u16_char_count++) {
304 ((
unsigned char *)buffer)[u16_char_count] = (*FILES[handle].pfn_inChar)();
305 #ifdef SERIAL_BREAK_NL 306 if ((FILES[handle].u16_read_access & CHAR_ACCESS) && (((
unsigned char *)buffer)[u16_char_count] ==
'\n')) {
311 #ifdef SERIAL_BREAK_CR 312 if ((FILES[handle].u16_read_access & CHAR_ACCESS) && (((
unsigned char *)buffer)[u16_char_count] ==
'\r')) {
319 return u16_char_count;
333 write(
int handle,
void *buffer,
unsigned int len) {
334 uint16_t u16_char_count;
336 if(!RANGECK_HANDLE(handle))
return FAIL;
337 if ((handle == HANDLE_STDOUT) && !(FILES[HANDLE_STDOUT].u16_write_access & ACCESS_SET_OPEN)) {
338 open(
"stdout", (CHAR_ACCESS | WRITE_ACCESS), 0);
340 if ((handle == HANDLE_STDERR) && !(FILES[HANDLE_STDERR].u16_write_access & ACCESS_SET_OPEN)) {
341 open(
"stderr", (CHAR_ACCESS | WRITE_ACCESS), 0);
343 if (!FILES[handle].u16_write_access)
return FAIL;
344 for (u16_char_count = 0; u16_char_count < len; u16_char_count++) {
345 if ((FILES[handle].u16_write_access & CHAR_ACCESS) && (((
unsigned char *)buffer)[u16_char_count] ==
'\n')) {
346 #if (SERIAL_EOL_DEFAULT==SERIAL_EOL_CR) 347 (*FILES[handle].pfv_outChar)(
'\r');
350 #if (SERIAL_EOL_DEFAULT==SERIAL_EOL_CR_LF) 351 (*FILES[handle].pfv_outChar)(
'\r');
353 (*FILES[handle].pfnv_outChar)(
'\n');
356 (*FILES[handle].pfnv_outChar)(((
unsigned char *)buffer)[u16_char_count]);
359 return u16_char_count;
382 lseek(
int handle,
long offset,
int origin) {
long _LIBC_FUNCTION lseek(int handle, long offset, int origin)
static int16_t stdioOpen(void)
int _LIBC_FUNCTION open(const char *name, int access, int mode)
int _LIBC_FUNCTION close(int handle)
int _LIBC_FUNCTION write(int handle, void *buffer, unsigned int len)
void configUART1(uint32_t u32_baudRate)
void outChar1(uint8_t u8_c)
int _LIBC_FUNCTION read(int handle, void *buffer, unsigned int len)
unsigned char uint8_t
An abbreviation for an 8-bit unsigned integer.