1:当hdmi插入的时候,hdmi驱动会上报一个中断上来,在驱动中会发送一个Uevent给上层。
“/sys/class/switch/hdmi/state” 这个节点会由0变成1
2:在HWC中,启动的时候就开启一个hdmi状态监听的线程,当这个节点有变化的时候,会去设置hdmi分辨率,打开hdmi设备,而且还更新自己的节点状态。
根据上面的hdmi使能之后,调用到:
HWC_OWL_ContextHotplugDisplay()来更新hdmi的状态,主要是向上层报告增加了一个hdmi设备。
代码如下:
//这里会回调到HWComposer中的接口
pthread_mutex_lock(&psPrivateData->sHdmiMutexLock);
psHwcFuncs->pfnContextHotplugDisplay(psPrivateData,eDisplay, bConnected);
pthread_mutex_unlock(&psPrivateData->sHdmiMutexLock);
psPrivateData->psHwcProcs->hotplug(psPrivateData->psHwcProcs, iDisplay, iConnected);
3:回到HWComposer中,来看下hotplug接口:
void HWComposer::hotplug(int disp, int connected) {
if (disp == HWC_DISPLAY_PRIMARY || disp >= VIRTUAL_DISPLAY_ID_BASE) {
ALOGE("hotplug event received for invalid display: disp=%d connected=%d",
disp, connected);
return;
}
queryDisplayProperties(disp); //得到显示设备的配置信息,比如分辨率 density等信息
mEventHandler.onHotplugReceived(disp, bool(connected)); //注意这个mEventHandler其实就是surfaceflinger对象,在HWC的构造函数中赋值
}
4:看下SF中的onHotplugReceived()
void SurfaceFlinger::onHotplugReceived(int type, bool