SDM660平台使能I2C或者UART口开不起机

当使能一个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

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SDM660平台上同时兼容外接的AW35615CSR芯片和内置的USB Type-C controller,你需要对SDM660平台的USB Type-C controller驱动程序进行修改,以便同时支持两种控制器。具体的修改步骤如下: 1. 在SDM660平台上加载AW35615CSR芯片的驱动程序,并确保AW35615CSR芯片已经被成功识别。 2. 在SDM660平台上加载USB Type-C controller驱动程序,并确保内置的USB Type-C controller已经被成功识别。 3. 在USB Type-C controller驱动程序中添加对AW35615CSR芯片的支持。具体来说,你需要修改驱动程序中的probe函数,以便在检测到AW35615CSR芯片时将其作为备选controller,并在AW35615CSR芯片不可用时使用内置的USB Type-C controller。具体代码实现可能因驱动程序而异,以下是一个简单的示例: ```c static int usb_tc_probe(struct platform_device *pdev) { struct usb_tc *tc; struct device *dev = &pdev->dev; int ret; tc = devm_kzalloc(dev, sizeof(*tc), GFP_KERNEL); if (!tc) return -ENOMEM; // 检测AW35615CSR芯片是否可用 if (aw35615csr_detect()) tc->type = USB_TC_TYPE_EXTERNAL; else tc->type = USB_TC_TYPE_INTERNAL; // 初始化Type-C controller switch (tc->type) { case USB_TC_TYPE_EXTERNAL: // 初始化外部Type-C controller ret = aw35615csr_tc_init(); if (ret) { dev_err(dev, "failed to initialize external Type-C controller\n"); return ret; } break; case USB_TC_TYPE_INTERNAL: // 初始化内部Type-C controller ret = msm_usb_tc_init(); if (ret) { dev_err(dev, "failed to initialize internal Type-C controller\n"); return ret; } break; default: dev_err(dev, "unsupported Type-C controller type\n"); return -EINVAL; } // 注册Type-C controller tc_set_drvdata(tc, dev); ret = usb_add_tc_dev(dev, tc); if (ret) { dev_err(dev, "failed to register Type-C controller\n"); goto err_tc_exit; } return 0; err_tc_exit: switch (tc->type) { case USB_TC_TYPE_EXTERNAL: aw35615csr_tc_exit(); break; case USB_TC_TYPE_INTERNAL: msm_usb_tc_exit(); break; } return ret; } ``` 在这个示例代码中,我们在probe函数中使用aw35615csr_detect函数来检测AW35615CSR芯片是否可用,如果可用,就将其作为备选controller,并在初始化Type-C controller时使用aw35615csr_tc_init函数初始化AW35615CSR芯片的Type-C controller。如果AW35615CSR芯片不可用,则使用内置的USB Type-C controller,并在初始化Type-C controller时使用msm_usb_tc_init函数初始化内置的USB Type-C controller。 4. 编译和安装修改后的USB Type-C controller驱动程序,并重新启动SDM660平台。在重新启动后,SDM660平台应该可以同时支持内置的USB Type-C controller和外接的AW35615CSR芯片了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值