Linux dts知识

linux kernel component框架分析

Linux component框架

linux reset框架


devicetree-specification-v0.3.pdf

中断子系统-ARM GPIO中断处理流程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

dts入门

i.MX8MPlus中的CLK子系统

[ARM Linux 驱动开发] linux 设备树

of_parse_phandle_with_args函数详解

phandle如dma
在这里插入图片描述
在这里插入图片描述

ti-processor-sdk-linux-j721s2-evm-08_06_00_10\board-support\linux-kernel\drivers\dma\ti\k3-udma.c
	ret = of_dma_controller_register(dev->of_node, udma_of_xlate, ud);
	if (ret) {
		dev_err(dev, "failed to register of_dma controller\n");
		dma_async_device_unregister(&ud->ddev);
	}

调用流程

struct dma_chan *dma_request_chan(struct device *dev, const char *name)

-》

chan = of_dma_request_slave_channel(dev->of_node, name);

-》

if (ofdma) {
			chan = ofdma->of_dma_xlate(&dma_spec, ofdma);
		} else {
			ret_no_channel = -EPROBE_DEFER;
			chan = NULL;
		}

of_dma_xlate初始化的地方
udma_probe-》 ret = of_dma_controller_register(dev->of_node, udma_of_xlate, ud);

static struct dma_chan *udma_of_xlate(struct of_phandle_args *dma_spec,
				      struct of_dma *ofdma)
{
	struct udma_dev *ud = ofdma->of_dma_data;
	dma_cap_mask_t mask = ud->ddev.cap_mask;
	struct udma_filter_param filter_param;
	struct dma_chan *chan;

	if (ud->match_data->type == DMA_TYPE_BCDMA) {
		if (dma_spec->args_count != 3)
			return NULL;

		filter_param.tr_trigger_type = dma_spec->args[0];
		filter_param.remote_thread_id = dma_spec->args[1];
		filter_param.asel = dma_spec->args[2];
		filter_param.atype = 0;
	} else {
		if (dma_spec->args_count != 1 && dma_spec->args_count != 2)
			return NULL;

		filter_param.remote_thread_id = dma_spec->args[0];
		filter_param.tr_trigger_type = 0;
		if (dma_spec->args_count == 2) {
			if (ud->match_data->type == DMA_TYPE_UDMA) {
				filter_param.atype = dma_spec->args[1];
				filter_param.asel = 0;
			} else {
				filter_param.atype = 0;
				filter_param.asel = dma_spec->args[1];
			}
		} else {
			filter_param.atype = 0;
			filter_param.asel = 0;
		}
	}

	chan = __dma_request_channel(&mask, udma_dma_filter_fn, &filter_param,
				     ofdma->of_node);
	if (!chan) {
		dev_err(ud->dev, "get channel fail in %s.\n", __func__);
		return ERR_PTR(-EINVAL);
	}

	return chan;
}
		filter_param.remote_thread_id = dma_spec->args[0];

	dmas = <&main_udmap 0xc640>,
0xc640代表的是remote_thread_id 

其他模块的实现可以搜索

of_xlate

xlate

of_phandle_args
pinctrl_parse_index_with_args

关键字找到

结合设备信息集合,探究设备和驱动是如何绑定的

支持条件编译
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

reg 寄存器
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Devicetree specification

反汇编
dtc -I dtb -O dts -o out.dts …/…/arch/arm/boot/dts/qcom/msm8909-1gb-qrd-skue.dtb

dtc -I dtb -O dts -o out.dts …/…/arch/arm/boot/dts/qcom/msm8909-1gb-mtp.dtb

dts:
node_name@address{
}
两个节点名字可以一样,但是里面的 address不能一样
节点上的地址address只是设备节点本身的地址,并不是cpu的可用地址,即
非根节点上的子节点的address使用的不是cpu的地址域,为了得到一个内存映射地址,设备树必须要指定一个域转换另外一个域的方法,这里用range
range是地址转换的列表,i2c总线下的设备里,缺少range属性,表示此设备不能被此设备的父设备的其他设备访问
根节点始终描述的是 cpu的地址空间
根节点下的子节点已经使用的是 cpu的地址域,所以不需要任何直接映射

