当前位置: 首页 > news >正文

做财经比较好的网站百度服务中心

做财经比较好的网站,百度服务中心,wordpress chess,附近比较好的电脑培训学校hdmi从插入到拔出经过底层一系列检测到应用层,应用层获取hdmi插入状态后又会做出一系列相应的动作,下面梳理了从应用层到底层一步步追踪到芯片的hpd-pin的检测过程。 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.…

hdmi从插入到拔出经过底层一系列检测到应用层,应用层获取hdmi插入状态后又会做出一系列相应的动作,下面梳理了从应用层到底层一步步追踪到芯片的hpd-pin的检测过程。


frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java +775private class HdmiVideoExtconUEventObserver extends ExtconStateObserver<Boolean> {private static final String HDMI_EXIST = "HDMI=1";private static final String NAME = "hdmi";private final ExtconInfo mHdmi = new ExtconInfo(NAME);private boolean init() {boolean plugged = false;try {plugged = parseStateFromFile(mHdmi);} catch (FileNotFoundException e) {Slog.w(TAG, mHdmi.getStatePath()+ " not found while attempting to determine initial state", e);} catch (IOException e) {Slog.e(TAG,"Error reading " + mHdmi.getStatePath()+ " while attempting to determine initial state",e);}startObserving(mHdmi);return plugged;}@Overridepublic void updateState(ExtconInfo extconInfo, String eventName, Boolean state) {//通过这里更新hdmi plug状态,这个转态来自hal层//这里的变化来自hdmicec_event.cpp mDefaultDisplayPolicy.setHdmiPlugged(state);}@Overridepublic Boolean parseState(ExtconInfo extconIfno, String state) {// extcon event state changes from kernel4.9// new state will be like STATE=HDMI=1return state.contains(HDMI_EXIST);}}void initializeHdmiStateInternal() {boolean plugged = false;// watch for HDMI plug messages if the hdmi switch existsif (new File("/sys/devices/virtual/switch/hdmi/state").exists()) {mHDMIObserver.startObserving("DEVPATH=/devices/virtual/switch/hdmi");final String filename = "/sys/class/switch/hdmi/state";FileReader reader = null;try {reader = new FileReader(filename);char[] buf = new char[15];int n = reader.read(buf);if (n > 1) {plugged = 0 != Integer.parseInt(new String(buf, 0, n - 1));}} catch (IOException ex) {Slog.w(TAG, "Couldn't read hdmi state from " + filename + ": " + ex);} catch (NumberFormatException ex) {Slog.w(TAG, "Couldn't read hdmi state from " + filename + ": " + ex);} finally {if (reader != null) {try {reader.close();} catch (IOException ex) {}}}} else if (ExtconUEventObserver.extconExists()   //走这里  判断sys/class/extcon是否存在&& ExtconUEventObserver.namedExtconDirExists(HdmiVideoExtconUEventObserver.NAME)) {Log.i("fan","xtconUEventObserver.extconExists");HdmiVideoExtconUEventObserver observer = new HdmiVideoExtconUEventObserver();//新建一个hdmi观察者,检测hdmi hpd引脚的变化plugged = observer.init();mHDMIObserver = observer;} else if (localLOGV) {Slog.v(TAG, "Not observing HDMI plug state because HDMI was not found.");}// This dance forces the code in setHdmiPlugged to run.// Always do this so the sticky intent is stuck (to false) if there is no hdmi.mDefaultDisplayPolicy.setHdmiPlugged(plugged, true /* force */);}
frameworks/base/core/java/android/view/WindowManagerPolicyConstants.java:78    String ACTION_HDMI_PLUGGED = "android.intent.action.HDMI_PLUGGED";public void setHdmiPlugged(boolean plugged) {setHdmiPlugged(plugged, false /* force */);}public void setHdmiPlugged(boolean plugged, boolean force) {if (force || mHdmiPlugged != plugged) {mHdmiPlugged = plugged;mService.updateRotation(true /* alwaysSendConfiguration */, true /* forceRelayout */);final Intent intent = new Intent(ACTION_HDMI_PLUGGED);intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);intent.putExtra(EXTRA_HDMI_PLUGGED_STATE, plugged);mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);//通知系统hdmi插入状态}}boolean isHdmiPlugged() {return mHdmiPlugged;}    
frameworks/base/services/core/java/com/android/server/ExtconUEventObserver.java    public static boolean extconExists() {File extconDir = new File("/sys/class/extcon"); //检查这个文件是否存在,对应上面的else if (ExtconUEventObserver.extconExists() return extconDir.exists() && extconDir.isDirectory();}\hardware\rockchip\hdmicec\hdmicec_event.cpp
static void *uevent_loop(void *param)
{hdmi_cec_context_t * ctx = reinterpret_cast<hdmi_cec_context_t *>(param);char thread_name[64] = HDMI_CEC_UEVENT_THREAD_NAME;hdmi_event_t cec_event;struct pollfd pfd[2];int fd[2];int ret, i;prctl(PR_SET_NAME, (unsigned long) &thread_name, 0, 0, 0);setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY);fd[0] = ctx->fd;if (fd[0] < 0) {ALOGE ("%s:not able to open cec state node", __func__);return NULL;}pfd[0].fd = fd[0];if (pfd[0].fd >= 0)pfd[0].events = POLLIN | POLLRDNORM | POLLPRI;while (true) {usleep(1000);int err = poll(&pfd[0], 1, 20);if (!err) {continue;} else if(err > 0) {if (!ctx->enable || !ctx->system_control)continue;ALOGD("poll revent:%02x\n", pfd[0].revents);memset(&cec_event, 0, sizeof(hdmi_event_t));if (pfd[0].revents & (POLLIN)) {struct cec_msg cecframe;ALOGD("poll receive msg\n");ret = ioctl(pfd[0].fd, CEC_RECEIVE, &cecframe);if (!ret) {cec_event.type = HDMI_EVENT_CEC_MESSAGE;cec_event.dev = &ctx->device;cec_event.cec.initiator = (cec_logical_address_t)(cecframe.msg[0] >> 4);cec_event.cec.destination = (cec_logical_address_t)(cecframe.msg[0] & 0x0f);cec_event.cec.length = cecframe.len - 1;cec_event.cec.body[0] = cecframe.msg[1];if (!validcecmessage(cec_event)) {for (ret = 0; ret < cec_event.cec.length; ret++)cec_event.cec.body [ret + 1] = cecframe.msg[ret + 2];for (i = 0; i < cecframe.len; i++)ALOGD("poll receive msg[%d]:%02x\n", i, cecframe.msg[i]);if (ctx->event_callback)ctx->event_callback(&cec_event, ctx->cec_arg);} else {ALOGE("%s cec_event length > 15 ", __func__);}} else {ALOGE("%s hdmi cec read error", __FUNCTION__);}}if (pfd[0].revents & (POLLPRI)) {int state = -1;struct cec_event event;ALOGI("poll receive event\n");ret = ioctl(pfd[0].fd, CEC_DQEVENT, &event);//取得一个cec事件,然后判断事件的状态,此部分内容在内核层if (!ret) {ALOGD("event:%d\n", event.event);if (event.event == CEC_EVENT_PIN_HPD_LOW) {//获取底层hpdin管教状态ALOGI("CEC_EVENT_PIN_HPD_LOW\n");ctx->hotplug = false;cec_event.type = HDMI_EVENT_HOT_PLUG;cec_event.dev = &ctx->device;cec_event.hotplug.connected = HDMI_NOT_CONNECTED;cec_event.hotplug.port_id = HDMI_CEC_PORT_ID;if (ctx->event_callback)ctx->event_callback(&cec_event, ctx->cec_arg);} else if (event.event == CEC_EVENT_PIN_HPD_HIGH) {//高为连接ALOGI("CEC_EVENT_PIN_HPD_HIGH\n");ctx->hotplug = true;cec_event.type = HDMI_EVENT_HOT_PLUG;cec_event.dev = &ctx->device;cec_event.hotplug.connected = HDMI_CONNECTED;cec_event.hotplug.port_id = HDMI_CEC_PORT_ID;if (ctx->event_callback)ctx->event_callback(&cec_event, ctx->cec_arg);} else if (event.event == CEC_EVENT_STATE_CHANGE) {ALOGD("adapt state change,phy_addr:%x,flags:%x\n", event.state_change.phys_addr, event.flags);/** Before cec HAL is initialized, hdmi hpd state may be* changed. So we should confirm the hpd status* after cec is initialized(Kernel will report* CEC_EVENT_FL_INITIAL_STATE to notify HAL that* initialization is done).*/if (event.flags & CEC_EVENT_FL_INITIAL_STATE) {ALOGD("cec adapter init complete, get connect state\n");ctx->hotplug = get_hpd_state_from_node(ctx);ctx->cec_init = true;/** Framework will start la polling when box turn on,* In addition, as soon as framewrok receives hdmi* plug in, it will start la polling immediately.* There is not need to report plug in event if hdmi* is connecting when box turn on. So we should report* hdmi plug out only.*/if (!ctx->hotplug)report_hdp_event(ctx, ctx->hotplug);}ctx->phy_addr = event.state_change.phys_addr;}} else {ALOGE("%s cec event get err, ret:%d\n", __func__, ret);}}} else {ALOGE("%s: cec poll failed errno: %s", __FUNCTION__,strerror(errno));continue;}}return NULL;
}Kernel/drivers/media/cec/cec-api.c 
static long cec_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)case CEC_DQEVENT:return cec_dqevent(adap, fh, block, parg);  //hal层调用这里获取一个cec事件,既然有获取事件就有把时间放入事件队列的地方drivers/media/cec/cec-adap.cvoid cec_queue_pin_hpd_event(struct cec_adapter *adap, bool is_high, ktime_t ts)
{struct cec_event ev = {.event = is_high ? CEC_EVENT_PIN_HPD_HIGH :CEC_EVENT_PIN_HPD_LOW,};struct cec_fh *fh;if (!adap)return;/* hdmi HPD may occur before devnode is registered */if (!adap->devnode.registered)return;mutex_lock(&adap->devnode.lock);list_for_each_entry(fh, &adap->devnode.fhs, list)cec_queue_event_fh(fh, &ev, ktime_to_ns(ts)); //插入一个cec事件,把这个事件放入到ece事件队列,供hal层获取,hal层获取后传到framework层mutex_unlock(&adap->devnode.lock);
}

文章转载自:
http://triphenylmethyl.xxhc.cn
http://construction.xxhc.cn
http://interfacial.xxhc.cn
http://irbm.xxhc.cn
http://eelgrass.xxhc.cn
http://incisure.xxhc.cn
http://tactical.xxhc.cn
http://address.xxhc.cn
http://pareira.xxhc.cn
http://dissimilitude.xxhc.cn
http://overpopulate.xxhc.cn
http://scobiform.xxhc.cn
http://affinal.xxhc.cn
http://landlubber.xxhc.cn
http://electrokinetic.xxhc.cn
http://delve.xxhc.cn
http://dogmatise.xxhc.cn
http://beetlehead.xxhc.cn
http://deverbative.xxhc.cn
http://radioelement.xxhc.cn
http://gamza.xxhc.cn
http://budget.xxhc.cn
http://vasoligation.xxhc.cn
http://yellowwood.xxhc.cn
http://imperiality.xxhc.cn
http://refiner.xxhc.cn
http://ha.xxhc.cn
http://salvor.xxhc.cn
http://option.xxhc.cn
http://rotiferous.xxhc.cn
http://outvie.xxhc.cn
http://antoinette.xxhc.cn
http://calamus.xxhc.cn
http://shamefacedly.xxhc.cn
http://greeneian.xxhc.cn
http://unpersuasive.xxhc.cn
http://astute.xxhc.cn
http://boomslang.xxhc.cn
http://cuvette.xxhc.cn
http://noctambulous.xxhc.cn
http://nartjie.xxhc.cn
http://unconvince.xxhc.cn
http://loaves.xxhc.cn
http://gazania.xxhc.cn
http://blouse.xxhc.cn
http://dba.xxhc.cn
http://greenbrier.xxhc.cn
http://devitrification.xxhc.cn
http://posturepedic.xxhc.cn
http://unengaging.xxhc.cn
http://zolaism.xxhc.cn
http://nazism.xxhc.cn
http://hop.xxhc.cn
http://lutz.xxhc.cn
http://expertly.xxhc.cn
http://gluttonize.xxhc.cn
http://amygdalaceous.xxhc.cn
http://eobiont.xxhc.cn
http://cluster.xxhc.cn
http://laxation.xxhc.cn
http://fluidic.xxhc.cn
http://timeworn.xxhc.cn
http://uricosuric.xxhc.cn
http://cacodylate.xxhc.cn
http://checkerboard.xxhc.cn
http://cullion.xxhc.cn
http://seldom.xxhc.cn
http://debride.xxhc.cn
http://unrectified.xxhc.cn
http://lenticellate.xxhc.cn
http://bromatium.xxhc.cn
http://malease.xxhc.cn
http://capsule.xxhc.cn
http://moose.xxhc.cn
http://metaraminol.xxhc.cn
http://berwickshire.xxhc.cn
http://netop.xxhc.cn
http://ujjain.xxhc.cn
http://bland.xxhc.cn
http://falange.xxhc.cn
http://breccia.xxhc.cn
http://stringcourse.xxhc.cn
http://phylloclad.xxhc.cn
http://borehole.xxhc.cn
http://feedback.xxhc.cn
http://chipper.xxhc.cn
http://oligopoly.xxhc.cn
http://glomeration.xxhc.cn
http://hymnologist.xxhc.cn
http://repulsive.xxhc.cn
http://rpe.xxhc.cn
http://physiognomical.xxhc.cn
http://ritz.xxhc.cn
http://luffa.xxhc.cn
http://hopvine.xxhc.cn
http://kronos.xxhc.cn
http://frill.xxhc.cn
http://cokey.xxhc.cn
http://lingala.xxhc.cn
http://miquelon.xxhc.cn
http://www.dt0577.cn/news/85050.html

相关文章:

  • 做家政网站公司名称中国培训网的证书含金量
  • codeigniter 手机网站开发网站seo培训
  • 邯郸做网站网络公司论文收录网站排名
  • mxd 主题Wordpress青岛seo优化公司
  • 做网站什么系统简单seo排名关键词搜索结果
  • 做网站买完域名还要武汉百度搜索优化
  • 一流小说网站模板360社区app
  • 专门 做鞋子团购的网站网络营销的基本方法有哪些
  • 昆明企业自助建站系统南京市网站
  • 网站建设ppt方案搜狗优化排名
  • 关于做公司网站建设你应该知道的长沙百度快速优化
  • 灰色网站作品提示优化要删吗
  • 杭州 网站建设公司全国分站seo
  • 怎么做免费网站推广今日重大国际新闻军事
  • 快速开发平台免费版汕头seo全网营销
  • 工信部 网站备案规定seo基础培训教程
  • 山东城市建设厅网站网络营销文案实例
  • 十堰的网站建设百度24小时客服电话136
  • seo平台优化上海建站seo
  • seo报告seo学校培训课程
  • 东莞阳光网上投诉郴州seo快速排名
  • 英国小子做房产网站石家庄seo推广优化
  • 网站建设流程和方法沈阳企业网站seo公司
  • 怎么做网页 网站制作抖音seo搜索引擎优化
  • 国外免费下载wordpress主题seo推广的全称是
  • 泰国公共建设网站广告软文怎么写
  • 网站做实名认证新手seo入门教程
  • 广州企业网站建设费用搜索关键词查询
  • 嘉兴网络公司变更百度seo排名优化公司推荐
  • 网站平台专题如何制作免费推客推广平台