Lines Matching refs:host

84 … spi_slave_hd_slot_t *host = heap_caps_calloc(1, sizeof(spi_slave_hd_slot_t), MALLOC_CAP_INTERNAL);  in spi_slave_hd_init()  local
85 if (host == NULL) { in spi_slave_hd_init()
89 spihost[host_id] = host; in spi_slave_hd_init()
90 host->int_spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; in spi_slave_hd_init()
91 host->dma_enabled = (config->dma_chan != SPI_DMA_DISABLED); in spi_slave_hd_init()
93 if (host->dma_enabled) { in spi_slave_hd_init()
100 …_bus_initialize_io(host_id, bus_config, SPICOMMON_BUSFLAG_SLAVE | bus_config->flags, &host->flags); in spi_slave_hd_init()
107 host->append_mode = append_mode; in spi_slave_hd_init()
113 .dma_enabled = host->dma_enabled, in spi_slave_hd_init()
122 if (host->dma_enabled) { in spi_slave_hd_init()
124 …uint32_t total_desc_size = spi_slave_hd_hal_get_total_desc_size(&host->hal, bus_config->max_transf… in spi_slave_hd_init()
125 host->hal.dmadesc_tx = heap_caps_malloc(total_desc_size, MALLOC_CAP_DMA); in spi_slave_hd_init()
126 host->hal.dmadesc_rx = heap_caps_malloc(total_desc_size, MALLOC_CAP_DMA); in spi_slave_hd_init()
127 if (!host->hal.dmadesc_tx || !host->hal.dmadesc_rx) { in spi_slave_hd_init()
133 host->max_transfer_sz = spi_salve_hd_hal_get_max_bus_size(&host->hal); in spi_slave_hd_init()
136 host->max_transfer_sz = 0; in spi_slave_hd_init()
140 spi_slave_hd_hal_init(&host->hal, &hal_config); in spi_slave_hd_init()
143 ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "spi_slave", &host->pm_lock); in spi_slave_hd_init()
148 esp_pm_lock_acquire(host->pm_lock); in spi_slave_hd_init()
152 host->tx_ret_queue = xQueueCreate(config->queue_size, sizeof(spi_slave_hd_data_t *)); in spi_slave_hd_init()
153 host->rx_ret_queue = xQueueCreate(config->queue_size, sizeof(spi_slave_hd_data_t *)); in spi_slave_hd_init()
154 if (!host->append_mode) { in spi_slave_hd_init()
155 host->tx_trans_queue = xQueueCreate(config->queue_size, sizeof(spi_slave_hd_data_t *)); in spi_slave_hd_init()
156 host->rx_trans_queue = xQueueCreate(config->queue_size, sizeof(spi_slave_hd_data_t *)); in spi_slave_hd_init()
157 if (!host->tx_trans_queue || !host->rx_trans_queue) { in spi_slave_hd_init()
162 host->tx_cnting_sem = xSemaphoreCreateCounting(config->queue_size, config->queue_size); in spi_slave_hd_init()
163 host->rx_cnting_sem = xSemaphoreCreateCounting(config->queue_size, config->queue_size); in spi_slave_hd_init()
164 if (!host->tx_cnting_sem || !host->rx_cnting_sem) { in spi_slave_hd_init()
171 if (!host->append_mode) { in spi_slave_hd_init()
174 (void *)host, &host->intr); in spi_slave_hd_init()
179 (void *)host, &host->intr_dma); in spi_slave_hd_init()
188 (void *)host, &host->intr); in spi_slave_hd_init()
194 spicommon_gdma_get_handle(host_id, &host->gdma_handle_tx, GDMA_CHANNEL_DIRECTION_TX); in spi_slave_hd_init()
198 gdma_register_tx_event_callbacks(host->gdma_handle_tx, &tx_cbs, host); in spi_slave_hd_init()
201 (void *)host, &host->intr_dma); in spi_slave_hd_init()
208 …memcpy((uint8_t *)&host->callback, (uint8_t *)&config->cb_config, sizeof(spi_slave_hd_callback_con… in spi_slave_hd_init()
210 if (host->callback.cb_buffer_tx != NULL) event |= SPI_EV_BUF_TX; in spi_slave_hd_init()
211 if (host->callback.cb_buffer_rx != NULL) event |= SPI_EV_BUF_RX; in spi_slave_hd_init()
212 if (host->callback.cb_cmd9 != NULL) event |= SPI_EV_CMD9; in spi_slave_hd_init()
213 if (host->callback.cb_cmdA != NULL) event |= SPI_EV_CMDA; in spi_slave_hd_init()
214 spi_slave_hd_hal_enable_event_intr(&host->hal, event); in spi_slave_hd_init()
226 spi_slave_hd_slot_t *host = spihost[host_id]; in spi_slave_hd_deinit() local
227 if (host == NULL) return ESP_ERR_INVALID_ARG; in spi_slave_hd_deinit()
229 if (host->tx_trans_queue) vQueueDelete(host->tx_trans_queue); in spi_slave_hd_deinit()
230 if (host->tx_ret_queue) vQueueDelete(host->tx_ret_queue); in spi_slave_hd_deinit()
231 if (host->rx_trans_queue) vQueueDelete(host->rx_trans_queue); in spi_slave_hd_deinit()
232 if (host->rx_ret_queue) vQueueDelete(host->rx_ret_queue); in spi_slave_hd_deinit()
233 if (host->tx_cnting_sem) vSemaphoreDelete(host->tx_cnting_sem); in spi_slave_hd_deinit()
234 if (host->rx_cnting_sem) vSemaphoreDelete(host->rx_cnting_sem); in spi_slave_hd_deinit()
235 if (host) { in spi_slave_hd_deinit()
236 free(host->hal.dmadesc_tx); in spi_slave_hd_deinit()
237 free(host->hal.dmadesc_rx); in spi_slave_hd_deinit()
238 esp_intr_free(host->intr); in spi_slave_hd_deinit()
239 esp_intr_free(host->intr_dma); in spi_slave_hd_deinit()
241 if (host->pm_lock) { in spi_slave_hd_deinit()
242 esp_pm_lock_release(host->pm_lock); in spi_slave_hd_deinit()
243 esp_pm_lock_delete(host->pm_lock); in spi_slave_hd_deinit()
249 if (host->dma_enabled) { in spi_slave_hd_deinit()
252 free(host); in spi_slave_hd_deinit()
257 static void tx_invoke(spi_slave_hd_slot_t *host) in tx_invoke() argument
259 portENTER_CRITICAL(&host->int_spinlock); in tx_invoke()
260 spi_slave_hd_hal_invoke_event_intr(&host->hal, SPI_EV_SEND); in tx_invoke()
261 portEXIT_CRITICAL(&host->int_spinlock); in tx_invoke()
264 static void rx_invoke(spi_slave_hd_slot_t *host) in rx_invoke() argument
266 portENTER_CRITICAL(&host->int_spinlock); in rx_invoke()
267 spi_slave_hd_hal_invoke_event_intr(&host->hal, SPI_EV_RECV); in rx_invoke()
268 portEXIT_CRITICAL(&host->int_spinlock); in rx_invoke()
271 static inline IRAM_ATTR BaseType_t intr_check_clear_callback(spi_slave_hd_slot_t *host, spi_event_t… in intr_check_clear_callback() argument
274 if (spi_slave_hd_hal_check_clear_event(&host->hal, ev) && cb) { in intr_check_clear_callback()
276 cb(host->callback.arg, &event, &cb_awoken); in intr_check_clear_callback()
283 spi_slave_hd_slot_t *host = (spi_slave_hd_slot_t *)arg; in spi_slave_hd_intr_segment() local
284 spi_slave_hd_callback_config_t *callback = &host->callback; in spi_slave_hd_intr_segment()
285 spi_slave_hd_hal_context_t *hal = &host->hal; in spi_slave_hd_intr_segment()
289 awoken |= intr_check_clear_callback(host, SPI_EV_BUF_TX, callback->cb_buffer_tx); in spi_slave_hd_intr_segment()
290 awoken |= intr_check_clear_callback(host, SPI_EV_BUF_RX, callback->cb_buffer_rx); in spi_slave_hd_intr_segment()
291 awoken |= intr_check_clear_callback(host, SPI_EV_CMD9, callback->cb_cmd9); in spi_slave_hd_intr_segment()
292 awoken |= intr_check_clear_callback(host, SPI_EV_CMDA, callback->cb_cmdA); in spi_slave_hd_intr_segment()
297 portENTER_CRITICAL_ISR(&host->int_spinlock); in spi_slave_hd_intr_segment()
298 if (host->tx_desc && spi_slave_hd_hal_check_disable_event(hal, SPI_EV_SEND)) { in spi_slave_hd_intr_segment()
301 if (host->rx_desc && spi_slave_hd_hal_check_disable_event(hal, SPI_EV_RECV)) { in spi_slave_hd_intr_segment()
304 portEXIT_CRITICAL_ISR(&host->int_spinlock); in spi_slave_hd_intr_segment()
311 .trans = host->tx_desc, in spi_slave_hd_intr_segment()
318 ret = xQueueSendFromISR(host->tx_ret_queue, &host->tx_desc, &awoken); in spi_slave_hd_intr_segment()
322 host->tx_desc = NULL; in spi_slave_hd_intr_segment()
326 host->rx_desc->trans_len = spi_slave_hd_hal_rxdma_seg_get_len(hal); in spi_slave_hd_intr_segment()
330 .trans = host->rx_desc, in spi_slave_hd_intr_segment()
337 ret = xQueueSendFromISR(host->rx_ret_queue, &host->rx_desc, &awoken); in spi_slave_hd_intr_segment()
341 host->rx_desc = NULL; in spi_slave_hd_intr_segment()
346 if (!host->tx_desc) { in spi_slave_hd_intr_segment()
347 ret = xQueueReceiveFromISR(host->tx_trans_queue, &host->tx_desc, &awoken); in spi_slave_hd_intr_segment()
349 spi_slave_hd_hal_txdma(hal, host->tx_desc->data, host->tx_desc->len); in spi_slave_hd_intr_segment()
354 .trans = host->tx_desc, in spi_slave_hd_intr_segment()
362 if (!host->rx_desc) { in spi_slave_hd_intr_segment()
363 ret = xQueueReceiveFromISR(host->rx_trans_queue, &host->rx_desc, &awoken); in spi_slave_hd_intr_segment()
365 spi_slave_hd_hal_rxdma(hal, host->rx_desc->data, host->rx_desc->len); in spi_slave_hd_intr_segment()
370 .trans = host->rx_desc, in spi_slave_hd_intr_segment()
379 portENTER_CRITICAL_ISR(&host->int_spinlock); in spi_slave_hd_intr_segment()
386 portEXIT_CRITICAL_ISR(&host->int_spinlock); in spi_slave_hd_intr_segment()
393 spi_slave_hd_slot_t *host = (spi_slave_hd_slot_t*)arg; in spi_slave_hd_append_tx_isr() local
394 spi_slave_hd_callback_config_t *callback = &host->callback; in spi_slave_hd_append_tx_isr()
395 spi_slave_hd_hal_context_t *hal = &host->hal; in spi_slave_hd_append_tx_isr()
419 ret = xQueueSendFromISR(host->tx_ret_queue, &trans_desc, &awoken); in spi_slave_hd_append_tx_isr()
422 ret = xSemaphoreGiveFromISR(host->tx_cnting_sem, &awoken); in spi_slave_hd_append_tx_isr()
431 spi_slave_hd_slot_t *host = (spi_slave_hd_slot_t*)arg; in spi_slave_hd_append_rx_isr() local
432 spi_slave_hd_callback_config_t *callback = &host->callback; in spi_slave_hd_append_rx_isr()
433 spi_slave_hd_hal_context_t *hal = &host->hal; in spi_slave_hd_append_rx_isr()
459 ret = xQueueSendFromISR(host->rx_ret_queue, &trans_desc, &awoken); in spi_slave_hd_append_rx_isr()
462 ret = xSemaphoreGiveFromISR(host->rx_cnting_sem, &awoken); in spi_slave_hd_append_rx_isr()
482 spi_slave_hd_slot_t *host = (spi_slave_hd_slot_t *)arg; in spi_slave_hd_intr_append() local
483 spi_slave_hd_hal_context_t *hal = &host->hal; in spi_slave_hd_intr_append()
488 portENTER_CRITICAL_ISR(&host->int_spinlock); in spi_slave_hd_intr_append()
497 portEXIT_CRITICAL_ISR(&host->int_spinlock); in spi_slave_hd_intr_append()
509 spi_slave_hd_slot_t *host = spihost[host_id]; in get_ret_queue_result() local
514 ret = xQueueReceive(host->tx_ret_queue, &trans, timeout); in get_ret_queue_result()
516 ret = xQueueReceive(host->rx_ret_queue, &trans, timeout); in get_ret_queue_result()
529 spi_slave_hd_slot_t *host = spihost[host_id]; in spi_slave_hd_queue_trans() local
531 …SPIHD_CHECK(host->append_mode == 0, "This API should be used for SPI Slave HD Segment Mode", ESP_E… in spi_slave_hd_queue_trans()
533 …SPIHD_CHECK(trans->len <= host->max_transfer_sz && trans->len > 0, "Invalid buffer size", ESP_ERR_… in spi_slave_hd_queue_trans()
537 BaseType_t ret = xQueueSend(host->tx_trans_queue, &trans, timeout); in spi_slave_hd_queue_trans()
541 tx_invoke(host); in spi_slave_hd_queue_trans()
543 BaseType_t ret = xQueueSend(host->rx_trans_queue, &trans, timeout); in spi_slave_hd_queue_trans()
547 rx_invoke(host); in spi_slave_hd_queue_trans()
555 spi_slave_hd_slot_t *host = spihost[host_id]; in spi_slave_hd_get_trans_res() local
557 …SPIHD_CHECK(host->append_mode == 0, "This API should be used for SPI Slave HD Segment Mode", ESP_E… in spi_slave_hd_get_trans_res()
578 spi_slave_hd_slot_t *host = spihost[host_id]; in spi_slave_hd_append_trans() local
579 spi_slave_hd_hal_context_t *hal = &host->hal; in spi_slave_hd_append_trans()
582 …SPIHD_CHECK(host->append_mode == 1, "This API should be used for SPI Slave HD Append Mode", ESP_ER… in spi_slave_hd_append_trans()
584 …SPIHD_CHECK(trans->len <= host->max_transfer_sz && trans->len > 0, "Invalid buffer size", ESP_ERR_… in spi_slave_hd_append_trans()
588 BaseType_t ret = xSemaphoreTake(host->tx_cnting_sem, timeout); in spi_slave_hd_append_trans()
594 BaseType_t ret = xSemaphoreTake(host->rx_cnting_sem, timeout); in spi_slave_hd_append_trans()
610 spi_slave_hd_slot_t *host = spihost[host_id]; in spi_slave_hd_get_append_trans_res() local
612 …SPIHD_CHECK(host->append_mode == 1, "This API should be used for SPI Slave HD Append Mode", ESP_ER… in spi_slave_hd_get_append_trans_res()