Linux dts知识


devicetree-specification-v0.3.pdf

[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关键字找到

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

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

在这里插入图片描述

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=
;
#size-cells=

;

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'rebooting 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查不出来当前是打开还是关闭,因为是运行时被修改了),再搜索是哪里个可疑的文件覆盖了

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部