platform: imx6q

os: Android5.1

branch: l5.1.1_2.1.0-ga

解决方法:

IMX6Q的PMU被bypass导致cpu没有供电而无法开机,只要donwload imx6q ldo版本的boot image即可。

log:

U-Boot 2015.04-14409-g6cf684a-dirty (Mar 10 2016 - 13:56:17)CPU:   Freescale i.MX6Q rev1.5 at 792 MHz
CPU:   Temperature 27 C
Reset cause: POR
Board: MX6-SabreSD
I2C:   ready
DRAM:  2 GiB
PMIC:  PFUZE100 ID=0x10
MMC:   FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2
*** Warning - bad CRC, using default environmentNo panel detected: default to Hannstar-XGA
Display: Hannstar-XGA (1024x768)
In:    serial
Out:   serial
Err:   serial
check_and_clean: reg 0, flag_set 0
Fastboot: Normal
flash target is MMC:1
Net:   Phy 1 not found
PHY reset timed out
FEC [PRIME]
Error: FEC address not set.Normal Boot
Hit any key to stop autoboot:  0
boota mmc1
kernel   @ 14008000 (7272264)
ramdisk  @ 15000000 (868699)
fdt      @ 14f00000 (44216)
## Current stack ends at 0x8ef3cbf0 ## Booting Android Image at 0x12000000 ...
Kernel load addr 0x14008000 size 7102 KiB
Kernel command line: console=ttymxc1,115200 init=/init video=mxcfb0:dev=ldb,bpp=32 video=mxcfb1:off video=mxcfb2:off video=mxcfb3:off vmalloc=256M androidboot.console=ttymxc1 consoleblank=0 androidboot.hardware=freescale cma=384Mkernel data at 0x12000800, len = 0x006ef748 (7272264)
*  fdt: cmdline image address = 0x14f00000
## Checking for 'FDT'/'FDT Image' at 14f00000
*  fdt: raw FDT blob
## Flattened Device Tree blob at 14f00000111 Booting using the fdt blob at 0x14f00000of_flat_tree at 0x14f00000 size 0x0000acb8Loading Kernel Image ... OKkernel loaded at 0x14008000, end = 0x146f7748
using: FDTUsing Device Tree in place at 14f00000, end 14f0dcb7
## Transferring control to Linux (at address 14008000)...switch to ldo_bypass mode!
Starting kernel ...

思路:

说明kernel和dts都已经找到,但是kernel一条log都没有。

本来想参考

https://community.freescale.com/thread/385298

在reset之后通过u-boot的命令来dump ddr中的ddr log,

无奈我们的硬件设计是cold reset, memory信息都丢失,无法抓log。

此问题断断续续困扰了我好几天,检查了dts和kernel中compatible确实也是一致的,

修改过的uart配置应该也没有问题。

u-boot 中有条log让我很好奇:

switch to ldo_bypass mode.

记得build bootimage的时候有个boot-imx6q-ldo.img,试了下,居然开机进kernel了!!!

原因:

IMX6Q提供了ldo bypass功能,这是什么东西呢?先看下图:

图一 使用内部PMU的LDO即非bypass

图二 使用外部PMIC而直接bypass内部PMU

两图的区别在于图二的VDDARM_IN直接短接到了VDD_ARM_CAP而作为cpu的电源,而图一是需要经过LDO电压转换的。

如果要使用bypass功能,那么硬件上必须要使用图二,否则VDD_ARM_CAP是没有电的。

PS: VDDARM_IN从外部PMIC输出的。

boot-imx6q-ldo.img 和boot-imx6q.img的区别在于:

kernel_imx/arch/arm/boot/dts/imx6q-sabresd-ldo.dts

......
#include "imx6q-sabresd.dts"&cpu0 {arm-supply = <&reg_arm>;soc-supply = <&reg_soc>;
};&gpc {/* use ldo-enable, u-boot will check it and configure */fsl,ldo-bypass = <0>;/* watchdog select of reset source */fsl,wdog-reset = <1>;
};
......

这些property会覆盖kernel_imx/arch/arm/boot/dts/imx6qdl-sabresd.dts里的配置:

&gpc {/* use ldo-bypass, u-boot will check it and configure */fsl,ldo-bypass = <1>;fsl,wdog-reset = <2>;
};
&cpu0 {arm-supply = <&sw1a_reg>;soc-supply = <&sw1c_reg>;
};

