blob: 3ff7ac69f6b2da546bdfbd18ff1483ecd4cdaf1d [file] [log] [blame]
Enrico Granata60a818d2019-05-09 09:56:09 -07001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Enrico Granata60b1cbc2019-05-20 11:06:46 -07005#include <base/files/file_path.h>
6#include <base/logging.h>
7#include <base/strings/stringprintf.h>
8#include <brillo/flag_helper.h>
9#include <brillo/syslog_logging.h>
10
11#define __STDC_FORMAT_MACROS
12#include <inttypes.h>
13
Enrico Granata51cdb942019-06-18 16:40:17 -070014#include <libmems/iio_context_impl.h>
15#include <libmems/iio_device.h>
Enrico Granata60b1cbc2019-05-20 11:06:46 -070016#include "mems_setup/configuration.h"
17#include "mems_setup/delegate_impl.h"
Enrico Granata60b1cbc2019-05-20 11:06:46 -070018#include "mems_setup/sensor_kind.h"
19
Enrico Granata60a818d2019-05-09 09:56:09 -070020int main(int argc, char** argv) {
Harvey Yang0c0dab52019-11-18 12:04:30 +080021 DEFINE_int32(device_id, -1,
22 "The IIO device id for the sensor being "
23 "initialized, such as iio:device0.");
Enrico Granata60b1cbc2019-05-20 11:06:46 -070024 DEFINE_string(device_name, "",
25 "The IIO device path for the sensor being "
Harvey Yang0c0dab52019-11-18 12:04:30 +080026 "initialized, such as cros-ec-accel.");
Enrico Granata60b1cbc2019-05-20 11:06:46 -070027
28 brillo::OpenLog("mems_setup", true /*log_pid*/);
29
30 brillo::InitLog(brillo::kLogToSyslog | brillo::kLogHeader |
31 brillo::kLogToStderrIfTty);
32
33 brillo::FlagHelper::Init(argc, argv, "Chromium OS MEMS Setup");
34
Harvey Yang73394622020-02-12 10:57:57 +080035 if ((FLAGS_device_id == -1 && FLAGS_device_name.empty())) {
36 LOG(ERROR) << "mems_setup must be called with sensor";
Enrico Granata60b1cbc2019-05-20 11:06:46 -070037 exit(1);
38 }
39
Harvey Yang0c0dab52019-11-18 12:04:30 +080040 if (FLAGS_device_name.empty()) {
Harvey Yang73394622020-02-12 10:57:57 +080041 LOG(INFO) << "Starting mems_setup [id=" << FLAGS_device_id << "]";
Harvey Yang0c0dab52019-11-18 12:04:30 +080042 } else {
Harvey Yang73394622020-02-12 10:57:57 +080043 LOG(INFO) << "Starting mems_setup [name=" << FLAGS_device_name << "]";
Enrico Granata60b1cbc2019-05-20 11:06:46 -070044 }
45
46 std::unique_ptr<mems_setup::Delegate> delegate(
Tom Hughes09483d12020-08-27 15:55:08 -070047 new mems_setup::DelegateImpl());
Enrico Granata60b1cbc2019-05-20 11:06:46 -070048
49 base::FilePath iio_trig_sysfs_path("/sys/bus/iio/devices/iio_sysfs_trigger");
50 if (!delegate->Exists(iio_trig_sysfs_path)) {
51 if (!delegate->ProbeKernelModule("iio_trig_sysfs")) {
52 LOG(ERROR) << "cannot load iio_trig_sysfs module";
53 exit(1);
54 }
55 if (!delegate->Exists(iio_trig_sysfs_path)) {
56 LOG(ERROR) << "cannot find iio_sysfs_trigger device";
57 exit(1);
58 }
59 }
60
Tom Hughes09483d12020-08-27 15:55:08 -070061 std::unique_ptr<libmems::IioContext> context(new libmems::IioContextImpl());
Harvey Yang0c0dab52019-11-18 12:04:30 +080062
63 libmems::IioDevice* device = nullptr;
64 if (FLAGS_device_id != -1) {
65 device = context->GetDeviceById(FLAGS_device_id);
66
67 if (device == nullptr) {
68 LOG(ERROR) << "device with id: " << FLAGS_device_id << " not found";
69 exit(1);
70 }
71 } else {
72 auto devices = context->GetDevicesByName(FLAGS_device_name);
Gwendal Grignoud4c9d652019-12-28 01:13:16 -080073 if (devices.size() != 1) {
Harvey Yang0c0dab52019-11-18 12:04:30 +080074 LOG(ERROR) << devices.size() << " possible devices with name "
75 << FLAGS_device_name << " found";
76 exit(1);
77 }
78 device = devices[0];
Enrico Granata60b1cbc2019-05-20 11:06:46 -070079 }
80
81 std::unique_ptr<mems_setup::Configuration> config(
Harvey Yang73394622020-02-12 10:57:57 +080082 new mems_setup::Configuration(context.get(), device, delegate.get()));
Enrico Granata60b1cbc2019-05-20 11:06:46 -070083
84 return config->Configure() ? 0 : 1;
Enrico Granata60a818d2019-05-09 09:56:09 -070085}