1*c8864062SRajashekar Gade Reddy /* 2*c8864062SRajashekar Gade Reddy // Copyright (c) 2019 Intel Corporation 3*c8864062SRajashekar Gade Reddy // 4*c8864062SRajashekar Gade Reddy // Licensed under the Apache License, Version 2.0 (the "License"); 5*c8864062SRajashekar Gade Reddy // you may not use this file except in compliance with the License. 6*c8864062SRajashekar Gade Reddy // You may obtain a copy of the License at 7*c8864062SRajashekar Gade Reddy // 8*c8864062SRajashekar Gade Reddy // http://www.apache.org/licenses/LICENSE-2.0 9*c8864062SRajashekar Gade Reddy // 10*c8864062SRajashekar Gade Reddy // Unless required by applicable law or agreed to in writing, software 11*c8864062SRajashekar Gade Reddy // distributed under the License is distributed on an "AS IS" BASIS, 12*c8864062SRajashekar Gade Reddy // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*c8864062SRajashekar Gade Reddy // See the License for the specific language governing permissions and 14*c8864062SRajashekar Gade Reddy // limitations under the License. 15*c8864062SRajashekar Gade Reddy */ 16*c8864062SRajashekar Gade Reddy 17*c8864062SRajashekar Gade Reddy #pragma once 18*c8864062SRajashekar Gade Reddy #include <experimental/filesystem> 19*c8864062SRajashekar Gade Reddy 20*c8864062SRajashekar Gade Reddy class SPIDev 21*c8864062SRajashekar Gade Reddy { 22*c8864062SRajashekar Gade Reddy private: 23*c8864062SRajashekar Gade Reddy int fd = -1; 24*c8864062SRajashekar Gade Reddy 25*c8864062SRajashekar Gade Reddy public: 26*c8864062SRajashekar Gade Reddy SPIDev() = delete; 27*c8864062SRajashekar Gade Reddy SPIDev(const SPIDev&) = delete; 28*c8864062SRajashekar Gade Reddy SPIDev& operator=(const SPIDev&) = delete; 29*c8864062SRajashekar Gade Reddy SPIDev(SPIDev&&) = delete; 30*c8864062SRajashekar Gade Reddy SPIDev& operator=(SPIDev&&) = delete; 31*c8864062SRajashekar Gade Reddy 32*c8864062SRajashekar Gade Reddy SPIDev(const std::string& spiDev) : 33*c8864062SRajashekar Gade Reddy fd(open(spiDev.c_str(), O_RDWR | O_CLOEXEC)) 34*c8864062SRajashekar Gade Reddy { 35*c8864062SRajashekar Gade Reddy if (fd < 0) 36*c8864062SRajashekar Gade Reddy { 37*c8864062SRajashekar Gade Reddy std::string msg = "Unable to open mtd device. errno=" + 38*c8864062SRajashekar Gade Reddy std::string(std::strerror(errno)); 39*c8864062SRajashekar Gade Reddy throw std::runtime_error(msg); 40*c8864062SRajashekar Gade Reddy } 41*c8864062SRajashekar Gade Reddy } 42*c8864062SRajashekar Gade Reddy 43*c8864062SRajashekar Gade Reddy virtual ~SPIDev() 44*c8864062SRajashekar Gade Reddy { 45*c8864062SRajashekar Gade Reddy if (!(fd < 0)) 46*c8864062SRajashekar Gade Reddy { 47*c8864062SRajashekar Gade Reddy close(fd); 48*c8864062SRajashekar Gade Reddy } 49*c8864062SRajashekar Gade Reddy } 50*c8864062SRajashekar Gade Reddy 51*c8864062SRajashekar Gade Reddy void spiReadData(const uint32_t startAddr, const size_t dataLen, 52*c8864062SRajashekar Gade Reddy void* dataRes) 53*c8864062SRajashekar Gade Reddy { 54*c8864062SRajashekar Gade Reddy if (lseek(fd, startAddr, SEEK_SET) < 0) 55*c8864062SRajashekar Gade Reddy { 56*c8864062SRajashekar Gade Reddy std::string msg = "Failed to do lseek on mtd device. errno=" + 57*c8864062SRajashekar Gade Reddy std::string(std::strerror(errno)); 58*c8864062SRajashekar Gade Reddy throw std::runtime_error(msg); 59*c8864062SRajashekar Gade Reddy } 60*c8864062SRajashekar Gade Reddy 61*c8864062SRajashekar Gade Reddy if (read(fd, dataRes, dataLen) != dataLen) 62*c8864062SRajashekar Gade Reddy { 63*c8864062SRajashekar Gade Reddy std::string msg = "Failed to read on mtd device. errno=" + 64*c8864062SRajashekar Gade Reddy std::string(std::strerror(errno)); 65*c8864062SRajashekar Gade Reddy throw std::runtime_error(msg); 66*c8864062SRajashekar Gade Reddy } 67*c8864062SRajashekar Gade Reddy 68*c8864062SRajashekar Gade Reddy return; 69*c8864062SRajashekar Gade Reddy } 70*c8864062SRajashekar Gade Reddy }; 71