从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已经打通成功。