1015e3adeSMatt Spinler #pragma once 2015e3adeSMatt Spinler 3015e3adeSMatt Spinler #include <experimental/filesystem> 4015e3adeSMatt Spinler #include <string> 5015e3adeSMatt Spinler #include <vector> 6015e3adeSMatt Spinler 7015e3adeSMatt Spinler namespace witherspoon 8015e3adeSMatt Spinler { 9015e3adeSMatt Spinler namespace pmbus 10015e3adeSMatt Spinler { 11015e3adeSMatt Spinler 12015e3adeSMatt Spinler /** 13*57868bc5SMatt Spinler * If the access should be done in the base 14*57868bc5SMatt Spinler * device directory or the hwmon directory. 15*57868bc5SMatt Spinler */ 16*57868bc5SMatt Spinler enum class Type 17*57868bc5SMatt Spinler { 18*57868bc5SMatt Spinler Base, 19*57868bc5SMatt Spinler Hwmon 20*57868bc5SMatt Spinler }; 21*57868bc5SMatt Spinler 22*57868bc5SMatt Spinler /** 23015e3adeSMatt Spinler * @class PMBus 24015e3adeSMatt Spinler * 25015e3adeSMatt Spinler * This class is an interface to communicating with PMBus devices 26015e3adeSMatt Spinler * by reading and writing sysfs files. 27*57868bc5SMatt Spinler * 28*57868bc5SMatt Spinler * Based on the Type parameter, the accesses can either be done 29*57868bc5SMatt Spinler * in the base device directory (the one passed into the constructor), 30*57868bc5SMatt Spinler * or in the hwmon directory for the device. 31015e3adeSMatt Spinler */ 32015e3adeSMatt Spinler class PMBus 33015e3adeSMatt Spinler { 34015e3adeSMatt Spinler public: 35015e3adeSMatt Spinler 36015e3adeSMatt Spinler PMBus() = delete; 37015e3adeSMatt Spinler ~PMBus() = default; 38015e3adeSMatt Spinler PMBus(const PMBus&) = default; 39015e3adeSMatt Spinler PMBus& operator=(const PMBus&) = default; 40015e3adeSMatt Spinler PMBus(PMBus&&) = default; 41015e3adeSMatt Spinler PMBus& operator=(PMBus&&) = default; 42015e3adeSMatt Spinler 43015e3adeSMatt Spinler /** 44015e3adeSMatt Spinler * Constructor 45015e3adeSMatt Spinler * 46015e3adeSMatt Spinler * @param[in] path - path to the sysfs directory 47015e3adeSMatt Spinler */ 48015e3adeSMatt Spinler PMBus(const std::string& path) : 49015e3adeSMatt Spinler basePath(path) 50015e3adeSMatt Spinler { 51*57868bc5SMatt Spinler findHwmonRelativePath(); 52015e3adeSMatt Spinler } 53015e3adeSMatt Spinler 54015e3adeSMatt Spinler /** 55015e3adeSMatt Spinler * Reads a file in sysfs that represents a single bit, 56015e3adeSMatt Spinler * therefore doing a PMBus read. 57015e3adeSMatt Spinler * 58015e3adeSMatt Spinler * @param[in] name - path concatenated to 59015e3adeSMatt Spinler * basePath to read 60*57868bc5SMatt Spinler * @param[in] type - either Base or Hwmon 61015e3adeSMatt Spinler * 62015e3adeSMatt Spinler * @return bool - false if result was 0, else true 63015e3adeSMatt Spinler */ 64*57868bc5SMatt Spinler bool readBit(const std::string& name, Type type); 65015e3adeSMatt Spinler 66015e3adeSMatt Spinler /** 67015e3adeSMatt Spinler * Reads a file in sysfs that represents a single bit, 68015e3adeSMatt Spinler * where the page number passed in is substituted 69015e3adeSMatt Spinler * into the name in place of the 'P' character in it. 70015e3adeSMatt Spinler * 71015e3adeSMatt Spinler * @param[in] name - path concatenated to 72015e3adeSMatt Spinler * basePath to read 73015e3adeSMatt Spinler * @param[in] page - page number 74*57868bc5SMatt Spinler * @param[in] type - either Base or Hwmon 75015e3adeSMatt Spinler * 76015e3adeSMatt Spinler * @return bool - false if result was 0, else true 77015e3adeSMatt Spinler */ 78015e3adeSMatt Spinler bool readBitInPage(const std::string& name, 79*57868bc5SMatt Spinler size_t page, 80*57868bc5SMatt Spinler Type type); 81015e3adeSMatt Spinler 82015e3adeSMatt Spinler /** 83015e3adeSMatt Spinler * Writes an integer value to the file, therefore doing 84015e3adeSMatt Spinler * a PMBus write. 85015e3adeSMatt Spinler * 86015e3adeSMatt Spinler * @param[in] name - path concatenated to 87015e3adeSMatt Spinler * basePath to write 88015e3adeSMatt Spinler * @param[in] value - the value to write 89*57868bc5SMatt Spinler * @param[in] type - either Base or Hwmon 90015e3adeSMatt Spinler */ 91*57868bc5SMatt Spinler void write(const std::string& name, int value, Type type); 92015e3adeSMatt Spinler 93015e3adeSMatt Spinler /** 94015e3adeSMatt Spinler * Returns the sysfs base path of this device 95015e3adeSMatt Spinler */ 96015e3adeSMatt Spinler inline const auto& path() const 97015e3adeSMatt Spinler { 98015e3adeSMatt Spinler return basePath; 99015e3adeSMatt Spinler } 100015e3adeSMatt Spinler 101015e3adeSMatt Spinler /** 102015e3adeSMatt Spinler * Replaces the 'P' in the string passed in with 103015e3adeSMatt Spinler * the page number passed in. 104015e3adeSMatt Spinler * 105015e3adeSMatt Spinler * For example: 106015e3adeSMatt Spinler * insertPageNum("inP_enable", 42) 107015e3adeSMatt Spinler * returns "in42_enable" 108015e3adeSMatt Spinler * 109015e3adeSMatt Spinler * @param[in] templateName - the name string, with a 'P' in it 110015e3adeSMatt Spinler * @param[in] page - the page number to insert where the P was 111015e3adeSMatt Spinler * 112015e3adeSMatt Spinler * @return string - the new string with the page number in it 113015e3adeSMatt Spinler */ 114015e3adeSMatt Spinler static std::string insertPageNum(const std::string& templateName, 115015e3adeSMatt Spinler size_t page); 116015e3adeSMatt Spinler 117*57868bc5SMatt Spinler /** 118*57868bc5SMatt Spinler * Finds the path relative to basePath to the hwmon directory 119*57868bc5SMatt Spinler * for the device and stores it in hwmonRelPath. 120*57868bc5SMatt Spinler */ 121*57868bc5SMatt Spinler void findHwmonRelativePath(); 122*57868bc5SMatt Spinler 123015e3adeSMatt Spinler private: 124015e3adeSMatt Spinler 125015e3adeSMatt Spinler /** 126015e3adeSMatt Spinler * The sysfs device path 127015e3adeSMatt Spinler */ 128015e3adeSMatt Spinler std::experimental::filesystem::path basePath; 129015e3adeSMatt Spinler 130*57868bc5SMatt Spinler /** 131*57868bc5SMatt Spinler * The relative (to basePath) path to the hwmon directory 132*57868bc5SMatt Spinler */ 133*57868bc5SMatt Spinler std::experimental::filesystem::path hwmonRelPath; 134*57868bc5SMatt Spinler 135015e3adeSMatt Spinler }; 136015e3adeSMatt Spinler 137015e3adeSMatt Spinler } 138015e3adeSMatt Spinler } 139