7
7
#define LCD_FRAME_BUFFER 0xC0000000 /* LCD Frame buffer of size 800x480 in ARGB8888 */
8
8
#define CAMERA_FRAME_BUFFER 0xC0200000
9
9
10
- #define QVGA_RES_X 96
11
- #define QVGA_RES_Y 96
12
-
13
- #define CAM_W_RES 96
14
- #define CAM_H_RES 96
15
- #define CAM_PIXEL_IMAGE_SIZE (CAM_H_RES * CAM_W_RES)
16
- #define SKIP_FRAMES 10
10
+ #define QVGA_RES_X 324
11
+ #define QVGA_RES_Y 244
17
12
18
13
#define ARGB8888_BYTE_PER_PIXEL 4
19
14
@@ -41,6 +36,8 @@ DCMI_HandleTypeDef hdcmi_discovery;
41
36
42
37
static uint32_t CameraCurrentResolution;
43
38
39
+ void BSP_CAMERA_PwrUp (void );
40
+
44
41
/* *
45
42
* @brief Initializes the DCMI MSP.
46
43
* @param hdcmi: HDMI handle
@@ -199,7 +196,7 @@ uint8_t BSP_CAMERA_Init(uint32_t Resolution)
199
196
phdcmi->Instance = DCMI;
200
197
201
198
/* Power up camera */
202
- // BSP_CAMERA_PwrUp();
199
+ BSP_CAMERA_PwrUp ();
203
200
HIMAX_Open ();
204
201
205
202
/* DCMI Initialization */
@@ -215,12 +212,10 @@ uint8_t BSP_CAMERA_Init(uint32_t Resolution)
215
212
*/
216
213
// HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize)
217
214
218
- /*
219
- HAL_DCMI_ConfigCROP(phdcmi, (324 - 96) / 2, (244 - 96 / 2), 96, 96);
220
- HAL_DCMI_EnableCROP(phdcmi);
221
- */
215
+ HAL_DCMI_ConfigCROP (phdcmi, (QVGA_RES_X - CameraResX) / 2 , (QVGA_RES_Y - CameraResY / 2 ), CameraResX, CameraResY);
216
+ HAL_DCMI_EnableCROP (phdcmi);
222
217
223
- HAL_DCMI_DisableCROP (phdcmi);
218
+ // HAL_DCMI_DisableCROP(phdcmi);
224
219
225
220
CameraCurrentResolution = Resolution;
226
221
@@ -305,6 +300,76 @@ uint8_t BSP_CAMERA_Stop(void)
305
300
return status;
306
301
}
307
302
303
+ TIM_HandleTypeDef TIMHandle = {0 };
304
+
305
+ #define DCMI_TIM (TIM1)
306
+ #define DCMI_TIM_PIN (GPIO_PIN_1)
307
+ #define DCMI_TIM_PORT (GPIOK)
308
+ #define DCMI_TIM_AF (GPIO_AF1_TIM1)
309
+ #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1)
310
+ #define DCMI_TIM_CLK_ENABLE () __TIM1_CLK_ENABLE()
311
+ #define DCMI_TIM_CLK_DISABLE () __TIM1_CLK_DISABLE()
312
+ #define DCMI_TIM_PCLK_FREQ () HAL_RCC_GetPCLK2Freq()
313
+ #define OMV_XCLK_FREQUENCY (6000000 )
314
+
315
+ extern " C" {
316
+ void HAL_TIM_PWM_MspInit (TIM_HandleTypeDef *htim)
317
+ {
318
+ if (htim->Instance == DCMI_TIM) {
319
+ /* Enable DCMI timer clock */
320
+ DCMI_TIM_CLK_ENABLE ();
321
+
322
+ /* Timer GPIO configuration */
323
+ GPIO_InitTypeDef GPIO_InitStructure;
324
+ GPIO_InitStructure.Pin = DCMI_TIM_PIN;
325
+ GPIO_InitStructure.Pull = GPIO_NOPULL;
326
+ GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
327
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
328
+ GPIO_InitStructure.Alternate = DCMI_TIM_AF;
329
+ HAL_GPIO_Init (DCMI_TIM_PORT, &GPIO_InitStructure);
330
+ }
331
+ }
332
+ }
333
+
334
+ static int extclk_config (int frequency)
335
+ {
336
+ /* TCLK (PCLK * 2) */
337
+ int tclk = DCMI_TIM_PCLK_FREQ () * 2 ;
338
+
339
+ /* Period should be even */
340
+ int period = (tclk / frequency) - 1 ;
341
+
342
+ if (TIMHandle.Init .Period && (TIMHandle.Init .Period != period)) {
343
+ // __HAL_TIM_SET_AUTORELOAD sets TIMHandle.Init.Period...
344
+ __HAL_TIM_SET_AUTORELOAD (&TIMHandle, period);
345
+ __HAL_TIM_SET_COMPARE (&TIMHandle, DCMI_TIM_CHANNEL, period / 2 );
346
+ return 0 ;
347
+ }
348
+
349
+ /* Timer base configuration */
350
+ TIMHandle.Instance = DCMI_TIM;
351
+ TIMHandle.Init .Period = period;
352
+ TIMHandle.Init .Prescaler = TIM_ETRPRESCALER_DIV1;
353
+ TIMHandle.Init .CounterMode = TIM_COUNTERMODE_UP;
354
+ TIMHandle.Init .ClockDivision = TIM_CLOCKDIVISION_DIV1;
355
+
356
+ /* Timer channel configuration */
357
+ TIM_OC_InitTypeDef TIMOCHandle;
358
+ TIMOCHandle.Pulse = period / 2 ;
359
+ TIMOCHandle.OCMode = TIM_OCMODE_PWM1;
360
+ TIMOCHandle.OCPolarity = TIM_OCPOLARITY_HIGH;
361
+ TIMOCHandle.OCFastMode = TIM_OCFAST_DISABLE;
362
+ TIMOCHandle.OCIdleState = TIM_OCIDLESTATE_RESET;
363
+
364
+ if ((HAL_TIM_PWM_Init (&TIMHandle) != HAL_OK)
365
+ || (HAL_TIM_PWM_ConfigChannel (&TIMHandle, &TIMOCHandle, DCMI_TIM_CHANNEL) != HAL_OK)
366
+ || (HAL_TIM_PWM_Start (&TIMHandle, DCMI_TIM_CHANNEL) != HAL_OK)) {
367
+ return -1 ;
368
+ }
369
+
370
+ return 0 ;
371
+ }
372
+
308
373
/* *
309
374
* @brief CANERA power up
310
375
* @retval None
@@ -313,21 +378,15 @@ void BSP_CAMERA_PwrUp(void)
313
378
{
314
379
GPIO_InitTypeDef gpio_init_structure;
315
380
316
- /* Enable GPIO clock */
317
- __HAL_RCC_GPIOJ_CLK_ENABLE ();
381
+ mbed::DigitalOut* powerup = new mbed::DigitalOut (PC_13);
382
+ *powerup = 0 ;
383
+ delay (50 );
384
+ *powerup = 1 ;
385
+ delay (50 );
318
386
319
- /* ** Configure the GPIO ***/
320
- /* Configure DCMI GPIO as alternate function */
321
- gpio_init_structure.Pin = GPIO_PIN_14;
322
- gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
323
- gpio_init_structure.Pull = GPIO_NOPULL;
324
- gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
325
- HAL_GPIO_Init (GPIOJ, &gpio_init_structure);
387
+ extclk_config (OMV_XCLK_FREQUENCY);
326
388
327
- /* De-assert the camera POWER_DOWN pin (active high) */
328
- HAL_GPIO_WritePin (GPIOJ, GPIO_PIN_14, GPIO_PIN_RESET);
329
-
330
- HAL_Delay (3 ); /* POWER_DOWN de-asserted during 3ms */
389
+ HAL_Delay (30 ); /* POWER_DOWN de-asserted during 3ms */
331
390
}
332
391
333
392
/* *
@@ -336,21 +395,7 @@ void BSP_CAMERA_PwrUp(void)
336
395
*/
337
396
void BSP_CAMERA_PwrDown (void )
338
397
{
339
- GPIO_InitTypeDef gpio_init_structure;
340
-
341
- /* Enable GPIO clock */
342
- __HAL_RCC_GPIOJ_CLK_ENABLE ();
343
-
344
- /* ** Configure the GPIO ***/
345
- /* Configure DCMI GPIO as alternate function */
346
- gpio_init_structure.Pin = GPIO_PIN_14;
347
- gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
348
- gpio_init_structure.Pull = GPIO_NOPULL;
349
- gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
350
- HAL_GPIO_Init (GPIOJ, &gpio_init_structure);
351
-
352
- /* Assert the camera POWER_DOWN pin (active high) */
353
- HAL_GPIO_WritePin (GPIOJ, GPIO_PIN_14, GPIO_PIN_SET);
398
+ digitalWrite (PC_13, LOW);
354
399
}
355
400
356
401
/* *
@@ -367,22 +412,22 @@ static uint32_t GetSize(uint32_t Resolution)
367
412
{
368
413
case CAMERA_R160x120:
369
414
{
370
- size = 0x2580 ;
415
+ size = 160 * 120 ;
371
416
}
372
417
break ;
373
418
case CAMERA_R320x240:
374
419
{
375
- size = 96 * 96 ;
420
+ size = 324 * 244 ;
376
421
}
377
422
break ;
378
423
case CAMERA_R480x272:
379
424
{
380
- size = 0xFF00 ;
425
+ size = 480 * 272 ;
381
426
}
382
427
break ;
383
428
case CAMERA_R640x480:
384
429
{
385
- size = 0x25800 ;
430
+ size = 640 * 480 ;
386
431
}
387
432
break ;
388
433
default :
@@ -479,8 +524,8 @@ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi)
479
524
480
525
int CameraClass::begin (int horizontalResolution, int verticalResolution)
481
526
{
482
- CameraResX = QVGA_RES_X ;
483
- CameraResY = QVGA_RES_Y ;
527
+ CameraResX = horizontalResolution ;
528
+ CameraResY = verticalResolution ;
484
529
485
530
SDRAM.begin (LCD_FRAME_BUFFER);
486
531
@@ -508,22 +553,24 @@ int CameraClass::start(void)
508
553
509
554
uint8_t * CameraClass::grab (void )
510
555
{
511
- HIMAX_Mode (HIMAX_Streaming);
556
+ // HIMAX_Mode(HIMAX_Streaming);
512
557
513
558
/* Start the Camera Snapshot Capture */
514
- BSP_CAMERA_ContinuousStart ((uint8_t *)LCD_FRAME_BUFFER);
559
+ // BSP_CAMERA_ContinuousStart((uint8_t *)LCD_FRAME_BUFFER);
515
560
516
561
/* Wait until camera frame is ready : DCMI Frame event */
517
562
while (camera_frame_ready == 0 )
518
563
{
519
564
}
565
+ return (uint8_t *)LCD_FRAME_BUFFER;
520
566
}
521
567
522
568
uint8_t * CameraClass::snapshot (void )
523
569
{
524
- printf (" Start snapshot\n " );
525
570
HIMAX_Mode (HIMAX_Streaming);
526
571
572
+ BSP_CAMERA_Resume ();
573
+
527
574
/* Start the Camera Snapshot Capture */
528
575
BSP_CAMERA_SnapshotStart ((uint8_t *)LCD_FRAME_BUFFER);
529
576
0 commit comments