ARM64 Linux 找出dts的3种方法

1. 编译完内核如何找出 dts

在编译完 ARM64 内核后,设备树二进制文件(DTB)通常会被放置在 arch/arm64/boot 目录下。在该目录下,你可以找到与目标硬件平台对应的 DTB 文件。命令如下:

$ find arch/arm64/boot/dts/ -name *.dtb.cmd
arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.cmd

里面不仅能展示原始dts文件是哪个,dtb编译过程,还能展示它的依赖文件有哪些,方便把这些依赖文件加到source insight进行分析:

$ cat arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.cmd
cmd_arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtb := mkdir -p arch/arm64/boot/dts/rockchip/ ; ./scripts/gcc-wrapper.py ./../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -E -Wp,-MD,arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.d.pre.tmp -nostdinc -I./scripts/dtc/include-prefixes -undef -D__DTS__ -x assembler-with-cpp -o arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.dts.tmp arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dts ; ./scripts/dtc/dtc -O dtb -o arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtb -b 0 -iarch/arm64/boot/dts/rockchip/ -i./scripts/dtc/include-prefixes -@ -Wno-unit_address_vs_reg -Wno-unit_address_format -Wno-avoid_unnecessary_addr_size -Wno-alias_paths -Wno-graph_child_address -Wno-graph_port -Wno-simple_bus_reg -Wno-unique_unit_address -Wno-pci_device_reg  -d arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.d.dtc.tmp arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.dts.tmp ; cat arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.d.pre.tmp arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.d.dtc.tmp > arch/arm64/boot/dts/rockchip/.rk3568-firefly-aioj.dtb.d

source_arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtb := arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dts

deps_arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtb := \
  arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtsi \
  arch/arm64/boot/dts/rockchip/rk3568-firefly-port.dtsi \
  scripts/dtc/include-prefixes/dt-bindings/gpio/gpio.h \
  scripts/dtc/include-prefixes/dt-bindings/pinctrl/rockchip.h \
  arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi \
  scripts/dtc/include-prefixes/dt-bindings/pwm/pwm.h \
  scripts/dtc/include-prefixes/dt-bindings/input/rk-input.h \
  scripts/dtc/include-prefixes/dt-bindings/display/drm_mipi_dsi.h \
  scripts/dtc/include-prefixes/dt-bindings/sensor-dev.h \
  arch/arm64/boot/dts/rockchip/rk3568.dtsi \
  scripts/dtc/include-prefixes/dt-bindings/clock/rk3568-cru.h \
  scripts/dtc/include-prefixes/dt-bindings/interrupt-controller/arm-gic.h \
  scripts/dtc/include-prefixes/dt-bindings/interrupt-controller/irq.h \
  scripts/dtc/include-prefixes/dt-bindings/soc/rockchip,boot-mode.h \
  scripts/dtc/include-prefixes/dt-bindings/phy/phy.h \
  scripts/dtc/include-prefixes/dt-bindings/power/rk3568-power.h \
  scripts/dtc/include-prefixes/dt-bindings/soc/rockchip-system-status.h \
  scripts/dtc/include-prefixes/dt-bindings/suspend/rockchip-rk3568.h \
  scripts/dtc/include-prefixes/dt-bindings/thermal/thermal.h \
  arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi \
  scripts/dtc/include-prefixes/dt-bindings/clock/rockchip-ddr.h \
  scripts/dtc/include-prefixes/dt-bindings/memory/rk3568-dram.h \
  scripts/dtc/include-prefixes/dt-bindings/memory/rockchip-dram.h \
  arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi \
  arch/arm64/boot/dts/rockchip/rockchip-pinconf.dtsi \
  arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi \
  arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj-cam-8ms1m.dtsi \

arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtb: $(deps_arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtb)

$(deps_arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtb):

2. Linux 运行起来之后如何找出 dts

当 Linux 系统启动后,设备树信息会被加载到 /proc/device-tree 中。虽然 /proc/device-tree 直接提供的是设备树的二进制形式,但我们可以通过以下步骤生成 DTS 文件,使用 dtc(设备树编译器)工具:

dtc -I fs -O dts -o output.dts /proc/device-tree
  • -I fs: 指定输入格式为文件系统格式。
  • -O dts: 指定输出格式为 DTS。
  • -o output.dts: 指定输出文件名。

3. QEMU直接导出dts

