1、硬件设计的原理

带电池开机的RK817的PMU电路图:

不带电池的开机的RK817的PMU电路图:

从RK817芯片手册得知道:

其中系统启动后可以使用以下命令查看系统配置:

echo r 0xde > /sys/rk8xx/rk8xx_dbg

使用以下命令查看RK817的充电状态:

echo r 0xe4 > /sys/rk8xx/rk8xx_dbg
echo r 0xe5 > /sys/rk8xx/rk8xx_dbg
echo r 0xe6 > /sys/rk8xx/rk8xx_dbg

所以从以上得知,当板子硬件设计不带电池的时候,需要修改RK817 IC的输入充电电流的限制。正常带电池启动时,RK817的充电电流限制在450mA。

而不带电池启动时,RK817的充电电流需要放开限制,调整到最大3A,同时需要修改u-boot和内核对不带电池不启动系统的限制。

2、u-boot对不带电池限制启动的修改

u-boot\drivers\power\charge_animation.c
static int charge_animation_show(struct udevice *dev)
{..............................if (!fuel_gauge_bat_is_exist(fg)) { //这里将检查电池是否存在printf("Exit charge: battery is not exist\n");return 0;}/* Extrem low power charge */ret = charge_extrem_low_power(dev);if (ret < 0) {printf("extrem low power charge failed, ret=%d\n", ret);return ret;}............................
}
------------>
方法一:
u-boot/drivers/power/fuel_gauge/fuel_gauge_uclass.c
int fuel_gauge_bat_is_exist(struct udevice *dev)
{const struct dm_fuel_gauge_ops *ops = dev_get_driver_ops(dev);if (!ops || !ops->bat_is_exist){ //bat is no exit ,so return 0printf("bat is no exist,return 0\n");//return -ENOSYS; //修改这里直接返回0,因为ops->bat_is_exist时,因为fg_rk817.c中的接口为空,所以这里会正常进入return 0;}printf("ops->bat_is_exist,call rk817_bat_bat_is_exist()\n");return ops->bat_is_exist(dev);
}
方法二:
修改:u-boot\drivers\power\fuel_gauge\fg_rk816.c
添加bat_is_exist()接口函数,如下:
@@ -132,6 +132,7 @@ static int dbg_enable = 0;#define CUR_ADC_K2      0x00ae#define CUR_ADC_K1        0x00af#define CUR_ADC_K0        0x00b0
+#define PMIC_CHRG_STS     0x00eb#define BAT_DISCHRG       0x00ec#define BAT_CON           BIT(4)@@ -1217,7 +1218,26 @@ static int rk817_bat_update_get_soc(struct udevice *dev)return VIRTUAL_POWER_SOC;}+static int rk817_is_bat_exist(struct rk817_battery_device *battery)
+{
+  struct rk8xx_priv *rk8xx = dev_get_priv(battery->dev->parent);
+
+  if (rk8xx->variant == RK817_ID)
+      return (rk817_bat_read(battery, PMIC_CHRG_STS) & 0x80) ? 1 : 0;
+
+  return 1;
+}
+
+static int rk817_bat_bat_is_exit(struct udevice *dev)
+{
+        struct rk817_battery_device *battery = dev_get_priv(dev);
+
+        return rk817_is_bat_exist(battery);
+}
+
+static struct dm_fuel_gauge_ops fg_ops = {
+  .bat_is_exist = rk817_bat_bat_is_exit,.get_soc = rk817_bat_update_get_soc,.get_voltage = rk817_bat_update_get_voltage,.get_current = rk817_bat_update_get_current,
@@ -1274,6 +1294,10 @@ static int rk817_fg_ofdata_to_platdata(struct udevice *dev)return -EINVAL;}+   battery->virtual_power = dev_read_u32_default(dev, "virtual_power", 0);
+  if (!rk817_is_bat_exist(battery))
+      battery->virtual_power = 1;
+if (rk8xx->variant == RK809_ID) {battery->bat_res_up  = dev_read_u32_default(dev, "bat_res_up", -1);if (battery->bat_res_up < 0) {
-- 

3、内核修改不带电池不允许启动

kernel\arch\arm64\boot\dts\rockchip\rk3566-rk817-tablet.dts
battery {compatible = "rk817,battery";ocv_table = <3400 3513 3578 3687 3734 3752 37633766 3771 3784 3804 3836 3885 39253962 4005 4063 4114 4169 4227 4303>;design_capacity = <5000>;design_qmax = <5500>;bat_res = <100>;sleep_enter_current = <150>;sleep_exit_current = <180>;sleep_filter_current = <100>;power_off_thresd = <3350>;zero_algorithm_vol = <3850>;max_soc_offset = <60>;monitor_sec = <5>;sample_res = <10>;//virtual_power = <0>;virtual_power = <1>; //bat_is_noexist};charger {compatible = "rk817,charger";min_input_voltage = <4500>;max_input_current = <1500>;max_chrg_current = <2000>;max_chrg_voltage = <4300>;chrg_term_mode = <0>;chrg_finish_cur = <300>;virtual_power = <0>;//1dc_det_adc = <0>; extcon = <&usb2phy0>;};
其中各个参数请参考代码中的/RKDocs/common/PMIC/Rockchip_Developer_Guide_RK817_RK809_Fuel_Gauge_CN&EN.pdf
【virtual_power 】
测试模式。设置该值为 1,无论有没有接充电器都会上报正在充电状态。其中只需要将batter选项中的virtual_power 设置成1即可,而charge中的virtual_power不需要设置成1

4、修改RK817充电输入电流的限制

需要将系统默认的输入电流限制从450mA修改成最大3A,这个主要解决USB线链接电脑插入拨出时系统重启的问题

4.1 u-boot部分将RK817输入充电电流从450mA修改成3A

u-boot\drivers\power\fuel_gauge\fg_rk817.c
//主要修改充电电流输入的限制,如下:
static void rk817_bat_charger_setting(struct rk817_battery_device *battery,int charger)
{static u8 old_charger = UNDEF_CHARGER;rk817_bat_set_input_voltage(battery, VLIM_4500MV);/* charger changed */if (old_charger != charger) {if (charger == NO_CHARGER) {//不充电的情况,即USB线拨出的情况DBG("NO_CHARGER\n");//rk817_bat_set_input_current(battery, ILIM_450MA);rk817_bat_set_input_current(battery, ILIM_3000MA); //从450mA修改到最大3A} else if (charger == USB_CHARGER) { //充电情况,即插入USB线链接电脑情况DBG("USB_CHARGER\n");//rk817_bat_set_input_current(battery, ILIM_450MA);//rk817_bat_set_input_current(battery, ILIM_1500MA);rk817_bat_set_input_current(battery, ILIM_3000MA);//从1500mA修改到最大3ADBG("USB_CHARGER charger setting ILIM_3000MA\n");} else if (charger == DC_CHARGER || charger == AC_CHARGER) { //充电情况DBG("DC OR AC CHARGE\n");//rk817_bat_set_input_current(battery, ILIM_1500MA);rk817_bat_set_input_current(battery, ILIM_3000MA); //从1500mA修改到最大3ADBG("DC OR AC CHARGE charger setting ILIM_3000MA\n");} else {DBG("charger setting error %d\n", charger);}old_charger = charger;}
}

4.2 内核部分将RK817输入充电电流从450mA修改成3A

kernel\drivers\power\supply\rk817_charger.c
//主要修改RK817在USB线在插入和拨出时,RK817的输入充电电流的限制
static void rk817_charge_set_chrg_param(struct rk817_charger *charge,enum charger_t charger)
{switch (charger) {case USB_TYPE_NONE_CHARGER: //链接到电脑上的USB拨出时,RK817输入的充电电流从450mA修改到3Acharge->usb_in = 0;charge->ac_in = 0;if (charge->dc_in == 0) {charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING;//rk817_charge_set_input_current(charge, INPUT_450MA);rk817_charge_set_input_current(charge, INPUT_3000MA);//不充电时的RK817输入充电电流}//rk817_charge_set_input_current(charge, INPUT_3000MA);power_supply_changed(charge->usb_psy);power_supply_changed(charge->ac_psy);DBG("rk817_charge_set_chrg_param()::USB_TYPE_NONE_CHARGER\n");break;case USB_TYPE_USB_CHARGER: //链接到电脑上的USB插入时,RK817输入的充电电流从450mA修改到3Acharge->usb_in = 1;charge->ac_in = 0;charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;if (charge->dc_in == 0)//rk817_charge_set_input_current(charge, INPUT_450MA);rk817_charge_set_input_current(charge, INPUT_3000MA);//充电时的RK817输入充电电流power_supply_changed(charge->usb_psy);power_supply_changed(charge->ac_psy);DBG("rk817_charge_set_chrg_param()::USB_TYPE_USB_CHARGER\n");break;case USB_TYPE_AC_CHARGER:case USB_TYPE_CDP_CHARGER://链接到电脑上的USB插入或者AC电源插入时,RK817输入的充电电流从450mA修改到3Acharge->ac_in = 1;charge->usb_in = 0;charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;if (charger == USB_TYPE_AC_CHARGER)//rk817_charge_set_input_current(charge,//                  charge->max_input_current);rk817_charge_set_input_current(charge,INPUT_3000MA);//充电时的RK817输入充电电流else//rk817_charge_set_input_current(charge,//                   INPUT_1500MA);rk817_charge_set_input_current(charge,INPUT_3000MA);//充电时的RK817输入充电电流power_supply_changed(charge->usb_psy);power_supply_changed(charge->ac_psy);DBG("rk817_charge_set_chrg_param()::USB_TYPE_AC-DC_CHARGER\n");break;case DC_TYPE_DC_CHARGER:charge->dc_in = 1;charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;//rk817_charge_set_input_current(charge,//                  charge->max_input_current);rk817_charge_set_input_current(charge, INPUT_3000MA);//充电时的RK817输入充电电流power_supply_changed(charge->usb_psy);power_supply_changed(charge->ac_psy);DBG("rk817_charge_set_chrg_param()::DC_TYPE_DC_CHARGER\n");break;case DC_TYPE_NONE_CHARGER:charge->dc_in = 0;if (!rk817_charge_get_plug_in_status(charge)) {charge->ac_in = 0;charge->usb_in = 0;charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING;//rk817_charge_set_input_current(charge, INPUT_450MA);rk817_charge_set_input_current(charge, INPUT_3000MA);//不充电时的RK817输入充电电流} else if (charge->usb_in) {//rk817_charge_set_input_current(charge, INPUT_450MA);rk817_charge_set_input_current(charge, INPUT_3000MA);//不充电时的RK817输入充电电流charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;}power_supply_changed(charge->usb_psy);power_supply_changed(charge->ac_psy);DBG("rk817_charge_set_chrg_param()::DC_TYPE_NONE_CHARGER\n");break;default:charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING;//rk817_charge_set_input_current(charge, INPUT_450MA);rk817_charge_set_input_current(charge, INPUT_3000MA);//不充电时的RK817输入充电电流DBG("rk817_charge_set_chrg_param()::default\n");break;}if (rk817_charge_online(charge) && rk817_charge_get_dsoc(charge) == 100)charge->prop_status = POWER_SUPPLY_STATUS_FULL;
}

修改完成后经过测试系统正常启动,USB口的adb和host都正常。

RK3568平台(PMU:Rk817)去掉电池之后,系统无法开机的解决方法相关推荐

  1. win7计算机时间显示错误,win7系统时间怎么调总是不对如何解决?win7系统时间总是不对解决方法...

    运行win7系统的时候会遇到一些奇奇怪怪的问题,比如有用户说win7系统时间怎么调总是不对,修改之后开机时间又变成很早之前的,每次都是这样,都要重新调整,非常麻烦,有什么办法可以解决win7系统时间总 ...

  2. VM平台添加设备时提示“无效的License组件”的解决方法

    VM平台添加设备时提示"无效的License组件"的解决方法 一般在添加设备时系统提示"无效的License组件"都是由于平台缺少对应的License组件导致的 ...

  3. 安卓系统卡顿的解决方法

    作为一个安卓的用户也是会有烦恼的,通常会遇到一系列的毛病,比如:手机经常会莫名其妙的变卡?点击app半天反应不过来?电话铃声响后却迟迟看不到电话界面?多个软件无缘无故的停止运行?这些都是安卓手机用户都 ...

  4. 计算机开机看不到用户,电脑开机进不了系统常见故障及解决方法

    电脑是我们生活工作中必不可少的一部分,我们可以利用它做很多事情.在电脑的使用过程中,我们经常会遇到这样的情况,我们前一天运用电脑还是好好的,第二天开机的时候,电脑却忽然出现一些错误提示或者不能正常开机 ...

  5. win7为什么打开桌面上的计算机很卡很慢,windows7很卡怎么处理_windows7系统卡慢的解决方法...

    近日有用户咨询win7电脑很卡的情况,相信这种状况大家应该都有遇到过吧,我们在运行大量的软件后,电脑就会变得很卡,这个时候我们会选择关闭一些不不用的软件,但是关闭之后电脑还是很卡,使得用户非常的烦躁. ...

  6. 4g内存只有1.6g可用_32位系统可用内存小 遇到32位系统内存小的解决方法

    内存是CPU进行沟通的桥梁,我们计算机上所有的程序都是在内存中运行的,如果内存不够用,可能系统缓慢卡顿,甚至会造成系统崩溃.那今天小编就给大家介绍一下32位系统可用内存小的解决方法,感兴趣的小伙伴一起 ...

  7. Windows系统“无法打开”故障解决方法之一

    Windows系统"无法打开"故障解决方法 无法打开"我的电脑","我的文档"等 解决方法:可能是Explorer程序出错了,通过下面的方法 ...

  8. CentOS7系统ifconfig无法使用的解决方法

    CentOS7系统ifconfig无法使用的解决方法 参考文章: (1)CentOS7系统ifconfig无法使用的解决方法 (2)https://www.cnblogs.com/mh-study/p ...

  9. Ubuntn系统忘记密码的解决方法(虚拟机下同样处理)

    Ubuntn系统忘记密码的解决方法(虚拟机下同样处理) 参考文章: (1)Ubuntn系统忘记密码的解决方法(虚拟机下同样处理) (2)https://www.cnblogs.com/cnkemi/p ...

最新文章

  1. PyTorch实现,GitHub star 4k+:这是微软开源的计算机视觉库
  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
  3. python笔记:load_ext autoreload
  4. 熟悉一下oncontextmenu事件的知识
  5. python线性回归算法简介_Python机器学习(二):线性回归算法
  6. mysql的每隔1分钟定时_mysql定时任务
  7. 重拾MVC——第二天:Vue学习与即时密码格式验证
  8. 为什么程序员对旧代码深恶痛绝?
  9. 论文笔记_S2D.43_2018-CVPR_单张RGB-D图像的深度补全
  10. vue-router传递参数的两种方式
  11. 360 网站服务器漏洞扫描,360Webscan
  12. ssl 2133 腾讯大战360#spfa#
  13. 全球500强的网站只有500个!强者生存!
  14. 【李沐:动手学深度学习pytorch版】第2章:预备知识
  15. 【双足轮机器人】Ascento技术详解--(5)实验--(7)总结【翻译】
  16. uAVS2 AVS2实时编码器
  17. ye321片库_jQuery的简约幻灯片库
  18. 企业办公最强“扫雷”秘籍,低代码避坑有一套
  19. java越野车架_越野怪兽 JAVA摆渡人 (ANIMA)山地车
  20. 让DedeCMS的栏目页标题显示页码数

热门文章

  1. 前端jquery判断元素是否隐藏
  2. 索尼android 5.0,索尼手机运行安卓5.0!太漂亮了
  3. Java 法师与战士
  4. Python中的除法
  5. python 除法运算
  6. 《课程格子》的一个笔试题目
  7. NCTF KeyBoard
  8. window host配置域名
  9. 智慧消防物联网系统解决方案 加速推进消防监测智能化发展
  10. 理解OpenCL中的工作组、工作项的索引