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.