[A133 Android11] 连接pc板子掉电

平台:A133+AXP717
系统:Android11
内核:Linux5.4
现象:在板子不接电池的情况下,连接电脑板子掉电(该项目不需要电池),用示波器抓到的波形显示reset一直为低。

使用逻辑分析仪测量pmu和主控在掉电前的通讯,发现其对pmu进行写0x17 0x88

通过查阅axp717数据手册我们发现0x17为一个限流操作,限制为500ma(100+N*50)mA,N为低5为即8。

我们将屏幕和喇叭去掉,发现其能正常开机了,说明猜想正确。

我们将dts中的pmu_usbpc_cur设为1500后进行测试,发现仍然起不来,逻辑分析仪显示仍然是下0x17 0x88,没办法我们只好去跟代码了

	pmu_usbpc_vol = <4600>;
	pmu_usbpc_cur = <1500>;//将其改为1.5A
	pmu_usbad_vol = <4600>;
	pmu_usbad_cur = <2500>;
	pmu_usb_typec_used = <0>;
	wakeup_usb_in;
	wakeup_usb_out;
};

通过compatible查找到文件为axp2202_usb_power.c
函数axp2202_set_iin_limit为限流函数,添加打印后发现其当连接pc时下了500ma的参数

static int axp2202_set_iin_limit(struct regmap *regmap, int mA)
{
	printk("axp2202_set_iin_limit mA = %d\n",mA);
	unsigned int data;
	int ret = 0;
	data = mA;
     printk("pmu_debug: data = %d",data);

	if (data > 3250)
		data = 3250;
	if	(data < 100)
		data = 100;
	data = ((data - 100) / 50);
	ret = regmap_update_bits(regmap, AXP2202_IIN_LIM, GENMASK(5, 0),
				 data);
	if (ret < 0)
		return ret;

	return 0;
}

在文件中共有3处调用

static int axp2202_usb_set_property(struct power_supply *psy,
				enum power_supply_property psp,
				const union power_supply_propval *val)
    
static irqreturn_t axp2202_irq_handler_usb_in(int irq, void *data)   

static void axp2202_usb_set_current_fsm(struct work_struct *work) 

通过再次添加打印,我们发现axp2202_usb_set_property为该次调用函数。

.set_property = axp2202_usb_set_property,

 static int ps_set_cur_charge_cntl_limit(struct thermal_cooling_device *tcd,
					unsigned long state)
     {	ret = psy->desc->set_property(psy,
		POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, &val);}
		
  .set_cur_state = ps_set_cur_charge_cntl_limit,

通过查看函数调用关系,最后发现为sunxi_udc.c下的sunxi_set_cur_vol_work调用

void sunxi_set_cur_vol_work(struct work_struct *work)
{
#if !defined(SUNXI_USB_FPGA) && defined(CONFIG_POWER_SUPPLY)
	struct power_supply *psy = NULL;
	union power_supply_propval temp;

	if (of_find_property(g_udc_pdev->dev.of_node, "det_vbus_supply", NULL))
		psy = devm_power_supply_get_by_phandle(&g_udc_pdev->dev,
						     "det_vbus_supply");

	if (!psy || IS_ERR(psy)) {
		DMSG_PANIC("%s()%d WARN: get power supply failed\n",
			   __func__, __LINE__);
	} else {
		temp.intval = 2500;//改大到2500

		power_supply_set_property(psy,
					POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &temp);
	}
#endif
}

可以发现这是一个保护pc的电流限制,当识别usb连接pc时主动将VBUS电流限制在500mA,由于我们的设备有额外的电源,所以直接将其调大。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值