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...
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函...
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...
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...








