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");}
button
[TOC] common/button_cmd.c 在执行到这里的时候,按键必须已经按下;代码没有循环与延时 且只能处理一个按键,不支持多个按键同时按下 使用时,需要在env中设置button_cmd_N_name= 和button_cmd_N=fastboot usb 0(执行的CMD命令) 参考test/dm/button.c中的button_cmd测试的用法 123456789101112131415void process_button_cmds(void){ struct button_cmd cmd = {0}; int i = 0; while (get_button_cmd(i++, &cmd) && i < MAX_BTN_CMDS) { if (!cmd.pressed) continue; log_info("BTN '%s'> %s\n", cmd.btn_name, cmd.cmd); run_co...
adc
[TOC] stm32-adc-core.c驱动信息12345678910111213static const struct udevice_id stm32_adc_core_ids[] = { { .compatible = "st,stm32h7-adc-core" }, { .compatible = "st,stm32mp1-adc-core" }, {}};U_BOOT_DRIVER(stm32_adc_core) = { .name = "stm32-adc-core", .id = UCLASS_SIMPLE_BUS, .of_match = stm32_adc_core_ids, .probe = stm32_adc_core_probe, .priv_auto = sizeof(struct stm32_adc_common),}; stm32_adc_core_probe 获取 base 地址 ...
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 设备扫描并绑定...
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函...
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...
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 ...
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...
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);...








