#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

#define UIO_DEV "/dev/uio0"
#define UIO_ADDR "/sys/class/uio/uio0/maps/map0/addr"
#define UIO_SIZE "/sys/class/uio/uio0/maps/map0/size"

static char uio_addr_buf[16], uio_size_buf[16];

int main( int argc, char **argv )
{
  int uio_fd, addr_fd, size_fd;
  int uio_size;
  void *uio_addr, *access_address;

  addr_fd = open( UIO_ADDR, O_RDONLY );
  size_fd = open( UIO_SIZE, O_RDONLY );
  uio_fd   = open( UIO_DEV, O_RDONLY );
  if( addr_fd<0 || size_fd<0 || uio_fd<0 ) {
      fprintf(stderr,"No se pueden abrir los archivos UIO...\n");
      return -1;
  }

  read( addr_fd, uio_addr_buf, sizeof(uio_addr_buf) );
  read( size_fd, uio_size_buf, sizeof(uio_size_buf) );
  uio_addr = (void *)strtoul( uio_addr_buf, NULL, 0 );
  uio_size = (int)strtol( uio_size_buf, NULL, 0 );

  access_address = mmap(NULL, uio_size,
  PROT_READ, MAP_SHARED, uio_fd, 0);
  printf("La dirección de HW  %p (longitud %d) "
         "es accesible a través de"
         " la dirección lógica %p\n", uio_addr,
         uio_size, access_address);

  // El acceso a los registros del hardware puede ir a partir de aquí...
  // ...
  return 0;
}
