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...
pinctrl
[TOC] pinctrl-uclass.cpinctrl_post_bind 以递归方式将其子项绑定为 pinconfig属性的 设备pinctrl_select_state pin选择状态并配置pinctrl_select_state_simple pin选择状态并配置1234567891011121314151617181920212223242526static int pinctrl_select_state_simple(struct udevice *dev){ struct udevice *pctldev; struct pinctrl_ops *ops; int ret; /* * 对于大多数系统,只有一个 pincontroller 设备。但在 * 在多个 pincontroller 设备的情况下,探测序列 * 数字 0(由 alias 定义)以避免争用条件。 */ ret = uclass_get_device_by_seq(UCLASS_PINCTRL, 0, &pctldev); if (ret) /* if not fou...
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 ...
export
exports.cjumptable_init malloc分配jt_funcs结构体,并将函数指针赋值给jt_funcs结构体 jt_funcs结构体中的函数指针是在_exports.h中定义的 这些函数在u-boot中是代码段中的函数,在u-boot中是通过函数指针调用的 jt跳转表包含指向导出函数的指针。指向跳转表将传递给独立应用程序。 123456789101112131415161718192021EXPORT_FUNC(get_version, unsigned long, get_version, void)EXPORT_FUNC(getchar, int, getc, void)EXPORT_FUNC(tstc, int, tstc, void)EXPORT_FUNC(putc, void, putc, const char)EXPORT_FUNC(puts, void, puts, const char *)struct jt_funcs {#define EXPORT_FUNC(impl, res, func, ...) res(*func)(__...
main
main.c123456789101112131415161718192021/* We come here after U-Boot is initialised and ready to process commands */void main_loop(void){ const char *s; bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop"); cli_init(); s = bootdelay_process(); //获取启动延迟时间 //从FDT中获取命令行参数 if (cli_process_fdt(&s)) //设置了bootsecure执行; //不使用命令行,避免被攻击 cli_secure_boot_cmd(s); //自动启动命令 autoboot_command(s); //命令行循环 cli_loop(); panic("No CLI available");}
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函...
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...
spi
[TOC] spi-uclass.c.post_bind dm_scan_fdt_devspi_child_post_bind 子节点绑定到总线123456789static int spi_child_post_bind(struct udevice *dev){ struct dm_spi_slave_plat *plat = dev_get_parent_plat(dev); if (!dev_has_ofnode(dev)) return 0; return spi_slave_of_to_plat(dev, plat);} spi_slave_of_to_plat 获取spi设备的属性1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374int spi_slave_of_to_plat(struct udevice *dev,...