clock
[TOC] clk-uclass.cclk_get_by_indexclk_get_by_index_nodev 通过phandle索引到clocks设备节点,并转换客户端的设备树 (OF) 时钟说明符。1234567891011int clk_get_by_index_nodev(ofnode node, int index, struct clk *clk){ struct ofnode_phandle_args args; int ret; //从节点的phandle索引到clocks设备节点 ret = ofnode_parse_phandle_with_args(node, "clocks", "#clock-cells", 0, index, &args); //转换客户端的设备树 (OF) 时钟说明符。 return clk_get_by_index_tail(ret, node, &args, "clocks", index, clk);...
core
[TOC] 驱动初始化及绑定与探测流程 存储在段中的驱动设备信息 初始化驱动模型结构,初始化根节点 从FDT中扫描设备并绑定到根节点 绑定后分配设备私有数据大小,与注册设备数据driver_data 绑定设备到父设备与uclass上 绑定后探测根节点下的子设备和子设备的子设备 总结如下: 扫描FDT的设备并与driver的compatible匹配后,进行绑定与挂载到父设备与根节点上 使用malloc分配设备使用的私有数据,并设置设备的driver_data 绑定后执行设备识别device_probe函数,顺序根据注册的顺序执行,注册顺序为FDT节点的顺序;1 设备绑定分为重定向之前绑定和重定向之后绑定, 重定向之前需要绑定的设备FDT节点中需要具有bootph-all或bootph-some-ram,bootph-pre-ram,bootph-pre-sram属性,且设备驱动信息flag中需要有DM_FLAG_PRE_RELOC标志 否则都是重定向之后绑定 dm_init_and_scandm_init 初始化驱动模型结构,初始化根节点dm_scan 设备扫描并绑定...
i2c
[TOC] i2c-uclass.ci2c_post_bind 扫描并绑定子节点1234567891011static int i2c_post_bind(struct udevice *dev){ int ret = 0; debug("%s: %s, seq=%d\n", __func__, dev->name, dev_seq(dev));#if CONFIG_IS_ENABLED(OF_REAL) ret = dm_scan_fdt_dev(dev);#endif return ret;} i2c_pre_probe 读取u-boot,i2c-transaction-bytes的值12345678910111213141516171819202122static int i2c_pre_probe(struct udevice *dev){#if CONFIG_IS_ENABLED(OF_REAL) struct dm_i2c_bus *i2c = dev_get_uclass_priv(dev); unsigne...
dts
[TOC] 驱动代码编写UCLASS_DRIVER 驱动类定义 一个驱动的大类的注册定义;例如serial驱动类,包括多个不同平台的串口设备驱动 1234567891011121314151617181920212223242526272829struct uclass_driver { const char *name;//debug查看用 enum uclass_id id;//所以相同驱动类设备的ID都一样 int (*post_bind)(struct udevice *dev); //设备绑定后的回调(device_bind_common调用) int (*pre_unbind)(struct udevice *dev); //设备绑定前的回调(device_bind_common调用) int (*pre_probe)(struct udevice *dev); //设备探测后的回调函数(device_probe函数中调用) int (*post_probe)(struct udevice *dev); //设备探测前的回调函数(device_probe函...
bootz
[TOC] bootz12345678910111213141516171819U_BOOT_LONGHELP(bootz, "[addr [initrd[:size]] [fdt]]\n" " - boot Linux zImage stored in memory\n" "\tThe argument 'initrd' is optional and specifies the address\n" "\tof the initrd in memory. The optional argument ':size' allows\n" "\tspecifying the size of RAW initrd.\n"#if defined(CONFIG_OF_LIBFDT) "\tWhen booting a Linux kernel which requires a flat device-tree\n" &quo...
ram
[TOC] ram-uclass.c类信息1234UCLASS_DRIVER(ram) = { .id = UCLASS_RAM, .name = "ram",}; stm32_sdram.c驱动信息123456789U_BOOT_DRIVER(stm32_fmc) = { .name = "stm32_fmc", .id = UCLASS_RAM, .of_match = stm32_fmc_ids, .ops = &stm32_fmc_ops, .of_to_plat = stm32_fmc_of_to_plat, .probe = stm32_fmc_probe, .plat_auto = sizeof(struct stm32_sdram_params),}; dts1234567891011121314151617fmc@52004000 { compatible = "st,stm32h7-fmc"; reg = <0x52004000 ...
regulator
[TOC] regulator-uclass.c类信息12345678UCLASS_DRIVER(regulator) = { .id = UCLASS_REGULATOR, .name = "regulator", .post_bind = regulator_post_bind, .pre_probe = regulator_pre_probe, .post_probe = regulator_post_probe, .per_device_plat_auto = sizeof(struct dm_regulator_uclass_plat),}; regulator_post_bind 读取设备属性用于设置设备属性,并检查设备是否是DM设备中唯一的12345678910111213141516171819202122232425262728293031323334static int regulator_post_bind(struct udevice *dev){ struct dm_regulator_uclass...
reset
[TOC] reset-uclass.creset_get_by_index123456789101112int reset_get_by_index(struct udevice *dev, int index, struct reset_ctl *reset_ctl){ struct ofnode_phandle_args args; int ret; //寻找当前节点的`resets`的phandle索引,内容为`#reset-cells`的设备节点 ret = dev_read_phandle_with_args(dev, "resets", "#reset-cells", 0, index, &args); return reset_get_by_index_tail(ret, dev_ofnode(dev), &args, "resets", index > 0, reset_ctl);} reset_get_by...
serial
[TOC] serial-uclass.cserial_init 初始化串口 注意DM已初始化完成 serial_init 在relocation前调用 serial_initialize 在relocation后调用 1234567891011121314/* Called after relocation */int serial_initialize(void){ /* Scanning uclass to probe devices */ if (IS_ENABLED(CONFIG_SERIAL_PROBE_ALL)) { int ret; //探测所有的串口设备 ret = uclass_probe_all(UCLASS_SERIAL); if (ret) return ret; } return serial_init();} 123456789101112131415161718192021222324252627282930/* Called prior to relocation */i...
simple-bus
[TOC] simple-bus驱动信息 在重定向之前调用123456789101112131415161718192021UCLASS_DRIVER(simple_bus) = { .id = UCLASS_SIMPLE_BUS, .name = "simple_bus", .post_bind = simple_bus_post_bind, .per_device_plat_auto = sizeof(struct simple_bus_plat),};#if CONFIG_IS_ENABLED(OF_REAL)static const struct udevice_id generic_simple_bus_ids[] = { { .compatible = "simple-bus" }, { .compatible = "simple-mfd" }, { }};#endifU_BOOT_DRIVER(simpl...








