Lines Matching refs:host

78 static inline bool is_valid_host(spi_host_device_t host)  in is_valid_host()  argument
82 return host >= SPI1_HOST && host <= SPI3_HOST; in is_valid_host()
84 return host == SPI2_HOST; in is_valid_host()
86 return host >= SPI2_HOST && host <= SPI3_HOST; in is_valid_host()
90 static inline bool SPI_SLAVE_ISR_ATTR bus_is_iomux(spi_slave_t *host) in bus_is_iomux() argument
92 return host->flags&SPICOMMON_BUSFLAG_IOMUX_PINS; in bus_is_iomux()
95 static void SPI_SLAVE_ISR_ATTR freeze_cs(spi_slave_t *host) in freeze_cs() argument
97 esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, host->cs_in_signal, false); in freeze_cs()
102 static inline void SPI_SLAVE_ISR_ATTR restore_cs(spi_slave_t *host) in restore_cs() argument
104 if (host->cs_iomux) { in restore_cs()
105 gpio_ll_iomux_in(GPIO_HAL_GET_HW(GPIO_PORT_0), host->cfg.spics_io_num, host->cs_in_signal); in restore_cs()
107 esp_rom_gpio_connect_in_signal(host->cfg.spics_io_num, host->cs_in_signal, false); in restore_cs()
113 spi_slave_t *host; member
119 spi_slave_t *host = ((spi_ipc_param_t *)args)->host; in ipc_isr_reg_to_core() local
120 …loc(spicommon_irqsource_for_host(host->id), host->intr_flags | ESP_INTR_FLAG_INTRDISABLED, spi_int… in ipc_isr_reg_to_core()
124 esp_err_t spi_slave_initialize(spi_host_device_t host, const spi_bus_config_t *bus_config, const sp… in spi_slave_initialize() argument
131 SPI_CHECK(is_valid_host(host), "invalid host", ESP_ERR_INVALID_ARG); in spi_slave_initialize()
135 …SPI_CHECK( dma_chan == SPI_DMA_DISABLED || dma_chan == (int)host || dma_chan == SPI_DMA_CH_AUTO, "… in spi_slave_initialize()
150 spi_chan_claimed=spicommon_periph_claim(host, "spi slave"); in spi_slave_initialize()
153 spihost[host] = malloc(sizeof(spi_slave_t)); in spi_slave_initialize()
154 if (spihost[host] == NULL) { in spi_slave_initialize()
158 memset(spihost[host], 0, sizeof(spi_slave_t)); in spi_slave_initialize()
159 memcpy(&spihost[host]->cfg, slave_config, sizeof(spi_slave_interface_config_t)); in spi_slave_initialize()
160 memcpy(&spihost[host]->bus_config, bus_config, sizeof(spi_bus_config_t)); in spi_slave_initialize()
161 spihost[host]->id = host; in spi_slave_initialize()
164 spihost[host]->dma_enabled = use_dma; in spi_slave_initialize()
166 ret = spicommon_dma_chan_alloc(host, dma_chan, &actual_tx_dma_chan, &actual_rx_dma_chan); in spi_slave_initialize()
172 …err = spicommon_bus_initialize_io(host, bus_config, SPICOMMON_BUSFLAG_SLAVE|bus_config->flags, &sp… in spi_slave_initialize()
178 spicommon_cs_initialize(host, slave_config->spics_io_num, 0, !bus_is_iomux(spihost[host])); in spi_slave_initialize()
180 …spihost[host]->cs_iomux = (slave_config->spics_io_num == spi_periph_signal[host].spics0_iomux_pin)… in spi_slave_initialize()
181 spihost[host]->cs_in_signal = spi_periph_signal[host].spics_in; in spi_slave_initialize()
185 if (use_dma) freeze_cs(spihost[host]); in spi_slave_initialize()
188 spihost[host]->tx_dma_chan = actual_tx_dma_chan; in spi_slave_initialize()
189 spihost[host]->rx_dma_chan = actual_rx_dma_chan; in spi_slave_initialize()
194 spihost[host]->max_transfer_sz = dma_desc_ct * SPI_MAX_DMA_LEN; in spi_slave_initialize()
197 spihost[host]->max_transfer_sz = SOC_SPI_MAXIMUM_BUFFER_SIZE; in spi_slave_initialize()
201 &spihost[host]->pm_lock); in spi_slave_initialize()
207 esp_pm_lock_acquire(spihost[host]->pm_lock); in spi_slave_initialize()
211 …spihost[host]->trans_queue = xQueueCreate(slave_config->queue_size, sizeof(spi_slave_transaction_t… in spi_slave_initialize()
212 if (!spihost[host]->trans_queue) { in spi_slave_initialize()
217 …spihost[host]->ret_queue = xQueueCreate(slave_config->queue_size, sizeof(spi_slave_transaction_t *… in spi_slave_initialize()
218 if (!spihost[host]->ret_queue) { in spi_slave_initialize()
226 spihost[host]->intr_flags = bus_config->intr_flags; in spi_slave_initialize()
229 .host = spihost[host], in spi_slave_initialize()
236 …mon_irqsource_for_host(host), bus_config->intr_flags | ESP_INTR_FLAG_INTRDISABLED, spi_intr, (void… in spi_slave_initialize()
243 spi_slave_hal_context_t *hal = &spihost[host]->hal; in spi_slave_initialize()
246 .host_id = host, in spi_slave_initialize()
247 .dma_in = SPI_LL_GET_HW(host), in spi_slave_initialize()
248 .dma_out = SPI_LL_GET_HW(host) in spi_slave_initialize()
273 if (spihost[host]) { in spi_slave_initialize()
274 if (spihost[host]->trans_queue) vQueueDelete(spihost[host]->trans_queue); in spi_slave_initialize()
275 if (spihost[host]->ret_queue) vQueueDelete(spihost[host]->ret_queue); in spi_slave_initialize()
276 free(spihost[host]->hal.dmadesc_tx); in spi_slave_initialize()
277 free(spihost[host]->hal.dmadesc_rx); in spi_slave_initialize()
279 if (spihost[host]->pm_lock) { in spi_slave_initialize()
280 esp_pm_lock_release(spihost[host]->pm_lock); in spi_slave_initialize()
281 esp_pm_lock_delete(spihost[host]->pm_lock); in spi_slave_initialize()
285 spi_slave_hal_deinit(&spihost[host]->hal); in spi_slave_initialize()
286 if (spihost[host]->dma_enabled) { in spi_slave_initialize()
287 spicommon_dma_chan_free(host); in spi_slave_initialize()
290 free(spihost[host]); in spi_slave_initialize()
291 spihost[host] = NULL; in spi_slave_initialize()
292 spicommon_periph_free(host); in spi_slave_initialize()
297 esp_err_t spi_slave_free(spi_host_device_t host) in spi_slave_free() argument
299 SPI_CHECK(is_valid_host(host), "invalid host", ESP_ERR_INVALID_ARG); in spi_slave_free()
300 SPI_CHECK(spihost[host], "host not slave", ESP_ERR_INVALID_ARG); in spi_slave_free()
301 if (spihost[host]->trans_queue) vQueueDelete(spihost[host]->trans_queue); in spi_slave_free()
302 if (spihost[host]->ret_queue) vQueueDelete(spihost[host]->ret_queue); in spi_slave_free()
303 if (spihost[host]->dma_enabled) { in spi_slave_free()
304 spicommon_dma_chan_free(host); in spi_slave_free()
306 spicommon_bus_free_io_cfg(&spihost[host]->bus_config); in spi_slave_free()
307 free(spihost[host]->hal.dmadesc_tx); in spi_slave_free()
308 free(spihost[host]->hal.dmadesc_rx); in spi_slave_free()
309 esp_intr_free(spihost[host]->intr); in spi_slave_free()
311 esp_pm_lock_release(spihost[host]->pm_lock); in spi_slave_free()
312 esp_pm_lock_delete(spihost[host]->pm_lock); in spi_slave_free()
314 free(spihost[host]); in spi_slave_free()
315 spihost[host] = NULL; in spi_slave_free()
316 spicommon_periph_free(host); in spi_slave_free()
334 esp_err_t SPI_SLAVE_ATTR spi_slave_queue_reset(spi_host_device_t host) in spi_slave_queue_reset() argument
336 SPI_CHECK(is_valid_host(host), "invalid host", ESP_ERR_INVALID_ARG); in spi_slave_queue_reset()
337 SPI_CHECK(spihost[host], "host not slave", ESP_ERR_INVALID_ARG); in spi_slave_queue_reset()
339 esp_intr_disable(spihost[host]->intr); in spi_slave_queue_reset()
340 spi_ll_set_int_stat(spihost[host]->hal.hw); in spi_slave_queue_reset()
342 spihost[host]->cur_trans = NULL; in spi_slave_queue_reset()
343 xQueueReset(spihost[host]->trans_queue); in spi_slave_queue_reset()
348 esp_err_t SPI_SLAVE_ISR_ATTR spi_slave_queue_reset_isr(spi_host_device_t host) in spi_slave_queue_reset_isr() argument
350 ESP_RETURN_ON_FALSE_ISR(is_valid_host(host), ESP_ERR_INVALID_ARG, SPI_TAG, "invalid host"); in spi_slave_queue_reset_isr()
351 ESP_RETURN_ON_FALSE_ISR(spihost[host], ESP_ERR_INVALID_ARG, SPI_TAG, "host not slave"); in spi_slave_queue_reset_isr()
355 while( pdFALSE == xQueueIsQueueEmptyFromISR(spihost[host]->trans_queue)) { in spi_slave_queue_reset_isr()
356 xQueueReceiveFromISR(spihost[host]->trans_queue, &trans, &do_yield); in spi_slave_queue_reset_isr()
362 spihost[host]->cur_trans = NULL; in spi_slave_queue_reset_isr()
366 esp_err_t SPI_SLAVE_ATTR spi_slave_queue_trans(spi_host_device_t host, const spi_slave_transaction_… in spi_slave_queue_trans() argument
369 SPI_CHECK(is_valid_host(host), "invalid host", ESP_ERR_INVALID_ARG); in spi_slave_queue_trans()
370 SPI_CHECK(spihost[host], "host not slave", ESP_ERR_INVALID_ARG); in spi_slave_queue_trans()
371 …SPI_CHECK(spihost[host]->dma_enabled == 0 || trans_desc->tx_buffer==NULL || esp_ptr_dma_capable(tr… in spi_slave_queue_trans()
373 SPI_CHECK(spihost[host]->dma_enabled == 0 || trans_desc->rx_buffer==NULL || in spi_slave_queue_trans()
378 …SPI_CHECK(trans_desc->length <= spihost[host]->max_transfer_sz * 8, "data transfer > host maximum"… in spi_slave_queue_trans()
379 r = xQueueSend(spihost[host]->trans_queue, (void *)&trans_desc, ticks_to_wait); in spi_slave_queue_trans()
381 esp_intr_enable(spihost[host]->intr); in spi_slave_queue_trans()
385 esp_err_t SPI_SLAVE_ISR_ATTR spi_slave_queue_trans_isr(spi_host_device_t host, const spi_slave_tran… in spi_slave_queue_trans_isr() argument
389 ESP_RETURN_ON_FALSE_ISR(is_valid_host(host), ESP_ERR_INVALID_ARG, SPI_TAG, "invalid host"); in spi_slave_queue_trans_isr()
390 ESP_RETURN_ON_FALSE_ISR(spihost[host], ESP_ERR_INVALID_ARG, SPI_TAG, "host not slave"); in spi_slave_queue_trans_isr()
391 …ESP_RETURN_ON_FALSE_ISR(spihost[host]->dma_enabled == 0 || trans_desc->tx_buffer==NULL || esp_ptr_… in spi_slave_queue_trans_isr()
393 ESP_RETURN_ON_FALSE_ISR(spihost[host]->dma_enabled == 0 || trans_desc->rx_buffer==NULL || in spi_slave_queue_trans_isr()
397 …ESP_RETURN_ON_FALSE_ISR(trans_desc->length <= spihost[host]->max_transfer_sz * 8, ESP_ERR_INVALID_… in spi_slave_queue_trans_isr()
399 r = xQueueSendFromISR(spihost[host]->trans_queue, (void *)&trans_desc, &do_yield); in spi_slave_queue_trans_isr()
409 esp_err_t SPI_SLAVE_ATTR spi_slave_get_trans_result(spi_host_device_t host, spi_slave_transaction_t… in spi_slave_get_trans_result() argument
412 SPI_CHECK(is_valid_host(host), "invalid host", ESP_ERR_INVALID_ARG); in spi_slave_get_trans_result()
413 SPI_CHECK(spihost[host], "host not slave", ESP_ERR_INVALID_ARG); in spi_slave_get_trans_result()
415 …SPI_CHECK(!(spihost[host]->cfg.flags & SPI_SLAVE_NO_RETURN_RESULT), "API not Supported!", ESP_ERR_… in spi_slave_get_trans_result()
417 r = xQueueReceive(spihost[host]->ret_queue, (void *)trans_desc, ticks_to_wait); in spi_slave_get_trans_result()
423 esp_err_t SPI_SLAVE_ATTR spi_slave_transmit(spi_host_device_t host, spi_slave_transaction_t *trans_… in spi_slave_transmit() argument
428 ret = spi_slave_queue_trans(host, trans_desc, ticks_to_wait); in spi_slave_transmit()
430 ret = spi_slave_get_trans_result(host, &ret_trans, ticks_to_wait); in spi_slave_transmit()
439 spi_slave_t *host = (spi_slave_t *)arg; in spi_slave_restart_after_dmareset() local
440 esp_intr_enable(host->intr); in spi_slave_restart_after_dmareset()
452 spi_slave_t *host = (spi_slave_t *)arg; in spi_intr() local
453 spi_slave_hal_context_t *hal = &host->hal; in spi_intr()
457 bool use_dma = host->dma_enabled; in spi_intr()
458 if (host->cur_trans) { in spi_intr()
460 if (use_dma) freeze_cs(host); in spi_intr()
463 host->cur_trans->trans_len = spi_slave_hal_get_rcv_bitlen(hal); in spi_intr()
469 … spicommon_dmaworkaround_req_reset(host->tx_dma_chan, spi_slave_restart_after_dmareset, host); in spi_intr()
473 if (host->cfg.post_trans_cb) host->cfg.post_trans_cb(host->cur_trans); in spi_intr()
475 if(!(host->cfg.flags & SPI_SLAVE_NO_RETURN_RESULT)) { in spi_intr()
476 xQueueSendFromISR(host->ret_queue, &host->cur_trans, &do_yield); in spi_intr()
478 host->cur_trans = NULL; in spi_intr()
485 spicommon_dmaworkaround_idle(host->tx_dma_chan); in spi_intr()
488 esp_intr_disable(host->intr); in spi_intr()
496 esp_intr_disable(host->intr); in spi_intr()
498 r = xQueueReceiveFromISR(host->trans_queue, &trans, &do_yield); in spi_intr()
504 esp_intr_enable(host->intr); in spi_intr()
507 host->cur_trans = trans; in spi_intr()
517 spicommon_dmaworkaround_transfer_active(host->tx_dma_chan); in spi_intr()
525 restore_cs(host); in spi_intr()
530 if (host->cfg.post_setup_cb) host->cfg.post_setup_cb(trans); in spi_intr()