105 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
 | 
						|
 | 
						|
#define READ_UINT8( _register_, _value_ ) \
 | 
						|
        ((_value_) = *((volatile unsigned char *)(_register_)))
 | 
						|
 | 
						|
#define WRITE_UINT8( _register_, _value_ ) \
 | 
						|
        (*((volatile unsigned char *)(_register_)) = (_value_))
 | 
						|
 | 
						|
 /* - Board specific addresses for serial chip */
 | 
						|
#define DIAG_BASE       0xfffff300
 | 
						|
#define DIAG_SLCR       (DIAG_BASE+0x00)
 | 
						|
#define DIAG_SLSR       (DIAG_BASE+0x04)
 | 
						|
#define DIAG_SLDICR     (DIAG_BASE+0x08)
 | 
						|
#define DIAG_SLDISR     (DIAG_BASE+0x0C)
 | 
						|
#define DIAG_SFCR       (DIAG_BASE+0x10)
 | 
						|
#define DIAG_SBRG       (DIAG_BASE+0x14)
 | 
						|
#define DIAG_TFIFO      (DIAG_BASE+0x20)
 | 
						|
#define DIAG_RFIFO      (DIAG_BASE+0x30)
 | 
						|
 | 
						|
#define BRG_T0          0x0000
 | 
						|
#define BRG_T2          0x0100
 | 
						|
#define BRG_T4          0x0200
 | 
						|
#define BRG_T5          0x0300
 | 
						|
 | 
						|
 | 
						|
#define READ_UINT16( _register_, _value_ ) \
 | 
						|
     ((_value_) = *((volatile unsigned short *)(_register_)))
 | 
						|
 | 
						|
#define WRITE_UINT16( _register_, _value_ ) \
 | 
						|
     (*((volatile unsigned short *)(_register_)) = (_value_))
 | 
						|
 | 
						|
unsigned char
 | 
						|
inbyte (void)
 | 
						|
{
 | 
						|
  unsigned char c;
 | 
						|
  unsigned short disr;
 | 
						|
  
 | 
						|
  for (;;)
 | 
						|
    {
 | 
						|
      READ_UINT16 (DIAG_SLDISR, disr);
 | 
						|
      if (disr & 0x0001)
 | 
						|
	break;
 | 
						|
    }
 | 
						|
  disr = disr & ~0x0001;
 | 
						|
  READ_UINT8 (DIAG_RFIFO, c);
 | 
						|
  WRITE_UINT16 (DIAG_SLDISR, disr);
 | 
						|
  return c;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
outbyte (unsigned char c)
 | 
						|
{
 | 
						|
  unsigned short disr;
 | 
						|
  
 | 
						|
  for (;;)
 | 
						|
    {
 | 
						|
      READ_UINT16 (DIAG_SLDISR, disr);
 | 
						|
      if (disr & 0x0002)
 | 
						|
	break;
 | 
						|
    }
 | 
						|
  disr = disr & ~0x0002;
 | 
						|
  WRITE_UINT8 (DIAG_TFIFO, c);
 | 
						|
  WRITE_UINT16 (DIAG_SLDISR, disr);
 | 
						|
}
 | 
						|
 | 
						|
/* Stuff required to setup IO on this board */
 | 
						|
void board_serial_init (void)
 | 
						|
{
 | 
						|
  WRITE_UINT16 (DIAG_SLCR, 0x0020);
 | 
						|
  WRITE_UINT16 (DIAG_SLDICR, 0x0000);
 | 
						|
  WRITE_UINT16 (DIAG_SFCR, 0x0000);
 | 
						|
  WRITE_UINT16 (DIAG_SBRG, BRG_T2 | 5);
 | 
						|
}
 | 
						|
 | 
						|
/* If you want this to be initialized as part of the stuff which gets called
 | 
						|
   by crt0, it should be named 'hardware_init_hook'.
 | 
						|
   Local implementations may want to move or add to this function OR
 | 
						|
   do the initializations after main() is entered.
 | 
						|
*/
 | 
						|
void hardware_init_hook(void)
 | 
						|
{
 | 
						|
  board_serial_init() ;
 | 
						|
}
 | 
						|
     
 | 
						|
/* Structure filled in by get_mem_info.  Only the size field is
 | 
						|
   actually used (by sbrk), so the others aren't even filled in.  */
 | 
						|
 | 
						|
struct s_mem
 | 
						|
{
 | 
						|
  unsigned int size;
 | 
						|
  unsigned int icsize;
 | 
						|
  unsigned int dcsize;
 | 
						|
};
 | 
						|
 | 
						|
/* mem_size is provided in the linker script so that we don't have to
 | 
						|
   define it here. */
 | 
						|
extern char _mem_size[];
 | 
						|
 | 
						|
void
 | 
						|
get_mem_info (mem)
 | 
						|
     struct s_mem *mem;
 | 
						|
{
 | 
						|
  mem->size = (unsigned int)_mem_size;
 | 
						|
}
 |