int sensor_snapshot(struct image *image) { volatile uint32_t addr; volatile uint16_t length; addr = (uint32_t) fb->pixels; if (sensor.pixformat==PIXFORMAT_JPEG) { length = MAX_XFER_SIZE; } else { length =(fb->w * fb->h * 2)/4; } /* Lock framebuffer mutex */ mutex_lock(&fb->lock); /* Start the DCMI */ HAL_DCMI_Start_DMA(&DCMIHandle, DCMI_MODE_SNAPSHOT, addr, length); /* Wait for frame */ while ((DCMI->CR & DCMI_CR_CAPTURE) != 0) { } if (sensor.pixformat == PIXFORMAT_GRAYSCALE) { /* If GRAYSCALE extract Y channel from YUYV */ for (int i=0; i<(fb->w * fb->h); i++) { fb->pixels[i] = fb->pixels[i*2]; } } else if (sensor.pixformat == PIXFORMAT_JPEG) { /* The frame is finished, but DMA still waiting for data because we set max frame size so we need to abort the DMA transfer here */ HAL_DMA_Abort(&DMAHandle); /* Read the number of data items transferred */ fb->bpp = (MAX_XFER_SIZE - DMAHandle.Instance->NDTR)*4; } if (image != NULL) { image->w = fb->w; image->h = fb->h; image->bpp = fb->bpp; image->pixels = fb->pixels; } fb->ready = 1; /* unlock framebuffer mutex */ mutex_unlock(&fb->lock); while (fb->lock_tried) { systick_sleep(2); } return 0; }
/** * @brief Starts the Camera capture in snapshot mode. * @param buff: pointer to the Camera output buffer * @retval None */ void BSP_CAMERA_SnapshotStart(uint8_t *buff) { /* Start the Camera capture */ HAL_DCMI_Start_DMA(&hdcmi_eval, DCMI_MODE_SNAPSHOT, (uint32_t)buff, GetSize(current_resolution)); }
/** * @brief Starts the Camera capture in continuous mode. * @param buff: pointer to the Camera output buffer * @retval None */ void BSP_CAMERA_ContinuousStart(uint8_t *buff) { /* Start the Camera capture */ HAL_DCMI_Start_DMA(&hdcmi_eval, DCMI_MODE_CONTINUOUS, (uint32_t)buff, GetSize(current_resolution)); }
/** * @brief Starts the camera capture in snapshot mode. * @param buff: pointer to the camera output buffer * @retval None */ void BSP_CAMERA_SnapshotStart(uint8_t *buff) { /* Start the camera capture */ HAL_DCMI_Start_DMA(&hDcmiEval, DCMI_MODE_SNAPSHOT, (uint32_t)buff, GetSize(CameraCurrentResolution)); }