Uboot work sequence< colibri_pxa270 >

本文详细解析了U-Boot在Colibri PXA270平台上的启动过程,包括从_start到main_loop的各阶段执行流程,以及如何通过U_BOOT_CMD宏定义支持不同命令,并最终调用bootm命令引导Linux内核。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Uboot work sequence< colibri_pxa270 >

1.     Start.s <\arch\arm\cpu\pxa>

_start: b reset  -->

reset: -->

bl _main -->

2.     Crt0.s<\arch\arm\lib>

ENTRY(_main)  -->

bl  board_init_f -->

board_init_f() à < Board_f.c > run all the function in init_sequence_f

ldr        pc, =board_init_r           /* this is auto-relocated! */

3.     Board_r.c<\common>

board_init_r --> run all the function in init_sequence_r

run_main_loop -->

main_loop() -->

4.     Main.c<\common>

process_boot_delay --> run_command_list

parse_file_outer -->

parse_file_outer解析用户命令

对于uboot支持的每一个命令,是通过U_BOOT_CMD宏定义的

http://wenku.baidu.com/view/9ba118f7c8d376eeaeaa319a.html

 

#define CONFIG_BOOTCOMMAND                                                                    \

            "if mmc init && fatload mmc 0 0xa0000000 uImage; then "                       \

                        "bootm 0xa0000000; "                                                   \

            "fi; "                                                                                          \

            "if usb reset && fatload usb 0 0xa0000000 uImage; then "           \

                        "bootm 0xa0000000; "                                                   \

            "fi; "                                                                                          \

            "bootm 0x80000;"

 

5.     Cmd_bootm.c <\common>

 

U_BOOT_CMD(

            bootm, CONFIG_SYS_MAXARGS,        1,         do_bootm,

            "boot application image from memory", bootm_help_text);

 

do_bootm -->

do_bootm_states -->  boot_fn = boot_os[images->os.os];设置函数为下面的进入做准备

 

bootm_find_os ->

1)     boot_get_kernel ->  memmove(&images->legacy_hdr_os_copy, hdr,sizeof(image_header_t));

