void hw_fini(void) { if(gpio_rs_fd >= 0) sysfs_gpio_close(gpio_rs_fd, GPIO_RS_PIN); if(spi_fd >= 0) close(spi_fd); gpio_rs_fd = spi_fd = -1; }
struct mux_spi * mux_spi_open(){ struct mux_spi *p; char buf[64]; int i; p = calloc(1,sizeof(struct mux_spi)); for(i=0;i<NUM_SPI;i++) p->spi_fd[i]=-1; for(i=0;i<NUM_GPIO;i++){ p->gpio[i] = sysfs_gpio_open(gpio_num[i]); if(!p->gpio[i]) goto err; /* initialize multiplexer bits to 0 */ if(sysfs_gpio_direction(p->gpio[i],1) || sysfs_gpio_value(p->gpio[i],0) ) goto err; } for(i=0;i<NUM_SPI;i++){ sprintf(buf,"/dev/spidev0.%d",i); p->spi_fd[i] = open(buf,O_RDWR); if(p->spi_fd[i] == -1){ perror(buf); goto err; } if(ioctl(p->spi_fd[i],SPI_IOC_RD_BITS_PER_WORD,&p->spibpw[i])){ perror("ioctl(SPI_IOC_RD_BITS_PER_WORD)"); goto err; } if(ioctl(p->spi_fd[i],SPI_IOC_RD_MODE,&p->spimode[i])){ perror("ioctl(SPI_IOC_RD_MODE)"); goto err; } if(ioctl(p->spi_fd[i],SPI_IOC_RD_LSB_FIRST,&p->spilsb[i])){ perror("ioctl(SPI_IOC_RD_LSB_FIRST)"); goto err; } fprintf(stderr,"Opened %s as fd %d (0x%02x, %d, %d).\n", buf,p->spi_fd[i], p->spimode[i],p->spibpw[i],p->spilsb[i]); } return p; err: for(i=0;i<NUM_SPI;i++){ if(p->spi_fd[i] != -1) close(p->spi_fd[i]); } for(i=0;i<NUM_GPIO;i++){ if(p->gpio[i]) sysfs_gpio_close(p->gpio[i]); } return NULL; }