acpi_get_devices(const char *HID, acpi_walk_callback user_function,   void *context, void **return_value) 根据形参指定的参数返回一个acpi_device,其中的HID 可能为null
其源码分析如下:acpi_status
acpi_get_devices(const char *HID,acpi_walk_callback user_function,void *context, void **return_value)
{acpi_status status;struct acpi_get_devices_info info;ACPI_FUNCTION_TRACE(acpi_get_devices);/* Parameter validation */#可以看到形参hid可以为null,但是user_function 不能为nullif (!user_function) {return_ACPI_STATUS(AE_BAD_PARAMETER);}/** We're going to call their callback from OUR callback, so we need* to know what it is, and their context parameter.*/#用形参给info赋值info.hid = HID;info.context = context;info.user_function = user_function;/** Lock the namespace around the walk.* The namespace will be unlocked/locked around each call* to the user function - since this function* must be allowed to make Acpi calls itself.*/status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);if (ACPI_FAILURE(status)) {return_ACPI_STATUS(status);}#开始从root 遍历所有类型为device的设备,来匹配info中的信息以寻找对应的acpi_device,结果保存在return_value中返回status = acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,acpi_ns_get_device_callback, NULL,&info, return_value);(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);return_ACPI_STATUS(status);
}我们继续看看acpi_ns_walk_namespace 中为查找acpi_device所有的callback函数
static acpi_status
acpi_ns_get_device_callback(acpi_handle obj_handle,u32 nesting_level,void *context, void **return_value)
{struct acpi_get_devices_info *info = context;acpi_status status;struct acpi_namespace_node *node;u32 flags;struct acpi_pnp_device_id *hid;struct acpi_pnp_device_id_list *cid;u32 i;u8 found;int no_match;status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);if (ACPI_FAILURE(status)) {return (status);}#检查handle是否有效node = acpi_ns_validate_handle(obj_handle);status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);if (ACPI_FAILURE(status)) {return (status);}if (!node) {return (AE_BAD_PARAMETER);}#search acpi_device分为两种情况,首先查找HID,如果没有查找到HID或者HID 为null,则开始执行user function查找if (info->hid != NULL) {#得到node的hidstatus = acpi_ut_execute_HID(node, &hid);if (status == AE_NOT_FOUND) {return (AE_OK);} else if (ACPI_FAILURE(status)) {return (AE_CTRL_DEPTH);}#hid就是一个字符串,这里通过strcmp比较字符串是否相等no_match = strcmp(hid->string, info->hid);ACPI_FREE(hid);#如果hid没有找到,则继续找cid,从for循环可以看出一个hid可以对应多个cidif (no_match) {/** HID does not match, attempt match within the* list of Compatible IDs (CIDs)*/status = acpi_ut_execute_CID(node, &cid);if (status == AE_NOT_FOUND) {return (AE_OK);} else if (ACPI_FAILURE(status)) {return (AE_CTRL_DEPTH);}/* Walk the CID list */#遍历所有的cidfound = FALSE;for (i = 0; i < cid->count; i++) {if (strcmp(cid->ids[i].string, info->hid) == 0) {/* Found a matching CID */found = TRUE;break;}}ACPI_FREE(cid);if (!found) {return (AE_OK);}}}/* Run _STA to determine if device is present */#如果hid和cid 都没有匹配,则执行STA 来判断这个device是否存在status = acpi_ut_execute_STA(node, &flags);if (ACPI_FAILURE(status)) {return (AE_CTRL_DEPTH);}if (!(flags & ACPI_STA_DEVICE_PRESENT) &&!(flags & ACPI_STA_DEVICE_FUNCTIONING)) {/** Don't examine the children of the device only when the* device is neither present nor functional. See ACPI spec,* description of _STA for more information.*/return (AE_CTRL_DEPTH);}/* We have a valid device, invoke the user function */#hid和cid 都没有匹配,而且STA返回ok的话,则执行用户指定的user_function来继续查找acpi_devicestatus = info->user_function(obj_handle, nesting_level,info->context, return_value);return (status);
}

