PIDUINO
Loading...
Searching...
No Matches
spidev.h
1/* Copyright © 2018-2025 Pascal JEAN, All rights reserved.
2 * This file is part of the Piduino Library.
3 *
4 * The Piduino Library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 3 of the License, or (at your option) any later version.
8 *
9 * The Piduino Library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with the Piduino Library; if not, see <http://www.gnu.org/licenses/>.
16 */
17#pragma once
18
19#include <deque>
20#include <map>
21#include <string>
22#include <piduino/iodevice.h>
23#include <piduino/gpiopin.h>
24#include <piduino/system.h>
25#include <linux/spi/spidev.h>
26
64namespace Piduino {
65
70 class SpiDev : public IoDevice {
71 public:
72
77 class Cs {
78 public:
79 friend class SpiDev;
80
81 Cs() : _id (-1), _pin (0), _mode (Pin::ModeUnknown),
82 _driverControl (true), _activeLevel (false) {}
83
84 inline int id() const {
85 return _id;
86 }
87
88 inline Pin * pin() const {
89 return _pin;
90 }
91
92 inline Pin::Mode mode() const {
93 return _mode;
94 }
95
96 inline bool driverControl() const {
97 return _driverControl;
98 }
99
100 inline bool activeLevel() const {
101 return _activeLevel;
102 }
103
104 bool setDriverControl (bool enable = false, bool activeLevel = false);
105 bool get() const;
106 void set (bool value);
107
108 protected:
109 inline void setId (int value) {
110 _id = value;
111 }
112 inline void setPin (Pin * value) {
113 _pin = value;
114 }
115 inline void setMode (Pin::Mode value) {
116 _mode = value;
117 }
118
119 private:
120 int _id;
125 };
126
131 class Info {
132 public:
133 static const int MaxBuses = 32;
134 static const int MaxCs = 32;
135
136 Info (int bus = 0, int cs = 0) {
137 setId (bus, cs);
138 }
139
140 void setId (int bus, int cs = 0);
141 bool setPath (const std::string & path);
142
143 inline int busId() const {
144 return _bus;
145 }
146
147 inline int csId() const {
148 return _cs;
149 }
150
151 inline const std::string & path() const {
152 return _path;
153 }
154
155 inline const std::map<int, Cs> & csList() const {
156 return _csList;
157 }
158
159 inline const Cs & cs() const {
160 return _csList.at (_cs);
161 }
162
163 inline bool exists() const {
165 }
166
167 bool operator== (const Info & other) {
168 return (_path == other._path) ;
169 }
170
171 bool operator!= (const Info & other) {
172 return (_path != other._path) ;
173 }
174
178 static std::deque<SpiDev::Info> availableBuses ();
179
184 static Info defaultBus ();
185
192 static std::string busPath (int bus, int cs = 0);
193
194 private:
195 int _bus;
196 int _cs;
197 std::string _path;
198 std::map<int, Cs> _csList;
199 };
200
205 class Settings {
206 public:
207 enum {
208 MsbFirst = true,
209 LsbFirst = false
210 };
211
212 Settings (uint32_t clock = 10000000, bool bitOrder = MsbFirst, uint8_t dataMode = SPI_MODE_0, uint8_t dataBits = 8) :
213 mode (dataMode), bitOrder (bitOrder), bitsPerWord (dataBits), speedHz (clock) {}
214
215 bool operator== (const Settings & other) {
216 return (mode == other.mode) && (bitOrder == other.bitOrder) &&
217 (bitsPerWord == other.bitsPerWord) && (speedHz == other.speedHz);
218 }
219
220 bool operator!= (const Settings & other) {
221 return ! (*this == other);
222 }
223
224 /*
225 SPI_CPHA 0x01
226 SPI_CPOL 0x02
227
228 SPI_MODE_0 (0|0)
229 SPI_MODE_1 (0|SPI_CPHA)
230 SPI_MODE_2 (SPI_CPOL|0)
231 SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
232
233 SPI_CS_HIGH 0x04
234 SPI_LSB_FIRST 0x08
235 SPI_3WIRE 0x10
236 SPI_LOOP 0x20
237 SPI_NO_CS 0x40
238 SPI_READY 0x80
239 */
240 uint8_t mode;
242 uint8_t bitsPerWord;
243 uint32_t speedHz;
244 };
245
250 class Transfer {
251 public:
252 const uint8_t * txBuf;
253 uint8_t * rxBuf;
254 uint32_t len;
255 uint32_t speedHz;
256 uint8_t bitsPerWord;
259 Transfer (const uint8_t * txbuf = 0, uint8_t * rxbuf = 0, uint32_t count = 0) :
260 txBuf (txbuf), rxBuf (rxbuf), len (count), speedHz (0),
262 bool operator== (const Transfer & other) {
263 return (txBuf == other.txBuf) && (rxBuf == other.rxBuf) &&
264 (len == other.len) && (speedHz == other.speedHz) &&
266 (bitsPerWord == other.bitsPerWord) &&
268 }
269 };
270
275
279 SpiDev (const Info & bus);
280
284 explicit SpiDev (int idBus, int idCs = 0);
285
289 explicit SpiDev (const std::string & path);
290
294 explicit SpiDev (const char * path);
295
299 virtual ~SpiDev();
300
309
314 virtual void close();
315
325 void setBus (int idBus, int idCs = 0);
326
330 void setBus (const Info & bus);
331
338 void setBusPath (const std::string & path);
339
343 void setBusPath (const char * path);
344
348 const Info & bus() const;
349
362 int transfer (const uint8_t * txbuf, uint8_t * rxbuf, uint32_t len);
363
371 int read (uint8_t * buffer, uint32_t len);
372
381 int write (const uint8_t *buffer, uint32_t len);
382
391
398 int transfer ();
399
404 void clear();
405
412
428 void setMode (uint8_t mode);
429
435 void setSpeedHz (uint32_t speedHz);
436
442 void setBitsPerWord (uint8_t bit);
443
450
454 const Settings & settings() const;
455
460 uint8_t mode() const;
461
465 uint32_t speedHz () const;
466
470 uint8_t bitsPerWord () const;
471
475 bool bitOrder() const;
476
477 protected:
478 class Private;
480
481 private:
483 };
484 // ---------------------------------------------------------------------------
485 //
486 // Piduino SpiDev Global Object
487 //
488 // ---------------------------------------------------------------------------
489 extern SpiDev SPI;
490}
495/* ========================================================================== */
A type-safe flags class for bitwise operations on enum values.
Definition flags.h:34
Abstract base class for input/output devices.
Definition iodevice.h:37
@ ReadWrite
Open the device for both input and output operations.
Definition iodevice.h:60
Represents a general-purpose input/output (GPIO) pin and its configuration.
Definition gpiopin.h:68
Mode
Enumerates the possible modes for a pin.
Definition gpiopin.h:76
Broche de chip select d'un bus SPI.
Definition spidev.h:77
void setId(int value)
Definition spidev.h:109
bool get() const
Pin * pin() const
Definition spidev.h:88
void setPin(Pin *value)
Definition spidev.h:112
bool driverControl() const
Definition spidev.h:96
void setMode(Pin::Mode value)
Definition spidev.h:115
void set(bool value)
Pin::Mode _mode
Definition spidev.h:122
bool setDriverControl(bool enable=false, bool activeLevel=false)
Pin::Mode mode() const
Definition spidev.h:92
int id() const
Definition spidev.h:84
bool activeLevel() const
Definition spidev.h:100
Informations sur un bus SPI.
Definition spidev.h:131
bool setPath(const std::string &path)
Info(int bus=0, int cs=0)
Definition spidev.h:136
static const int MaxCs
Definition spidev.h:134
static const int MaxBuses
Definition spidev.h:133
const Cs & cs() const
Definition spidev.h:159
static std::deque< SpiDev::Info > availableBuses()
Liste des bus disponibles sur le systèmes.
const std::map< int, Cs > & csList() const
Definition spidev.h:155
static Info defaultBus()
Information sur le bus SPI par défaut disponible sur la carte Pi Dépend du modèle de carte (informati...
int csId() const
Definition spidev.h:147
void setId(int bus, int cs=0)
bool exists() const
Definition spidev.h:163
int busId() const
Definition spidev.h:143
std::string _path
chemin du bus dans /dev
Definition spidev.h:197
bool operator==(const Info &other)
Definition spidev.h:167
const std::string & path() const
Definition spidev.h:151
static std::string busPath(int bus, int cs=0)
Chemin système correspondant à un bus.
bool operator!=(const Info &other)
Definition spidev.h:171
std::map< int, Cs > _csList
liste des broches de CS du bus
Definition spidev.h:198
int _cs
index du CS affecté par le driver spidev
Definition spidev.h:196
int _bus
numéro du bus
Definition spidev.h:195
Settings(uint32_t clock=10000000, bool bitOrder=MsbFirst, uint8_t dataMode=SPI_MODE_0, uint8_t dataBits=8)
Definition spidev.h:212
@ MsbFirst
MSB en premier.
Definition spidev.h:208
@ LsbFirst
LSB en premier.
Definition spidev.h:209
bool operator==(const Settings &other)
Definition spidev.h:215
bool operator!=(const Settings &other)
Definition spidev.h:220
bool operator==(const Transfer &other)
Definition spidev.h:262
uint16_t delayBeforeReleaseCs
Definition spidev.h:258
Transfer(const uint8_t *txbuf=0, uint8_t *rxbuf=0, uint32_t count=0)
Definition spidev.h:259
const uint8_t * txBuf
Definition spidev.h:252
const Info & bus() const
Informations sur le bus.
const Settings & settings() const
Configuration actuelle.
void setBusPath(const std::string &path)
Modification du chemin du bus Si la liaison ouverte, celle-ci est fermée, puis réouverte sur le nouve...
uint8_t bitsPerWord() const
Nombre de bits par mot.
int transfer(const uint8_t *txbuf, uint8_t *rxbuf, uint32_t len)
Transfert d'un message en entrée-sortie.
virtual void close()
Fermeture du bus Cette fonction est appelée par le destructeur.
int write(const uint8_t *buffer, uint32_t len)
Ecriture d'un message.
void setBus(int idBus, int idCs=0)
Modification du bus SPI Si la liaison ouverte, celle-ci est fermée, puis réouverte sur le nouveau bus...
uint32_t speedHz() const
Vitesse maximale de transmission en Hz.
void setMode(uint8_t mode)
Modification du mode de fonctionnement Les valeurs généralement utilisées sont SPI_MODE_0,...
SpiDev(Private &dd)
SpiDev(const std::string &path)
Constructeur à partir chemin de bus.
void setSettings(const Settings &settings)
Modification des réglages de la transmission Si la liaison est ouverte les réglages sont appliqués im...
SpiDev(int idBus, int idCs=0)
Constructeur à partir identifiant de bus.
void setBusPath(const char *path)
Surcharge de setBusPath() à partir d'une variable const char *.
int read(uint8_t *buffer, uint32_t len)
Lecture d'un message.
void setBitsPerWord(uint8_t bit)
Modification du nombre de bits par mot Si la liaison est ouverte les réglages sont appliqués immédiat...
SpiDev(const Info &bus)
Constructeur à partir d'un bus.
void setBitOrder(bool bitOrder)
Modification de l'ordre de transmission des bits MsbFirst ou LsbFirst Si la liaison est ouverte les r...
void pushTransfer(Transfer &t)
Empilement d'un message dans la pile de transmission Permet de gérer l'envoi de plusieurs message d'u...
void setSpeedHz(uint32_t speedHz)
Modification de la vitesse maximale de transmission en Hz Si la liaison est ouverte les réglages sont...
SpiDev()
Constructeur par défaut.
uint8_t mode() const
Mode de fonctionnement cf setMode()
int transfer()
Transmission des messages de la pile de transmission La pile est vidée avant retour.
bool bitOrder() const
Ordre de transmission des bits MsbFirst ou LsbFirst.
virtual ~SpiDev()
Destructeur.
void setBus(const Info &bus)
Surcharge de setBus() à partir d'une variable Info.
void clear()
Vidage de la pile de transmission Pas nécessaire après transfer()
SpiDev(const char *path)
Constructeur à partir chemin de bus const char *.
virtual bool open(OpenMode mode=IoDevice::ReadWrite)
Ouverture du bus SPI La configuration settings() est appliquée.
static bool charFileExists(const char *path)
Internal implementation class for GpioDevice.
#define PIMP_DECLARE_PRIVATE(Class)
PIMP_DECLARE_PRIVATE.
Definition global.h:82
Global namespace for Piduino.
Definition board.h:28
SpiDev SPI
Piduino SpiDev Global Object.