OpenCores
URL https://opencores.org/ocsvn/sudoku/sudoku/trunk

Subversion Repositories sudoku

[/] [sudoku/] [branches/] [zynq/] [sw/] [driver.h] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 dsheffie
#ifndef _DRIVER_H
2
#define _DRIVER_H
3
 
4
#include <stdint.h>
5
#include <fcntl.h>
6
#include <unistd.h>
7
#include <assert.h>
8
#include <stdio.h>
9
#include <sys/mman.h>
10
 
11
class Driver
12
{
13
 public:
14
  Driver(uintptr_t paddr)
15
  {
16
    this->paddr = paddr;
17
    uintptr_t pgsize = sysconf(_SC_PAGESIZE);
18
    uintptr_t regsize = regs * sizeof(uintptr_t);
19
    uintptr_t memsize = (regsize-1)/pgsize*pgsize+1;
20
 
21
    /*printf("opening interface at %p\n", (void*)paddr);*/
22
 
23
    int fd = open("/dev/mem", O_RDWR | O_SYNC);
24
    assert(fd != -1);
25
 
26
    int prot = PROT_READ | PROT_WRITE;
27
    int flags = MAP_SHARED;
28
    vaddr = (uintptr_t)mmap(0, memsize, prot, flags, fd, paddr & ~(pgsize-1));
29
    assert((void*)vaddr != MAP_FAILED);
30
    vaddr = vaddr + (paddr & (pgsize-1));
31
  }
32
 
33
  void reset()
34
  {
35
    *(volatile uintptr_t*)(vaddr + 0x100) = 0xA;
36
  }
37
 
38
  uintptr_t read(int port)
39
  {
40
    return *reg_addr(port);
41
  }
42
 
43
  void write(int port, uintptr_t value)
44
  {
45
    *reg_addr(port) = value;
46
  }
47
 
48
  int num_ports() {
49
    return regs;
50
  }
51
 
52
 private:
53
  uintptr_t vaddr;
54
  uintptr_t paddr;
55
  static const int regs = 8;
56
 
57
  volatile uintptr_t* reg_addr(int port)
58
  {
59
    return (volatile uintptr_t*)vaddr + (regs - port - 1);
60
  }
61
};
62
 
63
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.