• uboot DM驱动注册与初始化


    简介

    uboot是如何实现在不同的文件中调用U_BOOT_DRIVER(name)接口注册驱动,就可以在初始化时找到对应驱动进行初始化。

    注册驱动

    API:U_BOOT_DRIVER(name)

    /* Declare a new U-Boot driver */
    #define U_BOOT_DRIVER(__name)						\
    	ll_entry_declare(struct driver, __name, driver)
    
    #define ll_entry_declare(_type, _name, _list)				\
    	_type _u_boot_list_2_##_list##_2_##_name __aligned(4)		\
    			__attribute__((unused))				\
    			__section(".u_boot_list_2_"#_list"_2_"#_name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将驱动结构体编译为名称带有u_boot_list_2的段,查看u-boot.map可以看到

     .u_boot_list_2_driver_2_ccf_clk_divider
                    0x0000000093e805a0       0x78 drivers/clk/clk-divider.o
                    0x0000000093e805a0                _u_boot_list_2_driver_2_ccf_clk_divider
     .u_boot_list_2_driver_2_ccf_clk_mux
                    0x0000000093e80618       0x78 drivers/clk/clk-mux.o
                    0x0000000093e80618                _u_boot_list_2_driver_2_ccf_clk_mux
     .u_boot_list_2_driver_2_clk_composite
                    0x0000000093e80690       0x78 drivers/clk/clk-composite.o
                    0x0000000093e80690                _u_boot_list_2_driver_2_clk_composite
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过上述的过程,可以将每个注册的驱动分为不同的段,但是在运行时如何遍历找到所有的驱动段呢?
    看到上面的u_boot_list_2_driver_2,对这个2有没有点奇怪,为什么是2,而不是其它值。
    uboot找到注册驱动代码段的方法就是,设置一个驱动段的起始标记,再设置一个结束标记,通过查看u-boot.map看到,在注册驱动的起始处有.u_boot_list_2_driver_1段,在结束处有u_boot_list_2_uclass_driver_3段。
    那怎么确保.u_boot_list_2_driver_1一定在起始处,u_boot_list_2_uclass_driver_3一定在结束处。方法是通过链接脚本实现

     30  . = ALIGN(8);
     31  . = .;
     32  . = ALIGN(8);
     33  .u_boot_list : {
     34   KEEP(*(SORT(.u_boot_list*)));
     35  }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中,KEEP((SORT(.u_boot_list)));可以将名称前缀为u_boot_list的段进行排序,因此.u_boot_list_2_driver_1会排最前面,u_boot_list_2_driver_2_xx排在中间,.u_boot_list_2_driver_1排在最后。

  • 相关阅读:
    常用排序算法总结对比
    怎么在树莓派上搭建web网站,并发布到外网可访问?
    四大类好用的科研工具分享
    再探格林公式、斯托克斯公式、高斯公式
    【Opencv】-----倾斜图片转正
    React v5向路由组件传参
    洁净室/净化车间:洁净等级划分及标准、检测方法及流程解读
    SQL 注入复习总结
    【C++】C/C++内存管理
    Kotlin笔记(二):标准函数,静态方法,延迟初始化,密封类
  • 原文地址:https://blog.csdn.net/abc4764/article/details/126213825