当使能一个I2C或者UART功能导致系统开不起机的情况,一般有两点原因:
1、Pin脚被占用
2、在TZ那边,Pin脚给的权限不够
以SDM660平台的I2C_3为例:
我在sdm660-mtp.dtsi文件中使能了i2_3:
&i2c_3 {
status = "ok";
};
结果原本能开机的系统开不起来了……
i2c的配置在sdm660-blsp.dtsi文件中,我们一起来看一下:
i2c_3: i2c@c177000 { /* BLSP1 QUP3 */
compatible = "qcom,i2c-msm-v2";
#address-cells = <1>;
#size-cells = <0>;
reg = <0xc177000 0x600>;
reg-names = "qup_phys_addr";
interrupt-names = "qup_irq";
interrupts = <0 97 0>;
dmas = <&dma_blsp1 8 64 0x20000020 0x20>,
<&dma_blsp1 9 32 0x20000020 0x20>;
dma-names = "tx", "rx";
qcom,master-id = <86>;
qcom,clk-freq-out = <400000>;
qcom,clk-freq-in = <19200000>;
clock-names = "iface_clk", "core_clk";
clocks = <&clock_gcc GCC_BLSP1_AHB_CLK>,
<&clock_gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>;
qcom,i2c-dat = <&tlmm 10 0x00>;
qcom,i2c-clk = <&tlmm 11 0x00>;
pinctrl-names = "i2c_active", "i2c_sleep", "i2c_bitbang";
pinctrl-0 = <&i2c_3_active>;
pinctrl-1 = <&i2c_3_sleep>;
pinctrl-2 = <&i2c_3_bitbang>;
status = "disabled";
};
嗯……以上,似乎没什么问题,好吧,看高通给的SDM660 的GPIO CONFIG文件找对应的pin脚号:
1、检查kernel里pin脚有没有被占用,看sdm660-pinctrl.dtsi文件发现在SPI3的配置中有占用,嗯!果断屏蔽掉!
gpio10和gpio11的占用通通/**/屏蔽掉!
spi_3 {
spi_3_active: spi_3_active {
mux {
pins = "gpio8", "gpio9"/*,
"gpio10", "gpio11"*/;
function = "blsp_spi3";
};
config {
pins = "gpio8", "gpio9"/*,
"gpio10", "gpio11"*/;
drive-strength = <6>;
bias-disable;
};
};
spi_3_sleep: spi_3_sleep {
mux {
pins = "gpio8", "gpio9"/*,
"gpio10", "gpio11"*/;
function = "blsp_spi3";
};
config {
pins = "gpio8", "gpio9"/*,
"gpio10", "gpio11"*/;
drive-strength = <6>;
bias-disable;
};
};
};
更改dtsi后单编的命令为:在LA.UM.7.2\LINUX\android目录下执行 m dtboimage -jx 和 m bootimage -jx
编译出来的文件路径:
LA.UM.7.2\LINUX\android\out\target\product\sdm660_64\dtbo.img
LA.UM.7.2\LINUX\android\out\target\product\sdm660_64\boot.img
adb单刷dtbo和boot的命令:
fastboot flash dtbo dtbo.img
fastboot flash boot boot.img
2、检查TZ端pin脚的权限给的够不够
TZ.BF.4.0.7\trustzone_images\core\buses\qup_accesscontrol\honeybadger\config\QUPAC_660_Access.xml
果然,不仅多配了俩口,连权限给的也只有TZ能用,嗯,改!
<device id=BLSP_QUP3_DEV_ACCESS>
<props name="PERIPH ID" type=DALPROP_ATTR_TYPE_UINT32> BLSP_QUP3 </props>
<props name="GPIO range" type=DALPROP_ATTR_TYPE_BYTE_SEQ> 10, 11, end </props>
<props name="IS_GPIO_PROTECTED" type=DALPROP_ATTR_TYPE_UINT32> 1 </props>
<props name="RW_ACCESS_LIST" type=DALPROP_ATTR_TYPE_BYTE_SEQ> AC_HLOS, end </props>
<props name="IS_PERSISTENT" type=DALPROP_ATTR_TYPE_UINT32> 0 </props>
</device>
更改TZ后单编的命令为:在TZ.BF.4.0.7\trustzone_images目录下执行 ./build_target_sdm660.sh
编译出来的文件路径:TZ.BF.4.0.7\trustzone_images\build\ms\bin\KAJAANAA\devcfg.mbn
adb单刷devcfg.mbn的命令:
fastboot flash devcfg_a devcfg.mbn
fastboot flash devcfg_b devcfg.mbn