forked from google-coral/libedgetpu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdriver_factory_default.cc
64 lines (57 loc) · 1.99 KB
/
driver_factory_default.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "driver/driver_factory.h"
#include <dirent.h>
#include <sys/stat.h>
namespace platforms {
namespace darwinn {
namespace driver {
std::vector<api::Device> DriverProvider::EnumerateByClass(
const std::string& class_name, const std::string& device_name,
api::Chip chip, api::Device::Type type) {
std::vector<api::Device> device_list;
const std::string class_dir_name = "/sys/class/" + class_name;
DIR* dir = opendir(class_dir_name.c_str());
if (dir == nullptr) {
VLOG(2) << "Failed to open " << class_dir_name << ": " << strerror(errno);
return device_list; // empty list
}
struct dirent* entry;
while ((entry = readdir(dir)) != nullptr) {
std::string entry_name(entry->d_name);
if (entry_name == "." || entry_name == "..") {
continue;
}
if (entry_name.compare(0, device_name.size(), device_name) != 0) {
continue;
}
const std::string dev_file_name = "/dev/" + entry_name;
struct stat statbuf;
int ret = stat(dev_file_name.c_str(), &statbuf);
if (ret != 0) {
VLOG(1) << "Failed to stat " << dev_file_name << ": " << strerror(errno);
continue;
}
if (!S_ISCHR(statbuf.st_mode)) {
LOG(ERROR) << dev_file_name << " is not a character device.";
continue;
}
device_list.push_back({chip, type, dev_file_name});
}
closedir(dir);
return device_list;
}
} // namespace driver
} // namespace darwinn
} // namespace platforms