| Index: chromeos/accelerometer/accelerometer_reader.cc
|
| diff --git a/chromeos/accelerometer/accelerometer_reader.cc b/chromeos/accelerometer/accelerometer_reader.cc
|
| index e07eb53e78b652d70a5a19068f6d56f29a16d59a..8e46534476819b7862dcc0f640394553e39040f0 100644
|
| --- a/chromeos/accelerometer/accelerometer_reader.cc
|
| +++ b/chromeos/accelerometer/accelerometer_reader.cc
|
| @@ -32,13 +32,18 @@ namespace chromeos {
|
| namespace {
|
|
|
| // Paths to access necessary data from the accelerometer device.
|
| -const base::FilePath::CharType kAccelerometerTriggerPath[] =
|
| - FILE_PATH_LITERAL("/sys/bus/iio/devices/trigger0/trigger_now");
|
| const base::FilePath::CharType kAccelerometerDevicePath[] =
|
| FILE_PATH_LITERAL("/dev/cros-ec-accel");
|
| const base::FilePath::CharType kAccelerometerIioBasePath[] =
|
| FILE_PATH_LITERAL("/sys/bus/iio/devices/");
|
|
|
| +// Trigger created by accelerometer-init.sh to query the sensors.
|
| +const char kTriggerPrefix[] = "trigger";
|
| +const char kTriggerName[] = "sysfstrig0\n";
|
| +
|
| +// Sysfs entry to trigger readings.
|
| +const base::FilePath::CharType kTriggerNow[] = "trigger_now";
|
| +
|
| // This is the per source scale file in use on kernels older than 3.18. We
|
| // should remove this when all devices having accelerometers are on kernel 3.18
|
| // or later or have been patched to use new format: http://crbug.com/510831
|
| @@ -165,6 +170,9 @@ class AccelerometerFileReader
|
| // Number of accelerometers on device.
|
| size_t count;
|
|
|
| + // sysfs entry to trigger readings.
|
| + base::FilePath trigger_now;
|
| +
|
| // Which accelerometers are present on device.
|
| bool has[ACCELEROMETER_SOURCE_COUNT];
|
|
|
| @@ -240,10 +248,39 @@ void AccelerometerFileReader::Initialize(
|
| }
|
| return;
|
| }
|
| - if (!base::PathExists(base::FilePath(kAccelerometerTriggerPath))) {
|
| +
|
| + // Find trigger to use:
|
| + base::FileEnumerator trigger_dir(base::FilePath(kAccelerometerIioBasePath),
|
| + false, base::FileEnumerator::DIRECTORIES);
|
| + std::string prefix = kTriggerPrefix;
|
| + for (base::FilePath name = trigger_dir.Next(); !name.empty();
|
| + name = trigger_dir.Next()) {
|
| + if (name.BaseName().value().substr(0, prefix.size()) != prefix)
|
| + continue;
|
| + std::string trigger_name;
|
| + if (!base::ReadFileToString(name.Append("name"), &trigger_name)) {
|
| + if (base::SysInfo::IsRunningOnChromeOS()) {
|
| + LOG(WARNING) << "Unable to read the trigger name at " << name.value();
|
| + }
|
| + continue;
|
| + }
|
| + if (trigger_name == kTriggerName) {
|
| + base::FilePath trigger_now = name.Append(kTriggerNow);
|
| + if (!base::PathExists(trigger_now)) {
|
| + if (base::SysInfo::IsRunningOnChromeOS()) {
|
| + LOG(ERROR) << "Accelerometer trigger does not exist at "
|
| + << trigger_now.value();
|
| + }
|
| + return;
|
| + } else {
|
| + configuration_.trigger_now = trigger_now;
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + if (configuration_.trigger_now.empty()) {
|
| if (base::SysInfo::IsRunningOnChromeOS()) {
|
| - LOG(ERROR) << "Accelerometer trigger does not exist at"
|
| - << kAccelerometerTriggerPath;
|
| + LOG(ERROR) << "Accelerometer trigger not found";
|
| }
|
| return;
|
| }
|
| @@ -426,8 +463,7 @@ void AccelerometerFileReader::ReadFileAndNotify() {
|
| DCHECK(initialization_successful_);
|
|
|
| // Initiate the trigger to read accelerometers simultaneously
|
| - int bytes_written = base::WriteFile(
|
| - base::FilePath(kAccelerometerTriggerPath), "1\n", 2);
|
| + int bytes_written = base::WriteFile(configuration_.trigger_now, "1\n", 2);
|
| if (bytes_written < 2) {
|
| PLOG(ERROR) << "Accelerometer trigger failure: " << bytes_written;
|
| return;
|
|
|