arm-supply和soc-supply默认使用的是PMIC的电源,改成了内部PMU的reg_arm和reg_soc.

那么fsl,ldo-bypass怎么被用到的呢?且看u-boot!

cpu.c

void arch_preboot_os(void)
{
......
#if defined(CONFIG_LDO_BYPASS_CHECK)ldo_mode_set(check_ldo_bypass());
#endif
.....
}

soc.c

int check_ldo_bypass(void)
{
......ldo_mode = fdt_getprop(gd->fdt_blob, node, "fsl,ldo-bypass", NULL);/** return 1 if "fsl,ldo-bypass = <1>", else return 0 if* "fsl,ldo-bypass = <0>" or no "fsl,ldo-bypass" property*/ldo_bypass = fdt32_to_cpu(*ldo_mode) == 1 ? 1 : 0;return ldo_bypass;
}

mx6qecovacs.c

#ifdef CONFIG_LDO_BYPASS_CHECK
void ldo_mode_set(int ldo_bypass)
{
....../* switch to ldo_bypass mode , boot on 800Mhz */if (ldo_bypass) {prep_anatop_bypass();if (is_mx6dqp()) {/* decrease VDDARM for 400Mhz DQP:1.1V*/pmic_reg_read(p, PFUZE100_SW2VOL, &value);value &= ~0x3f;value |= 0x1c;pmic_reg_write(p, PFUZE100_SW2VOL, value);} else {/* decrease VDDARM for 400Mhz DQ:1.1V, DL:1.275V */pmic_reg_read(p, PFUZE100_SW1ABVOL, &value);value &= ~0x3f;
#if defined(CONFIG_MX6DL)value |= 0x27;
#elsevalue |= 0x20;
#endifpmic_reg_write(p, PFUZE100_SW1ABVOL, value);}/* increase VDDSOC to 1.3V */pmic_reg_read(p, PFUZE100_SW1CVOL, &value);value &= ~0x3f;value |= 0x28;pmic_reg_write(p, PFUZE100_SW1CVOL, value);/** MX6Q/DQP:* VDDARM:1.15V@800M; VDDSOC:1.175V@800M* VDDARM:0.975V@400M; VDDSOC:1.175V@400M* MX6DL:* VDDARM:1.175V@800M; VDDSOC:1.175V@800M* VDDARM:1.075V@400M; VDDSOC:1.175V@400M*/is_400M = set_anatop_bypass(2);if (is_mx6dqp()) {pmic_reg_read(p, PFUZE100_SW2VOL, &value);value &= ~0x3f;if (is_400M)value |= 0x17;elsevalue |= 0x1e;pmic_reg_write(p, PFUZE100_SW2VOL, value);}if (is_400M)
#if defined(CONFIG_MX6DL)vddarm = 0x1f;
#elsevddarm = 0x1b;
#endifelse
#if defined(CONFIG_MX6DL)vddarm = 0x23;
#elsevddarm = 0x22;
#endifpmic_reg_read(p, PFUZE100_SW1ABVOL, &value);value &= ~0x3f;value |= vddarm;pmic_reg_write(p, PFUZE100_SW1ABVOL, value);/* decrease VDDSOC to 1.175V */pmic_reg_read(p, PFUZE100_SW1CVOL, &value);value &= ~0x3f;value |= 0x23;pmic_reg_write(p, PFUZE100_SW1CVOL, value);finish_anatop_bypass();printf("switch to ldo_bypass mode!\n");}
}
#endif

也就是说u-boot会根据dts中的ldo-bypass值来修改PMIC的输出电压,而我们硬件却是用的内部PMU方案!

参考:

1. IMX6Q datasheet

2. https://community.freescale.com/thread/385298

3. https://community.freescale.com/message/507621

[IMX6Q][Android5.1]移植笔记 --- kernel停在Starting kernel 分析相关推荐

  1. kernel停在Starting kernel 分析

    解决方法: 1.看门狗问题,可能会造成这种显现. 2.IMX6Q的PMU被bypass导致cpu没有供电而无法开机,只要donwload imx6q ldo版本的boot image即可. log: ...

  2. [IMX6Q][Android5.1]移植笔记 --- Kernel启动无法挂载文件系统

    platform: imx6q os: Android5.1 branch: l5.1.1_2.1.0-ga 错误log如下,主要是最后几句: ...... sdhci: Secure Digital ...

  3. [IMX6Q][Android5.1]移植笔记 --- 无法挂载system文件系统

    platform: imx6q os: Android5.1 branch: l5.1.1_2.1.0-ga 编译好system image之后开机提示如下log,注意红色部分: Freeing un ...

  4. IMX6怎么移植最新Android,[IMX6Q][Android5.1]移植筆記 --- 無法掛載system文件系統

    platform: imx6q os: Android5.1 branch: l5.1.1_2.1.0-ga 編譯好system image之后開機提示如下log,注意紅色部分: Freeing un ...

  5. [RK3288][Android5.1] 移植笔记 --- gsl3673 触控驱动

    Platform: RK3288 OS: Android 5.1 Kernel: 3.10.79 原理图屏相关部分: 同上一篇 采用 I2C4 接口     I2C4_SCL_TP  :  I2C4_ ...

  6. [RK3288][Android5.1] 移植笔记 --- eDP显示屏添加

    Platform: RK3288 OS: Android 5.1 Kernel: 3.10.79 原理图屏相关部分: dts配置: eDP的配置相当简单, 只要配置display-timing即可,另 ...

  7. linux卡死在选择内核界面,求助:am3352 linux内核启动时卡在 Starting kernel ...

    这是用光盘里的uImage的输出信息: U-Boot# tftp 0x82000000 bakuImage link up on port 0, speed 100, full duplex Usin ...

  8. AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17

    AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17 手上板子原来自带的是2.4.19的内核, 打算移植新的2.6的内核,从网上下了2.6.17的kernel,下载 ...

  9. 【TINY4412】U-BOOT移植笔记:(9)SD卡启动U-BOOT

    [TINY4412]U-BOOT移植笔记:(9)SD卡启动U-BOOT 宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64 目标板[底板]: Tiny4412SDK - 1506 目标板 ...

最新文章

  1. java 类的存储结构设计_Doris存储层设计介绍1——存储结构设计解析
  2. Semaphore(信号量)
  3. spring MVC项目启动报错
  4. 笔记-项目范围管理-项目范围说明书
  5. win7讲述人修复_揭秘:干掉了win7!为何win10屡被吐槽它却“永世留芳”
  6. sklearn炼丹术之——交叉验证Cross-validation: evaluating estimator performance
  7. 洛谷P3369 【模板】普通平衡树(STL做法:vectormultiset)
  8. 如何固定电脑ip地址
  9. [转载]使用Response.Filter过滤非法词汇
  10. Android studio显示红叉,提示Error:please select android sdk
  11. 自定义dns服务器是什么,dns服务器有什么用(电脑设置DNS的方法)
  12. Openerp部分学习资料
  13. 少儿编程--STEMA考试介绍转自STEMA (STEM 能力测试) 考 试 白 皮 书
  14. 人工智能原理(学习笔记)
  15. 阿里百川 用户反馈(feedback) 与 (com.umeng.lib.xxxxx 及 和 alipaySDK-xxxxx) 冲突的问题。
  16. UCLA教授朱松纯:走向通用人工智能,从大数据到大任务
  17. C#入门4——税收计算
  18. Unity制作格斗游戏核心思路总结
  19. Sphinx全文索引搜索常见的一些错误处理收集
  20. jquery iframe 父子互操作

热门文章

  1. 【附源码】计算机毕业设计SSM企业员工考勤管理系统
  2. 如何正确调整上传附件大小限制
  3. Vue响应式原理及双向数据绑定
  4. [蓝桥杯]分分钟的碎碎念(动态规划)
  5. ROS-虚拟机Ubuntu中安装ros系统
  6. 淘宝京东拼多多抖音淘特等多平台商品聚合商品详情API接口(商品详情页API接口,商品销量Api接口)
  7. [CDH运维] CDH官方包收费之后
  8. matlab汉宁窗长度,汉宁窗的matlab实现.doc
  9. java摄像头跟随_一种摄像头自动跟随人脸转动的控制方法与流程
  10. 创意信息总经理何文江:打造大数据产品和解决方案综合提供商