HOME       UP       PREV       FURTHER NOTES       NEXT (I/O Blocks, Common Interface Nets.)  

Programmed I/O

Input and output operations are made by a program running on the processor.

Disadvantage: Inefficient - too much polling for general use. Interrupt driven I/O is more efficient.

#define IO_BASE 0xFFFC1000 // or whatever

#define U_SEND 0x10 #define U_RECEIVE 0x14 #define U_CONTROL 0x18 #define U_STATUS 0x1C

#define UART_SEND() \ (*((volatile char *)(IO_BASE+U_SEND))) #define UART_RECEIVE() \ (*((volatile char *)(IO_BASE+U_RECEIVE))) #define UART_CONTROL() \ (*((volatile char *)(IO_BASE+U_CONTROL))) #define UART_STATUS() \ (*((volatile char *)(IO_BASE+U_STATUS)))

#define UART_STATUS_RX_EMPTY (0x80) #define UART_STATUS_TX_EMPTY (0x40)

#define UART_CONTROL_RX_INT_ENABLE (0x20) #define UART_CONTROL_TX_INT_ENABLE (0x10)

  char uart_polled_read()
  {
     while (UART_STATUS() &
        UART_STATUS_RX_EMPTY) continue;
     return UART_RECEIVE();
  }
  uart_polled_write(char d)
  {
     while (!(UART_STATUS() & 
       UART_STATUS_TX_EMPTY)) continue;
     UART_SEND() = d;
  }


(C) 2008-10, DJ Greaves, University of Cambridge, Computer Laboratory.