Lines Matching refs:slot
68 static esp_err_t start_command_read_blocks(slot_info_t *slot, sdspi_hw_cmd_t *cmd,
71 static esp_err_t start_command_write_blocks(slot_info_t *slot, sdspi_hw_cmd_t *cmd,
74 static esp_err_t start_command_default(slot_info_t *slot, int flags, sdspi_hw_cmd_t *cmd);
78 static esp_err_t poll_busy(slot_info_t *slot, int timeout_ms, bool polling);
93 static sdspi_dev_handle_t store_slot_info(slot_info_t *slot) in store_slot_info() argument
100 if (s_slots[slot->host_id] == NULL) { in store_slot_info()
101 s_slots[slot->host_id] = slot; in store_slot_info()
102 return slot->host_id; in store_slot_info()
104 return (sdspi_dev_handle_t)slot; in store_slot_info()
112 slot_info_t* slot = s_slots[handle]; in remove_slot_info() local
114 return slot; in remove_slot_info()
121 static void cs_high(slot_info_t *slot) in cs_high() argument
123 if (slot->gpio_cs != GPIO_UNUSED) { in cs_high()
124 gpio_set_level(slot->gpio_cs, 1); in cs_high()
129 static void cs_low(slot_info_t *slot) in cs_low() argument
131 if (slot->gpio_cs != GPIO_UNUSED) { in cs_low()
132 gpio_set_level(slot->gpio_cs, 0); in cs_low()
137 static bool card_write_protected(slot_info_t *slot) in card_write_protected() argument
139 if (slot->gpio_wp == GPIO_UNUSED) { in card_write_protected()
142 return gpio_get_level(slot->gpio_wp) == 0; in card_write_protected()
146 static bool card_missing(slot_info_t *slot) in card_missing() argument
148 if (slot->gpio_cd == GPIO_UNUSED) { in card_missing()
151 return gpio_get_level(slot->gpio_cd) == 1; in card_missing()
156 static esp_err_t get_block_buf(slot_info_t *slot, uint8_t **out_buf) in get_block_buf() argument
158 if (slot->block_buf == NULL) { in get_block_buf()
159 slot->block_buf = heap_caps_malloc(SDSPI_BLOCK_BUF_SIZE, MALLOC_CAP_DMA); in get_block_buf()
160 if (slot->block_buf == NULL) { in get_block_buf()
164 *out_buf = slot->block_buf; in get_block_buf()
170 static void release_bus(slot_info_t *slot) in release_bus() argument
177 spi_device_polling_transmit(slot->spi_handle, &t); in release_bus()
182 static void go_idle_clockout(slot_info_t *slot) in go_idle_clockout() argument
192 spi_device_polling_transmit(slot->spi_handle, &t); in go_idle_clockout()
202 static esp_err_t configure_spi_dev(slot_info_t *slot, int clock_speed_hz) in configure_spi_dev() argument
204 if (slot->spi_handle) { in configure_spi_dev()
206 spi_bus_remove_device(slot->spi_handle); in configure_spi_dev()
207 slot->spi_handle = NULL; in configure_spi_dev()
217 return spi_bus_add_device(slot->host_id, &devcfg, &slot->spi_handle); in configure_spi_dev()
225 static esp_err_t deinit_slot(slot_info_t *slot) in deinit_slot() argument
228 if (slot->spi_handle) { in deinit_slot()
229 spi_bus_remove_device(slot->spi_handle); in deinit_slot()
230 slot->spi_handle = NULL; in deinit_slot()
231 free(slot->block_buf); in deinit_slot()
232 slot->block_buf = NULL; in deinit_slot()
236 if (slot->gpio_cs != GPIO_UNUSED) { in deinit_slot()
237 pin_bit_mask |= BIT64(slot->gpio_cs); in deinit_slot()
239 if (slot->gpio_cd != GPIO_UNUSED) { in deinit_slot()
240 pin_bit_mask |= BIT64(slot->gpio_cd); in deinit_slot()
242 if (slot->gpio_wp != GPIO_UNUSED) { in deinit_slot()
243 pin_bit_mask |= BIT64(slot->gpio_wp); in deinit_slot()
245 if (slot->gpio_int != GPIO_UNUSED) { in deinit_slot()
246 pin_bit_mask |= BIT64(slot->gpio_int); in deinit_slot()
247 gpio_intr_disable(slot->gpio_int); in deinit_slot()
248 gpio_isr_handler_remove(slot->gpio_int); in deinit_slot()
259 if (slot->semphr_int) { in deinit_slot()
260 vSemaphoreDelete(slot->semphr_int); in deinit_slot()
261 slot->semphr_int = NULL; in deinit_slot()
263 free(slot); in deinit_slot()
270 slot_info_t* slot = remove_slot_info(handle); in sdspi_host_remove_device() local
271 if (slot == NULL) { in sdspi_host_remove_device()
275 deinit_slot(slot); in sdspi_host_remove_device()
283 slot_info_t* slot = remove_slot_info(i); in sdspi_host_deinit() local
285 if (slot == NULL) continue; in sdspi_host_deinit()
287 deinit_slot(slot); in sdspi_host_deinit()
294 slot_info_t *slot = get_slot_info(handle); in sdspi_host_set_card_clk() local
295 if (slot == NULL) { in sdspi_host_set_card_clk()
299 return configure_spi_dev(slot, freq_khz * 1000); in sdspi_host_set_card_clk()
304 slot_info_t *slot = get_slot_info(handle); in sdspi_host_get_real_freq() local
305 if (slot == NULL) { in sdspi_host_get_real_freq()
309 return spi_device_get_actual_freq(slot->spi_handle, real_freq_khz); in sdspi_host_get_real_freq()
315 slot_info_t* slot = (slot_info_t*)arg; in gpio_intr() local
316 xSemaphoreGiveFromISR(slot->semphr_int, &awoken); in gpio_intr()
317 gpio_intr_disable(slot->gpio_int); in gpio_intr()
329 slot_info_t* slot = (slot_info_t*)malloc(sizeof(slot_info_t)); in sdspi_host_init_device() local
330 if (slot == NULL) { in sdspi_host_init_device()
333 *slot = (slot_info_t) { in sdspi_host_init_device()
339 esp_err_t ret = configure_spi_dev(slot, SDMMC_FREQ_PROBING * 1000); in sdspi_host_init_device()
352 slot->gpio_cs = slot_config->gpio_cs; in sdspi_host_init_device()
354 slot->gpio_cs = GPIO_UNUSED; in sdspi_host_init_device()
357 if (slot->gpio_cs != GPIO_UNUSED) { in sdspi_host_init_device()
363 cs_high(slot); in sdspi_host_init_device()
375 slot->gpio_cd = slot_config->gpio_cd; in sdspi_host_init_device()
377 slot->gpio_cd = GPIO_UNUSED; in sdspi_host_init_device()
382 slot->gpio_wp = slot_config->gpio_wp; in sdspi_host_init_device()
384 slot->gpio_wp = GPIO_UNUSED; in sdspi_host_init_device()
396 slot->gpio_int = slot_config->gpio_int; in sdspi_host_init_device()
409 slot->semphr_int = xSemaphoreCreateBinary(); in sdspi_host_init_device()
410 if (slot->semphr_int == NULL) { in sdspi_host_init_device()
415 gpio_intr_disable(slot->gpio_int); in sdspi_host_init_device()
419 ret = gpio_isr_handler_add(slot->gpio_int, &gpio_intr, slot); in sdspi_host_init_device()
425 slot->gpio_int = GPIO_UNUSED; in sdspi_host_init_device()
429 *out_handle = store_slot_info(slot); in sdspi_host_init_device()
432 if (slot->semphr_int) { in sdspi_host_init_device()
433 vSemaphoreDelete(slot->semphr_int); in sdspi_host_init_device()
434 slot->semphr_int = NULL; in sdspi_host_init_device()
436 if (slot->spi_handle) { in sdspi_host_init_device()
437 spi_bus_remove_device(slot->spi_handle); in sdspi_host_init_device()
438 slot->spi_handle = NULL; in sdspi_host_init_device()
440 free(slot); in sdspi_host_init_device()
448 slot_info_t *slot = get_slot_info(handle); in sdspi_host_start_command() local
449 if (slot == NULL) { in sdspi_host_start_command()
452 if (card_missing(slot)) { in sdspi_host_start_command()
463 spi_device_acquire_bus(slot->spi_handle, portMAX_DELAY); in sdspi_host_start_command()
464 poll_busy(slot, 40, true); in sdspi_host_start_command()
469 go_idle_clockout(slot); in sdspi_host_start_command()
474 cs_low(slot); in sdspi_host_start_command()
480 … ret = start_command_write_blocks(slot, cmd, data, data_size, multi_block, stop_transmission); in sdspi_host_start_command()
482 ret = start_command_read_blocks(slot, cmd, data, data_size, stop_transmission); in sdspi_host_start_command()
485 ret = start_command_default(slot, flags, cmd); in sdspi_host_start_command()
487 cs_high(slot); in sdspi_host_start_command()
489 release_bus(slot); in sdspi_host_start_command()
490 spi_device_release_bus(slot->spi_handle); in sdspi_host_start_command()
497 slot->data_crc_enabled = (uint8_t) cmd_arg; in sdspi_host_start_command()
498 ESP_LOGD(TAG, "data CRC set=%d", slot->data_crc_enabled); in sdspi_host_start_command()
504 static esp_err_t start_command_default(slot_info_t *slot, int flags, sdspi_hw_cmd_t *cmd) in start_command_default() argument
530 esp_err_t ret = spi_device_polling_transmit(slot->spi_handle, &t); in start_command_default()
550 ret = poll_busy(slot, cmd->timeout_ms, no_use_polling); in start_command_default()
560 static esp_err_t poll_busy(slot_info_t *slot, int timeout_ms, bool polling) in poll_busy() argument
576 ret = spi_device_polling_transmit(slot->spi_handle, &t); in poll_busy()
578 ret = spi_device_transmit(slot->spi_handle, &t); in poll_busy()
596 static esp_err_t poll_data_token(slot_info_t *slot, uint8_t *extra_ptr, size_t *extra_size, int tim… in poll_data_token() argument
608 ret = spi_device_polling_transmit(slot->spi_handle, &t); in poll_data_token()
698 static esp_err_t start_command_read_blocks(slot_info_t *slot, sdspi_hw_cmd_t *cmd, in start_command_read_blocks() argument
706 esp_err_t ret = spi_device_polling_transmit(slot->spi_handle, &t_command); in start_command_read_blocks()
744 … ret = poll_data_token(slot, cmd_u8 + SDSPI_CMD_R1_SIZE, &extra_data_size, cmd->timeout_ms); in start_command_read_blocks()
756 ret = get_block_buf(slot, &rx_data); in start_command_read_blocks()
770 ret = spi_device_transmit(slot->spi_handle, &t_data); in start_command_read_blocks()
791 if (slot->data_crc_enabled) { in start_command_read_blocks()
811 ret = start_command_default(slot, SDSPI_CMD_FLAG_RSP_R1B, &stop_cmd); in start_command_read_blocks()
818 ret = poll_busy(slot, cmd->timeout_ms, use_polling); in start_command_read_blocks()
831 static esp_err_t start_command_write_blocks(slot_info_t *slot, sdspi_hw_cmd_t *cmd, in start_command_write_blocks() argument
834 if (card_write_protected(slot)) { in start_command_write_blocks()
847 esp_err_t ret = spi_device_polling_transmit(slot->spi_handle, &t_command); in start_command_write_blocks()
868 ret = spi_device_polling_transmit(slot->spi_handle, &t_start_token); in start_command_write_blocks()
879 ret = get_block_buf(slot, &tmp); in start_command_write_blocks()
892 ret = spi_device_transmit(slot->spi_handle, &t_data); in start_command_write_blocks()
908 ret = spi_device_polling_transmit(slot->spi_handle, &t_crc_rsp); in start_command_write_blocks()
927 ret = poll_busy(slot, cmd->timeout_ms, no_use_polling); in start_command_write_blocks()
945 ret = spi_device_polling_transmit(slot->spi_handle, &t_stop_token); in start_command_write_blocks()
950 ret = poll_busy(slot, cmd->timeout_ms, use_polling); in start_command_write_blocks()
968 slot_info_t* slot = get_slot_info(handle); in sdspi_host_io_int_wait() local
970 if (gpio_get_level(slot->gpio_int)==0) return ESP_OK; in sdspi_host_io_int_wait()
973 xSemaphoreTake(slot->semphr_int, 0); in sdspi_host_io_int_wait()
975 gpio_intr_enable(slot->gpio_int); in sdspi_host_io_int_wait()
976 BaseType_t ret = xSemaphoreTake(slot->semphr_int, timeout_ticks); in sdspi_host_io_int_wait()
978 gpio_intr_disable(slot->gpio_int); in sdspi_host_io_int_wait()