20
20
#include "soc/gdma_struct.h"
21
21
#include "soc/gdma_periph.h"
22
22
#include "soc/gdma_reg.h"
23
+ #include "hal/clk_gate_ll.h"
24
+ #include "esp_private/gdma.h"
23
25
#include "ll_cam.h"
24
26
#include "cam_hal.h"
25
27
#include "esp_rom_gpio.h"
@@ -87,7 +89,7 @@ void ll_cam_dma_reset(cam_obj_t *cam)
87
89
//GDMA.channel[cam->dma_num].in.wight.rx_weight = 7;//The weight of Rx channel 0-15
88
90
}
89
91
90
- static void IRAM_ATTR ll_cam_vsync_isr (void * arg )
92
+ static void CAMERA_ISR_IRAM_ATTR ll_cam_vsync_isr (void * arg )
91
93
{
92
94
//DBG_PIN_SET(1);
93
95
cam_obj_t * cam = (cam_obj_t * )arg ;
@@ -110,7 +112,7 @@ static void IRAM_ATTR ll_cam_vsync_isr(void *arg)
110
112
//DBG_PIN_SET(0);
111
113
}
112
114
113
- static void IRAM_ATTR ll_cam_dma_isr (void * arg )
115
+ static void CAMERA_ISR_IRAM_ATTR ll_cam_dma_isr (void * arg )
114
116
{
115
117
cam_obj_t * cam = (cam_obj_t * )arg ;
116
118
BaseType_t HPTaskAwoken = pdFALSE ;
@@ -141,25 +143,6 @@ bool IRAM_ATTR ll_cam_stop(cam_obj_t *cam)
141
143
return true;
142
144
}
143
145
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
-
163
146
bool ll_cam_start (cam_obj_t * cam , int frame_pos )
164
147
{
165
148
LCD_CAM .cam_ctrl1 .cam_start = 0 ;
@@ -191,27 +174,72 @@ bool ll_cam_start(cam_obj_t *cam, int frame_pos)
191
174
return true;
192
175
}
193
176
194
- static esp_err_t ll_cam_dma_init (cam_obj_t * cam )
177
+ esp_err_t ll_cam_deinit (cam_obj_t * cam )
195
178
{
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 ;
207
182
}
208
183
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 );
214
236
}
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
+ // }
215
243
ll_cam_dma_reset (cam );
216
244
return ESP_OK ;
217
245
}
@@ -267,12 +295,16 @@ static esp_err_t ll_cam_converter_config(cam_obj_t *cam, const camera_config_t *
267
295
esp_err_t ll_cam_config (cam_obj_t * cam , const camera_config_t * config )
268
296
{
269
297
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 );
275
301
}
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
+ // }
276
308
277
309
LCD_CAM .cam_ctrl .val = 0 ;
278
310
@@ -369,7 +401,7 @@ esp_err_t ll_cam_init_isr(cam_obj_t *cam)
369
401
{
370
402
esp_err_t ret = ESP_OK ;
371
403
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 ,
373
405
(uint32_t )& GDMA .channel [cam -> dma_num ].in .int_st , GDMA_IN_SUC_EOF_CH0_INT_ST_M ,
374
406
ll_cam_dma_isr , cam , & cam -> dma_intr_handle );
375
407
if (ret != ESP_OK ) {
@@ -378,7 +410,7 @@ esp_err_t ll_cam_init_isr(cam_obj_t *cam)
378
410
}
379
411
380
412
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 ,
382
414
(uint32_t )& LCD_CAM .lc_dma_int_st .val , LCD_CAM_CAM_VSYNC_INT_ST_M ,
383
415
ll_cam_vsync_isr , cam , & cam -> cam_intr_handle );
384
416
if (ret != ESP_OK ) {
0 commit comments