uboot阶段修改dts使用分析

本文介绍了如何使用uboot的fdt命令进行设备树的调试,包括fdtaddr、fdtboardsetup、fdtmove等实用工具,展示了如何查看、修改设备节点属性,如LCD定时器和内存设置,以及如何保存修改。

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

前言

为方便调试某些设备树中配置的timing而不需要重新烧录固件,故做此记录

uboot的fdt命令

移植参考说明简略参考:

https://blog.youkuaiyun.com/u013165704/article/details/80374702

fdt help

t7_an400_lpddr4x# fdt
fdt - flattened device tree utility commands

Usage:
fdt addr [-c]  <addr> [<length>]   - Set the [control] fdt location to <addr>
fdt boardsetup                      - Do board-specific set up
fdt move   <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active
fdt resize [<extrasize>]            - Resize fdt to size + padding to 4k addr + some optional <extrasize> if needed
fdt print  <path> [<prop>]          - Recursive print starting at <path>
fdt list   <path> [<prop>]          - Print one level starting at <path>
fdt get value <var> <path> <prop>   - Get <property> and store in <var>
fdt get name <var> <path> <index>   - Get name of node <index> and store in <var>
fdt get addr <var> <path> <prop>    - Get start address of <property> and store in <var>
fdt get size <var> <path> [<prop>]  - Get size of [<property>] or num nodes and store in <var>
fdt set    <path> <prop> [<val>]    - Set <property> [to <val>]
fdt mknode <path> <node>            - Create a new node after <path>
fdt rm     <path> [<prop>]          - Delete the node or <property>
fdt header [get <var> <member>]     - Display header info
                                      get - get header member <member> and store it in <var>
fdt bootcpu <id>                    - Set boot cpuid
fdt memory <addr> <size>            - Add/Update memory node
fdt rsvmem print                    - Show current mem reserves
fdt rsvmem add <addr> <size>        - Add a mem reserve
fdt rsvmem delete <index>           - Delete a mem reserves
fdt chosen [<start> <end>]          - Add/update the /chosen branch in the tree
                                        <start>/<end> - initrd start/end addr
NOTE: Dereference aliases by omitting the leading '/', e.g. fdt print ethernet0.

查看某节点命令

直接使用fdt list xx,注意这里的设备节点的路径要带上绝对路径 即 /xx/xx这样

t7_an400_lpddr4x# fdt list /lcd1/vbyone_1
vbyone_1 {
        model_name = "public_1region";
        interface = "vbyone";
        basic_setting = <0x00000f00 0x00000870 0x00001130 0x000008ca 0x0000000a 0x00000010 0x00000009>;
        range_setting = <0x00001090 0x000012c0 0x00000898 0x00000ae6 0x20e6da00 0x25ab8e00>;
        lcd_timing = <0x00000021 0x000001dd 0x00000000 0x00000006 0x00000041 0x00000000>;
        clk_attr = <0x00000002 0x00000000 0x00000001 0x00000000>;
        vbyone_attr = <0x00000008 0x00000001 0x00000004 0x00000004>;
        vbyone_intr_enable = <0x00000001 0x00000003>;
        phy_attr = <0x00000007 0x00000001>;
        hw_filter = <0x00000000 0x00000000>;
        power_on_step = <0x00000000 0x00000000 0x00000001 0x000000c8 0x00000002 0x00000000 0x00000000 0x0000000a 0x000000ff 0x00000000 0x00000000 0x00000000>;
        power_off_step = <0x00000002 0x00000000 0x00000000 0x0000000a 0x00000000 0x00000000 0x00000000 0x000001f4 0x000000ff 0x00000000 0x00000000 0x00000000>;
        backlight_index = <0x000000ff>;
};

修改某节点命令

使用 fdt set path prop,注意这里的设备节点的路径也要带上绝对路径

  • 修改整数数组
    *需要注意的是不能增大原数组大小,只能减少或者修改某数组成员
    如修改power_on_step 某type的delay值
    将原来的0x000000c8 修改成0x000001f4
