/ 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 }