acpi_bus_get_status这个函数获取acpi_device对应handle的_STA的值,然后将这个值赋值给acpi_device
其使用的例程如下:
if (acpi_bus_get_status(battery->device)) {
ACPI_EXCEPTION((AE_INFO, AE_ERROR, "Evaluating _STA"));
return -ENODEV;
}
其源码分析如下:
int acpi_bus_get_status(struct acpi_device *device)
{
acpi_status status;
unsigned long long sta;
#如果这个设备已经不再了,则设置这个acpi_device的状态为ACPI_STA_DEFAULT后退出
if (acpi_device_always_present(device)) {
acpi_set_device_status(device, ACPI_STA_DEFAULT);
return 0;
}
/* Battery devices must have their deps met before calling _STA */
#对电池设备特殊对待
if (acpi_device_is_battery(device) && device->dep_unmet) {
acpi_set_device_status(device, 0);
return 0;
}
#获得acpi_device对应handle的sta的状态
status = acpi_bus_get_status_handle(device->handle, &sta);
if (ACPI_FAILURE(status))
return -ENODEV;
#将sta的值赋值给acpi_device
acpi_set_device_status(device, sta);
if (device->status.functional && !device->status.present) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: "
"functional but not present;\n",
device->pnp.bus_id, (u32)sta));
}
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n",
device->pnp.bus_id, (u32)sta));
return 0;
}
我们看看如果通过handle 拿到sta的状态,原来就是直接获取bios提供的_STA 这个整形值
acpi_status acpi_bus_get_status_handle(acpi_handle handle,
unsigned long long *sta)
{
acpi_status status;
status = acpi_evaluate_integer(handle, "_STA", NULL, sta);
if (ACPI_SUCCESS(status))
return AE_OK;
if (status == AE_NOT_FOUND) {
*sta = ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED |
ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING;
return AE_OK;
}
return status;
}
所以从这里知道acpi_device 对应的status是和其hanlde的_STA 值是相等的。
内核ACPI函数API之acpi_bus_get_status
最新推荐文章于 2021-05-01 15:50:06 发布