fdt set  /lcd1/vbyone_1 power_on_step  <0x00000000 0x00000000 0x00000001 0x000001f4 0x00000002 0x00000000 0x00000000 0x0000000a 0x000000ff 0x00000000 0x00000000 0x00000000>

修改后再获取确认

t7_an400_lpddr4x# fdt list /lcd1/vbyone_1
vbyone_1 {
        model_name = "public_1region";
        interface = "vbyone";
        basic_setting = <0x00000f00 0x00000870 0x00001130 0x000008ca 0x0000000a 0x00000010 0x00000009>;
        range_setting = <0x00001090 0x000012c0 0x00000898 0x00000ae6 0x20e6da00 0x25ab8e00>;
        lcd_timing = <0x00000021 0x000001dd 0x00000000 0x00000006 0x00000041 0x00000000>;
        clk_attr = <0x00000002 0x00000000 0x00000001 0x00000000>;
        vbyone_attr = <0x00000008 0x00000001 0x00000004 0x00000004>;
        vbyone_intr_enable = <0x00000001 0x00000003>;
        phy_attr = <0x00000007 0x00000001>;
        hw_filter = <0x00000000 0x00000000>;
        power_on_step = <0x00000000 0x00000000 0x00000001 0x000001f4 0x00000002 0x00000000 0x00000000 0x0000000a 0x000000ff 0x00000000 0x00000000 0x00000000>;
        power_off_step = <0x00000002 0x00000000 0x00000000 0x0000000a 0x00000000 0x00000000 0x00000000 0x000001f4 0x000000ff 0x00000000 0x00000000 0x00000000>;
        backlight_index = <0x000000ff>;
};

修改字符串
如关闭某设备节点

t7_an400_lpddr4x# fdt set /backlight1/ status "disable" 
t7_an400_lpddr4x# fdt list /backlight1
backlight1 {
        compatible = "amlogic, backlight-t7";
        status = "disable";
 }

平台版本若支持保存修改,可使用 fdt save保存修改的设备树,这样的话即使重启之前的修改也保留着

### RK3568 U-Boot 阶段速度优化技术与最佳实践 对于RK3568平台而言,U-Boot启动时间的优化至关重要。通过一系列的技术手段可以显著提升其性能。 #### 减少不必要的驱动加载 移除或禁用不需要的设备树节点以及相应的驱动程序能够减少初始化过程中的开销。这可以通过编辑`dts`文件来实现,在其中仅保留必要的硬件配置[^1]。 ```diff // 在DTS文件中删除未使用的外设定义 -delete { - status = "disabled"; -}; ``` #### 启用压缩镜像支持 启用FIT(Flattened Image Tree)格式并采用LZMA等高效算法对内核及其附属组件进行打包处理有助于加快解压速率。修改`defconfig`以开启相应选项: ```bash CONFIG_FIT=y CONFIG_LZO_DECOMPRESS=y CONFIG_OF_LIBFDT_OVERLAY=y ``` #### 调整环境变量设置 合理规划命令行参数传递机制同样重要。将频繁变动的数据项存放在RAM盘而非Flash存储器里可有效缩短读取耗时;同时精简bootargs字符串长度也有助于提高效率[^2]。 ```shell setenv bootcmd 'run distro_bootcmd' setenv loadaddr 0x40007E00 setenv fdt_high ffffffff ``` #### 利用多线程加速资源获取 针对某些特定场景下的网络下载操作或是其他I/O密集型任务,则考虑引入并发编程模型——比如借助TFTP协议传输文件期间允许后台执行额外指令集从而达到异步化目的[^3]。 ```c static int spl_load_image_tftp(const char *filename, ulong dest_addr) { struct net_info info; ... while (len < size && !ctrlc()) { // 支持Ctrl+C中断 ret = tftp_read_block(&info, buf, min(len_left, PKTSIZE)); if (ret != RET_SUCCESS) break; memcpy((void *)dest_addr + len, buf, ret); len += ret; /* 执行一些轻量级的任务 */ do_some_lightweight_tasks(); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值