Skip to content

Commit 858c43a

Browse files
committed
Fix Portenta_Camera library
1 parent 1016c03 commit 858c43a

File tree

5 files changed

+129
-76
lines changed

5 files changed

+129
-76
lines changed

libraries/Himax_HM01B0/himax.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ static regval_list_t himax_default_regs[] = {
128128
{AE_TARGET_MEAN, 0x3C}, //AE target mean [Def: 0x3C]
129129
{AE_MIN_MEAN, 0x0A}, //AE min target mean [Def: 0x0A]
130130

131-
{INTEGRATION_H, 0x00}, //Integration H [Def: 0x01]
132-
{INTEGRATION_L, 0x60}, //Integration L [Def: 0x08]
131+
{INTEGRATION_H, 0x01}, //Integration H [Def: 0x01]
132+
{INTEGRATION_L, 0x08}, //Integration L [Def: 0x08]
133133
{ANALOG_GAIN, 0x00}, //Analog Global Gain [Def: 0x00]
134134
{DAMPING_FACTOR, 0x20}, //Damping Factor [Def: 0x20]
135135
{DIGITAL_GAIN_H, 0x01}, //Digital Gain High [Def: 0x01]
@@ -162,7 +162,7 @@ static regval_list_t himax_default_regs[] = {
162162
{0x3059, 0x02},
163163
{0x3060, 0x00},
164164
//{0x0601, 0x01},
165-
{IMG_ORIENTATION, 0x01}, // change the orientation
165+
{IMG_ORIENTATION, 0x00},
166166
{0x0104, 0x01}
167167
};
168168

@@ -197,25 +197,18 @@ static void HIMAX_FrameRate (void);
197197
* @{
198198
*/
199199

200-
mbed::I2C i2c(I2C_SDA_INTERNAL , I2C_SCL_INTERNAL);
201200
/**
202201
* @brief Initializes the I2C interface.
203202
* @retval HIMAX status
204203
*/
205204
uint8_t HIMAX_Open(void)
206205
{
207-
printf("HIMAX_Open\n");
208-
/* I2C1 Pin connected */
206+
Wire.begin();
209207

210208
printf("Model: %x:%x\n", HIMAX_RegRead(MODEL_ID_H), HIMAX_RegRead(MODEL_ID_L));
211-
Serial.printf("Model: %x:%x\n", HIMAX_RegRead(MODEL_ID_H), HIMAX_RegRead(MODEL_ID_L));
212-
213-
printf("After WIRE.begin\n");
214209

215210
HIMAX_Reset();
216-
printf("After HIMAX_Reset\n");
217211
HIMAX_Boot();
218-
printf("After HIMAX_Boot\n");
219212
//For debugging camera Configuration
220213
HIMAX_PrintReg();
221214

@@ -243,7 +236,11 @@ static int HIMAX_RegWrite(uint16_t addr, uint8_t value)
243236
reg.reg_num = (addr_low << 8) | addr_high;
244237
reg.value = value;
245238

246-
return i2c.write(HIMAX_I2C_ADDR, (const char *)&reg, 3);
239+
Wire.beginTransmission(HIMAX_I2C_ADDR);
240+
Wire.write((const char *)&reg, 3);
241+
int ret = Wire.endTransmission();
242+
243+
return ret;
247244
}
248245

249246
/**
@@ -257,16 +254,24 @@ static uint8_t HIMAX_RegRead(uint16_t addr)
257254

258255
reg.reg_num = (addr_low << 8) | addr_high;
259256

260-
i2c.write(HIMAX_I2C_ADDR, (const char *)&reg.reg_num, 2);
261-
i2c.read(HIMAX_I2C_ADDR, (char*)&(reg.value), 1);
257+
Wire.beginTransmission(HIMAX_I2C_ADDR);
258+
Wire.write((const char *)&reg.reg_num, 2);
259+
Wire.endTransmission(false);
260+
int ret = Wire.requestFrom(HIMAX_I2C_ADDR, 1);
261+
if (Wire.available()) {
262+
reg.value = Wire.read();
263+
}
264+
while (Wire.available()) {
265+
Wire.read();
266+
}
262267
return reg.value;
263268
}
264269

265270
static uint8_t HIMAX_Reset()
266271
{
267272
do {
268273
HIMAX_RegWrite(SW_RESET, HIMAX_RESET);
269-
wait_us(50);
274+
delayMicroseconds(50);
270275
} while (HIMAX_RegRead(MODE_SELECT) != HIMAX_Standby);
271276

272277
return 0;
@@ -277,7 +282,9 @@ static uint8_t HIMAX_Boot()
277282
uint32_t i;
278283

279284
for(i = 0; i < (sizeof(himax_default_regs) / sizeof(regval_list_t)); i++) {
285+
printf("%d\n", i);
280286
HIMAX_RegWrite(himax_default_regs[i].reg_num, himax_default_regs[i].value);
287+
delayMicroseconds(50);
281288
}
282289

283290
HIMAX_RegWrite(PCLK_POLARITY, (0x20 | PCLK_FALLING_EDGE));

libraries/Himax_HM01B0/himax.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
#include "Arduino.h"
66
#include "Wire.h"
7+
#include "mbed.h"
78

89
#ifdef __cplusplus
910
extern "C" {
1011
#endif
1112

12-
#define HIMAX_I2C_ADDR 0x48
13+
#define HIMAX_I2C_ADDR 0x24
1314

1415
#define QVGA_W (320)
1516
#define QVGA_H (240)

libraries/Portenta_Camera/camera.cpp

Lines changed: 97 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,8 @@
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

4237
static 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
*/
337396
void 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

480525
int 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

509554
uint8_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

522568
uint8_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

libraries/Portenta_Camera/camera.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
class CameraClass {
22
public:
3-
int begin();
4-
int snapshot();
3+
int begin(int horizontalResolution, int verticalResolution);
4+
uint8_t* snapshot();
5+
int start(void);
6+
uint8_t* grab(void);
57
};

libraries/Portenta_Camera/examples/Envie_camera/Envie_camera.ino

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22

33
CameraClass cam;
44

5-
mbed::DigitalOut pin(PD_4);
6-
75
void setup() {
86

97
Serial.begin(115200);
108
while (!Serial);
11-
pin = 1;
129

1310
// put your setup code here, to run once:
14-
cam.begin();
15-
cam.snapshot();
16-
11+
cam.begin(324, 244);
12+
cam.start();
1713
}
1814

1915
void loop() {
2016
// put your main code here, to run repeatedly:
21-
22-
}
17+
Serial.write(cam.grab(), 324*244);
18+
}

0 commit comments

Comments
 (0)