static void deinit_gpio(void) { palSetPadMode(GPIOA, 3, PAL_MODE_INPUT); palSetPadMode(GPIOA, 2, PAL_MODE_INPUT); palSetPadMode(GPIOC, 0, PAL_MODE_INPUT); palSetPadMode(GPIOA, 5, PAL_MODE_INPUT); palSetPadMode(GPIOA, 6, PAL_MODE_INPUT); palSetPadMode(GPIOA, 7, PAL_MODE_INPUT); bsp_spi_deinit(BSP_DEV_SPI2); palSetPadMode(GPIOC, 1, PAL_MODE_INPUT); palSetPadMode(GPIOB, 10, PAL_MODE_INPUT); palSetPadMode(GPIOC, 2, PAL_MODE_INPUT); palSetPadMode(GPIOC, 3, PAL_MODE_INPUT); palSetPadMode(GPIOB, 11, PAL_MODE_INPUT); /* Configure K1/2/3/4 Buttons as Input */ palSetPadMode(GPIOB, 7, PAL_MODE_INPUT); palSetPadMode(GPIOB, 6, PAL_MODE_INPUT); palSetPadMode(GPIOB, 8, PAL_MODE_INPUT); palSetPadMode(GPIOB, 9, PAL_MODE_INPUT); /* Configure D2/3/4/5 LEDs as Input */ palSetPadMode(GPIOB, 0, PAL_MODE_INPUT); palSetPadMode(GPIOB, 3, PAL_MODE_INPUT); palSetPadMode(GPIOB, 4, PAL_MODE_INPUT); palSetPadMode(GPIOB, 5, PAL_MODE_INPUT); }
void bbio_spi_sniff(t_hydra_console *con) { uint8_t cs_state, data, rx_data[2]; mode_config_proto_t* proto = &con->mode->proto; bsp_status_t status; proto->dev_mode = DEV_SPI_SLAVE; status = bsp_spi_init(proto->dev_num, proto); status = bsp_spi_init(proto->dev_num+1, proto); if(status == BSP_OK) { cprint(con, "\x01", 1); } else { cprint(con, "\x00", 1); proto->dev_mode = DEV_SPI_MASTER; status = bsp_spi_init(proto->dev_num, proto); status = bsp_spi_deinit(proto->dev_num+1); return; } cs_state = 1; while(!USER_BUTTON || chnReadTimeout(con->sdu, &data, 1,1)) { if (cs_state == 0 && bsp_spi_get_cs(proto->dev_num)) { cprint(con, "]", 1); cs_state = 1; } else if (cs_state == 1 && !(bsp_spi_get_cs(proto->dev_num))) { cprint(con, "[", 1); cs_state = 0; } if(bsp_spi_rxne(proto->dev_num)){ bsp_spi_read_u8(proto->dev_num, &rx_data[0], 1); if(bsp_spi_rxne(proto->dev_num+1)){ bsp_spi_read_u8(proto->dev_num+1, &rx_data[1], 1); } else { rx_data[1] = 0; } cprintf(con, "\\%c%c", rx_data[0], rx_data[1]); } } proto->dev_mode = DEV_SPI_MASTER; status = bsp_spi_init(proto->dev_num, proto); status = bsp_spi_deinit(proto->dev_num+1); }
/** \brief DeInit/Cleanup HydraNFC functions * * \param con t_hydra_console*: hydra console (optional can be NULL if unused) * \return void * */ void hydranfc_cleanup(t_hydra_console *con) { (void)con; if(key_sniff_thread != NULL) { chThdTerminate(key_sniff_thread); chThdWait(key_sniff_thread); key_sniff_thread = NULL; } bsp_spi_deinit(BSP_DEV_SPI2); extStop(&EXTD1); /* deinit GPIO config (reinit using hydrabus_init() */ deinit_gpio(); }
static void cleanup(t_hydra_console *con) { mode_config_proto_t* proto = &con->mode->proto; bsp_spi_deinit(proto->dev_num); }
void bbio_mode_spi(t_hydra_console *con) { uint8_t bbio_subcommand; uint16_t to_rx, to_tx, i; uint8_t *tx_data = (uint8_t *)g_sbuf; uint8_t *rx_data = (uint8_t *)g_sbuf+4096; uint8_t data; bsp_status_t status; mode_config_proto_t* proto = &con->mode->proto; bbio_spi_init_proto_default(con); bsp_spi_init(proto->dev_num, proto); while (!USER_BUTTON) { if(chSequentialStreamRead(con->sdu, &bbio_subcommand, 1) == 1) { switch(bbio_subcommand) { case BBIO_RESET: bsp_spi_deinit(proto->dev_num); return; case BBIO_SPI_CS_LOW: bsp_spi_select(proto->dev_num); cprint(con, "\x01", 1); break; case BBIO_SPI_CS_HIGH: bsp_spi_unselect(proto->dev_num); cprint(con, "\x01", 1); break; case BBIO_SPI_SNIFF_ALL: case BBIO_SPI_SNIFF_CS_LOW: case BBIO_SPI_SNIFF_CS_HIGH: bbio_spi_sniff(con); break; case BBIO_SPI_WRITE_READ: case BBIO_SPI_WRITE_READ_NCS: chSequentialStreamRead(con->sdu, rx_data, 4); to_tx = (rx_data[0] << 8) + rx_data[1]; to_rx = (rx_data[2] << 8) + rx_data[3]; if ((to_tx > 4096) || (to_rx > 4096)) { cprint(con, "\x00", 1); break; } chSequentialStreamRead(con->sdu, tx_data, to_tx); if(bbio_subcommand == BBIO_SPI_WRITE_READ) { bsp_spi_select(proto->dev_num); } bsp_spi_write_u8(proto->dev_num, tx_data, to_tx); i=0; while(i<to_rx) { if((to_rx-i) >= 255) { bsp_spi_read_u8(proto->dev_num, rx_data+i, 255); } else { bsp_spi_read_u8(proto->dev_num, rx_data+i, to_rx-i); } i+=255; } if(bbio_subcommand == BBIO_SPI_WRITE_READ) { bsp_spi_unselect(proto->dev_num); } i=0; cprint(con, "\x01", 1); while(i < to_rx) { cprintf(con, "%c", rx_data[i]); i++; } break; default: if ((bbio_subcommand & BBIO_SPI_BULK_TRANSFER) == BBIO_SPI_BULK_TRANSFER) { // data contains the number of bytes to // write data = (bbio_subcommand & 0b1111) + 1; chSequentialStreamRead(con->sdu, tx_data, data); bsp_spi_write_read_u8(proto->dev_num, tx_data, rx_data, data); cprint(con, "\x01", 1); i=0; while(i < data) { cprintf(con, "%c", rx_data[i]); i++; } } else if ((bbio_subcommand & BBIO_SPI_SET_SPEED) == BBIO_SPI_SET_SPEED) { proto->dev_speed = bbio_subcommand & 0b111; status = bsp_spi_init(proto->dev_num, proto); if(status == BSP_OK) { cprint(con, "\x01", 1); } else { cprint(con, "\x00", 1); } } else if ((bbio_subcommand & BBIO_SPI_CONFIG) == BBIO_SPI_CONFIG) { proto->dev_polarity = (bbio_subcommand & 0b100)?1:0; proto->dev_phase = (bbio_subcommand & 0b10)?1:0; status = bsp_spi_init(proto->dev_num, proto); if(status == BSP_OK) { cprint(con, "\x01", 1); } else { cprint(con, "\x00", 1); } } else if ((bbio_subcommand & BBIO_SPI_CONFIG_PERIPH) == BBIO_SPI_CONFIG_PERIPH) { cprint(con, "\x01", 1); } } } } }