18
18
#include < sys/ioctl.h>
19
19
#include < unistd.h>
20
20
#include < fcntl.h>
21
+ #include < libudev.h>
21
22
#include < cstdio>
22
23
#include < cstring>
23
24
#include < algorithm>
@@ -83,15 +84,15 @@ namespace Piduino {
83
84
// -----------------------------------------------------------------------------
84
85
85
86
// ---------------------------------------------------------------------------
86
- bool
87
+ bool
87
88
I2cDev::Info::setPath (const std::string & p) {
88
-
89
+
89
90
for (int i = 0 ; i < MaxBuses; i++) {
90
- std::string bp = busPath (i);
91
-
91
+ std::string bp = busPath (i);
92
+
92
93
if (bp == p) {
93
-
94
- setId (i);
94
+
95
+ setId (i);
95
96
return true ;
96
97
}
97
98
}
@@ -107,6 +108,53 @@ namespace Piduino {
107
108
return std::string (path);
108
109
}
109
110
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
+
110
158
// -----------------------------------------------------------------------------
111
159
//
112
160
// I2cDev Class
@@ -165,7 +213,7 @@ namespace Piduino {
165
213
d->flush ();
166
214
d->rxbuf .clear ();
167
215
168
- d->fd = ::open (d->bus .path ().c_str (), d->modeToPosixFlags (mode));
216
+ d->fd = ::open (d->bus .path ().c_str (), d->modeToPosixFlags (mode));
169
217
if (d->fd < 0 ) {
170
218
171
219
d->setError ();
@@ -262,8 +310,8 @@ namespace Piduino {
262
310
void
263
311
I2cDev::setBusPath (const char * path) {
264
312
PIMP_D (I2cDev);
265
-
266
- setBusPath (std::string (path));
313
+
314
+ setBusPath (std::string (path));
267
315
}
268
316
269
317
// ---------------------------------------------------------------------------
@@ -436,33 +484,6 @@ namespace Piduino {
436
484
d->flush ();
437
485
}
438
486
}
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
-
466
487
}
467
488
468
489
/* ========================================================================== */
0 commit comments