Linux component框架
linux reset框架
devicetree-specification-v0.3.pdf
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 寄存器
反汇编
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生成
=>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7808f61dc8817f722618adf6dd5fc2c8.png)
也可以通过查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)