#address-cells=<2>;
#size-cells=<1>;

ethernet@0.0{
reg=<0,0,0x100000>
地址有两个cell,其中一个是片选,另一个是片选基地址,即编移是,第三个是大小
}

必须要了解的知识:
在启动过程中传参:
R0:cp#15 control register
R1 :machine ID
R2:atags or pointer-->传到内核_fdt_pointer(lk加载dtb到内存的物理地址)
R3:process ID即进程ID

pbl->sbl1->lk->kernel-ramdisk

kernel中:
start_kernel->set_arch->setup_machine_fdt->
early_init_dt_verify->fdt_check_header检测DTB头部

编译kernel

make kernel

make -C kernel/msm-3.18 O=…/…/out/target/product/msm8909/obj/kernel/msm-3.18 ARCH=arm CROSS_COMPILE=arm-none-gnueabi-

make -C kernel/msm-3.18 O=../../out/target/product/msm8953_64/obj/kernel/msm-3.18 ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android

dtb存储结构
其存储的类型为:
头部header
设备树结构块
字符串-设备节点属性键值对

struct fdt_header {
	uint32_t magic;			 /* magic word FDT_MAGIC */
	uint32_t totalsize;		 /* total size of DT block */
	uint32_t off_dt_struct;		 /* offset to structure */
	uint32_t off_dt_strings;	 /* offset to strings */
	uint32_t off_mem_rsvmap;	 /* offset to memory reserve map */
	uint32_t version;		 /* format version */
	uint32_t last_comp_version;	 /* last compatible version */

	/* version 2 fields below */
	uint32_t boot_cpuid_phys;	 /* Which physical CPU id we're
					    booting on */
	/* version 3 fields below */
	uint32_t size_dt_strings;	 /* size of the strings block */

	/* version 17 fields below */
	uint32_t size_dt_struct;	 /* size of the structure block */
}

这里写图片描述

dts 包含关系
查找dtb.dts.tmp 结尾的文件

在这里插入图片描述
有时发送打开i2c总是打不开,不能生成dtb在文件系统对应的节点
DTBO简介

原来在设置叠加层中关掉了
在这里插入图片描述

在这里插入图片描述
发现启动卡中有了对应的文件,应该是没有去掉或修改才不生效,解决办法,删除对应的dtbo,或修改对应dtbo源文件再替换

在这里插入图片描述
对比生效
在这里插入图片描述
在这里插入图片描述

205000生成
=>
在这里插入图片描述
也可以通过查status状态,来判断实际运行是关闭还是打开(反编译查看dtb查不出来当前是打开还是关闭,因为是运行时被修改了),再搜索是哪里个可疑的文件覆盖了

在这里插入图片描述

setenv name_overlays k3-am62a7-sk-csi2-imx219.dtbo报错
dtbo生成有问题


    fix dtbo set overlay invalid

diff --git a/ti-processor-sdk-linux-am62axx-evm-08.06.00.45/board-support/linux-kernel/scripts/Makefile.lib b/ti-processor-sdk-linux-am62axx-evm-08.06.00.45/board-support/linux-kernel/scripts/Makefile.lib
index 3c62e7670..c5b90339e 100644
--- a/ti-processor-sdk-linux-am62axx-evm-08.06.00.45/board-support/linux-kernel/scripts/Makefile.lib
+++ b/ti-processor-sdk-linux-am62axx-evm-08.06.00.45/board-support/linux-kernel/scripts/Makefile.lib
@@ -320,7 +320,7 @@ $(obj)/%.dtb.S: $(obj)/%.dtb FORCE
 quiet_cmd_dtc = DTC     $@
 cmd_dtc = $(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
        $(DTC) -O $(patsubst .%,%,$(suffix $@)) -o $@ -b 0 \
-               $(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
+               $(addprefix -i,$(dir $<) $(DTC_INCLUDE)) -@ \
                -d $(depfile).dtc.tmp $(dtc-tmp) ; \
        cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值