首页 > 其他分享 >boot驱动模型中的常用API--Apple的学习笔记

boot驱动模型中的常用API--Apple的学习笔记

时间:2023-10-16 22:05:49浏览次数:34  
标签:__ Apple -- boot list uclass dev id uc

一,前言

之前解决ping问题的过程中,需要看uboot的代码,感觉看起来很轻松,我一直觉得代码写的小学生都能看懂的,这才是高手写的代码。面向对象设计的好,封装做的也好。虽然和qemu的Qobject设计雷同,但是我又手痒想画图了。

二,学习

boot驱动模型中的常用API--Apple的学习笔记_uboot

1,uclass_find(id)

根据uclass id来找uclass。在gd->uclass_root中循环扫描,uc->uc_drv->id与id值进行比较

list_for_each_entry(uc, gd->uclass_root, sibling_node) {

        if (uc->uc_drv->id == key)

            return uc;

}

2,lists_uclass_lookup(id)

根据id来找uclass_driver,里面开头居然用了段地址。u_boot_list_2_为前缀,1为后缀,代表段开始。进行依次扫描,判断if (entry->id == id)就找到了。

#define ll_entry_start(_type, _list)                    \

({                                  \

    static char start[0] __aligned(CONFIG_LINKER_LIST_ALIGN)    \

        __attribute__((unused))                 \

        __section(".u_boot_list_2_"#_list"_1");         \

    (_type *)&start;                        \

})

还有一个end的宏,里面也用了段地址结尾。u_boot_list_2_为前缀,3为后缀,代表段结束

#define ll_entry_end(_type, _list)                  \

({                                  \

    static char end[0] __aligned(4) __attribute__((unused))     \

        __section(".u_boot_list_2_"#_list"_3");         \

    (_type *)&end;                          \

})

ll_entry_declare用来定义的,猜测都是知道,2为后缀,代表段中的内容。

3,lists_driver_lookup_name与lists_uclass_lookup雷同,都是利用段地址范围来扫描的。

boot驱动模型中的常用API--Apple的学习笔记_uboot_02

4,uclass_find_device(UCLASS_AHCI, 0, &dev);通过uclass的dev_head开始扫描找到dev。

uclass_foreach_dev(dev, uc) {

        if (!index--) {

            *devp = dev;

            return 0;

        }

5,看到很多uclass_find_device_byxxx,对应到udevice中有很多属性,name,seq,ofnode等等,这类api就是先通过uclass找到udevice然后和udevice中的属性对比。因为一般一个uclass可以有多个udevice。

boot驱动模型中的常用API--Apple的学习笔记_uboot_03

三,小结

我喜欢通过画图来学习结构体对象,这样更有面向对象的设计感。

标签:__,Apple,--,boot,list,uclass,dev,id,uc
From: https://blog.51cto.com/AppleCai/7893978

相关文章

  • 10月奥森徒步走活动
    我是卢松松,点点上面的头像,欢迎关注我哦!10月15日,北京奥森公园徒步走小聚会结束了。这次一共有15位朋友参与,为什么是15个人呢?因为酒店包厢吃饭是15个座位。这次小聚认识了不少新朋友,同时也促进了几个合作。松松经常说,线上谈十次,不如线下见一面!带着对未来的一丝迷茫和憧憬,于是在这个......
  • 函数指针变量
    函数指针变量函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调用函数intadd(intx,inty){ returnx+y;}intmain(){ printf("%p\n",&add); printf("%p\n",add); return0;}函数是有地址的,add的地址和&add的地址一致说明函数名就是函数的地址将函数的地址......
  • 提示-bash telnet command not found的解决方法
    Linuxcentos运行telnet命令,出现下面的错误提示:[root@localhost~]#telnet127.0.0.1-bash:telnet:commandnotfound解决方法:安装telnet服务centos、ubuntu安装telnet命令的方法.yumlisttelnet*列出telnet相关的安装包yuminstalltelnet-server......
  • CentOS7系统安装jdk1.8
    1、下载jdk安装包打开jdk下载地址,找到linux下64位的安装包,点击下载(注意此步骤需要注册Oracle账号并登录2、将安装包上传至服务器3、解压tar-zxvfjdk-8u331-linux-x64.tar.gz4、将解压文件夹移动至/usr/local/目录下mvjdk1.8.0_331/usr/local/5、配置环境变量vi/etc/profil......
  • 麒麟KYLINOS2303上通过模板设置电源
    hello,大家好啊,今天给大家带来一篇在麒麟kylinOS2303上通过模板设置电源的文章,主要通过开机启动脚本实现,开机脚本内容主要为gsettings的设置,关于gestating的相关信息,请大家自行查阅相关资料获取。1、查看系统信息pdsyw@pdsyw-pc:~/桌面$cat/etc/.kyinfo[dist]name=Kylinmiles......
  • 使用NSSM将server注册为windows系统服务说明
    1、如果server目录下有regServerService.bat批处理脚本,直接点击运行就自动注册为系统服务了,完成后在系统服务启动wgcloud-server-release,如果正在窗口模式运行server,那先关闭运行窗口如果没有这个批处理脚本,则继续往下看2、下载nssm-2.24-101-g897c7ad.zip,若已下载过,请忽略3、解压n......
  • 使用NSSM将server注册为windows系统服务说明
    1、如果server目录下有regServerService.bat批处理脚本,直接点击运行就自动注册为系统服务了,完成后在系统服务启动wgcloud-server-release,如果正在窗口模式运行server,那先关闭运行窗口如果没有这个批处理脚本,则继续往下看2、下载nssm-2.24-101-g897c7ad.zip,若已下载过,请忽略3、解压n......
  • 使用NSSM将server注册为windows系统服务说明
    1、如果server目录下有regServerService.bat批处理脚本,直接点击运行就自动注册为系统服务了,完成后在系统服务启动wgcloud-server-release,如果正在窗口模式运行server,那先关闭运行窗口如果没有这个批处理脚本,则继续往下看2、下载nssm-2.24-101-g897c7ad.zip,若已下载过,请忽略3、解压n......
  • 使用NSSM将server注册为windows系统服务说明
    1、如果server目录下有regServerService.bat批处理脚本,直接点击运行就自动注册为系统服务了,完成后在系统服务启动wgcloud-server-release,如果正在窗口模式运行server,那先关闭运行窗口如果没有这个批处理脚本,则继续往下看2、下载nssm-2.24-101-g897c7ad.zip,若已下载过,请忽略3、解压n......
  • tomcat下 删除webapps和work下面的项目后,tomcat启动报错
    常常在开发时,多个项目挂在一个Tomcat下,但是后续想把个别项目从Tomcat移除的时候发现,Tomcat执行报错.我咱们只需要找到打开此文件后,找到找到这些你已经删除的项目,有多少删多少,再重新启动Tomcat就不会报错了......