cyg_bool altera_avalon_jtag_uart_diag_getc_nonblock(void* __ch_data, cyg_uint8* ch)
{
    cyg_uint8* port = (cyg_uint8*) __ch_data;
    cyg_uint32 status;
    cyg_uint32 data; 

    data = IORD_ALTERA_AVALON_JTAG_UART_DATA(port);

    if (data & ALTERA_AVALON_JTAG_UART_DATA_RVALID_MSK)
    {
      *ch = (data & ALTERA_AVALON_JTAG_UART_DATA_DATA_MSK) 
                >> ALTERA_AVALON_JTAG_UART_DATA_DATA_OFST;
      return true;
    }
static unsigned char altera_avalon_jtag_uart_getc(serial_channel *chan)
{
  altera_avalon_jtag_uart_dev *jtag_uart_chan = 
                                (altera_avalon_jtag_uart_dev *)chan->dev_priv;
  cyg_addrword_t port               = jtag_uart_chan->base;
  cyg_uint32 data;

  do 
  {
    data = IORD_ALTERA_AVALON_JTAG_UART_DATA(port);
  }
  while (!(data & ALTERA_AVALON_JTAG_UART_DATA_RVALID_MSK));

  return (data & ALTERA_AVALON_JTAG_UART_DATA_DATA_MSK) 
                 >> ALTERA_AVALON_JTAG_UART_DATA_DATA_OFST;
}
int 
altera_avalon_jtag_uart_read(altera_avalon_jtag_uart_state* sp, 
  char* buffer, int space, int flags)
{
  unsigned int base = sp->base;

  char * ptr = buffer;
  char * end = buffer + space;

  while (ptr < end)
  {
    unsigned int data = IORD_ALTERA_AVALON_JTAG_UART_DATA(base);

    if (data & ALTERA_AVALON_JTAG_UART_DATA_RVALID_MSK)
      *ptr++ = (data & ALTERA_AVALON_JTAG_UART_DATA_DATA_MSK) >> ALTERA_AVALON_JTAG_UART_DATA_DATA_OFST;
    else if (ptr != buffer)
      break;
    else if(flags & O_NONBLOCK)
      break;   
    
  }