Skip to content

Commit c4b7c95

Browse files
committed
Switch the detection of i2c and spi buses on udev.
1 parent 08b5fef commit c4b7c95

File tree

10 files changed

+159
-114
lines changed

10 files changed

+159
-114
lines changed

include/piduino/arduino/Wire.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class TwoWire : public Piduino::I2cDev {
3737
TwoWire() : Piduino::I2cDev() {}
3838
virtual ~TwoWire() {}
3939
void begin() {
40-
setBus (defaultBus());
40+
setBus (Info::defaultBus());
4141
open ();
4242
}
4343
void begin (int id) {

include/piduino/i2cdev.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#ifndef PIDUINO_I2CDEV_H
1919
#define PIDUINO_I2CDEV_H
2020

21-
#include <map>
21+
#include <deque>
2222
#include <string>
2323
#include <piduino/iodevice.h>
2424

@@ -37,7 +37,7 @@ namespace Piduino {
3737
class Info {
3838
public:
3939
static const int MaxBuses = 32;
40-
Info(int id = 0) {
40+
Info (int id = 0) {
4141
setId (id);
4242
}
4343
inline int id() const {
@@ -57,8 +57,15 @@ namespace Piduino {
5757
bool operator!= (const Info & other) {
5858
return (_path != other._path) ;
5959
}
60+
6061
static std::string busPath (int id);
61-
62+
static Info defaultBus ();
63+
/**
64+
Returns a list of available serial ports on the system.
65+
*/
66+
static std::deque<Info> availableBuses ();
67+
68+
6269
private:
6370
int _id;
6471
std::string _path;
@@ -116,9 +123,6 @@ namespace Piduino {
116123

117124
virtual void flush ();
118125

119-
static std::map<int, Info> availableBuses ();
120-
static Info defaultBus ();
121-
122126
protected:
123127
class Private;
124128
I2cDev (Private &dd);

include/piduino/spidev.h

+23-24
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#ifndef PIDUINO_SPIDEV_H
1919
#define PIDUINO_SPIDEV_H
2020

21-
#include <vector>
21+
#include <deque>
2222
#include <map>
2323
#include <string>
2424
#include <piduino/iodevice.h>
@@ -81,27 +81,27 @@ namespace Piduino {
8181

8282
Cs() : _id (-1), _pin (0), _mode (Pin::ModeUnknown),
8383
_driverControl (true), _activeLevel (false) {}
84-
84+
8585
inline int id() const {
8686
return _id;
8787
}
88-
88+
8989
inline Pin * pin() const {
9090
return _pin;
9191
}
92-
92+
9393
inline Pin::Mode mode() const {
9494
return _mode;
9595
}
96-
96+
9797
inline bool driverControl() const {
9898
return _driverControl;
9999
}
100-
100+
101101
inline bool activeLevel() const {
102102
return _activeLevel;
103103
}
104-
104+
105105
bool setDriverControl (bool enable = false, bool activeLevel = false);
106106
bool get() const;
107107
void set (bool value);
@@ -133,22 +133,22 @@ namespace Piduino {
133133
public:
134134
static const int MaxBuses = 32;
135135
static const int MaxCs = 32;
136-
136+
137137
Info (int bus = 0, int cs = 0) {
138138
setId (bus, cs);
139139
}
140-
140+
141141
void setId (int bus, int cs = 0);
142142
bool setPath (const std::string & path);
143143

144144
inline int busId() const {
145145
return _bus;
146146
}
147-
147+
148148
inline int csId() const {
149149
return _cs;
150150
}
151-
151+
152152
inline const std::string & path() const {
153153
return _path;
154154
}
@@ -169,6 +169,17 @@ namespace Piduino {
169169
return (_path != other._path) ;
170170
}
171171

172+
/**
173+
* @brief Liste des bus disponibles sur le systèmes
174+
*/
175+
static std::deque<SpiDev::Info> availableBuses ();
176+
177+
/**
178+
* @brief Information sur le bus SPI par défaut disponible sur la carte Pi
179+
* Dépend du modèle de carte (informations stockées dans la base de données)
180+
*/
181+
static Info defaultBus ();
182+
172183
/**
173184
* @brief Chemin système correspondant à un bus
174185
* @param bus identifiant du bus
@@ -214,7 +225,7 @@ namespace Piduino {
214225
}
215226

216227
bool operator!= (const Settings & other) {
217-
return !(*this == other);
228+
return ! (*this == other);
218229
}
219230

220231
/*
@@ -470,18 +481,6 @@ namespace Piduino {
470481
*/
471482
bool bitOrder() const;
472483

473-
/**
474-
* @brief Liste des bus disponibles sur le systèmes
475-
* Dépend du modèle de carte (informations stockées dans la base de données)
476-
*/
477-
static std::vector<SpiDev::Info> availableBuses ();
478-
479-
/**
480-
* @brief Information sur le bus SPI par défaut disponible sur la carte Pi
481-
* Dépend du modèle de carte (informations stockées dans la base de données)
482-
*/
483-
static Info defaultBus ();
484-
485484
protected:
486485
class Private;
487486
SpiDev (Private &dd);

src/arduino/Core.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace Piduino {
4141
}
4242
else {
4343

44-
cs = & SpiDev::defaultBus().cs();
44+
cs = & SpiDev::Info::defaultBus().cs();
4545
}
4646
if (gpio.open()) {
4747

src/arduino/spi/SPI.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Initialize the SPI library
2121
void SPIClass::begin() {
2222

23-
setBus (defaultBus());
23+
setBus (Info::defaultBus());
2424
setSettings (SPISettings());
2525
open ();
2626
}

src/i2c/i2cdev.cpp

+57-36
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <sys/ioctl.h>
1919
#include <unistd.h>
2020
#include <fcntl.h>
21+
#include <libudev.h>
2122
#include <cstdio>
2223
#include <cstring>
2324
#include <algorithm>
@@ -83,15 +84,15 @@ namespace Piduino {
8384
// -----------------------------------------------------------------------------
8485

8586
// ---------------------------------------------------------------------------
86-
bool
87+
bool
8788
I2cDev::Info::setPath (const std::string & p) {
88-
89+
8990
for (int i = 0; i < MaxBuses; i++) {
90-
std::string bp = busPath(i);
91-
91+
std::string bp = busPath (i);
92+
9293
if (bp == p) {
93-
94-
setId(i);
94+
95+
setId (i);
9596
return true;
9697
}
9798
}
@@ -107,6 +108,53 @@ namespace Piduino {
107108
return std::string (path);
108109
}
109110

111+
// ---------------------------------------------------------------------------
112+
std::deque<I2cDev::Info>
113+
I2cDev::Info::availableBuses () {
114+
std::deque<I2cDev::Info> buses;
115+
struct udev *udev;
116+
117+
udev = udev_new();
118+
if (udev) {
119+
struct udev_enumerate * enumerate;
120+
struct udev_list_entry * devices, * dev_list_entry;
121+
struct udev_device * dev;
122+
123+
enumerate = udev_enumerate_new (udev);
124+
udev_enumerate_add_match_subsystem (enumerate, "i2c-dev");
125+
udev_enumerate_scan_devices (enumerate);
126+
devices = udev_enumerate_get_list_entry (enumerate);
127+
128+
udev_list_entry_foreach (dev_list_entry, devices) {
129+
130+
dev = udev_device_new_from_syspath (
131+
udev, udev_list_entry_get_name (dev_list_entry));
132+
133+
if (!dev) {
134+
break;
135+
}
136+
137+
const char * path = udev_device_get_devnode (dev);
138+
if (path) {
139+
Info bus;
140+
if (bus.setPath (path)) {
141+
buses.push_back(bus);
142+
}
143+
}
144+
}
145+
udev_unref (udev);
146+
}
147+
148+
return buses;
149+
}
150+
151+
// ---------------------------------------------------------------------------
152+
I2cDev::Info
153+
I2cDev::Info::defaultBus () {
154+
155+
return Info (db.board().defaultI2cBus());
156+
}
157+
110158
// -----------------------------------------------------------------------------
111159
//
112160
// I2cDev Class
@@ -165,7 +213,7 @@ namespace Piduino {
165213
d->flush();
166214
d->rxbuf.clear();
167215

168-
d->fd = ::open (d->bus.path().c_str(), d->modeToPosixFlags(mode));
216+
d->fd = ::open (d->bus.path().c_str(), d->modeToPosixFlags (mode));
169217
if (d->fd < 0) {
170218

171219
d->setError();
@@ -262,8 +310,8 @@ namespace Piduino {
262310
void
263311
I2cDev::setBusPath (const char * path) {
264312
PIMP_D (I2cDev);
265-
266-
setBusPath (std::string(path));
313+
314+
setBusPath (std::string (path));
267315
}
268316

269317
// ---------------------------------------------------------------------------
@@ -436,33 +484,6 @@ namespace Piduino {
436484
d->flush();
437485
}
438486
}
439-
440-
441-
// ---------------------------------------------------------------------------
442-
std::map<int, I2cDev::Info>
443-
I2cDev::availableBuses () {
444-
std::map<int, I2cDev::Info> buses;
445-
446-
for (int id = 0; id < db.board().soc().i2cCount() ; id++) {
447-
std::string path = Info::busPath (id);
448-
449-
if (System::fileExist (path)) {
450-
Info bus(id);
451-
452-
buses[id] = bus;
453-
}
454-
455-
}
456-
return buses;
457-
}
458-
459-
// ---------------------------------------------------------------------------
460-
I2cDev::Info
461-
I2cDev::defaultBus () {
462-
463-
return Info(db.board().defaultI2cBus());
464-
}
465-
466487
}
467488

468489
/* ========================================================================== */

src/serial/serialportinfo.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@
1414
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1515
* Lesser General Public License for more details.
1616
*/
17-
#if 0
18-
#include <cstdio>
19-
#include <stdlib.h>
20-
#endif
21-
2217
#include <unistd.h>
2318
#include <fcntl.h>
2419
#include <termios.h>

0 commit comments

Comments
 (0)