【安卓Sensor框架-3】Sensor事件上报流程

sensor事件上报流程 主要为如下:
sensor事件上报流程

由前面一篇博文分析,hal层传感器事件会上报给 aidl 层,会调用 postEventsToMessageQueue 方法

/hardware/interfaces/sensors/common/default/2.X/multihal/HalProxy.cpp

661  void HalProxy::postEventsToMessageQueue(const std::vector<Event>& events, size_t numWakeupEvents,
662                                          V2_0::implementation::ScopedWakelock wakelock) {
663      size_t numToWrite = 0;
664      std::lock_guard<std::mutex> lock(mEventQueueWriteMutex);
665      if (wakelock.isLocked()) {
666          incrementRefCountAndMaybeAcquireWakelock(numWakeupEvents);
667      }
668      if (mPendingWriteEventsQueue.empty()) {
669          numToWrite = std::min(events.size(), mEventQueue->availableToWrite());
670          if (numToWrite > 0) {
// 写入sensor 事件到 mEventQueue
671              if (mEventQueue->write(events.data(), numToWrite)) {
672                  // TODO(b/143302327): While loop if mEventQueue->avaiableToWrite > 0 to possibly fit
673                  // in more writes immediately
// 唤醒处理sensor事件
674                  mEventQueueFlag->wake(static_cast<uint32_t>(EventQueueFlagBits::READ_AND_PROCESS));

而对应的系统进程sensorservice 会创建个线程监听hal 层的数据

// 对应的监听是在 SensorService线程中监听的

1040  bool SensorService::threadLoop() {
1041      ALOGD("nuSensorService thread starting...");
1042  
1043      // each virtual sensor could generate an event per "real" event, that's why we need to size
1044      // numEventMax much smaller than MAX_RECEIVE_BUFFER_EVENT_COUNT.  in practice, this is too
1045      // aggressive, but guaranteed to be enough.
1046      const size_t vcount = mSensors.getVirtualSensors().size();
1047      const size_t minBufferSize = SensorEventQueue::MAX_RECEIVE_BUFFER_EVENT_COUNT;
1048      const size_t numEventMax = minBufferSize / (1 + vcount);
1049  
1050      SensorDevice& device(SensorDevice::getInstance());
1051  
1052      const int halVersion = device.getHalDeviceVersion();
1053      do {
// 调用 SensorDevice 监听 sensor数据
1054          ssize_t count = device.poll(mSensorEventBuffer, numEventMax);
1055          if (count < 0) {
1056              if(count == DEAD_OBJECT && device.isReconnecting()) {
。。。
1172          const std::vector<sp<SensorEventConnection>> activeConnections = connLock.getActiveConnections();
。。。
// 遍历所有的connection,去通知到应用客户端
// 调用 SensorEventConnection 的 sendEvents 方法
1235          for (const sp<SensorEventConnection>& connection : activeConnections) {
1236              connection->sendEvents(mSensorEventBuffer, count, mSensorEventScratch,
1237                      mMapFlushEventsToConnections);
1238              needsWakeLock |= connection->needsWakeLock();

// 调用 SensorDevice 监听 sensor数据

/frameworks/native/services/sensorservice/SensorDevice.cpp

351  ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) {
352      if (mHalWrapper == nullptr) return NO_INIT;
353  
354      ssize_t eventsRead = 0;
// aidlhal 是为true 的
355      if (mHalWrapper->supportsMessageQueues()) {
// 调用 的pollFmq 
356          eventsRead = mHalWrapper->pollFmq(buffer, count);
357      } else if (mHalWrapper->supportsPolling()) {
358          eventsRead = mHalWrapper->poll(buffer, count);
359      } else {
360          ALOGE("Must support polling or FMQ");
361          eventsRead = -1;
362      }
363  
364      if (eventsRead > 0) {

/frameworks/native/services/sensorservice/AidlSensorHalWrapper.cpp

160  ssize_t AidlSensorHalWrapper::pollFmq(sensors_event_t *buffer, size_t maxNumEventsToRead) {
161      ssize_t eventsRead = 0;
162      size_t availableEvents = mEventQueue->availableToRead();
163  
164      if (availableEvents == 0) {
165          uint32_t eventFlagState = 0;
166  
167          // Wait for events to become available. This is necessary so that the Event FMQ's read() is
168          // able to be called with the correct number of events to read. If the specified number of
169          // events is not available, then read() would return no events, possibly introducing
170          // additional latency in delivering events to applications.
// 等待数据通过 mEventQueueFlag
//  这里 postEventsToMessageQueue 会唤醒
171          if (mEventQueueFlag != nullptr) {
172              mEventQueueFlag->wait(asBaseType(ISensors::EVENT_QUEUE_FLAG_BITS_READ_AND_PROCESS) |
173                                            asBaseType(INTERNAL_WAKE),
174                                    &eventFlagState);
175          }
176          availableEvents = mEventQueue->availableToRead();

一个应用注册一个监听,会创建对应的 SensorEventConnection 。

// 调用 SensorEventConnection 的 sendEvents 方法

/frameworks/native/services/sensorservice/SensorEventConnection.cpp

290  status_t SensorService::SensorEventConnection::sendEvents(
// buffer 是传入的sensor  的数据
291          sensors_event_t const* buffer, size_t numEvents,
292          sensors_event_t* scratch,
293          wp<const SensorEventConnection> const * mapFlushEventsToConnections) {
294      // filter out events not for this connection
295  
296      std::unique_ptr<sensors_event_t[]> sanitizedBuffer;
297  
298      int count = 0;
299      Mutex::Autolock _l(mConnectionLock);
300      if (scratch) {
301          size_t i=0;
302          while (i<numEvents) {
303              int32_t sensor_handle = buffer[i].sensor;
304              if (buffer[i].type == SENSOR_TYPE_META_DATA) {
305                  ALOGD_IF(DEBUG_CONNECTIONS, "flush complete event sensor==%d ",
306                          buffer[i].meta_data.sensor);
307                  // Setting sensor_handle to the correct sensor to ensure the sensor events per
308                  // connection are filtered correctly.  buffer[i].sensor is zero for meta_data
309                  // events.
// 获取到sensor 的handle
310                  sensor_handle = buffer[i].meta_data.sensor;
311              }
312  
313              // Check if this connection has registered for this sensor. If not continue to the
314              // next sensor_event.
// 一个 应用有一个SensorEventConnection,对应一个sensor
// 遍历是否是该 SensorEventConnection 的sensor
315              if (mSensorInfo.count(sensor_handle) == 0) {
316                  ++i;
317                  continue;
318              }
。。。。
405      // NOTE: ASensorEvent and sensors_event_t are the same type.
// socket 通信通知到 sensorservice
406      ssize_t size = SensorEventQueue::write(mChannel,
407                                      reinterpret_cast<ASensorEvent const*>(scratch), count);
61  ssize_t SensorEventQueue::write(const sp<BitTube>& tube,
62          ASensorEvent const* events, size_t numEvents) {
63      return BitTube::sendObjects(tube, events, numEvents);
64  }

// 由前面分析,在android_hardware_SensorManager创建了 Receiver,监听了socket事件

  • nativeInitSensorEventQueue注册初始化Receiver

  • Receiver实例化后调用onFirstRef(),handler\Looper
    轮询LooperCallback监听回调Receiver::handleEvent()

  • mSensorQueue->getFd() 实际就是 SensorEventQueue > SensorEventConnection >
    BitTube::getFd() 里边mReceiveFd = sockets[0]

  • env->CallVoidMethod(…gBaseEventQueueClassInfo.dispatchSensorEvent…)
    JNI 调用Java层SensorEventQueue中dispatchSensorEvent方法

/frameworks/base/core/jni/android_hardware_SensorManager.cpp

327  class Receiver : public LooperCallback {
328      sp<SensorEventQueue> mSensorQueue;
329      sp<MessageQueue> mMessageQueue;
330      jobject mReceiverWeakGlobal;
331      jfloatArray mFloatScratch;
332      jintArray   mIntScratch;

359  private:
360      virtual void onFirstRef() {
361          LooperCallback::onFirstRef();
362          mMessageQueue->getLooper()->addFd(mSensorQueue->getFd(), 0,
363                  ALOOPER_EVENT_INPUT, this, mSensorQueue.get());
364      }

// loopper 会回调handleEvent 方法

366      virtual int handleEvent(int fd, int events, void* data) {
367          JNIEnv* env = AndroidRuntime::getJNIEnv();
368          sp<SensorEventQueue> q = reinterpret_cast<SensorEventQueue *>(data);
369          ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
370  
371          ssize_t n;
372          ASensorEvent buffer[16];
373          while ((n = q->read(buffer, 16)) > 0) {
374              for (int i=0 ; i<n ; i++) {
375                  if (buffer[i].type == SENSOR_TYPE_STEP_COUNTER) {
376                      // step-counter returns a uint64, but the java API only deals with floats
377                      float value = float(buffer[i].u64.step_counter);
378                      env->SetFloatArrayRegion(mFloatScratch, 0, 1, &value);
。。。
433                      if (receiverObj.get()) {
// 回调java层的方法
434                          env->CallVoidMethod(receiverObj.get(),
435                                              gBaseEventQueueClassInfo.dispatchSensorEvent,
436                                              buffer[i].sensor,
437                                              mFloatScratch,
438                                              status,
439                                              buffer[i].timestamp);
440                      }

/frameworks/base/core/java/android/hardware/SystemSensorManager.java

966          // Called from native code.
967          @SuppressWarnings("unused")
968          @Override
969          protected void dispatchSensorEvent(int handle, float[] values, int inAccuracy,
970                  long timestamp) {
971              final Sensor sensor = mManager.mHandleToSensor.get(handle);
972              if (sensor == null) {
973                  // sensor disconnected
974                  return;
975              }
976  
977              SensorEvent t = null;
978              synchronized (mSensorsEvents) {
979                  t = mSensorsEvents.get(handle);
980              }
981  
982              if (t == null) {
983                  // This may happen if the client has unregistered and there are pending events in
984                  // the queue waiting to be delivered. Ignore.
985                  return;
986              }
987              // Copy from the values array.
988              System.arraycopy(values, 0, t.values, 0, t.values.length);
989              t.timestamp = timestamp;
990              t.accuracy = inAccuracy;
991              t.sensor = sensor;
992  
993              // call onAccuracyChanged() only if the value changes
994              final int accuracy = mSensorAccuracies.get(handle);
995              if (t.accuracy >= 0 && accuracy != t.accuracy) {
996                  mSensorAccuracies.put(handle, t.accuracy);
997                  mListener.onAccuracyChanged(t.sensor, t.accuracy);
998              }
999  
1000              // Indicate if the discontinuity count changed
1001              t.firstEventAfterDiscontinuity = false;
1002              if (t.sensor.getType() == Sensor.TYPE_HEAD_TRACKER) {
1003                  final int lastCount = mSensorDiscontinuityCounts.get(handle);
1004                  final int curCount = Float.floatToIntBits(values[6]);
1005                  if (lastCount >= 0 && lastCount != curCount) {
1006                      mSensorDiscontinuityCounts.put(handle, curCount);
1007                      t.firstEventAfterDiscontinuity = true;
1008                  }
1009              }
1010  
// 回调观察者的 onSensorChanged方法
1011              mListener.onSensorChanged(t);
1012          }

// 回调观察者的 onSensorChanged方法

/frameworks/base/services/core/java/com/android/server/display/AutomaticBrightnessController.java

1346      private final SensorEventListener mLightSensorListener = new SensorEventListener() {
1347          @Override
1348          public void onSensorChanged(SensorEvent event) {
1349              if (mLightSensorEnabled) {
1350                  final long time = mClock.uptimeMillis();
1351                  final float lux = event.values[0];
1352                  handleLightSensorEvent(time, lux);
1353              }
1354          }
845      private void updateAmbientLux(long time) {
846          // If the light sensor was just turned on then immediately update our initial
847          // estimate of the current ambient light level.
848          if (!mAmbientLuxValid) {
849              final long timeWhenSensorWarmedUp =
850                  mLightSensorWarmUpTimeConfig + mLightSensorEnableTime;
851              if (time < timeWhenSensorWarmedUp) {
852                  if (mLoggingEnabled) {
853                      Slog.d(TAG, "updateAmbientLux: Sensor not ready yet: "
854                              + "time=" + time + ", "
855                              + "timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp);
856                  }
。。。
884          if ((mSlowAmbientLux >= mAmbientBrighteningThreshold
885                  && mFastAmbientLux >= mAmbientBrighteningThreshold
886                  && nextBrightenTransition <= time)
887                  || (mSlowAmbientLux <= mAmbientDarkeningThreshold
888                          && mFastAmbientLux <= mAmbientDarkeningThreshold
889                          && nextDarkenTransition <= time)) {
890              mPreThresholdLux = mAmbientLux;
891              setAmbientLux(mFastAmbientLux);
892              if (mLoggingEnabled) {
893                  Slog.d(TAG, "updateAmbientLux: "
894                          + ((mFastAmbientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": "
895                          + "mAmbientBrighteningThreshold=" + mAmbientBrighteningThreshold + ", "
896                          + "mAmbientDarkeningThreshold=" + mAmbientDarkeningThreshold + ", "
897                          + "mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", "
898                          + "mAmbientLux=" + mAmbientLux);
899              }
// 这里去更新亮度
900              updateAutoBrightness(true /* sendUpdate */, false /* isManuallySet */);
901              nextBrightenTransition = nextAmbientLightBrighteningTransition(time);
902              nextDarkenTransition = nextAmbientLightDarkeningTransition(time);
903          }

// 对自动亮度算法的一些计算

920      private void updateAutoBrightness(boolean sendUpdate, boolean isManuallySet) {
921          if (!mAmbientLuxValid) {
922              return;
923          }
924  
925          float value = mCurrentBrightnessMapper.getBrightness(mAmbientLux, mForegroundAppPackageName,
926                  mForegroundAppCategory);
927          mRawScreenAutoBrightness = value;
928          float newScreenAutoBrightness = clampScreenBrightness(value);
。。。
975              if (sendUpdate) {
// 通知到 DisplayPowerController
976                  mCallbacks.updateBrightness();
977              }
978          }
979      }

// 调用 DisplayPowerController的updateBrightness

/frameworks/base/services/core/java/com/android/server/display/DisplayPowerController2.java

1744      @Override
1745      public void updateBrightness() {
1746          sendUpdatePowerState();
1747      }
886      private void sendUpdatePowerState() {
887          synchronized (mLock) {
888              sendUpdatePowerStateLocked();
889          }
890      }
892      @GuardedBy("mLock")
893      private void sendUpdatePowerStateLocked() {
894          if (!mStopped && !mPendingUpdatePowerStateLocked) {
895              mPendingUpdatePowerStateLocked = true;
896              Message msg = mHandler.obtainMessage(MSG_UPDATE_POWER_STATE);
897              mHandler.sendMessageAtTime(msg, mClock.uptimeMillis());
898          }
899      }
2714          @Override
2715          public void handleMessage(Message msg) {
2716              switch (msg.what) {
2717                  case MSG_UPDATE_POWER_STATE:
2718                      updatePowerState();
2719                      break;
1230      // Call from handler thread
1231      private void updatePowerState() {
1232          Trace.traceBegin(Trace.TRACE_TAG_POWER,
1233                  "DisplayPowerController#updatePowerState");
1234          updatePowerStateInternal();
1235          Trace.traceEnd(Trace.TRACE_TAG_POWER);
1236      }
1238      private void updatePowerStateInternal() {
1239          // Update the power state request.
1240          final boolean mustNotify;
1241          final int previousPolicy;
。。。
1339          int brightnessAdjustmentFlags = 0;
1340          if (Float.isNaN(brightnessState)) {
// 从下列获取到自动亮度的值
1341              if (mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()) {
1342                  brightnessState = mAutomaticBrightnessStrategy.getAutomaticScreenBrightness(
1343                          mTempBrightnessEvent);
1344                  if (BrightnessUtils.isValidBrightnessValue(brightnessState)
1345                          || brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT) {
1346                      rawBrightnessState = mAutomaticBrightnessController
1347                              .getRawAutomaticScreenBrightness();
1348                      brightnessState = clampScreenBrightness(brightnessState);
1349                      // slowly adapt to auto-brightness
1350                      // TODO(b/253226419): slowChange should be decided by strategy.updateBrightness
1351                      slowChange = mAutomaticBrightnessStrategy.hasAppliedAutoBrightness()
1352                              && !mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged();
1353                      brightnessAdjustmentFlags =
1354                              mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentReasonsFlags();
1355                      updateScreenBrightnessSetting = currentBrightnessSetting != brightnessState;
1356                      mAutomaticBrightnessStrategy.setAutoBrightnessApplied(true);
1357                      mBrightnessReasonTemp.setReason(BrightnessReason.REASON_AUTOMATIC);
1358                      if (mScreenOffBrightnessSensorController != null) {
1359                          mScreenOffBrightnessSensorController.setLightSensorEnabled(false);
1360                      }
1361                  } else {
1362                      mAutomaticBrightnessStrategy.setAutoBrightnessApplied(false);
1363                  }
1364              }
。。。
1551              if (BrightnessUtils.isValidBrightnessValue(animateValue)
1552                      && (animateValue != currentBrightness
1553                      || sdrAnimateValue != currentSdrBrightness)) {
1554                  if (initialRampSkip || hasBrightnessBuckets
1555                          || !isDisplayContentVisible || brightnessIsTemporary) {
1556                      animateScreenBrightness(animateValue, sdrAnimateValue,
1557                              SCREEN_ANIMATION_RATE_MINIMUM);
1558                  } else {
1559                      boolean isIncreasing = animateValue > currentBrightness;
1560                      final float rampSpeed;
1561                      if (isIncreasing && slowChange) {
1562                          rampSpeed = mBrightnessRampRateSlowIncrease;
1563                      } else if (isIncreasing && !slowChange) {
1564                          rampSpeed = mBrightnessRampRateFastIncrease;
1565                      } else if (!isIncreasing && slowChange) {
1566                          rampSpeed = mBrightnessRampRateSlowDecrease;
1567                      } else {
1568                          rampSpeed = mBrightnessRampRateFastDecrease;
1569                      }
// 然后调用 animateScreenBrightness 方法
1570                      animateScreenBrightness(animateValue, sdrAnimateValue, rampSpeed);
1571                  }
1572              }

// 然后调用 animateScreenBrightness 方法

2017      private void animateScreenBrightness(float target, float sdrTarget, float rate) {
2018          if (DEBUG) {
2019              Slog.d(mTag, "Animating brightness: target=" + target + ", sdrTarget=" + sdrTarget
2020                      + ", rate=" + rate);
2021          }
2022          if (mScreenBrightnessRampAnimator.animateTo(target, sdrTarget, rate)) {
2023              Trace.traceCounter(Trace.TRACE_TAG_POWER, "TargetScreenBrightness", (int) target);
2024  
2025              String propertyKey = "debug.tracing.screen_brightness";
2026              String propertyValue = String.valueOf(target);
2027              try {
2028                  // TODO(b/153319140) remove when we can get this from the above trace invocation
2029                  SystemProperties.set(propertyKey, propertyValue);
2030              } catch (RuntimeException e) {
2031                  Slog.e(mTag, "Failed to set a system property: key=" + propertyKey
2032                          + " value=" + propertyValue + " " + e.getMessage());
2033              }
2034  
2035              noteScreenBrightness(target);
2036          }
2037      }

// 先看下 mScreenBrightnessRampAnimator 对象

917          mScreenBrightnessRampAnimator = mInjector.getDualRampAnimator(mPowerState,
918                  DisplayPowerState.SCREEN_BRIGHTNESS_FLOAT,
919                  DisplayPowerState.SCREEN_SDR_BRIGHTNESS_FLOAT);
2890          DualRampAnimator<DisplayPowerState> getDualRampAnimator(DisplayPowerState dps,
2891                  FloatProperty<DisplayPowerState> firstProperty,
2892                  FloatProperty<DisplayPowerState> secondProperty) {
2893              return new DualRampAnimator(dps, firstProperty, secondProperty);
2894          }

// 对应的是 DualRampAnimator 对象

187      static class DualRampAnimator<T> {
188          private final Choreographer mChoreographer;
189          private final RampAnimator<T> mFirst;
190          private final RampAnimator<T> mSecond;
191  
192          private Listener mListener;
193          private boolean mAwaitingCallback;
194  
195          DualRampAnimator(T object, FloatProperty<T> firstProperty,
196                  FloatProperty<T> secondProperty) {
197              mChoreographer = Choreographer.getInstance();
// first 用 RampAnimator 包装了
198              mFirst = new RampAnimator<>(object, firstProperty);
199              mSecond = new RampAnimator<>(object, secondProperty);
200          }

// 接下来调用 animateTo 方法

224          public boolean animateTo(float linearFirstTarget, float linearSecondTarget, float rate) {
225              boolean animationTargetChanged = mFirst.setAnimationTarget(linearFirstTarget, rate);
226              animationTargetChanged |= mSecond.setAnimationTarget(linearSecondTarget, rate);
227              boolean shouldBeAnimating = isAnimating();
228  
229              if (shouldBeAnimating != mAwaitingCallback) {
230                  if (shouldBeAnimating) {
231                      mAwaitingCallback = true;
232                      postAnimationCallback();
233                  } else if (mAwaitingCallback) {
234                      mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION,
235                              mAnimationCallback, null);
236                      mAwaitingCallback = false;
237                  }
238              }
239              return animationTargetChanged;
240          }

//其中 mFirst 为 new RampAnimator<>(object, firstProperty)
// 调用 setAnimationTarget 方法

77      boolean setAnimationTarget(float targetLinear, float rate) {
78          // Convert the target from the linear into the HLG space.
79          final float target = BrightnessUtils.convertLinearToGamma(targetLinear);
80  
81          // Immediately jump to the target the first time.
82          if (mFirstTime || rate <= 0) {
83              if (mFirstTime || target != mCurrentValue) {
84                  mFirstTime = false;
85                  mRate = 0;
86                  mTargetHlgValue = target;
87                  mTargetLinearValue = targetLinear;
88                  mCurrentValue = target;
// 给属性设置值
89                  setPropertyValue(target);
90                  mAnimating = false;
91                  return true;
92              }
93              return false;
94          }
95
144      private void setPropertyValue(float val) {
145          // To avoid linearVal inconsistency when converting to HLG and back to linear space
146          // used original target linear value for final animation step
147          float linearVal =
148                  val == mTargetHlgValue ? mTargetLinearValue : BrightnessUtils.convertGammaToLinear(
149                          val);
150          mProperty.setValue(mObject, linearVal);
151      }

mProperty 的值为如下:

116      public static final FloatProperty<DisplayPowerState> SCREEN_BRIGHTNESS_FLOAT =
117              new FloatProperty<DisplayPowerState>("screenBrightnessFloat") {
118                  @Override
// object 的值为DisplayPowerState 
119                  public void setValue(DisplayPowerState object, float value) {
120                      object.setScreenBrightness(value);
121                  }
122  
123                  @Override
124                  public Float get(DisplayPowerState object) {
125                      return object.getScreenBrightness();
126                  }
127              };

// 所以调用 DisplayPowerState setScreenBrightness 方法

/frameworks/base/services/core/java/com/android/server/display/DisplayPowerState.java

197      public void setScreenBrightness(float brightness) {
198          if (mScreenBrightness != brightness) {
199              if (DEBUG) {
200                  Slog.d(TAG, "setScreenBrightness: brightness=" + brightness);
201              }
202  
203              mScreenBrightness = brightness;
204              if (mScreenState != Display.STATE_OFF) {
205                  mScreenReady = false;
206                  scheduleScreenUpdate();
207              }
208          }
209      }
351      private void scheduleScreenUpdate() {
352          if (!mScreenUpdatePending) {
353              mScreenUpdatePending = true;
354              postScreenUpdateThreadSafe();
355          }
356      }
358      private void postScreenUpdateThreadSafe() {
359          mHandler.removeCallbacks(mScreenUpdateRunnable);
360          mHandler.post(mScreenUpdateRunnable);
361      }
379      private final Runnable mScreenUpdateRunnable = new Runnable() {
380          @Override
381          public void run() {
382              mScreenUpdatePending = false;
383  
384              float brightnessState = mScreenState != Display.STATE_OFF
385                      && mColorFadeLevel > 0f ? mScreenBrightness : PowerManager.BRIGHTNESS_OFF_FLOAT;
386              float sdrBrightnessState = mScreenState != Display.STATE_OFF
387                      && mColorFadeLevel > 0f
388                              ? mSdrScreenBrightness : PowerManager.BRIGHTNESS_OFF_FLOAT;
389              if (mPhotonicModulator.setState(mScreenState, brightnessState, sdrBrightnessState)) {
390                  if (DEBUG) {
391                      Slog.d(TAG, "Screen ready");
392                  }
393                  mScreenReady = true;
394                  invokeCleanListenerIfNeeded();
395              } else {
396                  if (DEBUG) {
397                      Slog.d(TAG, "Screen not ready");
398                  }
399              }
400          }
401      };

PhotonicModulator是个线程

437          public PhotonicModulator() {
438              super("PhotonicModulator");
439          }
440  
441          public boolean setState(int state, float brightnessState, float sdrBrightnessState) {
442              synchronized (mLock) {
443                  boolean stateChanged = state != mPendingState;
444                  boolean backlightChanged = brightnessState != mPendingBacklight
445                          || sdrBrightnessState != mPendingSdrBacklight;
446                  if (stateChanged || backlightChanged) {
447                      if (DEBUG) {
448                          Slog.d(TAG, "Requesting new screen state: state="
449                                  + Display.stateToString(state) + ", backlight=" + brightnessState);
450                      }
451  
452                      mPendingState = state;
453                      mPendingBacklight = brightnessState;
454                      mPendingSdrBacklight = sdrBrightnessState;
455                      boolean changeInProgress = mStateChangeInProgress || mBacklightChangeInProgress;
456                      mStateChangeInProgress = stateChanged || mStateChangeInProgress;
457                      mBacklightChangeInProgress = backlightChanged || mBacklightChangeInProgress;
458  
// 唤醒主线程
459                      if (!changeInProgress) {
460                          mLock.notifyAll();
461                      }
462                  }
463                  return !mStateChangeInProgress;
464              }
465          }

// 执行run 方法

482          @Override
483          public void run() {
484              for (;;) {
485                  // Get pending change.
486                  final int state;
487                  final boolean stateChanged;
488                  final float brightnessState;
489                  final float sdrBrightnessState;
490                  final boolean backlightChanged;
。。。。
511                          try {
512                              mLock.wait();
513                          } catch (InterruptedException ex) {
514                              if (mStopped) {
515                                  return;
516                              }
517                          }
518                          continue;
519                      }
520                      mActualState = state;
521                      mActualBacklight = brightnessState;
522                      mActualSdrBacklight = sdrBrightnessState;
523                  }
524  
525                  // Apply pending change.
526                  if (DEBUG) {
527                      Slog.d(TAG, "Updating screen state: id=" + mDisplayId +  ", state="
528                              + Display.stateToString(state) + ", backlight=" + brightnessState
529                              + ", sdrBacklight=" + sdrBrightnessState);
530                  }
531                  mBlanker.requestDisplayState(mDisplayId, state, brightnessState,
532                          sdrBrightnessState);
533              }
534          }

/frameworks/base/services/core/java/com/android/server/display/DisplayManagerService.java

337      private final DisplayBlanker mDisplayBlanker = new DisplayBlanker() {
338          // Synchronized to avoid race conditions when updating multiple display states.
339          @Override
340          public synchronized void requestDisplayState(int displayId, int state, float brightness,
341                  float sdrBrightness) {
342              boolean allInactive = true;
343              boolean allOff = true;
344              final boolean stateChanged;
345              synchronized (mSyncRoot) {
346                  final int index = mDisplayStates.indexOfKey(displayId);
347                  if (index > -1) {
348                      final int currentState = mDisplayStates.valueAt(index);
349                      stateChanged = state != currentState;
350                      if (stateChanged) {
351                          final int size = mDisplayStates.size();
352                          for (int i = 0; i < size; i++) {
353                              final int displayState = i == index ? state : mDisplayStates.valueAt(i);
354                              if (displayState != Display.STATE_OFF) {
355                                  allOff = false;
356                              }
357                              if (Display.isActiveState(displayState)) {
358                                  allInactive = false;
359                              }
360                              if (!allOff && !allInactive) {
361                                  break;
362                              }
363                          }
364                      }
365                  } else {
366                      stateChanged = false;
367                  }
368              }
369  
370              // The order of operations is important for legacy reasons.
371              if (state == Display.STATE_OFF) {
372                  requestDisplayStateInternal(displayId, state, brightness, sdrBrightness);
373              }
374  
375              if (stateChanged) {
376                  mDisplayPowerCallbacks.onDisplayStateChange(allInactive, allOff);
377              }
378  
379              if (state != Display.STATE_OFF) {
380                  requestDisplayStateInternal(displayId, state, brightness, sdrBrightness);
381              }
382          }
383      };
864      private void requestDisplayStateInternal(int displayId, int state, float brightnessState,
865              float sdrBrightnessState) {
866          if (state == Display.STATE_UNKNOWN) {
867              state = Display.STATE_ON;
868          }
869  
870          brightnessState = clampBrightness(state, brightnessState);
871          sdrBrightnessState = clampBrightness(state, sdrBrightnessState);
872  
873          // Update the display state within the lock.
874          // Note that we do not need to schedule traversals here although it
875          // may happen as a side-effect of displays changing state.
876          final Runnable runnable;
877          final String traceMessage;
878          synchronized (mSyncRoot) {
。。。
// 获取到 runnable  方法并执行
901              runnable = updateDisplayStateLocked(mLogicalDisplayMapper.getDisplayLocked(displayId)
902                      .getPrimaryDisplayDeviceLocked());
903              if (Trace.isTagEnabled(Trace.TRACE_TAG_POWER)) {
904                  Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_POWER,
905                          "requestDisplayStateInternal:" + displayId, displayId);
906              }
907          }
908  
909          // Setting the display power state can take hundreds of milliseconds
910          // to complete so we defer the most expensive part of the work until
911          // after we have exited the critical section to avoid blocking other
912          // threads for a long time.
913          if (runnable != null) {
914              runnable.run();
915          }
916      }
1992      private Runnable updateDisplayStateLocked(DisplayDevice device) {
1993          // Blank or unblank the display immediately to match the state requested
1994          // by the display power controller (if known).
1995          DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
1996          if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
1997              final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(device);
1998              if (display == null) {
1999                  return null;
2000              }
2001              final int displayId = display.getDisplayIdLocked();
2002              final int state = mDisplayStates.get(displayId);
2003  
2004              // Only send a request for display state if display state has already been initialized.
2005              if (state != Display.STATE_UNKNOWN) {
2006                  final BrightnessPair brightnessPair = mDisplayBrightnesses.get(displayId);
2007                  return device.requestDisplayStateLocked(state, brightnessPair.brightness,
2008                          brightnessPair.sdrBrightness);
2009              }
2010          }
2011          return null;
2012      }

/frameworks/base/services/core/java/com/android/server/display/LocalDisplayAdapter.java

748          @Override
749          public Runnable requestDisplayStateLocked(final int state, final float brightnessState,
750                  final float sdrBrightnessState) {
751              // Assume that the brightness is off if the display is being turned off.
752              assert state != Display.STATE_OFF
753                      || brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT;
754              final boolean stateChanged = (mState != state);
755              final boolean brightnessChanged = mBrightnessState != brightnessState
756                      || mSdrBrightnessState != sdrBrightnessState;
757              if (stateChanged || brightnessChanged) {
758                  final long physicalDisplayId = mPhysicalDisplayId;
759                  final IBinder token = getDisplayTokenLocked();
760                  final int oldState = mState;
761  
762                  if (stateChanged) {
763                      mState = state;
764                      updateDeviceInfoLocked();
765                  }
766  
767                  // Defer actually setting the display state until after we have exited
768                  // the critical section since it can take hundreds of milliseconds
769                  // to complete.
770                  return new Runnable() {
771                      @Override
772                      public void run() {
773                          // Exit a suspended state before making any changes.
774                          int currentState = oldState;
775                          if (Display.isSuspendedState(oldState)
776                                  || oldState == Display.STATE_UNKNOWN) {
777                              if (!Display.isSuspendedState(state)) {
778                                  setDisplayState(state);
779                                  currentState = state;
780                              } else if (state == Display.STATE_DOZE_SUSPEND
781                                      || oldState == Display.STATE_DOZE_SUSPEND) {
782                                  setDisplayState(Display.STATE_DOZE);
783                                  currentState = Display.STATE_DOZE;
784                              } else if (state == Display.STATE_ON_SUSPEND
785                                      || oldState == Display.STATE_ON_SUSPEND) {
786                                  setDisplayState(Display.STATE_ON);
787                                  currentState = Display.STATE_ON;
788  
789                              // If UNKNOWN, we still want to set the initial display state,
790                              // otherwise, return early.
791                              } else if (oldState != Display.STATE_UNKNOWN) {
792                                  return; // old state and new state is off
793                              }
794                          }
795  
796                          // Apply brightness changes given that we are in a non-suspended state.
797                          if (brightnessChanged) {

// 执行设置亮度

861                      private void setDisplayBrightness(float brightnessState,
862                              float sdrBrightnessState) {
863                          // brightnessState includes invalid, off and full range.
864                          if (Float.isNaN(brightnessState) || Float.isNaN(sdrBrightnessState)) {
865                              return;
866                          }
867  
868                          if (DEBUG) {
869                              Slog.d(TAG, "setDisplayBrightness("
870                                      + "id=" + physicalDisplayId
871                                      + ", brightnessState=" + brightnessState
872                                      + ", sdrBrightnessState=" + sdrBrightnessState + ")");
873                          }
874  
875                          Trace.traceBegin(Trace.TRACE_TAG_POWER, "setDisplayBrightness("
876                                  + "id=" + physicalDisplayId + ", brightnessState="
877                                  + brightnessState + ", sdrBrightnessState=" + sdrBrightnessState
878                                  + ")");
879                          try {
880                              final float backlight = brightnessToBacklight(brightnessState);
881                              final float sdrBacklight = brightnessToBacklight(sdrBrightnessState);
882  
883                              final float nits = backlightToNits(backlight);
884                              final float sdrNits = backlightToNits(sdrBacklight);
885  
886                              mBacklightAdapter.setBacklight(sdrBacklight, sdrNits, backlight, nits);
887                              Trace.traceCounter(Trace.TRACE_TAG_POWER,
888                                      "ScreenBrightness",
889                                      BrightnessSynchronizer.brightnessFloatToInt(brightnessState));
890                              Trace.traceCounter(Trace.TRACE_TAG_POWER,
891                                      "SdrScreenBrightness",
892                                      BrightnessSynchronizer.brightnessFloatToInt(
893                                              sdrBrightnessState));
894  
895                              if (getDisplayDeviceConfig().hasSdrToHdrRatioSpline()) {
896                                  handleHdrSdrNitsChanged(nits, sdrNits);
897                              }
898  
899                          } finally {
900                              Trace.traceEnd(Trace.TRACE_TAG_POWER);
901                          }
902                      }
<think>好的,用户想了解MTK SensorHub框架的相关信息和使用方法。首先,我需要回顾一下已有的引用内容,看看哪些信息是相关的。 引用[1]提到了SensorHub3.0的架构路径,这可能涉及到代码结构。引用[3]说明MTK框架分为AP和SCP两部分,AP是主芯片,SCP是协处理器,处理传感器数据。引用[4]提到在SCP下,MTK的SensorHub是基于Google的CHRE架构开发的,事件驱动,类似操作系统。引用[2]则讨论了HAL框架、传感器服务启动、驱动框架图等。 接下来,用户需要的是架构介绍和使用说明,所以应该整理这些信息,分模块说明。比如先介绍整体架构,AP和SCP的分工,然后说明驱动层、中间件、应用层的结构。可能还需要提到初始化的流程数据传递机制,以及如何通过sys节点或HAL接口进行操作。 需要注意的是,用户可能对如何实际使用或开发基于该框架的驱动感兴趣,所以需要包括初始化步骤、数据获取方法以及调试相关的信息,比如sys节点。另外,要确保引用的正确性,每个引用的部分都要正确标注来源。 可能还需要生成相关问题,比如架构优势、初始化流程数据传递机制、调试方法等。这些问题要针对用户可能进一步询问的方向来设计,确保覆盖技术细节和实际应用。 最后,确保回答结构清晰,分点说明,使用中文,并且正确应用LaTeX格式,虽然这里可能数学公式不多,但如果有变量或代码部分,需要正确使用格式。</think>### MTK SensorHub 框架解析 #### 1. **架构概述** MTK SensorHub 框架基于**AP(应用处理器)与SCP(传感器协处理器)协同工作**的设计,其中: - **AP**负责高层业务逻辑和传感器数据应用处理[^3]。 - **SCP**作为低功耗协处理器,负责实时采集传感器原始数据并预处理(如滤波、融合等)[^4]。 - 两者通过共享内存或IPC(进程间通信)进行数据交互,降低主芯片功耗。 #### 2. **核心模块** 1. **驱动层(Vendor层)** - 路径:`vendor/mediatek/proprietary/tinysys/scp/middleware/sensorhub/drivers/physical`[^1] - 功能:实现传感器硬件驱动(如I2C通信、中断处理),通过`get_data()`获取原始数据并传递至中间件[^2]。 2. **中间件层(Middleware)** - 基于**Google CHRE(Context Hub Runtime Environment)**的事件驱动架构,支持传感器数据融合、算法处理(如姿态识别)。 - 提供标准化API,允许第三方算法集成。 3. **应用层(HAL & Framework)** - **HAL(硬件抽象层)**:向上提供统一接口(如`SensorManager`),向下调用SCP服务。 - **Sys节点调试**:通过`/sys/class/sensors/`下的节点控制传感器启停或读取原始数据。 #### 3. **数据流示例** ``` 传感器硬件 → I2C驱动 → SCP预处理 → 共享内存 → AP HAL → Android SensorService → 应用层 ``` 数据上报可通过**定时器触发工作队列**实现低延迟。 #### 4. **关键接口与配置** - **初始化流程**: ```C // SCP端传感器驱动初始化示例 static int __init sensor_driver_init(void) { i2c_register_driver(&sensor_i2c_driver); chre_api_register_callback(data_event_handler); // 注册CHRE回调 return 0; } ``` - **应用层调用**:通过Android Sensor API(如`SensorEventListener`)订阅数据。 #### 5. **调试与优化** - **日志查看**:通过`dmesg`或SCP专用调试工具捕捉传感器异常。 - **功耗优化**:使用SCP的**低功耗模式**,仅在AP需要数据时唤醒。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值