大家好,我现在需要实现一个指纹TA,但是指纹TA需要spi访问,
这个时候怎么在tee os里添加一个spi驱动,然后这个TA怎么访问spi
驱动呢,比如spi config,spitxrx。
我了解的,需要在op-tee os 添加平台相关的spi寄存器,类似于ree
下的平台驱动,但是tee os下是没有文件系统的,那么ta怎么访问驱动,
是使用ioct和文件的节点readwrite接口函数......
谢谢!!
Hi Junwua,
我的理解这个没有标准的方案,如果你用OP-TEE的话,我觉得你可以参考TEE Internal API 的实现方式,使用system call的方式实现你要用的接口。例如 SPI Open, config,Read, write, RW等。
但是OP-TEE下如何开发SPI 驱动是另外一个话题,例如是否在SPI 的初始化,DMA和中断是否在Secure OS完成,这个要根据你们的能力和平台来决定。
Hi Ethan zhang:
非常感谢你答复。
TEE internal api的方式我们可以试试;但我一直有个疑问就是TA是可以访问ree下的文件节点,
那么如果是这个思路,如果在ree和tee之间打开一条通路,让ree下的设备节点和tee下的驱动ops
关联呢,毕竟tee os下是没有文件系统概念。
另外你说的op-tee os下开发spi驱动,这个也是我们要关注的,前面的问题是一个访问路径和方法。
具体的实现是由os里实现,我们想参考pl022_spi.c,使用driver_init(peripherals_init);这个接口,
然后添加如mtk的spi platorm 代码, 添加spi_ops。然后封装spi ops的api接口。这样的思路,
是否正确,另外你提到的DMA和中断,这个是不是涉及到tee下中断处理,需要特殊的几个函数,
同时需要在ree平台下做对应的封装,如mtk里提到的tee下中断处理函数。那么dma的问题是什么
呢,是内存地址的边界问题吗?
谢谢! 乱点出错啦
我的理解是TA不会访问REE的节点,另外指纹所连接的SPI,一般是独占的,不跟其他设备share SPI,所以在TEE下可以实现SPI驱动,对REE没有影响。
另外有的是指纹的中断放到REE侧,通过TEE driver再call 到 TEE去读取数据。DMA也有中断,有的TEE不支持中断的话,也有通过轮询的方式来读数据。
有的是指纹的中断放到REE侧。 ---这个我了解过豆荚是这样实现的。
所以按您的说法,这个TA访问tee os下的驱动,只要一种途径,就是utee-syscall下去。
但我之前查看过别人的一个lib,也是基于op-tee 开发的,但有RSEE_DevIoctl,
不知道里面的细节是什么。另外之前我也问过豆荚,他们说TA下是可以访问文件节点的,
我理解TA本质是一个application,是可以访问,需要配置权限什么的。
File: librsee.a(rsee_spi.o)
Symbol table '.symtab' contains 73 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS rsee_spi.c 2: 00000000 0 SECTION LOCAL DEFAULT 13 14: 00000000 14 OBJECT LOCAL DEFAULT 17 __func__.4365 15: 00000010 15 OBJECT LOCAL DEFAULT 17 __func__.4370 16: 00000020 21 OBJECT LOCAL DEFAULT 17 __func__.4379 17: 00000000 0 SECTION LOCAL DEFAULT 18 18: 00000000 0 NOTYPE LOCAL DEFAULT 18 $d 19: 00000000 0 SECTION LOCAL DEFAULT 19 39: 00000000 0 SECTION LOCAL DEFAULT 56 40: 00000000 0 NOTYPE LOCAL DEFAULT 1 wm4.0.c07c874f17947de2184 41: 00000000 0 NOTYPE LOCAL DEFAULT 2 wm4.conf.h.2.df7c5bdb9abe 42: 00000000 0 NOTYPE LOCAL DEFAULT 3 wm4.tee_api_defines.h.3.8 43: 00000000 0 NOTYPE LOCAL DEFAULT 4 wm4.stdint.h.3.4af0baad44 44: 00000000 0 NOTYPE LOCAL DEFAULT 5 wm4.rsee_spi_defines.h.2. 45: 00000000 0 NOTYPE LOCAL DEFAULT 6 wm4.compiler.h.3.aa6be3b2 46: 00000000 0 NOTYPE LOCAL DEFAULT 7 wm4.stdbool.h.29.1c9ee685 47: 00000000 0 NOTYPE LOCAL DEFAULT 8 wm4.stddef.h.39.daafd3d79 48: 00000000 0 NOTYPE LOCAL DEFAULT 9 wm4.tee_api_types.h.190.e 49: 00000000 0 NOTYPE LOCAL DEFAULT 10 wm4.trace_levels.h.3.8337 50: 00000000 0 NOTYPE LOCAL DEFAULT 11 wm4.trace.h.10.eb5c6ea8b9 51: 00000000 0 NOTYPE LOCAL DEFAULT 12 wm4.assert.h.16.66b581df0
65: 00000000 0 SECTION LOCAL DEFAULT 12 66: 00000001 60 FUNC GLOBAL DEFAULT 13 rsee_spi_open 67: 00000000 0 NOTYPE GLOBAL DEFAULT UND RSEE_DevOpen 68: 00000000 0 NOTYPE GLOBAL DEFAULT UND trace_printf 69: 0000003d 56 FUNC GLOBAL DEFAULT 13 rsee_spi_close 70: 00000000 0 NOTYPE GLOBAL DEFAULT UND RSEE_DevClose 71: 00000075 68 FUNC GLOBAL DEFAULT 13 rsee_spi_full_duplex 72: 00000000 0 NOTYPE GLOBAL DEFAULT UND RSEE_DevIoctl
实现spi驱动是可以。 问题在于我对这个tee os驱动 和TA直接的访问架构。一般一路spi挂载一路设备,
这个可以做成可配置,tee下用,ree下就不能用。
有的是指纹的中断放到REE侧---这个我了解豆荚就是这么做的。
现在我的困惑依旧是那个ta和tee os 驱动直接的访问路径,因为指纹驱动需要spi,lcd驱动需要mipi
接口等,是一个系列的问题。
那根据您的意思,目前只有一种途径utee-syscall的。但我查看了一个别人的lib,也是基础于op-tee
开发的,里面用到了ioctl,不知道是怎么弄的。
开发的,里面用到了ioctl,不知道是怎么弄的。File: librsee.a(rsee_spi.o) rsee_spi_open RSEE_DevIoctl
File: librsee.a(rsee_spi.o)Symbol table '.symtab' contains 73 entries:Num: Value Size Type Bind Vis Ndx Name0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS rsee_spi.c2: 00000000 0 SECTION LOCAL DEFAULT 13 14: 00000000 14 OBJECT LOCAL DEFAULT 17 __func__.436515: 00000010 15 OBJECT LOCAL DEFAULT 17 __func__.437016: 00000020 21 OBJECT LOCAL DEFAULT 17 __func__.437917: 00000000 0 SECTION LOCAL DEFAULT 18 18: 00000000 0 NOTYPE LOCAL DEFAULT 18 $d19: 00000000 0 SECTION LOCAL DEFAULT 19 39: 00000000 0 SECTION LOCAL DEFAULT 56 40: 00000000 0 NOTYPE LOCAL DEFAULT 1 wm4.0.c07c874f17947de218441: 00000000 0 NOTYPE LOCAL DEFAULT 2 wm4.conf.h.2.df7c5bdb9abe42: 00000000 0 NOTYPE LOCAL DEFAULT 3 wm4.tee_api_defines.h.3.843: 00000000 0 NOTYPE LOCAL DEFAULT 4 wm4.stdint.h.3.4af0baad4444: 00000000 0 NOTYPE LOCAL DEFAULT 5 wm4.rsee_spi_defines.h.2.45: 00000000 0 NOTYPE LOCAL DEFAULT 6 wm4.compiler.h.3.aa6be3b246: 00000000 0 NOTYPE LOCAL DEFAULT 7 wm4.stdbool.h.29.1c9ee68547: 00000000 0 NOTYPE LOCAL DEFAULT 8 wm4.stddef.h.39.daafd3d7948: 00000000 0 NOTYPE LOCAL DEFAULT 9 wm4.tee_api_types.h.190.e49: 00000000 0 NOTYPE LOCAL DEFAULT 10 wm4.trace_levels.h.3.833750: 00000000 0 NOTYPE LOCAL DEFAULT 11 wm4.trace.h.10.eb5c6ea8b951: 00000000 0 NOTYPE LOCAL DEFAULT 12 wm4.assert.h.16.66b581df0
65: 00000000 0 SECTION LOCAL DEFAULT 12 66: 00000001 60 FUNC GLOBAL DEFAULT 13 rsee_spi_open67: 00000000 0 NOTYPE GLOBAL DEFAULT UND RSEE_DevOpen68: 00000000 0 NOTYPE GLOBAL DEFAULT UND trace_printf69: 0000003d 56 FUNC GLOBAL DEFAULT 13 rsee_spi_close70: 00000000 0 NOTYPE GLOBAL DEFAULT UND RSEE_DevClose71: 00000075 68 FUNC GLOBAL DEFAULT 13 rsee_spi_full_duplex72: 00000000 0 NOTYPE GLOBAL DEFAULT UND RSEE_DevIoctl
File: librsee.a(rsee_spi.o)Symbol table '.symtab' contains 73 entries:Num: Value Size Type Bind Vis Ndx Name0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS rsee_spi.c2: 00000000 0 SECTION LOCAL DEFAULT 13 14: 00000000 14 OBJECT LOCAL DEFAULT 17 __func__.436515: 00000010 15 OBJECT LOCAL DEFAULT 17 __func__.437016: 00000020 21 OBJECT LOCAL DEFAULT 17 __func__.437917: 00000000 0 SECTION LOCAL DEFAULT 18 18: 00000000 0 NOTYPE LOCAL DEFAULT 18 $d19: 00000000 0 SECTION LOCAL DEFAULT 19 39: 00000000 0 SECTION LOCAL DEFAULT 56