2020#include "soc/gdma_struct.h"
2121#include "soc/gdma_periph.h"
2222#include "soc/gdma_reg.h"
23+ #include "hal/clk_gate_ll.h"
24+ #include "esp_private/gdma.h"
2325#include "ll_cam.h"
2426#include "cam_hal.h"
2527#include "esp_rom_gpio.h"
@@ -87,7 +89,7 @@ void ll_cam_dma_reset(cam_obj_t *cam)
8789 //GDMA.channel[cam->dma_num].in.wight.rx_weight = 7;//The weight of Rx channel 0-15
8890}
8991
90- static void IRAM_ATTR ll_cam_vsync_isr (void * arg )
92+ static void CAMERA_ISR_IRAM_ATTR ll_cam_vsync_isr (void * arg )
9193{
9294 //DBG_PIN_SET(1);
9395 cam_obj_t * cam = (cam_obj_t * )arg ;
@@ -110,7 +112,7 @@ static void IRAM_ATTR ll_cam_vsync_isr(void *arg)
110112 //DBG_PIN_SET(0);
111113}
112114
113- static void IRAM_ATTR ll_cam_dma_isr (void * arg )
115+ static void CAMERA_ISR_IRAM_ATTR ll_cam_dma_isr (void * arg )
114116{
115117 cam_obj_t * cam = (cam_obj_t * )arg ;
116118 BaseType_t HPTaskAwoken = pdFALSE ;
@@ -141,25 +143,6 @@ bool IRAM_ATTR ll_cam_stop(cam_obj_t *cam)
141143 return true;
142144}
143145
144- esp_err_t ll_cam_deinit (cam_obj_t * cam )
145- {
146- if (cam -> cam_intr_handle ) {
147- esp_intr_free (cam -> cam_intr_handle );
148- cam -> cam_intr_handle = NULL ;
149- }
150-
151- if (cam -> dma_intr_handle ) {
152- esp_intr_free (cam -> dma_intr_handle );
153- cam -> dma_intr_handle = NULL ;
154- }
155- GDMA .channel [cam -> dma_num ].in .link .addr = 0x0 ;
156-
157- LCD_CAM .cam_ctrl1 .cam_start = 0 ;
158- LCD_CAM .cam_ctrl1 .cam_reset = 1 ;
159- LCD_CAM .cam_ctrl1 .cam_reset = 0 ;
160- return ESP_OK ;
161- }
162-
163146bool ll_cam_start (cam_obj_t * cam , int frame_pos )
164147{
165148 LCD_CAM .cam_ctrl1 .cam_start = 0 ;
@@ -191,27 +174,72 @@ bool ll_cam_start(cam_obj_t *cam, int frame_pos)
191174 return true;
192175}
193176
194- static esp_err_t ll_cam_dma_init (cam_obj_t * cam )
177+ esp_err_t ll_cam_deinit (cam_obj_t * cam )
195178{
196- for (int x = (SOC_GDMA_PAIRS_PER_GROUP - 1 ); x >= 0 ; x -- ) {
197- if (GDMA .channel [x ].in .link .addr == 0x0 ) {
198- cam -> dma_num = x ;
199- ESP_LOGI (TAG , "DMA Channel=%d" , cam -> dma_num );
200- break ;
201- }
202- if (x == 0 ) {
203- cam_deinit ();
204- ESP_LOGE (TAG , "Can't found available GDMA channel" );
205- return ESP_FAIL ;
206- }
179+ if (cam -> cam_intr_handle ) {
180+ esp_intr_free (cam -> cam_intr_handle );
181+ cam -> cam_intr_handle = NULL ;
207182 }
208183
209- if (REG_GET_BIT (SYSTEM_PERIP_CLK_EN1_REG , SYSTEM_DMA_CLK_EN ) == 0 ) {
210- REG_CLR_BIT (SYSTEM_PERIP_CLK_EN1_REG , SYSTEM_DMA_CLK_EN );
211- REG_SET_BIT (SYSTEM_PERIP_CLK_EN1_REG , SYSTEM_DMA_CLK_EN );
212- REG_SET_BIT (SYSTEM_PERIP_RST_EN1_REG , SYSTEM_DMA_RST );
213- REG_CLR_BIT (SYSTEM_PERIP_RST_EN1_REG , SYSTEM_DMA_RST );
184+ if (cam -> dma_intr_handle ) {
185+ esp_intr_free (cam -> dma_intr_handle );
186+ cam -> dma_intr_handle = NULL ;
187+ }
188+ gdma_disconnect (cam -> dma_channel_handle );
189+ gdma_del_channel (cam -> dma_channel_handle );
190+ cam -> dma_channel_handle = NULL ;
191+ // GDMA.channel[cam->dma_num].in.link.addr = 0x0;
192+
193+ LCD_CAM .cam_ctrl1 .cam_start = 0 ;
194+ LCD_CAM .cam_ctrl1 .cam_reset = 1 ;
195+ LCD_CAM .cam_ctrl1 .cam_reset = 0 ;
196+ return ESP_OK ;
197+ }
198+
199+ static esp_err_t ll_cam_dma_init (cam_obj_t * cam )
200+ {
201+ //alloc rx gdma channel
202+ gdma_channel_alloc_config_t rx_alloc_config = {
203+ .direction = GDMA_CHANNEL_DIRECTION_RX ,
204+ };
205+ esp_err_t ret = gdma_new_channel (& rx_alloc_config , & cam -> dma_channel_handle );
206+ if (ret != ESP_OK ) {
207+ cam_deinit ();
208+ ESP_LOGE (TAG , "Can't find available GDMA channel" );
209+ return ESP_FAIL ;
210+ }
211+ int chan_id = -1 ;
212+ ret = gdma_get_channel_id (cam -> dma_channel_handle , & chan_id );
213+ if (ret != ESP_OK ) {
214+ cam_deinit ();
215+ ESP_LOGE (TAG , "Can't get GDMA channel number" );
216+ return ESP_FAIL ;
217+ }
218+ cam -> dma_num = chan_id ;
219+ ESP_LOGI (TAG , "DMA Channel=%d" , cam -> dma_num );
220+ // for (int x = (SOC_GDMA_PAIRS_PER_GROUP - 1); x >= 0; x--) {
221+ // if (GDMA.channel[x].in.link.addr == 0x0) {
222+ // cam->dma_num = x;
223+ // ESP_LOGI(TAG, "DMA Channel=%d", cam->dma_num);
224+ // break;
225+ // }
226+ // if (x == 0) {
227+ // cam_deinit();
228+ // ESP_LOGE(TAG, "Can't found available GDMA channel");
229+ // return ESP_FAIL;
230+ // }
231+ // }
232+
233+ if (!periph_ll_periph_enabled (PERIPH_GDMA_MODULE )) {
234+ periph_ll_disable_clk_set_rst (PERIPH_GDMA_MODULE );
235+ periph_ll_enable_clk_clear_rst (PERIPH_GDMA_MODULE );
214236 }
237+ // if (REG_GET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_DMA_CLK_EN) == 0) {
238+ // REG_CLR_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_DMA_CLK_EN);
239+ // REG_SET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_DMA_CLK_EN);
240+ // REG_SET_BIT(SYSTEM_PERIP_RST_EN1_REG, SYSTEM_DMA_RST);
241+ // REG_CLR_BIT(SYSTEM_PERIP_RST_EN1_REG, SYSTEM_DMA_RST);
242+ // }
215243 ll_cam_dma_reset (cam );
216244 return ESP_OK ;
217245}
@@ -267,12 +295,16 @@ static esp_err_t ll_cam_converter_config(cam_obj_t *cam, const camera_config_t *
267295esp_err_t ll_cam_config (cam_obj_t * cam , const camera_config_t * config )
268296{
269297 esp_err_t ret = ESP_OK ;
270- if (REG_GET_BIT (SYSTEM_PERIP_CLK_EN1_REG , SYSTEM_LCD_CAM_CLK_EN ) == 0 ) {
271- REG_CLR_BIT (SYSTEM_PERIP_CLK_EN1_REG , SYSTEM_LCD_CAM_CLK_EN );
272- REG_SET_BIT (SYSTEM_PERIP_CLK_EN1_REG , SYSTEM_LCD_CAM_CLK_EN );
273- REG_SET_BIT (SYSTEM_PERIP_RST_EN1_REG , SYSTEM_LCD_CAM_RST );
274- REG_CLR_BIT (SYSTEM_PERIP_RST_EN1_REG , SYSTEM_LCD_CAM_RST );
298+ if (!periph_ll_periph_enabled (PERIPH_LCD_CAM_MODULE )) {
299+ periph_ll_disable_clk_set_rst (PERIPH_LCD_CAM_MODULE );
300+ periph_ll_enable_clk_clear_rst (PERIPH_LCD_CAM_MODULE );
275301 }
302+ // if (REG_GET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_LCD_CAM_CLK_EN) == 0) {
303+ // REG_CLR_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_LCD_CAM_CLK_EN);
304+ // REG_SET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_LCD_CAM_CLK_EN);
305+ // REG_SET_BIT(SYSTEM_PERIP_RST_EN1_REG, SYSTEM_LCD_CAM_RST);
306+ // REG_CLR_BIT(SYSTEM_PERIP_RST_EN1_REG, SYSTEM_LCD_CAM_RST);
307+ // }
276308
277309 LCD_CAM .cam_ctrl .val = 0 ;
278310
@@ -369,7 +401,7 @@ esp_err_t ll_cam_init_isr(cam_obj_t *cam)
369401{
370402 esp_err_t ret = ESP_OK ;
371403 ret = esp_intr_alloc_intrstatus (gdma_periph_signals .groups [0 ].pairs [cam -> dma_num ].rx_irq_id ,
372- ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED | ESP_INTR_FLAG_IRAM ,
404+ ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED | CAMERA_ISR_IRAM_FLAG ,
373405 (uint32_t )& GDMA .channel [cam -> dma_num ].in .int_st , GDMA_IN_SUC_EOF_CH0_INT_ST_M ,
374406 ll_cam_dma_isr , cam , & cam -> dma_intr_handle );
375407 if (ret != ESP_OK ) {
@@ -378,7 +410,7 @@ esp_err_t ll_cam_init_isr(cam_obj_t *cam)
378410 }
379411
380412 ret = esp_intr_alloc_intrstatus (ETS_LCD_CAM_INTR_SOURCE ,
381- ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED | ESP_INTR_FLAG_IRAM ,
413+ ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED | CAMERA_ISR_IRAM_FLAG ,
382414 (uint32_t )& LCD_CAM .lc_dma_int_st .val , LCD_CAM_CAM_VSYNC_INT_ST_M ,
383415 ll_cam_vsync_isr , cam , & cam -> cam_intr_handle );
384416 if (ret != ESP_OK ) {
0 commit comments