/** * @brief Hardware initialization * * The function initializes the GPIO pins used in the bit-bang interface and * also assigned a default output value for SPI signal. * * @param dev pointer to structure of device data * @return 0 on success, negative errno on error */ static int tsb_spi_hw_init(struct device *dev) { struct tsb_spi_info *info = NULL; int i = 0; int retval; /* check input parameters */ if (!dev || !device_get_private(dev)) { return -EINVAL; } info = device_get_private(dev); retval = tsb_request_pinshare(TSB_PIN_GPIO10); if (retval) { lowsyslog("SPI: cannot get ownership of GPIO10 pin.\n"); return retval; } /* backup pinshare#5 setting */ info->pinshare = tsb_get_pinshare(); /* set pinshare#5 (DBG) to normal GPIO */ if (!(info->pinshare & TSB_PIN_GPIO10)) { tsb_set_pinshare(TSB_PIN_GPIO10); } /* setup GPIO pins */ gpio_activate(SPI_SCK); gpio_direction_out(SPI_SCK, 0); gpio_activate(SPI_SDI); gpio_direction_in(SPI_SDI); gpio_activate(SPI_SDO); gpio_direction_out(SPI_SDO, 0); /* setup all chip-select pins */ for (i = 0; i < info->caps.csnum; i++) { gpio_activate(info->chipselect[i]); gpio_direction_out(info->chipselect[i], 1); } return 0; }
/** * Initialise an I2C device */ struct i2c_dev_s *up_i2cinitialize(int port) { irqstate_t flags; int retval; i2cvdbg("Init I2C port %d\n", port); /* Only one I2C port on TSB */ if (port > 0) return NULL; flags = irqsave(); if (refcount++) goto out; retval = tsb_request_pinshare(TSB_PIN_GPIO21 | TSB_PIN_GPIO22); if (retval) { lowsyslog("I2C: cannot get ownership of I2C pins\n"); goto err_req_pinshare; } sem_init(&g_mutex, 0, 1); sem_init(&g_wait, 0, 0); /* enable I2C pins */ tsb_clr_pinshare(TSB_PIN_GPIO21); tsb_clr_pinshare(TSB_PIN_GPIO22); /* enable I2C clocks */ tsb_clk_enable(TSB_CLK_I2CP); tsb_clk_enable(TSB_CLK_I2CS); /* reset I2C module */ tsb_reset(TSB_RST_I2CP); tsb_reset(TSB_RST_I2CS); /* Initialize the I2C controller */ tsb_i2c_init(); /* Allocate a watchdog timer */ g_timeout = wd_create(); DEBUGASSERT(g_timeout != 0); /* Attach Interrupt Handler */ irq_attach(TSB_IRQ_I2C, i2c_interrupt); /* Enable Interrupt Handler */ up_enable_irq(TSB_IRQ_I2C); /* Install our operations */ g_dev.ops = &dev_i2c_ops; out: irqrestore(flags); return &g_dev; err_req_pinshare: refcount--; irqrestore(flags); return NULL; }