xref: /openbmc/intel-ipmi-oem/include/spiDev.hpp (revision c88640627cde5fb0e4aa7e1799d043689775cfad)
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