初始化阶段完成了initcall1和initcall2段的代码执行之后,系统将执行initcall3和initcall4段中代码的执行,该部分主要完成一些驱动的初始化操作,包括串口,外围设备。在OP-TEE中,driver_init和driver_init_late定义的initcall3和initcall4段的基本如下:
以hikey支持为例,执行initcall3段的代码是,将会初始化外围设备的启动操作,而该操作是通过执行peripherals_init函数来实现,该函数的内容如下:
static TEE_Result peripherals_init(void)
{
vaddr_t pmussi_base = nsec_periph_base(PMUSSI_BASE);
DMSG("enable LD021_1V8 source (pin 35) on LS connector\n");
/*
* Mezzanine cards usually use this to source level shifters for
* UART, GPIO, SPI, I2C, etc so if not enabled, connected
* peripherals will not work either (during bootloader stage)
* until linux is booted.
*/
io_mask8(pmussi_base + PMUSSI_LDO21_REG_ADJ, PMUSSI_LDO21_REG_VL_1V8,
PMUSSI_LDO21_REG_VL_MASK);
write8(PMUSSI_ENA_LDO21, pmussi_base + PMUSSI_ENA_LDO17_22);
#ifdef CFG_SPI
spi_init();
#endif
return TEE_SUCCESS;
}
driver_init(peripherals_init);