2)     /* find kernel entry point */

            if (images.legacy_hdr_valid) {

                        images.ep = image_get_ep(&images.legacy_hdr_os_copy);

 

boot_selected_os -->

boot_fn(state, argc, argv, images); --> do_bootm_linux -->

boot_jump_linux --> kernel_entry = (void (*)(int, int, uint))images->ep;

kernel_entry -->

Configure board: Colibri_pxa270.h (include\configs)

1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
https://blog.youkuaiyun.com/weixin_43245753/article/details/123914980现在已经配置了charge-animation { compatible = "rockchip,uboot-charge"; rockchip,uboot-charge-on = <1>; //启用uboot的关机充电模式:1:开启,0:关闭 rockchip,android-charge-on = <0>;//启用android的关机充电模式:1:开启,0:关闭,这里默认是关闭,使用的是uboot的关机充电 rockchip,uboot-low-power-voltage = <6800>; //uboot低电预充的开机电压 rockchip,screen-on-voltage = <6900>;// uboot低电预充的亮屏电压 rockchip,uboot-exit-charge-level = <2>; // 退出uboot充电的电量百分比 rockchip,uboot-exit-charge-auto = <0>; //是否开启自动退出uboot充电,与uboot-exit-charge-level 配合使用 rockchip,system-suspend = <1>; //配置uboot关机充电时支持深度休眠 //uboot关机充电时支持深度休眠时如下电源不关闭 regulator-on-in-mem = <&vdd_log_s0>, <&vcc_2v0_pldo_s3>, <&vdd2_ddr_s3>, <&vcc_1v1_nldo_s3>, <&vdd1_1v8_ddr_s3>, <&vcc_1v8_s3>, <&master_pldo6_s3>, <&vdd_0v75_s3>, <&vdd2l_0v9_ddr_s3>, <&vdd_1v8_pll_s0>, <&pldo6_s3>; //uboot关机充电时支持深度休眠时如下电源关闭 regulator-off-in-mem = <&vdd_gpu_s0>, <&vdd_npu_s0>, <&vdd_vdenc_s0>, <&vdd_gpu_mem_s0>, <&vdd_npu_mem_s0>, <&vdd_vdenc_mem_s0>, <&avcc_1v8_s0>, <&vcc_3v3_s0>, <&vccio_sd_s0>, <&master_nldo3>, <&avdd_0v75_s0>, <&vdd_0v85_s0>, <&vdd_cpu_big1_s0>, <&vdd_cpu_big0_s0>, <&vdd_cpu_lit_s0>, <&vdd_cpu_big1_mem_s0>, <&vdd_cpu_big0_mem_s0>, <&vcc_1v8_s0>, <&vdd_cpu_lit_mem_s0>, <&vddq_ddr_s0>, <&vdd_ddr_s0>, <&vcc_1v8_cam_s0>, <&avdd1v8_ddr_pll_s0>, <&vcc_3v3_sd_s0>, <&vcc_2v8_cam_s0>, <&vdd_0v75_pll_s0>, <&vdd_ddr_pll_s0>, <&slave_nldo3>, <&avdd_1v2_cam_s0>, <&avdd_1v2_s0>, <&vcc_3v3_s3>; status = "okay"; }; dts的属性已经被uboot驱动检测到了,但是插入电源适配器还是自动开机
07-11
<think>我们正在处理一个关于Rockchip平台Uboot充电配置的问题。用户已经配置了Uboot的关机充电模式,但插入电源适配器时设备仍然自动开机,而不是进入充电模式。我们需要分析可能的原因并提供解决方案。 首先,我们需要理解Rockchip平台的关机充电流程。在Rockchip平台上,关机充电功能通常由Uboot和内核共同支持。Uboot负责检测充电状态并显示充电界面,而内核则负责实际的充电管理。当设备关机并插入充电器时,Uboot应检测到充电器插入,并进入充电模式(显示充电界面,不启动内核)。如果设备直接开机,说明Uboot没有正确进入充电模式。 可能的原因: 1. **硬件检测问题**:Uboot未能正确检测到充电器插入。 2. **软件配置问题**:Uboot的充电配置(如设备树或Kconfig)未正确启用或设置。 3. **电源管理相关驱动问题**:Uboot中与充电相关的驱动(如PMIC驱动)存在问题。 4. **固件问题**:Uboot本身或相关固件(如rkbin)存在问题。 根据引用[1]和[2],我们可以参考Rockchip Uboot的编译和配置,以及如何修改开机LOGO(充电界面可能涉及LOGO显示)。但用户的问题集中在充电模式未按预期工作。 解决步骤: 1. **确认硬件连接和充电器**:确保使用的充电器是设备支持的,并且连接正常。有些设备可能只支持特定电压/电流的充电器。 2. **检查Uboot配置**: - 确认Uboot已配置支持充电模式。在Uboot的配置文件(如`configs/<board>_defconfig`)中,应包含以下配置: ``` CONFIG_DM_CHARGER=y CONFIG_CHARGER_RK817=y # 根据实际PMIC型号选择 CONFIG_POWER_GPIO=y CONFIG_DM_PMIC=y CONFIG_PMIC_RK8XX=y ``` - 检查设备树(dts)配置。在设备树中,需要正确配置充电相关的节点,例如: ```dts charger { compatible = "rockchip,rt5036-charger"; // 根据实际PMIC型号修改 status = "okay"; }; ``` 以及电源键的配置(因为长按电源键会触发开机): ```dts keys { power { gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; linux,code = <KEY_POWER>; label = "power"; wakeup-source; }; }; ``` 3. **检查PMIC(电源管理集成电路)驱动**:确保Uboot中对应的PMIC驱动已正确初始化,并能正确读取充电状态。 4. **调试Uboot**:通过串口查看Uboot启动日志,观察插入充电器时的检测信息。可能需要修改Uboot代码,添加调试信息,例如在充电检测函数中打印日志。 5. **检查rkbin**:引用[1]提到rkbin,这是Rockchip提供的二进制文件,包括DDR初始化、miniloader等。确保使用的rkbin版本与Uboot和硬件匹配。 6. **检查关机充电的流程**:在Rockchip平台上,关机充电模式需要Uboot和内核的配合。内核关机时需要将系统状态保存,并在下次启动时由Uboot读取。如果内核关机时没有正确设置标志,Uboot可能会忽略充电状态而直接启动内核。 7. **检查内核配置**:虽然问题可能主要在Uboot,但内核的配置也可能影响。确保内核中配置了相应的充电驱动,并且在关机时能够正确设置充电标志。 8. **参考已知问题**:查阅Rockchip官方文档或社区,看是否有类似问题及解决方案。 具体操作建议: 1. **获取调试信息**:通过串口连接设备,观察插入充电器时Uboot的输出。正常进入充电模式时,Uboot会显示充电界面(可能是一个LOGO或电池图标)。如果直接进入内核启动流程,则说明检测失败。 2. **修改Uboot代码添加调试信息**:在Uboot中,与充电检测相关的代码可能在`drivers/power/`目录下。例如,在`charger_rk817.c`(或其他对应PMIC的驱动)的`charger_get_status`函数中添加打印,查看检测到的充电状态。 3. **测试充电器检测**:在Uboot命令行中,尝试使用命令读取PMIC寄存器,例如: ``` rk8xx read 0x4a # 读取充电状态寄存器(具体寄存器地址需参考PMIC手册) ``` 4. **检查电源键状态**:如果电源键被按下(或短路),设备会开机。因此,需要检查电源键是否正常,以及在插入充电器时是否误触发了电源键。 5. **更新固件**:尝试更新Uboot和rkbin到最新版本,以排除已知问题。 6. **检查设备树**:确认设备树中充电器节点和电源键节点的配置正确,特别是GPIO引脚配置。 7. **检查内核关机流程**:确保内核在关机时正确设置了充电标志,并且Uboot能够读取该标志。 如果以上步骤无法解决问题,可能需要更深入地分析Uboot的电源管理流程。 相关问题: 1. 如何调试Rockchip Uboot的充电检测功能? 2. Rockchip平台关机充电的完整流程是怎样的? 3. 如何配置Uboot的设备树以支持关机充电? 4. 在Rockchip平台上,PMIC驱动常见问题有哪些? 5. 如何更新rkbin以及它与Uboot的兼容性如何?</think>### Rockchip Uboot 充电配置问题分析 根据您的描述,设备在配置 Uboot 关机充电模式后,插入电源适配器时仍自动开机而非进入充电模式。以下是可能原因及解决方案: #### 一、核心原因分析 1. **电源检测逻辑错误** Uboot 可能未正确检测到充电器插入事件,导致直接触发开机流程而非充电模式。Rockchip 平台需通过 `drivers/power/` 下的 PMIC 驱动(如 RK808/RK817)检测电源状态[^1]。 2. **设备树配置缺失** 关键配置项未正确启用: ```dts charger { compatible = "rockchip,rt5036-charger"; // 需匹配实际PMIC型号 rockchip,dc-det-gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; // DC检测GPIO status = "okay"; // 必须启用 }; ``` 3. **固件兼容性问题** 使用的 rkbin 版本与硬件不兼容(常见于 RK3399/RK3588),导致充电流程初始化失败[^1]。 4. **硬件触发信号干扰** 电源按钮 GPIO 被错误触发(如电压波动),强制启动系统。 #### 二、解决方案步骤 1. **验证硬件检测** 在 Uboot 命令行执行 PMIC 寄存器检测: ```bash => i2c dev 0 # 切换到PMIC所在I2C总线 => i2c read 0x40 0x4a 1 # 读取RK817充电状态寄存器 ``` 正常充电状态应返回 `0x01`,否则需检查硬件连接。 2. **检查关键配置** - 确认 `CONFIG_POWER_CHARGER=y` 已加入 **defconfig** 文件 - 在设备树中确保: ```dts / { chosen { rockchip,uboot-charge-on = <1>; // 启用Uboot充电 }; }; ``` 3. **更新 rkbin 固件** 从官方仓库获取最新版本: ```bash git clone https://github.com/rockchip-linux/rkbin.git cp rkbin/bin/rk33/rk3399_bl31_v1.35.elf ./ # 以RK3399为例 make BL31=./rk3399_bl31_v1.35.elf ``` 4. **添加充电模式调试** 在 Uboot 源码中添加调试信息(`drivers/power/charge_display.c`): ```c printf("Charger status: %s\n", charger_is_connected() ? "Connected" : "Disconnected"); ``` 5. **检查电源键防抖配置** 在设备树中增加防抖参数: ```dts gpio-keys { power { debounce-interval = <100>; // 100ms防抖 }; }; ``` #### 三、验证流程 1. 编译烧写更新后的 Uboot: ```bash make rk3399_defconfig make CROSS_COMPILE=aarch64-linux-gnu- rkdeveloptool db rk3399_loader_v2.24.126.bin rkdeveloptool wl 0x40 uboot.img ``` 2. 通过串口监控启动日志: ```log U-Boot 2023.07 (Oct 10 2023 - 16:20:35 +0800) DRAM: 4 GiB Charger status: Connected // 关键调试信息 Entering charge mode... // 成功进入充电模式 ``` > **注意**:若仍无法解决,请提供以下信息: > - 具体芯片型号(如 RK3399/RK3588) > - Uboot 版本及 rkbin 版本 > - 串口输出的完整启动日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值