1a5d25dccSAndrew Jeffery /* 2a5d25dccSAndrew Jeffery // Copyright (c) 2018 Intel Corporation 3a5d25dccSAndrew Jeffery // 4a5d25dccSAndrew Jeffery // Licensed under the Apache License, Version 2.0 (the "License"); 5a5d25dccSAndrew Jeffery // you may not use this file except in compliance with the License. 6a5d25dccSAndrew Jeffery // You may obtain a copy of the License at 7a5d25dccSAndrew Jeffery // 8a5d25dccSAndrew Jeffery // http://www.apache.org/licenses/LICENSE-2.0 9a5d25dccSAndrew Jeffery // 10a5d25dccSAndrew Jeffery // Unless required by applicable law or agreed to in writing, software 11a5d25dccSAndrew Jeffery // distributed under the License is distributed on an "AS IS" BASIS, 12a5d25dccSAndrew Jeffery // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a5d25dccSAndrew Jeffery // See the License for the specific language governing permissions and 14a5d25dccSAndrew Jeffery // limitations under the License. 15a5d25dccSAndrew Jeffery */ 16a5d25dccSAndrew Jeffery /// \file devices.hpp 17a5d25dccSAndrew Jeffery 18a5d25dccSAndrew Jeffery #pragma once 19a5d25dccSAndrew Jeffery #include <boost/container/flat_map.hpp> 20a5d25dccSAndrew Jeffery 21a5d25dccSAndrew Jeffery namespace devices 22a5d25dccSAndrew Jeffery { 23a5d25dccSAndrew Jeffery 24a5d25dccSAndrew Jeffery struct CmpStr 25a5d25dccSAndrew Jeffery { operator ()devices::CmpStr26a5d25dccSAndrew Jeffery bool operator()(const char* a, const char* b) const 27a5d25dccSAndrew Jeffery { 28a5d25dccSAndrew Jeffery return std::strcmp(a, b) < 0; 29a5d25dccSAndrew Jeffery } 30a5d25dccSAndrew Jeffery }; 31a5d25dccSAndrew Jeffery 32a5d25dccSAndrew Jeffery // I2C device drivers may create a /hwmon subdirectory. For example the tmp75 33a5d25dccSAndrew Jeffery // driver creates a /sys/bus/i2c/devices/<busnum>-<i2caddr>/hwmon 34a5d25dccSAndrew Jeffery // directory. The sensor code relies on the presence of the /hwmon 35a5d25dccSAndrew Jeffery // subdirectory to collect sensor readings. Initialization of this subdir is 36a5d25dccSAndrew Jeffery // not reliable. I2C devices flagged with hasHWMonDir are tested for correct 37a5d25dccSAndrew Jeffery // initialization, and when a failure is detected the device is deleted, and 38a5d25dccSAndrew Jeffery // then recreated. The default is to retry 5 times before moving to the next 39a5d25dccSAndrew Jeffery // device. 40a5d25dccSAndrew Jeffery 41a5d25dccSAndrew Jeffery // Devices such as I2C EEPROMs do not generate this file structure. These 42a5d25dccSAndrew Jeffery // kinds of devices are flagged using the noHWMonDir enumeration. The 43a5d25dccSAndrew Jeffery // expectation is they are created correctly on the first attempt. 44a5d25dccSAndrew Jeffery 45a5d25dccSAndrew Jeffery // This enumeration class exists to reduce copy/paste errors. It is easy to 46a5d25dccSAndrew Jeffery // overlook the trailing parameter in the ExportTemplate structure when it is 47a5d25dccSAndrew Jeffery // a simple boolean. 48a5d25dccSAndrew Jeffery enum class createsHWMon : bool 49a5d25dccSAndrew Jeffery { 50a5d25dccSAndrew Jeffery noHWMonDir, 51a5d25dccSAndrew Jeffery hasHWMonDir 52a5d25dccSAndrew Jeffery }; 53a5d25dccSAndrew Jeffery 54a5d25dccSAndrew Jeffery struct ExportTemplate 55a5d25dccSAndrew Jeffery { ExportTemplatedevices::ExportTemplate56a5d25dccSAndrew Jeffery ExportTemplate(const char* params, const char* bus, const char* constructor, 57a5d25dccSAndrew Jeffery const char* destructor, createsHWMon hasHWMonDir) : 58*b7077437SPatrick Williams parameters(params), busPath(bus), add(constructor), remove(destructor), 59a5d25dccSAndrew Jeffery hasHWMonDir(hasHWMonDir) {}; 60a5d25dccSAndrew Jeffery const char* parameters; 61a5d25dccSAndrew Jeffery const char* busPath; 62a5d25dccSAndrew Jeffery const char* add; 63a5d25dccSAndrew Jeffery const char* remove; 64a5d25dccSAndrew Jeffery createsHWMon hasHWMonDir; 65a5d25dccSAndrew Jeffery }; 66a5d25dccSAndrew Jeffery 67a5d25dccSAndrew Jeffery const boost::container::flat_map<const char*, ExportTemplate, CmpStr> 68a5d25dccSAndrew Jeffery exportTemplates{ 69a5d25dccSAndrew Jeffery {{"EEPROM_24C01", 70a5d25dccSAndrew Jeffery ExportTemplate("24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 71a5d25dccSAndrew Jeffery "new_device", "delete_device", 72a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 73a5d25dccSAndrew Jeffery {"EEPROM_24C02", 74a5d25dccSAndrew Jeffery ExportTemplate("24c02 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 75a5d25dccSAndrew Jeffery "new_device", "delete_device", 76a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 77a5d25dccSAndrew Jeffery {"EEPROM_24C04", 78a5d25dccSAndrew Jeffery ExportTemplate("24c04 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 79a5d25dccSAndrew Jeffery "new_device", "delete_device", 80a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 81a5d25dccSAndrew Jeffery {"EEPROM_24C08", 82a5d25dccSAndrew Jeffery ExportTemplate("24c08 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 83a5d25dccSAndrew Jeffery "new_device", "delete_device", 84a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 85a5d25dccSAndrew Jeffery {"EEPROM_24C16", 86a5d25dccSAndrew Jeffery ExportTemplate("24c16 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 87a5d25dccSAndrew Jeffery "new_device", "delete_device", 88a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 89a5d25dccSAndrew Jeffery {"EEPROM_24C32", 90a5d25dccSAndrew Jeffery ExportTemplate("24c32 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 91a5d25dccSAndrew Jeffery "new_device", "delete_device", 92a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 93a5d25dccSAndrew Jeffery {"EEPROM_24C64", 94a5d25dccSAndrew Jeffery ExportTemplate("24c64 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 95a5d25dccSAndrew Jeffery "new_device", "delete_device", 96a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 97a5d25dccSAndrew Jeffery {"EEPROM_24C128", 98a5d25dccSAndrew Jeffery ExportTemplate("24c128 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 99a5d25dccSAndrew Jeffery "new_device", "delete_device", 100a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 101a5d25dccSAndrew Jeffery {"EEPROM_24C256", 102a5d25dccSAndrew Jeffery ExportTemplate("24c256 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 103a5d25dccSAndrew Jeffery "new_device", "delete_device", 104a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 105a5d25dccSAndrew Jeffery {"ADS1015", 106a5d25dccSAndrew Jeffery ExportTemplate("ads1015 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 107a5d25dccSAndrew Jeffery "new_device", "delete_device", 108a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 109a5d25dccSAndrew Jeffery {"ADS7828", 110a5d25dccSAndrew Jeffery ExportTemplate("ads7828 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 111a5d25dccSAndrew Jeffery "new_device", "delete_device", 112a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 113a5d25dccSAndrew Jeffery {"EEPROM", 114a5d25dccSAndrew Jeffery ExportTemplate("eeprom $Address", "/sys/bus/i2c/devices/i2c-$Bus", 115a5d25dccSAndrew Jeffery "new_device", "delete_device", 116a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 117a5d25dccSAndrew Jeffery {"Gpio", ExportTemplate("$Index", "/sys/class/gpio", "export", 118a5d25dccSAndrew Jeffery "unexport", createsHWMon::noHWMonDir)}, 119a591d6c0STingting Chen {"IPSPS1", 120a591d6c0STingting Chen ExportTemplate("ipsps1 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 121a591d6c0STingting Chen "new_device", "delete_device", 122a591d6c0STingting Chen createsHWMon::hasHWMonDir)}, 123a5d25dccSAndrew Jeffery {"MAX34440", 124a5d25dccSAndrew Jeffery ExportTemplate("max34440 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 125a5d25dccSAndrew Jeffery "new_device", "delete_device", 126a5d25dccSAndrew Jeffery createsHWMon::hasHWMonDir)}, 127a591d6c0STingting Chen {"PCA9537", 128a591d6c0STingting Chen ExportTemplate("pca9537 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 129a591d6c0STingting Chen "new_device", "delete_device", 130a591d6c0STingting Chen createsHWMon::noHWMonDir)}, 131a5d25dccSAndrew Jeffery {"PCA9542Mux", 132a5d25dccSAndrew Jeffery ExportTemplate("pca9542 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 133a5d25dccSAndrew Jeffery "new_device", "delete_device", 134a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 135a5d25dccSAndrew Jeffery {"PCA9543Mux", 136a5d25dccSAndrew Jeffery ExportTemplate("pca9543 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 137a5d25dccSAndrew Jeffery "new_device", "delete_device", 138a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 139a5d25dccSAndrew Jeffery {"PCA9544Mux", 140a5d25dccSAndrew Jeffery ExportTemplate("pca9544 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 141a5d25dccSAndrew Jeffery "new_device", "delete_device", 142a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 143a5d25dccSAndrew Jeffery {"PCA9545Mux", 144a5d25dccSAndrew Jeffery ExportTemplate("pca9545 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 145a5d25dccSAndrew Jeffery "new_device", "delete_device", 146a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 147a5d25dccSAndrew Jeffery {"PCA9546Mux", 148a5d25dccSAndrew Jeffery ExportTemplate("pca9546 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 149a5d25dccSAndrew Jeffery "new_device", "delete_device", 150a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 151a5d25dccSAndrew Jeffery {"PCA9547Mux", 152a5d25dccSAndrew Jeffery ExportTemplate("pca9547 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 153a5d25dccSAndrew Jeffery "new_device", "delete_device", 154a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 155a5d25dccSAndrew Jeffery {"PCA9548Mux", 156a5d25dccSAndrew Jeffery ExportTemplate("pca9548 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 157a5d25dccSAndrew Jeffery "new_device", "delete_device", 158a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 159a5d25dccSAndrew Jeffery {"PCA9846Mux", 160a5d25dccSAndrew Jeffery ExportTemplate("pca9846 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 161a5d25dccSAndrew Jeffery "new_device", "delete_device", 162a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 163a5d25dccSAndrew Jeffery {"PCA9847Mux", 164a5d25dccSAndrew Jeffery ExportTemplate("pca9847 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 165a5d25dccSAndrew Jeffery "new_device", "delete_device", 166a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 167a5d25dccSAndrew Jeffery {"PCA9848Mux", 168a5d25dccSAndrew Jeffery ExportTemplate("pca9848 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 169a5d25dccSAndrew Jeffery "new_device", "delete_device", 170a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 171a5d25dccSAndrew Jeffery {"PCA9849Mux", 172a5d25dccSAndrew Jeffery ExportTemplate("pca9849 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 173a5d25dccSAndrew Jeffery "new_device", "delete_device", 174a5d25dccSAndrew Jeffery createsHWMon::noHWMonDir)}, 175a5d25dccSAndrew Jeffery {"SIC450", 176a5d25dccSAndrew Jeffery ExportTemplate("sic450 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 177a5d25dccSAndrew Jeffery "new_device", "delete_device", 178a5d25dccSAndrew Jeffery createsHWMon::hasHWMonDir)}, 179a5d25dccSAndrew Jeffery {"Q50SN12072", 180a5d25dccSAndrew Jeffery ExportTemplate("q50sn12072 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 181a5d25dccSAndrew Jeffery "new_device", "delete_device", 182a5d25dccSAndrew Jeffery createsHWMon::hasHWMonDir)}, 183a5d25dccSAndrew Jeffery {"MAX31790", 184a5d25dccSAndrew Jeffery ExportTemplate("max31790 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 185a5d25dccSAndrew Jeffery "new_device", "delete_device", 186a5d25dccSAndrew Jeffery createsHWMon::hasHWMonDir)}, 1875e9a3055SSaitwal, Meghan {"PIC32", ExportTemplate("pic32 $Address", 1885e9a3055SSaitwal, Meghan "/sys/bus/i2c/devices/i2c-$Bus", "new_device", 1895e9a3055SSaitwal, Meghan "delete_device", createsHWMon::hasHWMonDir)}, 190a591d6c0STingting Chen {"INA226", 191a591d6c0STingting Chen ExportTemplate("ina226 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 192a591d6c0STingting Chen "new_device", "delete_device", 193a591d6c0STingting Chen createsHWMon::hasHWMonDir)}, 194a5d25dccSAndrew Jeffery {"RAA229620", 195a5d25dccSAndrew Jeffery ExportTemplate("raa229620 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 196a5d25dccSAndrew Jeffery "new_device", "delete_device", 197a5d25dccSAndrew Jeffery createsHWMon::hasHWMonDir)}, 198a5d25dccSAndrew Jeffery {"RAA229621", 199a5d25dccSAndrew Jeffery ExportTemplate("raa229621 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 200a5d25dccSAndrew Jeffery "new_device", "delete_device", 201a5d25dccSAndrew Jeffery createsHWMon::hasHWMonDir)}, 202e7fb111cSMatt Simmering {"PIC32", 203e7fb111cSMatt Simmering ExportTemplate("pic32 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 204016f1219SKonstantin Aladyshev "new_device", "delete_device", 205a5d25dccSAndrew Jeffery createsHWMon::hasHWMonDir)}}}; 206a5d25dccSAndrew Jeffery } // namespace devices 207