surfaceflinger增加hdmi显示设备

当HDMI插入时,驱动上报中断并触发Uevent,使'/sys/class/switch/hdmi/state'变为1。HWC的hdmi监听线程检测到变化后,调用HWC_OWL_ContextHotplugDisplay()更新hdmi状态,并通过HWComposer的hotplug接口通知。SurfaceFlinger的onHotplugReceived()接收到消息后进行业务处理,EventThread将此事件通过BitTube发送给NativeDisplayEventReceiver处理。详情见链接。
摘要由CSDN通过智能技术生成

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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值