当前位置:   article > 正文

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

arm tzpc

继续进行驱动开发,在上一篇文章中完成了对寄存器的读写,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 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

宏定义,第一个是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>
  • 1
  • 2
  • 3

头文件为三个,分别是新建的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));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

最后是操作函数,第一个函数用于初始化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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/129972
推荐阅读
相关标签
  

闽ICP备14008679号