Commit 1ade62df authored by gwendal's avatar gwendal Committed by Commit bot

Accelerometer: find trigger name

Do not assume the sysfs trigger to use is trigger0. Instead find the
trigger which name is "sysfstrig0". This is the name used by
accelerometer-init.sh udev script.

BUG=chromium:632486
TEST=With proper accelerometer-init.sh, check that chrome rotate screen
even when cros-ec-ring driver is loaded.

R=jonross@chromium.org
Signed-off-by: default avatarGwendal Grignou <gwendal@chromium.org>
Review-Url: https://codereview.chromium.org/2198543002
Cr-Commit-Position: refs/heads/master@{#410407}
parent c1bc67f8
...@@ -32,13 +32,18 @@ namespace chromeos { ...@@ -32,13 +32,18 @@ namespace chromeos {
namespace { namespace {
// Paths to access necessary data from the accelerometer device. // 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[] = const base::FilePath::CharType kAccelerometerDevicePath[] =
FILE_PATH_LITERAL("/dev/cros-ec-accel"); FILE_PATH_LITERAL("/dev/cros-ec-accel");
const base::FilePath::CharType kAccelerometerIioBasePath[] = const base::FilePath::CharType kAccelerometerIioBasePath[] =
FILE_PATH_LITERAL("/sys/bus/iio/devices/"); 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 // 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 // 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 // or later or have been patched to use new format: http://crbug.com/510831
...@@ -165,6 +170,9 @@ class AccelerometerFileReader ...@@ -165,6 +170,9 @@ class AccelerometerFileReader
// Number of accelerometers on device. // Number of accelerometers on device.
size_t count; size_t count;
// sysfs entry to trigger readings.
base::FilePath trigger_now;
// Which accelerometers are present on device. // Which accelerometers are present on device.
bool has[ACCELEROMETER_SOURCE_COUNT]; bool has[ACCELEROMETER_SOURCE_COUNT];
...@@ -240,10 +248,39 @@ void AccelerometerFileReader::Initialize( ...@@ -240,10 +248,39 @@ void AccelerometerFileReader::Initialize(
} }
return; 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()) { if (base::SysInfo::IsRunningOnChromeOS()) {
LOG(ERROR) << "Accelerometer trigger does not exist at" LOG(ERROR) << "Accelerometer trigger not found";
<< kAccelerometerTriggerPath;
} }
return; return;
} }
...@@ -426,8 +463,7 @@ void AccelerometerFileReader::ReadFileAndNotify() { ...@@ -426,8 +463,7 @@ void AccelerometerFileReader::ReadFileAndNotify() {
DCHECK(initialization_successful_); DCHECK(initialization_successful_);
// Initiate the trigger to read accelerometers simultaneously // Initiate the trigger to read accelerometers simultaneously
int bytes_written = base::WriteFile( int bytes_written = base::WriteFile(configuration_.trigger_now, "1\n", 2);
base::FilePath(kAccelerometerTriggerPath), "1\n", 2);
if (bytes_written < 2) { if (bytes_written < 2) {
PLOG(ERROR) << "Accelerometer trigger failure: " << bytes_written; PLOG(ERROR) << "Accelerometer trigger failure: " << bytes_written;
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment