gdma: avoid manually start/stop when channel is controled by ETM
This commit is contained in:
@@ -451,10 +451,10 @@ err:
|
||||
|
||||
esp_err_t gdma_start(gdma_channel_handle_t dma_chan, intptr_t desc_base_addr)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
gdma_pair_t *pair = NULL;
|
||||
gdma_group_t *group = NULL;
|
||||
ESP_GOTO_ON_FALSE_ISR(dma_chan, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
|
||||
ESP_RETURN_ON_FALSE_ISR(dma_chan, ESP_ERR_INVALID_ARG, TAG, "invalid argument");
|
||||
ESP_RETURN_ON_FALSE_ISR(dma_chan->flags.start_stop_by_etm == false, ESP_ERR_INVALID_STATE, TAG, "channel is controlled by ETM");
|
||||
pair = dma_chan->pair;
|
||||
group = pair->group;
|
||||
|
||||
@@ -468,16 +468,15 @@ esp_err_t gdma_start(gdma_channel_handle_t dma_chan, intptr_t desc_base_addr)
|
||||
}
|
||||
portEXIT_CRITICAL_SAFE(&dma_chan->spinlock);
|
||||
|
||||
err:
|
||||
return ret;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t gdma_stop(gdma_channel_handle_t dma_chan)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
gdma_pair_t *pair = NULL;
|
||||
gdma_group_t *group = NULL;
|
||||
ESP_GOTO_ON_FALSE_ISR(dma_chan, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
|
||||
ESP_RETURN_ON_FALSE_ISR(dma_chan, ESP_ERR_INVALID_ARG, TAG, "invalid argument");
|
||||
ESP_RETURN_ON_FALSE_ISR(dma_chan->flags.start_stop_by_etm == false, ESP_ERR_INVALID_STATE, TAG, "channel is controlled by ETM");
|
||||
pair = dma_chan->pair;
|
||||
group = pair->group;
|
||||
|
||||
@@ -489,8 +488,7 @@ esp_err_t gdma_stop(gdma_channel_handle_t dma_chan)
|
||||
}
|
||||
portEXIT_CRITICAL_SAFE(&dma_chan->spinlock);
|
||||
|
||||
err:
|
||||
return ret;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t gdma_append(gdma_channel_handle_t dma_chan)
|
||||
|
||||
@@ -46,6 +46,7 @@ static esp_err_t gdma_del_etm_task(esp_etm_task_t *task)
|
||||
gdma_ll_tx_enable_etm_task(group->hal.dev, pair->pair_id, false);
|
||||
}
|
||||
free(gdma_task);
|
||||
dma_chan->flags.start_stop_by_etm = false;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
@@ -105,6 +106,8 @@ esp_err_t gdma_new_etm_task(gdma_channel_handle_t dma_chan, const gdma_etm_task_
|
||||
}
|
||||
ESP_GOTO_ON_FALSE(task_id != 0, ESP_ERR_NOT_SUPPORTED, err, TAG, "not supported task type");
|
||||
|
||||
// set a flag, now the GDMA channel is start/stop by ETM subsystem
|
||||
dma_chan->flags.start_stop_by_etm = true;
|
||||
// fill the ETM task object
|
||||
task->chan = dma_chan;
|
||||
task->base.task_id = task_id;
|
||||
|
||||
@@ -67,6 +67,9 @@ struct gdma_channel_t {
|
||||
size_t sram_alignment; // alignment for memory in SRAM
|
||||
size_t psram_alignment; // alignment for memory in PSRAM
|
||||
esp_err_t (*del)(gdma_channel_t *channel); // channel deletion function, it's polymorphic, see `gdma_del_tx_channel` or `gdma_del_rx_channel`
|
||||
struct {
|
||||
uint32_t start_stop_by_etm: 1; // whether the channel is started/stopped by ETM
|
||||
} flags;
|
||||
};
|
||||
|
||||
struct gdma_tx_channel_t {
|
||||
|
||||
Reference in New Issue
Block a user