of_device_is_available怎么使用
时间: 2023-08-03 17:03:08 浏览: 142
of_device_is_available函数是用于检查某个设备节点是否可用的函数,它的使用需要传入一个设备节点的指针,函数返回一个布尔值,表示该设备节点是否可用。
在Linux内核中,可以通过以下方式使用of_device_is_available函数:
1. 头文件引入
```c
#include <linux/of.h>
```
2. 调用函数
```c
struct device_node *node; // 设备节点指针
if (of_device_is_available(node)) {
// 设备可用
} else {
// 设备不可用
}
```
需要注意的是,of_device_is_available函数只能检查设备节点是否可用,并不能判断设备是否存在或者是否已经被占用。如果需要判断设备是否存在或者是否已经被占用,需要使用其他的函数进行检查。
相关问题
解释一下高通DRM显示框架的这段代码struct drm_panel *of_drm_find_panel(const struct device_node *np) { struct drm_panel *panel; if (!of_device_is_available(np)) { printk("find panel 1 failed --------wxy\n"); return ERR_PTR(-ENODEV); } mutex_lock(&panel_lock); list_for_each_entry(panel, &panel_list, list) { if (panel->dev->of_node == np) { printk("find panel 2 success--------wxy\n"); mutex_unlock(&panel_lock); return panel; } } mutex_unlock(&panel_lock); return ERR_PTR(-EPROBE_DEFER); }
这段代码实现了一个函数 `of_drm_find_panel`,它的作用是在DRM系统中寻找并返回一个与给定设备节点(`np`)对应的DRM面板(`struct drm_panel`)。具体实现如下:
- 首先检查给定设备节点是否可用(`of_device_is_available(np)`),如果不可用则返回一个错误指针并打印一条错误信息。
- 获取全局互斥锁(`panel_lock`),以防止多个线程同时对DRM面板列表进行访问。
- 遍历DRM面板列表(`panel_list`),对于每个DRM面板:
- 判断该面板的设备节点是否与给定设备节点相同(`panel->dev->of_node == np`)。
- 如果相同,则返回该面板,并释放全局互斥锁。
- 如果不同,则继续寻找下一个DRM面板。
- 遍历完整个DRM面板列表后,仍未找到与给定设备节点对应的DRM面板,则释放全局互斥锁并返回一个错误指针,表示该设备节点对应的DRM面板还没有被探测到。
其中,打印的调试信息主要是为了方便开发者调试使用,可以根据需要进行删除或修改。
bool ringActiveLocally = outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_RING), 0); // - for STRATEGY_SONIFICATION and ringtone active: // if SPEAKER was selected, and SPEAKER_SAFE is available, use SPEAKER_SAFE instead // - for STRATEGY_SONIFICATION_RESPECTFUL: // if no media is playing on the device, check for mandatory use of "safe" speaker // when media would have played on speaker, and the safe speaker path is available if (strategy == STRATEGY_SONIFICATION || ringActiveLocally || (strategy == STRATEGY_SONIFICATION_RESPECTFUL && !mediaActiveLocally)) { devices.replaceDevicesByType( AUDIO_DEVICE_OUT_SPEAKER, availableOutputDevices.getDevicesFromType( AUDIO_DEVICE_OUT_SPEAKER_SAFE)); } } break; case STRATEGY_CALL_ASSISTANT: devices = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_TELEPHONY_TX); break; case STRATEGY_NONE: // Happens when internal strategies are processed ("rerouting", "patch"...) break; default: ALOGW("%s unknown strategy: %d", __func__, strategy); break;
这段代码是关于选择输出设备的具体实现。首先,代码会根据当前的策略类型(`strategy`)和铃声是否正在播放(`ringActiveLocally`),选择是否要使用“safe”扬声器。如果当前策略是`STRATEGY_SONIFICATION`或者铃声正在播放,那么会尝试使用“safe”扬声器来输出声音,这是为了避免铃声等声音过大,导致设备损坏。其次,如果当前策略是`STRATEGY_SONIFICATION_RESPECTFUL`,并且没有其他媒体正在播放,那么也会尝试使用“safe”扬声器来输出声音。最后,根据不同的策略类型,会选择不同的输出设备。如果当前策略是`STRATEGY_CALL_ASSISTANT`,则会选择电话扬声器(`AUDIO_DEVICE_OUT_TELEPHONY_TX`),如果是`STRATEGY_NONE`,则不需要进行任何操作。如果策略类型不是以上任何一种,则会输出一个警告信息。