赞
踩
继续进行驱动开发,在上一篇文章中完成了对寄存器的读写,Hikey soc 中对Trustzone IP核是支持的,但在官方文档中并未对三个IP核的寄存器地址进行定义和使用,所以需要自行编写驱动用以初始化TZPC和AXI-APB总线桥信号寄存器的外围设备时钟,代码如下,可以参考OP-TEE的core/driver/目录下的pl011.c代码:
在/devel/optee/optee_os/core/include/drivers/目录下新建hikey_tzpc.h文件,并与其中添加代码,如下:
#ifndef HIKEY_TZPC_H
#define HIKEY_TZPC_H
#include <types_ext.h>
#define SOC_TZPC_BASE_ADDR 0xF8002000
/* offset address */
#define SOC_TZPC_TZPCDECPROT3SET_ADDR 0x0828
#define SOC_TZPC_TZPCDECPROT3STAT_ADDR 0x0824
#define AO_SC_PERIPH_CLKEN4 0x630
#define AO_SC_PERIPH_CLKSTAT4 0x638
#define PERI_SC_PERIPH_CLKEN3 0x230
#define PERI_SC_PERIPH_CLKSTAT3 0x238
/* register flag */
#define AO_SC_PERIPH_CLKEN4_PCLK_TZPC (1 << 11)
#define PERI_CLK3_TZPC_DEP (1 << 21)
/* 初始化TZPC */
void tzpc_init(vaddr_t base);
/* 初始化TZPCDEP外设时钟 */
void tzpcdep_init(vaddr_t base);
#endif /* HIKEY_TZPC_H */
宏定义,第一个是TZPC寄存器基地址,接下来的两个为TZPC第三个设置寄存器和状态寄存器的偏移地址,然后是外围设备时钟设置寄存器和状态寄存器,最后两个是TZPC和AXI-APB桥的外围时钟的设置值。
在/devel/optee/optee_os/core/drivers目录下新建hikey_tzpc.c,并编写代码,分段解释一下:
#include <drivers/hikey_tzpc.h>
#include <io.h>
#include <trace.h>
头文件为三个,分别是新建的TZPC头文件,寄存器读写头文件,和调试输出头文件。
/* base: AO_CTRL_BASE */
/* tzpc_clk: AO_SC_PERIPH_CLKEN4_PCLK_TZPC */
/* stat_reg: AO_SC_PERIPH_CLKSTAT4 */
void tzpc_init(vaddr_t base)
{
unsigned int data;
/* enable TZPC */
EMSG("TZPC: 0x%x\n",read32(SOC_TZPC_BASE_ADDR+SOC_TZPC_TZPCDECPROT3STAT_ADDR));
write32(AO_SC_PERIPH_CLKEN4_PCLK_TZPC,base+AO_SC_PERIPH_CLKEN4);
do {
data = read32(base+AO_SC_PERIPH_CLKSTAT4);
} while (!(data & AO_SC_PERIPH_CLKEN4_PCLK_TZPC));
EMSG("TZPC: 0x%x\n",read32(SOC_TZPC_BASE_ADDR+SOC_TZPC_TZPCDECPROT3STAT_ADDR));
write32(0x0BFFFFFF,SOC_TZPC_BASE_ADDR+SOC_TZPC_TZPCDECPROT3SET_ADDR);
do {
data = read32(SOC_TZPC_BASE_ADDR+SOC_TZPC_TZPCDECPROT3STAT_ADDR);
} while (!(data & 0x0BFFFFFF));
}
/* base: PERI_BASE */
/* tzpc_dep_clk: PERI_CLK3_TZPC_DEP */
/* stat_reg: PERI_SC_PERIPH_CLKSTAT3 */
void tzpcdep_init(vaddr_t base)
{
unsigned int data;
/* enable tzpc_dep */
write32(PERI_CLK3_TZPC_DEP,base+PERI_SC_PERIPH_CLKEN3);
do {
data = read32(base+PERI_SC_PERIPH_CLKSTAT3);
} while (!(data & PERI_CLK3_TZPC_DEP));
}
最后是操作函数,第一个函数用于初始化TZPC外设时钟和配置TZPC的第三个寄存器的内容,第二个函数用于初始化TZPCDEP的外围时钟,测试效果是所有的外设和接口在非安全状态下全部不可用。
1.修改/devel/optee/optee_os/core/arch/arm/plat-hikey/platform_config.h文件,添加设备地址:
#error Unknown console UART
#endif
/* tzpc base */
+#define AO_CTRL_BASE 0xF7800000
+#define PERI_BASE 0xF7030000
#define CONSOLE_BAUDRATE 115200
#define CONSOLE_UART_CLK_IN_HZ 19200000
2.修改/devel/optee/optee_os/core/arch/arm/plat-hikey/main.c文件,用以调用这个驱动,修改代码如下:
void console_init(void)
{
pl011_init(CONSOLE_UART_BASE,
CONSOLE_UART_CLK_IN_HZ,
CONSOLE_BAUDRATE);
+tzpcdep_init(PERI_BASE);
+tzpc_init(AO_CTRL_BASE);
}
3.修改编译文件
/devel/optee/optee_os/core/drivers目录下的sub.mk文件,代码如下:
srcs-$(CFG_PL011) += pl011.c
+srcs-$(CFG_PL011) += hikey_tzpc.c
srcs-$(CFG_GIC) += gic.c
srcs-$(CFG_SUNXI_UART) += sunxi_uart.c
srcs-$(CFG_8250_UART) += serial8250_uart.c
srcs-$(CFG_16550_UART) += ns16550.c
srcs-$(CFG_IMX_UART) += imx_uart.c
如上三步,一个简单的外设驱动就基本完成了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。