const DR_REG_RTCCNTL_BASE: u32 = 0x3ff48000;
const RTC_CNTL_TEST_MUX_REG: u32 = DR_REG_RTCCNTL_BASE + 0xa8;
const RTC_CNTL_DTEST_RTC: u32 = 0x00000003;
const RTC_CNTL_DTEST_RTC_S: u32 = 30;
const RTC_CNTL_ENT_RTC: u32 = 1 << 29;
const SENS_SAR_START_FORCE_REG: u32 = 0x3ff48800 + 0x002c;
const SENS_SAR2_EN_TEST: u32 = 1 << 4;
const DPORT_PERIP_CLK_EN_REG: u32 = 0x3ff00000 + 0x0c0;
const DPORT_I2C_EXT0_CLK_EN: u32 = 1 << 7;
const DPORT_PERIP_RST_EN_REG: u32 = 0x3ff00000 + 0x0c4;
const DPORT_I2C_EXT0_RST: u32 = 1 << 7;
const SENS_ULP_CP_FORCE_START_TOP: u32 = 1 << 8;
const SENS_ULP_CP_START_TOP: u32 = 1 << 9;
const DR_REG_I2S_BASE: u32 = 0x3ff4f000;
const DR_REG_SYSCON_BASE: u32 = 0x3ff66000;
const SYSCON_SARADC_CTRL_REG: u32 = DR_REG_SYSCON_BASE + 0x10;
const SYSCON_SARADC_FSM_REG: u32 = DR_REG_SYSCON_BASE + 0x18;
const SYSCON_SARADC_SAR2_PATT_TAB1_REG: u32 = DR_REG_SYSCON_BASE + 0x2c;
const SYSCON_SARADC_SAR2_PATT_TAB2_REG: u32 = DR_REG_SYSCON_BASE + 0x30;
const SYSCON_SARADC_SAR2_PATT_TAB3_REG: u32 = DR_REG_SYSCON_BASE + 0x34;
const SYSCON_SARADC_SAR2_PATT_TAB4_REG: u32 = DR_REG_SYSCON_BASE + 0x38;
const SYSCON_SARADC_SAR2_MUX: u32 = 1 << 2;
const SYSCON_SARADC_SAR_CLK_DIV: u32 = 0x000000FF;
const SYSCON_SARADC_SAR_CLK_DIV_S: u32 = 7;
const SYSCON_SARADC_RSTB_WAIT: u32 = 0x000000FF;
const SYSCON_SARADC_RSTB_WAIT_S: u32 = 0;
const SYSCON_SARADC_START_WAIT: u32 = 1 << 2;
const SYSCON_SARADC_START_WAIT_S: u32 = 1 << 2;
const SYSCON_SARADC_WORK_MODE: u32 = 0x00000003;
const SYSCON_SARADC_WORK_MODE_S: u32 = 3;
const SYSCON_SARADC_SAR_SEL: u32 = 1 << 5;
const I2S_RX_BCK_DIV_NUM: u32 = 0x0000003F;
const I2S_RX_BCK_DIV_NUM_S: u32 = 6;
const SYSCON_SARADC_DATA_TO_I2S: u32 = 1 << 16;
const SYSCON_SARADC_DATA_SAR_SEL: u32 = 1 << 25;
const I2S_CAMERA_EN: u32 = 1 << 0;
const I2S_LCD_EN: u32 = 1 << 5;
const I2S_DATA_ENABLE: u32 = 1 << 4;
const I2S_DATA_ENABLE_TEST_EN: u32 = 1 << 3;
const I2S_RX_START: u32 = 1 << 5;
const DR_REG_SENS_BASE: u32 = 0x3ff48800;
const SENS_SAR_MEAS_WAIT2_REG: u32 = DR_REG_SENS_BASE + 0x000c;
const SENS_SAR_READ_CTRL_REG: u32 = DR_REG_SENS_BASE;
const SENS_SAR_READ_CTRL2_REG: u32 = DR_REG_SENS_BASE + 0x0090;
const SENS_FORCE_XPD_SAR: u32 = 0x00000003;
const SENS_FORCE_XPD_SAR_S: u32 = 18;
const SENS_SAR1_DIG_FORCE: u32 = 1 << 27;
const SENS_SAR2_DIG_FORCE: u32 = 1 << 28;
pub fn ensure_randomness() {
set_peri_reg_bits(
RTC_CNTL_TEST_MUX_REG,
RTC_CNTL_DTEST_RTC,
2,
RTC_CNTL_DTEST_RTC_S,
);
set_peri_reg_mask(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_ENT_RTC);
set_peri_reg_mask(SENS_SAR_START_FORCE_REG, SENS_SAR2_EN_TEST);
set_peri_reg_mask(DPORT_PERIP_CLK_EN_REG, DPORT_I2C_EXT0_CLK_EN);
clear_peri_reg_mask(DPORT_PERIP_RST_EN_REG, DPORT_I2C_EXT0_RST);
clear_peri_reg_mask(SENS_SAR_START_FORCE_REG, SENS_ULP_CP_FORCE_START_TOP);
clear_peri_reg_mask(SENS_SAR_START_FORCE_REG, SENS_ULP_CP_START_TOP);
write_peri_reg(SYSCON_SARADC_SAR2_PATT_TAB1_REG, 0xADADADAD);
write_peri_reg(SYSCON_SARADC_SAR2_PATT_TAB2_REG, 0xADADADAD);
write_peri_reg(SYSCON_SARADC_SAR2_PATT_TAB3_REG, 0xADADADAD);
write_peri_reg(SYSCON_SARADC_SAR2_PATT_TAB4_REG, 0xADADADAD);
set_peri_reg_bits(
SENS_SAR_MEAS_WAIT2_REG,
SENS_FORCE_XPD_SAR,
3,
SENS_FORCE_XPD_SAR_S,
);
set_peri_reg_mask(SENS_SAR_READ_CTRL_REG, SENS_SAR1_DIG_FORCE);
set_peri_reg_mask(SENS_SAR_READ_CTRL2_REG, SENS_SAR2_DIG_FORCE);
set_peri_reg_mask(SYSCON_SARADC_CTRL_REG, SYSCON_SARADC_SAR2_MUX);
set_peri_reg_bits(
SYSCON_SARADC_CTRL_REG,
SYSCON_SARADC_SAR_CLK_DIV,
4,
SYSCON_SARADC_SAR_CLK_DIV_S,
);
set_peri_reg_bits(
SYSCON_SARADC_FSM_REG,
SYSCON_SARADC_RSTB_WAIT,
8,
SYSCON_SARADC_RSTB_WAIT_S,
);
set_peri_reg_bits(
SYSCON_SARADC_FSM_REG,
SYSCON_SARADC_START_WAIT,
10,
SYSCON_SARADC_START_WAIT_S,
);
set_peri_reg_bits(
SYSCON_SARADC_CTRL_REG,
SYSCON_SARADC_WORK_MODE,
0,
SYSCON_SARADC_WORK_MODE_S,
);
set_peri_reg_mask(SYSCON_SARADC_CTRL_REG, SYSCON_SARADC_SAR_SEL);
clear_peri_reg_mask(SYSCON_SARADC_CTRL_REG, SYSCON_SARADC_DATA_SAR_SEL);
set_peri_reg_bits(
DR_REG_I2S_BASE + 0x00b0,
I2S_RX_BCK_DIV_NUM,
20,
I2S_RX_BCK_DIV_NUM_S,
);
set_peri_reg_mask(SYSCON_SARADC_CTRL_REG, SYSCON_SARADC_DATA_TO_I2S);
clear_peri_reg_mask(DR_REG_I2S_BASE + 0x00a8, I2S_CAMERA_EN);
set_peri_reg_mask(DR_REG_I2S_BASE + 0x00a8, I2S_LCD_EN);
set_peri_reg_mask(DR_REG_I2S_BASE + 0x00a8, I2S_DATA_ENABLE);
set_peri_reg_mask(DR_REG_I2S_BASE + 0x00a8, I2S_DATA_ENABLE_TEST_EN);
set_peri_reg_mask(DR_REG_I2S_BASE + 0x00a8, I2S_RX_START);
}
fn set_peri_reg_bits(reg: u32, bitmap: u32, value: u32, shift: u32) {
unsafe {
(reg as *mut u32).write_volatile(
((reg as *mut u32).read_volatile() & !(bitmap << shift)) | ((value & bitmap) << shift),
);
}
}
fn set_peri_reg_mask(reg: u32, mask: u32) {
unsafe {
(reg as *mut u32).write_volatile((reg as *mut u32).read_volatile() | mask);
}
}
fn clear_peri_reg_mask(reg: u32, mask: u32) {
unsafe {
(reg as *mut u32).write_volatile((reg as *mut u32).read_volatile() & !mask);
}
}
fn write_peri_reg(reg: u32, val: u32) {
unsafe {
(reg as *mut u32).write_volatile(val);
}
}