77#define LCD_FRAME_BUFFER 0xC0000000 /* LCD Frame buffer of size 800x480 in ARGB8888 */
88#define CAMERA_FRAME_BUFFER 0xC0200000
99
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
1712
1813#define ARGB8888_BYTE_PER_PIXEL 4
1914
@@ -41,6 +36,8 @@ DCMI_HandleTypeDef hdcmi_discovery;
4136
4237static uint32_t CameraCurrentResolution;
4338
39+ void BSP_CAMERA_PwrUp (void );
40+
4441/* *
4542 * @brief Initializes the DCMI MSP.
4643 * @param hdcmi: HDMI handle
@@ -199,7 +196,7 @@ uint8_t BSP_CAMERA_Init(uint32_t Resolution)
199196 phdcmi->Instance = DCMI;
200197
201198 /* Power up camera */
202- // BSP_CAMERA_PwrUp();
199+ BSP_CAMERA_PwrUp ();
203200 HIMAX_Open ();
204201
205202 /* DCMI Initialization */
@@ -215,12 +212,10 @@ uint8_t BSP_CAMERA_Init(uint32_t Resolution)
215212 */
216213// HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize)
217214
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);
222217
223- HAL_DCMI_DisableCROP (phdcmi);
218+ // HAL_DCMI_DisableCROP(phdcmi);
224219
225220 CameraCurrentResolution = Resolution;
226221
@@ -305,6 +300,76 @@ uint8_t BSP_CAMERA_Stop(void)
305300 return status;
306301}
307302
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+
308373/* *
309374 * @brief CANERA power up
310375 * @retval None
@@ -313,21 +378,15 @@ void BSP_CAMERA_PwrUp(void)
313378{
314379 GPIO_InitTypeDef gpio_init_structure;
315380
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 );
318386
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);
326388
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 */
331390}
332391
333392/* *
@@ -336,21 +395,7 @@ void BSP_CAMERA_PwrUp(void)
336395 */
337396void BSP_CAMERA_PwrDown (void )
338397{
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);
354399}
355400
356401/* *
@@ -367,22 +412,22 @@ static uint32_t GetSize(uint32_t Resolution)
367412 {
368413 case CAMERA_R160x120:
369414 {
370- size = 0x2580 ;
415+ size = 160 * 120 ;
371416 }
372417 break ;
373418 case CAMERA_R320x240:
374419 {
375- size = 96 * 96 ;
420+ size = 324 * 244 ;
376421 }
377422 break ;
378423 case CAMERA_R480x272:
379424 {
380- size = 0xFF00 ;
425+ size = 480 * 272 ;
381426 }
382427 break ;
383428 case CAMERA_R640x480:
384429 {
385- size = 0x25800 ;
430+ size = 640 * 480 ;
386431 }
387432 break ;
388433 default :
@@ -479,8 +524,8 @@ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi)
479524
480525int CameraClass::begin (int horizontalResolution, int verticalResolution)
481526{
482- CameraResX = QVGA_RES_X ;
483- CameraResY = QVGA_RES_Y ;
527+ CameraResX = horizontalResolution ;
528+ CameraResY = verticalResolution ;
484529
485530 SDRAM.begin (LCD_FRAME_BUFFER);
486531
@@ -508,22 +553,24 @@ int CameraClass::start(void)
508553
509554uint8_t * CameraClass::grab (void )
510555{
511- HIMAX_Mode (HIMAX_Streaming);
556+ // HIMAX_Mode(HIMAX_Streaming);
512557
513558 /* Start the Camera Snapshot Capture */
514- BSP_CAMERA_ContinuousStart ((uint8_t *)LCD_FRAME_BUFFER);
559+ // BSP_CAMERA_ContinuousStart((uint8_t *)LCD_FRAME_BUFFER);
515560
516561 /* Wait until camera frame is ready : DCMI Frame event */
517562 while (camera_frame_ready == 0 )
518563 {
519564 }
565+ return (uint8_t *)LCD_FRAME_BUFFER;
520566}
521567
522568uint8_t * CameraClass::snapshot (void )
523569{
524- printf (" Start snapshot\n " );
525570 HIMAX_Mode (HIMAX_Streaming);
526571
572+ BSP_CAMERA_Resume ();
573+
527574 /* Start the Camera Snapshot Capture */
528575 BSP_CAMERA_SnapshotStart ((uint8_t *)LCD_FRAME_BUFFER);
529576
0 commit comments