内核ACPI函数API之acpi_get_devices相关推荐

  1. 内核ACPI函数API之acpi_reboot

    acpi_reboot 这个函数用于写pci/io/memory的相关寄存器让其重启其源码分析如下:void acpi_reboot(void) {struct acpi_generic_addres ...

  2. 内核ACPI函数API之acpi_bind_one和acpi_unbind_one

    int acpi_bind_one(struct device *dev, struct acpi_device *acpi_dev)用于将一个acpi_dev和dev在sys中建立symlink,主 ...

  3. 内核ACPI函数API之acpi_scan_add_handler

    int acpi_scan_add_handler(struct acpi_scan_handler *handler)用于将一个acpi handler添加到acpi_scan_handlers_l ...

  4. tensorflow函数API总结

    tensorflow函数API总结: 首推官网查询 tf.keras.Input:创建输入层 别名: tf.keras.Input tf.keras.layers.Input tf.keras.Inp ...

  5. HTML5 Audio标签方法和函数API介绍

     问说网 > 文章教程 > 网页制作 > HTML5 Audio标签方法和函数API介绍 Audio APIHTML5HTML5 Audio预加载 HTML5 Audio标签方法和函 ...

  6. php内核函数手册,深入理解PHP内核(五)函数的内部结构,深入理解内部结构

    深入理解PHP内核(五)函数的内部结构,深入理解内部结构 php的函数包括用户定义的函数.内部函数(print_r count...).匿名函数.变量函数($func = 'print_r'; $fu ...

  7. 【小白学习keras教程】八、Sequential Model和模型函数API两种模型建立方法

    @Author:Runsen 文章目录 Load dataset Sequential Model API 方法1 方法2 模型函数API 单输入输出 合并图层 1.连接 2. add, subtra ...

  8. decode函数_「实践」云函数 + API,你也可以做个天气信息系统

    为什么要把云函数 SCF 与 API 网关进行结合?本文告诉你答案! 通常,我们用云函数 SCF 写一个函数应用,这个应用可能多种多样.例如之前介绍过的 OJ 系统判题功能,通过 NLP 实现文本摘要 ...

  9. [tensorflow]tensorflow 2.1 函数API(The Functional API)

    目录 1.函数API介绍 2.创建模型 3.训练和评估模型 4.保存模型 5.模型的嵌套 1.函数API介绍 Keras的函数API是一种创建模型的方法,该模型比tf.keras.Sequential ...

最新文章

  1. “嫦娥上月球挖土”!打破尘封44年的人类历史,中国航天实现“五个首次”...
  2. Unreal Engine 4 —— 异步加载关卡的实现方法及思考
  3. 快速配置MPLS ×××
  4. centos安装xrdp实现远程桌面访问
  5. java发送http请求的四种方式
  6. 2_5 BridgeMode.cpp 桥接模式
  7. win10 x64+anaconda+labelme标注数据
  8. 【软件开发底层知识修炼】二十四 ABI之函数调用约定
  9. 易语言取c盘文件夹中的文件被占用,win7系统怎么快速找出文件被什么进程占用|win7解除文件占用的方法...
  10. 教你些技巧,用 Python 自动化办公做一些有趣的事情 太方便了
  11. 简单的避免idea自动导入 *
  12. php 中的关联数组 介绍
  13. DataGrip之一个赏心悦目的SQL格式化模板,快用起来吧
  14. 关于IP地址定位、IP查询和IP地址库 你想了解的历史都在这里
  15. 【外星眼halcon教程】机器视觉测量消费电子显示屏的颜色
  16. 互补滤波系数_一阶互补滤波
  17. android手机备份恢复出厂设置,安卓手机恢复出厂设置在哪里?史上最全版恢复过程详解...
  18. 带你全面了解蓝牙定位原理,蓝牙定位方案种类-新导智能
  19. MD5校验判断文件是否一样
  20. 爬取电影天堂的最新电影

热门文章

  1. python获取实时基金数据由银河证券提供_我用Python写了个金融数据爬虫,半小时干了组里实习生一周的工作量...
  2. 中国5G、新能源汽车领先全球,将引领第四次工业革命
  3. 分类模型之混淆矩阵(Confusion Matrix)
  4. 分布式开发最全的解决方案
  5. 大时钟暗物质云计算机,超级计算机历时3月模拟宇宙140亿年演化
  6. DIY服务器相关资料
  7. 大数据离线集群数据迁移实战项目
  8. 为什么要设置软件项目经理这个职位?
  9. HCIE-RS 论述题 组播地址的处理方式
  10. 动手学数据分析Task05:模型的建立与评估