内核ACPI函数API之acpi_get_devices
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相关推荐
- 内核ACPI函数API之acpi_reboot
acpi_reboot 这个函数用于写pci/io/memory的相关寄存器让其重启其源码分析如下:void acpi_reboot(void) {struct acpi_generic_addres ...
- 内核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,主 ...
- 内核ACPI函数API之acpi_scan_add_handler
int acpi_scan_add_handler(struct acpi_scan_handler *handler)用于将一个acpi handler添加到acpi_scan_handlers_l ...
- tensorflow函数API总结
tensorflow函数API总结: 首推官网查询 tf.keras.Input:创建输入层 别名: tf.keras.Input tf.keras.layers.Input tf.keras.Inp ...
- HTML5 Audio标签方法和函数API介绍
问说网 > 文章教程 > 网页制作 > HTML5 Audio标签方法和函数API介绍 Audio APIHTML5HTML5 Audio预加载 HTML5 Audio标签方法和函 ...
- php内核函数手册,深入理解PHP内核(五)函数的内部结构,深入理解内部结构
深入理解PHP内核(五)函数的内部结构,深入理解内部结构 php的函数包括用户定义的函数.内部函数(print_r count...).匿名函数.变量函数($func = 'print_r'; $fu ...
- 【小白学习keras教程】八、Sequential Model和模型函数API两种模型建立方法
@Author:Runsen 文章目录 Load dataset Sequential Model API 方法1 方法2 模型函数API 单输入输出 合并图层 1.连接 2. add, subtra ...
- decode函数_「实践」云函数 + API,你也可以做个天气信息系统
为什么要把云函数 SCF 与 API 网关进行结合?本文告诉你答案! 通常,我们用云函数 SCF 写一个函数应用,这个应用可能多种多样.例如之前介绍过的 OJ 系统判题功能,通过 NLP 实现文本摘要 ...
- [tensorflow]tensorflow 2.1 函数API(The Functional API)
目录 1.函数API介绍 2.创建模型 3.训练和评估模型 4.保存模型 5.模型的嵌套 1.函数API介绍 Keras的函数API是一种创建模型的方法,该模型比tf.keras.Sequential ...
最新文章
- “嫦娥上月球挖土”!打破尘封44年的人类历史,中国航天实现“五个首次”...
- Unreal Engine 4 —— 异步加载关卡的实现方法及思考
- 快速配置MPLS ×××
- centos安装xrdp实现远程桌面访问
- java发送http请求的四种方式
- 2_5 BridgeMode.cpp 桥接模式
- win10 x64+anaconda+labelme标注数据
- 【软件开发底层知识修炼】二十四 ABI之函数调用约定
- 易语言取c盘文件夹中的文件被占用,win7系统怎么快速找出文件被什么进程占用|win7解除文件占用的方法...
- 教你些技巧,用 Python 自动化办公做一些有趣的事情 太方便了
- 简单的避免idea自动导入 *
- php 中的关联数组 介绍
- DataGrip之一个赏心悦目的SQL格式化模板,快用起来吧
- 关于IP地址定位、IP查询和IP地址库 你想了解的历史都在这里
- 【外星眼halcon教程】机器视觉测量消费电子显示屏的颜色
- 互补滤波系数_一阶互补滤波
- android手机备份恢复出厂设置,安卓手机恢复出厂设置在哪里?史上最全版恢复过程详解...
- 带你全面了解蓝牙定位原理,蓝牙定位方案种类-新导智能
- MD5校验判断文件是否一样
- 爬取电影天堂的最新电影