/ bf16-gpiodevice.c
bf16-gpiodevice.c
  1  #include <fcntl.h>
  2  #include <sys/mman.h>
  3  #include <unistd.h>
  4  
  5  #include "bf16-gpiodevice.h"
  6  #include "driver-bitfury16.h"
  7  
  8  #include "miner.h"
  9  
 10  typedef struct {
 11  	unsigned int*   oe_addr;  // R/W, bit==1 -> input, bit==0 -> output,
 12  	unsigned int*   data_out; // R/W
 13  	unsigned int*   data_set; // W/O
 14  	unsigned int*   data_clr; // W/O
 15  	unsigned int*   data_in;  // R/O
 16  } gpio_attr_t;
 17  
 18  typedef struct {
 19  	unsigned int* data_control;
 20  } ctrl_attr_t;
 21  
 22  typedef struct {
 23  	gpio_attr_t gpio0;
 24  	gpio_attr_t gpio1;
 25  	gpio_attr_t gpio2;
 26  	gpio_attr_t gpio3;
 27  	ctrl_attr_t* ctrl;
 28  } mmap_attr_t;
 29  
 30  static mmap_attr_t mmap_base;
 31  char *gpio_device_name  = "/dev/mem";
 32  
 33  int8_t gpio_write_ctrl(gpio_rq_t* rq)
 34  {
 35  	if (rq->gpioIndex < MAX_GPIO_INDEX && rq->regIndex < MAX_REGISTER_INDEX) {
 36  		gpio_attr_t* gpio_addr = (void*) &mmap_base;
 37  		gpio_attr_t gpio = gpio_addr[rq->gpioIndex];
 38  
 39  		unsigned int** addr = (void*) &gpio;
 40  		*addr[rq->regIndex] = rq->data;
 41  
 42  		return 0;
 43  	}
 44  
 45  	return -1;
 46  }
 47  
 48  int gpio_read_ctrl(gpio_rq_t* rq)
 49  {
 50  	if (rq->gpioIndex < MAX_GPIO_INDEX && rq->regIndex < MAX_REGISTER_INDEX) {
 51  		gpio_attr_t* gpio_addr = (void*) &mmap_base;
 52  		gpio_attr_t gpio = gpio_addr[rq->gpioIndex];
 53  
 54  		unsigned int** addr = (void*) &gpio;
 55  		rq->data = *addr[rq->regIndex];
 56  		return 0;
 57  	}
 58  
 59  	return -1;
 60  }
 61  
 62  void* map_gpio(gpio_attr_t* gpioAttr, void* gpio)
 63  {
 64  	gpioAttr->oe_addr  = gpio + GPIO_OE;
 65  	gpioAttr->data_out = gpio + GPIO_DATAOUT;
 66  	gpioAttr->data_set = gpio + GPIO_SETDATAOUT;
 67  	gpioAttr->data_clr = gpio + GPIO_CLEARDATAOUT;
 68  	gpioAttr->data_in  = gpio + GPIO_DATAIN;
 69  
 70  	return gpio;
 71  }
 72  
 73  void* mmap_open(const char *device, uint32_t base, uint32_t size)
 74  {
 75  	int fd = open(device, O_RDWR | O_SYNC);
 76  	if (fd < 0)
 77  		quit(1, "Failed to open /dev/mem: %s", strerror(errno));
 78  
 79  	void* mmap_addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, base);
 80  	if (mmap_addr == MAP_FAILED)
 81  		quit(1, "Failed to mmap GPIO [%08x]: %s", base, strerror(errno));
 82  
 83  	close(fd);
 84  
 85  	return mmap_addr;
 86  }
 87  
 88  int8_t gpio_init(device_t* attr, char *device, uint16_t size)
 89  {
 90  	attr->device = device;
 91  	attr->mode = 0;
 92  	attr->speed = 0;
 93  	attr->bits = 0;
 94  	attr->size = size;
 95  	attr->rx = malloc(size);
 96  	attr->tx = malloc(size);
 97  
 98  	map_gpio(&mmap_base.gpio0, mmap_open(device, GPIO0_START_ADDR, GPIO_SIZE));
 99  	map_gpio(&mmap_base.gpio1, mmap_open(device, GPIO1_START_ADDR, GPIO_SIZE));
100  	map_gpio(&mmap_base.gpio2, mmap_open(device, GPIO2_START_ADDR, GPIO_SIZE));
101  	map_gpio(&mmap_base.gpio3, mmap_open(device, GPIO3_START_ADDR, GPIO_SIZE));
102  
103  	return 0;
104  }
105  
106  
107  void gpio_release(device_t *attr)
108  {
109  	free(attr->rx);
110  	free(attr->tx);
111  }