首页 > 编程知识 正文

OPTEE 简易驱动编写启动TZPC与TZPCDEP,驱动编写

时间:2023-05-06 03:59:39 阅读:274870 作者:4085

继续进行驱动开发,在上一篇文章中完成了对寄存器的读写,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%xn",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%xn",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.csrcs-$(CFG_GIC) += gic.csrcs-$(CFG_SUNXI_UART) += sunxi_uart.csrcs-$(CFG_8250_UART) += serial8250_uart.csrcs-$(CFG_16550_UART) += ns16550.csrcs-$(CFG_IMX_UART) += imx_uart.c

如上三步,一个简单的外设驱动就基本完成了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。