Lines Matching +full:cs +full:- +full:out

1 /*-
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
74 device_set_desc(dev, "GPIO SPI bit-banging driver");
83 d = sc->sc_freq / 1000000;
97 sc->sc_dev = dev;
98 sc->sc_busdev = device_get_parent(dev);
104 sc->sc_sclk = value & 0xff;
109 sc->sc_mosi = value & 0xff;
115 sc->sc_miso = value & 0xff;
120 sc->sc_cs0 = value & 0xff;
126 sc->sc_cs1 = value & 0xff;
131 sc->sc_cs2 = value & 0xff;
136 sc->sc_cs3 = value & 0xff;
143 sc->sc_freq = value;
147 sc->sc_freq);
151 sc->sc_sclk, sc->sc_mosi, sc->sc_miso,
152 sc->sc_cs0, sc->sc_cs1, sc->sc_cs2, sc->sc_cs3);
156 GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sc_sclk,
158 GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sc_mosi,
160 if (sc->sc_miso != 0xff) {
161 GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sc_miso,
165 GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sc_cs0,
168 if (sc->sc_cs1 != 0xff)
169 GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sc_cs1,
171 if (sc->sc_cs2 != 0xff)
172 GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sc_cs2,
174 if (sc->sc_cs3 != 0xff)
175 GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sc_cs3,
178 gpio_spi_chip_deactivate(sc, -1);
193 gpio_spi_chip_activate(struct gpio_spi_softc *sc, int cs)
197 switch (cs) {
199 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
200 sc->sc_cs0, 0);
203 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
204 sc->sc_cs1, 0);
207 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
208 sc->sc_cs2, 0);
211 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
212 sc->sc_cs3, 0);
215 device_printf(sc->sc_dev, "don't have CS%d\n", cs);
222 gpio_spi_chip_deactivate(struct gpio_spi_softc *sc, int cs)
229 switch (cs) {
230 case -1:
231 /* All CS */
232 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
233 sc->sc_cs0, 1);
234 if (sc->sc_cs1 == 0xff) break;
235 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
236 sc->sc_cs1, 1);
237 if (sc->sc_cs2 == 0xff) break;
238 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
239 sc->sc_cs2, 1);
240 if (sc->sc_cs3 == 0xff) break;
241 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
242 sc->sc_cs3, 1);
245 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
246 sc->sc_cs0, 1);
249 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
250 sc->sc_cs1, 1);
253 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
254 sc->sc_cs2, 1);
257 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
258 sc->sc_cs3, 1);
261 device_printf(sc->sc_dev, "don't have CS%d\n", cs);
266 gpio_spi_txrx(struct gpio_spi_softc *sc, int cs, int mode, uint8_t data)
268 uint32_t mask, out = 0;
280 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
281 sc->sc_mosi, (data & mask)?1:0);
282 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
283 sc->sc_sclk, 0);
286 if (sc->sc_miso != 0xff) {
287 GPIOBUS_PIN_GET(sc->sc_busdev, sc->sc_dev,
288 sc->sc_miso, &bit);
289 out |= bit?mask:0;
293 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
294 sc->sc_sclk, 1);
300 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
301 sc->sc_mosi, (data & mask)?1:0);
302 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
303 sc->sc_sclk, 1);
306 if (sc->sc_miso != 0xff) {
307 GPIOBUS_PIN_GET(sc->sc_busdev, sc->sc_dev,
308 sc->sc_miso, &bit);
309 out |= bit?mask:0;
313 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
314 sc->sc_sclk, 0);
319 return (out & 0xff);
332 KASSERT(cmd->tx_cmd_sz == cmd->rx_cmd_sz,
334 KASSERT(cmd->tx_data_sz == cmd->rx_data_sz,
337 gpio_spi_chip_activate(sc, devi->cs);
340 if ((devi->mode == SPIBUS_MODE_CPOL) ||
341 (devi->mode == SPIBUS_MODE_CPHA)) {
342 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
343 sc->sc_sclk, 1);
345 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
346 sc->sc_sclk, 0);
352 buf_out = (uint8_t *)cmd->tx_cmd;
353 buf_in = (uint8_t *)cmd->rx_cmd;
355 for (i = 0; i < cmd->tx_cmd_sz; i++)
356 buf_in[i] = gpio_spi_txrx(sc, devi->cs, devi->mode, buf_out[i]);
361 buf_out = (uint8_t *)cmd->tx_data;
362 buf_in = (uint8_t *)cmd->rx_data;
363 for (i = 0; i < cmd->tx_data_sz; i++)
364 buf_in[i] = gpio_spi_txrx(sc, devi->cs, devi->mode, buf_out[i]);
367 if ((devi->mode == SPIBUS_MODE_CPOL) ||
368 (devi->mode == SPIBUS_MODE_CPHA)) {
369 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
370 sc->sc_sclk, 1);
372 GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev,
373 sc->sc_sclk, 0);
376 gpio_spi_chip_deactivate(sc, devi->cs);