DM(Driver Model)的作用就是把"设备"和"驱动"解耦,并提供统一的设备管理框架,如而 CLK、GPIO、SPI、I2C、MMC、USB 都只是运行在 DM 框架上的一个UCLASS。
DM 初始化入口:
scss
dm_init()
dm_uninit()
dm_init_and_scan()
dm_scan_plat()
dm_scan_fdt()
dm_scan_other()
作用:
初始化 DM 根结构
初始化 uclass_root
扫描平台设备
扫描设备树
开始 bind 设备
UCLASS 管理函数:
uclass_get()
uclass_find()
uclass_destroy()
uclass_add()
uclass_bind_device()
uclass_unbind_device()
uclass_find_device()
uclass_get_device()
uclass_first_device()
uclass_next_device()
uclass_first_device_err()
uclass_next_device_err()
作用:
根据 UCLASS_ID 找 struct uclass
创建 struct uclass
把 udevice 挂到 uc->dev_head
遍历某个 uclass 下的所有设备
DEVICE 绑定和 Probe 函数
device_bind()
device_bind_driver()
device_bind_driver_to_node()
device_bind_by_name()
device_bind_common()
device_probe()
device_remove()
device_unbind()
device_get_child()
device_find_child()
device_find_first_child()
device_find_next_child()
device_find_global_by_ofnode()
作用:
创建 struct udevice
设置 dev->driver
设置 dev->uclass
设置 dev->parent
挂到父设备 child_head
挂到 uclass->dev_head
执行 probe/remove/unbind
Linker List / Driver 查找函数
lists_uclass_lookup()
lists_driver_lookup_name()
lists_bind_fdt()
lists_bind_drivers()
作用:
从 __u_boot_list_2_uclass_driver 找 uclass_driver
从 __u_boot_list_2_driver 找 driver
根据 compatible 匹配 U_BOOT_DRIVER
绑定设备树节点
udevice 私有数据函数
dev_get_priv()
dev_get_plat()
dev_get_uclass_priv()
dev_get_parent_priv()
dev_get_parent_plat()
dev_get_driver_data()
作用:
获取 driver 私有数据
获取 plat 数据
获取 uclass 私有数据
获取父设备私有数据
获取 of_match.data