使用QEMU模拟arm64时,如果使用了-machine virt,那么是不需要指定dts的,因为QEMU内置了一个dts文件,参考:qemu/v9.1.0/source/hw/arm/virt.c

qemu-system-aarch64 \
  -cpu cortex-a72 \
  -machine virt,gic-version=3,virtualization=on \
  -m 2048 \
  -nographic \
  -drive file=your_image.img,format=raw \
  -kernel your_kernel.img \
  -initrd your_initrd.img \
  -append "console=ttyAMA0 root=/dev/vda rw"

在使用 QEMU 模拟器时,可以直接在启动虚拟机的过程中导出设备树二进制文件(DTB)。要在 QEMU 启动时导出 DTB,你可以使用 -machine 选项中的 dumpdtb 参数。以下是一个示例命令:

qemu-system-aarch64 -cpu cortex-a72 -machine virt,gic-version=3,virtualization=on,dumpdtb=cortex-a72-virt.dtb
  • qemu-system-aarch64: 启动 QEMU 的 AArch64(ARM64)模拟器。
  • -cpu cortex-a72: 指定使用 Cortex-A72 CPU。
  • -machine virt: 指定虚拟机的机器类型为 virt。
  • gic-version=3: 设置通用中断控制器(GIC)的版本为 3。
  • virtualization=on: 开启虚拟化支持。
  • dumpdtb=cortex-a72-virt.dtb: 在启动时生成并导出名为 cortex-a72-virt.dtb 的 DTB 文件。

成功启动后,QEMU 会自动将设备树保存为指定的 cortex-a72-virt.dtb 文件。你可以在本地文件系统中找到这个文件,并使用 dtc 工具将其转换为 DTS 文件:

dtc -I dtb -O dts -o cortex-a72-virt.dts cortex-a72-virt.dtb

4 修改dts后重新生成dtb

使用 dtc 命令将修改后的 DTS 文件转换为 DTB 文件。假设你的 DTS 文件名为 modified.dts,可以执行以下命令:

dtc -I dts -O dtb -o output.dtb modified.dts
  • -I dts: 指定输入格式为 DTS。
  • -O dtb: 指定输出格式为 DTB。
  • -o output.dtb: 指定输出的 DTB 文件名。

附上一些有用的资料

devicetree « Documentation - kernel/git/torvalds/linux.git - Linux kernel source tree

Specifications (devicetree.org) 

Device Tree Reference - eLinux.org

Device Tree Usage - eLinux.org

ePAPR 1.1 (elinux.org)

记录点滴,欢迎点赞关注收藏,共同进步 !

### RK3568 I2C控制器使用方法教程 #### 一、I2C通信原理概述 I2C(Inter-Integrated Circuit)总线是一种简单双向二线制同步串行总线,它只需要两根线即可在集成电路之间传送信息。这两条信号线分别是SDA(数据线)和SCL(时钟线)。对于RK3568开发板而言,存在硬件I2C和软件I2C两种实现方式[^1]。 #### 二、Rockchip平台下的I2C配置 ##### (三)硬件I2C驱动设置 针对RK3568这类基于Arm架构的处理器,在Linux操作系统环境下通常会采用内核自带的支持来初始化并操作I2C设备。具体来说,可以通过修改DTS文件定义具体的外设连接关系以及参数配置,从而完成对特定型号I2C控制器的基础设定工作[^4]。 ```bash // 修改对应的.dts文件中的节点描述部分 &i2c0 { pinctrl-names = "default"; pinctrl-0 = <&i2c0_xfer>; status = "okay"; /* 添加要挂载到该I2C总线上面的从机设备 */ }; ``` ##### (四)通过GPIO模拟I2C传输过程 当某些情况下无法利用现成的硬件资源或者为了调试目的而需要临时建立一条新的I2C链路时,则可以考虑借助通用输入/输出端口(GPIO)来进行仿真处理。这种方式虽然效率较低但是灵活性较高,适合用于原型验证阶段或是特殊应用场景下作为备用方案之一[^3]。 #### 三、常见问题排查指南 如果遇到与I2C有关的功能失效现象,可以从以下几个方面入手分析原因: - **检查电源供电状态**:确保所有涉及到的相关电路都处于正常工作电压范围内; - **确认线路连接无误**:仔细核查PCB布局图对照实物连线情况排除短路开路等问题; - **查阅日志记录**:查看系统启动过程中是否有报错提示,并尝试理解其含义以便进一步定位故障源; - **测试工具辅助诊断**:运用逻辑分析仪等专业仪器捕捉实际波形特征并与标准规格对比找出差异之处;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值