MTK 6.0及以上版本开放SPI TEE权限(spi不受linux驱动控制的原因)

 

          从Android 6.0版本开始, Google 就要求使用 TEE 环境,  MTK平台已内置 并默认开启豆荚TEE。而豆荚 TEE 默认使用了指纹,占用了MTK平台的某一组SPI总线,例如MT6735 6737平台只有一组SPI总线,即SPI0,即已经被TEE占用。但是如果我们在linux kernel层调试第三方驱动时使用到该组spi总线, spi 会返回如下奇怪的错误,读写spi都会返回  interrupt is disable 的错误信息。

[   69.832282]-(0)[2402:sh]spi.c: 1105: <mt_do_spi_setup>mode:1, speed:6715 KHz,CPOL0,CPHA1
[   69.832306]-(0)[2402:sh]test_spi spi0.1: interrupt is disable


让linux拥有spi控制权限的修改方法如下:

1、屏蔽TEE SPI


vendor\mediatek\proprietary\trustzone\atf\v1.0\services\spd\teeid\teei_fastcall.c

static void teei_set_sec_dev()
{
            /*add spi secure attribute,
            * this time the ree fp driver
            *  have been inited.*/
            //FIXME : Make it be configured
-            set_module_apc(spi_apc_num, 0, 1);       // 屏蔽掉这行
+            //set_module_apc(spi_apc_num, 0, 1);    
}

 

2、修改 TEE SPI属性

 

如果经过上述修改, SPI 任然被 TEE 占用, 那么修改其安全属性。 vendor/mediatek/proprietary/trustzone/atf/v1.0/plat/mt6735/drivers/devapc/devapc.c 文件上有几个地方, 与指纹使用 SPI 相关地方全部改为 L0, 不同平台可能稍有不同。

-    {"SPI0",                                    E_L1,  E_L3 ,  E_L0, E_L0},
+    {"SPI0",                                    E_L0,  E_L0 ,  E_L0, E_L0},


综上所述,重新 make 以后,out目录下的 trustzone.bin 会重新生成,此时linux kernel层的第三方驱动就可以使用这组spi总线了。

使用MTK自带的spi自收自发的测试方法:

adb shell " echo -w com_mod=1 > /sys/bus/spi/drivers/test_spi/spi0.1/spi"

adb shell  " echo -w len=8 > /sys/bus/spi/drivers/test_spi/spi0.1/spi_msg"

 kernel log已经能打出spi的寄存器信息:

[  126.074882](0)[2719:sh]: [spi_store]:[576]SPIDEV name is:spi-ut
[  131.130709]-(0)[2721:sh]spi.c: 941: <mt_spi_transfer>enter,start add msg:0xffffffc016b5fc68
[  131.130745]-(0)[2721:sh]test_spi spi0.1: spi.c: 1253: <mt_spi_setup>set up chip config,mode:1
[  131.130764]-(0)[2721:sh]spi.c: 661: <transfer_dma_mapping>Transfer_dma_mapping success.
[  131.130778]-(0)[2721:sh]spi.c: 1000: <mt_spi_transfer>add msg ffffffc016b5fc68 to queue
[  131.130803]-(0)[2721:sh]spi.c: 912: <mt_spi_next_message>start transfer message:0xffffffc016b5fc68
[  131.130821]-(0)[2721:sh]spi.c: 1105: <mt_do_spi_setup>mode:1, speed:6715 KHz,CPOL0,CPHA1
[  131.130846]-(0)[2721:sh]spi.c: 756: <mt_spi_next_xfer>start xfer 0xffffffc016b5fcc0, mode 1, len 8
[  131.130859]-(0)[2721:sh]spi.c: 767: <mt_spi_next_xfer>The last xfer.
[  131.130875]-(0)[2721:sh]spi.c: 554: <spi_setup_packet>The packet_size:0x8 packet_loop:0x1
[  131.130892]-(0)[2721:sh]spi.c: 146: <spi_dump_reg>||*****************************************||
[  131.130906]-(0)[2721:sh]spi.c: 147: <spi_dump_reg>cfg0:0x00020002
[  131.130920]-(0)[2721:sh]spi.c: 148: <spi_dump_reg>cfg1:0x00070001
[  131.130934]-(0)[2721:sh]spi.c: 149: <spi_dump_reg>cmd :0x00013d00
[  131.130947]-(0)[2721:sh]spi.c: 152: <spi_dump_reg>tx_s:0x6f5b87c0
[  131.130960]-(0)[2721:sh]spi.c: 153: <spi_dump_reg>rx_d:0x6f5b8ac0
[  131.130974]-(0)[2721:sh]spi.c: 154: <spi_dump_reg>sta1:0x00000001
[  131.130987]-(0)[2721:sh]spi.c: 155: <spi_dump_reg>:0x00000001
[  131.131000]-(0)[2721:sh]spi.c: 156: <spi_dump_reg>||*****************************************||
[  131.131014]-(0)[2721:sh]spi.c: 808: <mt_spi_next_xfer>The xfer start
[  131.131116]-(0)[2721:sh]spi.c: 1037: <mt_spi_interrupt>xfer:0xffffffc016b5fcc0 interrupt status:1
[  131.131133]-(0)[2721:sh]spi.c: 852: <mt_spi_msg_done>msg:ffffffc016b5fc68 complete(0): 8 bytes transferred
[  131.131148]-(0)[2721:sh]spi.c: 881: <mt_spi_msg_done>All msg is completion.
[  131.133855](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 0 is:78
[  131.133879](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 0 is:0
[  131.133894](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 1 is:56
[  131.133908](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 1 is:0
[  131.133922](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 2 is:34
[  131.133936](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 2 is:0
[  131.133950](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 3 is:12
[  131.133964](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 3 is:0
[  131.133978](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 4 is:78
[  131.133992](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 4 is:0
[  131.134006](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 5 is:56
[  131.134020](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 5 is:0
[  131.134035](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 6 is:34
[  131.134049](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 6 is:0
[  131.134062](0)[2721:sh]: [spi_recv_check_all]:[196]tx xfer 7 is:12
[  131.134076](0)[2721:sh]: [spi_recv_check_all]:[197]rx xfer 7 is:0
[  131.134094](0)[2721:sh]: [spi_recv_check_all]:[205]Message:0xffffffc016b5fc68,error 8,actual xfer length is:8
[  131.134109](0)[2721:sh]: [spi_msg_store]:[757]Message transfer err:-8

证明了spi master已经打通成功。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值