Skip to content

Commit 7002930

Browse files
committed
Enable clock and deassert reset for both sensors on HI3516CV610
1 parent d5fa8a5 commit 7002930

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

src/hal/hisi/hal_hisi.c

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -420,28 +420,38 @@ static void v4_ensure_sensor_restored() {
420420
}
421421

422422
static struct CV610_PERI_CRG8464 peri_crg8464;
423+
static struct CV610_PERI_CRG8464 peri_crg8472;
423424
static bool crg8464_changed;
424-
static void ot_ensure_sensor_enabled() {
425-
// PERI_CRG8464 0x8440
426-
// PERI_CRG8472 0x8460
427-
struct CV610_PERI_CRG8464 crg8464;
428-
if (mem_reg(CV610_PERI_CRG8464_ADDR, (uint32_t *)&crg8464, OP_READ)) {
429-
if (!crg8464.sensor0_cken) {
430-
peri_crg8464 = crg8464;
431-
// 1: clock enabled
432-
crg8464.sensor0_cken = true;
433-
// 0: reset deasserted
434-
crg8464.sensor0_srst_req = false;
435-
mem_reg(CV610_PERI_CRG8464_ADDR, (uint32_t *)&crg8464, OP_WRITE);
436-
crg8464_changed = true;
437-
}
425+
static bool crg8472_changed;
426+
static inline void enable_sensor_crg(uint32_t addr,
427+
struct CV610_PERI_CRG8464 *shadow,
428+
bool *changed) {
429+
struct CV610_PERI_CRG8464 reg;
430+
431+
if (!mem_reg(addr, (uint32_t *)&reg, OP_READ))
432+
return;
433+
434+
if (!reg.sensor0_cken || reg.sensor0_srst_req) {
435+
*shadow = reg; // Cache original value
436+
reg.sensor0_cken = true; // Enable clock
437+
reg.sensor0_srst_req = false; // Deassert reset
438+
mem_reg(addr, (uint32_t *)&reg, OP_WRITE);
439+
*changed = true;
438440
}
439441
}
440442

443+
static void ot_ensure_sensor_enabled(void) {
444+
enable_sensor_crg(CV610_PERI_CRG8464_ADDR, &peri_crg8464, &crg8464_changed);
445+
enable_sensor_crg(CV610_PERI_CRG8472_ADDR, &peri_crg8472, &crg8472_changed);
446+
}
447+
441448
static void ot_ensure_sensor_restored() {
442449
if (crg8464_changed) {
443450
mem_reg(CV610_PERI_CRG8464_ADDR, (uint32_t *)&peri_crg8464, OP_WRITE);
444451
}
452+
if (crg8472_changed) {
453+
mem_reg(CV610_PERI_CRG8472_ADDR, (uint32_t *)&peri_crg8472, OP_WRITE);
454+
}
445455
}
446456

447457
static void hisi_hal_cleanup() {

src/hal/hisi/ispreg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ struct CV610_PERI_CRG8464 {
2929
};
3030

3131
#define CV610_PERI_CRG8464_ADDR 0x11018440
32+
#define CV610_PERI_CRG8472_ADDR 0x11018460
3233

3334
const char *hisi_detect_fmc();
3435
void hisi_chip_properties(cJSON *j_inner);

0 commit comments

Comments
 (0)