OP-TEE 简易驱动编写:启动TZPC与TZPCDEP

Posted Q7318

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OP-TEE 简易驱动编写:启动TZPC与TZPCDEP相关的知识,希望对你有一定的参考价值。

继续进行驱动开发,在上一篇文章中完成了对寄存器的读写,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

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

以上是关于OP-TEE 简易驱动编写:启动TZPC与TZPCDEP的主要内容,如果未能解决你的问题,请参考以下文章

OP-TEE TA:读写寄存器数据

OP-TEE TA:读写寄存器数据

数学运算符

FSL i.MX6 UltraLite EVK OP-TEE的移植

FSL i.MX6 UltraLite EVK OP-TEE的移植

HIKEY OP-TEE切换UART运行状态