@@ -15,35 +15,6 @@ namespace gpiod {
namespace {
-::gpiod_chip* open_lookup(const ::std::string& device)
-{
- return ::gpiod_chip_open_lookup(device.c_str());
-}
-
-::gpiod_chip* open_by_path(const ::std::string& device)
-{
- return ::gpiod_chip_open(device.c_str());
-}
-
-::gpiod_chip* open_by_name(const ::std::string& device)
-{
- return ::gpiod_chip_open_by_name(device.c_str());
-}
-
-::gpiod_chip* open_by_number(const ::std::string& device)
-{
- return ::gpiod_chip_open_by_number(::std::stoul(device));
-}
-
-using open_func = ::std::function<::gpiod_chip* (const ::std::string&)>;
-
-const ::std::map<int, open_func> open_funcs = {
- { chip::OPEN_LOOKUP, open_lookup, },
- { chip::OPEN_BY_PATH, open_by_path, },
- { chip::OPEN_BY_NAME, open_by_name, },
- { chip::OPEN_BY_NUMBER, open_by_number, },
-};
-
void chip_deleter(::gpiod_chip* chip)
{
::gpiod_chip_close(chip);
@@ -56,10 +27,10 @@ bool is_gpiochip_device(const ::std::string& path)
return ::gpiod_is_gpiochip_device(path.c_str());
}
-chip::chip(const ::std::string& device, int how)
+chip::chip(const ::std::string& path)
: _m_chip()
{
- this->open(device, how);
+ this->open(path);
}
chip::chip(::gpiod_chip* chip)
@@ -74,14 +45,12 @@ chip::chip(const ::std::weak_ptr<::gpiod_chip>& chip_ptr)
}
-void chip::open(const ::std::string& device, int how)
+void chip::open(const ::std::string& path)
{
- auto func = open_funcs.at(how);
-
- ::gpiod_chip *chip = func(device);
+ ::gpiod_chip *chip = ::gpiod_chip_open(path.c_str());
if (!chip)
throw ::std::system_error(errno, ::std::system_category(),
- "cannot open GPIO device " + device);
+ "cannot open GPIO device " + path);
this->_m_chip.reset(chip, chip_deleter);
}
@@ -58,10 +58,9 @@ public:
/**
* @brief Constructor. Opens the chip using chip::open.
- * @param device String describing the GPIO chip.
- * @param how Indicates how the chip should be opened.
+ * @param path Path to the GPIO chip device.
*/
- GPIOD_API chip(const ::std::string& device, int how = OPEN_LOOKUP);
+ GPIOD_API chip(const ::std::string& path);
/**
* @brief Copy constructor. References the object held by other.
@@ -96,13 +95,12 @@ public:
/**
* @brief Open a GPIO chip.
- * @param device String describing the GPIO chip.
- * @param how Indicates how the chip should be opened.
+ * @param path Path to the GPIO chip device.
*
* If the object already holds a reference to an open chip, it will be
* closed and the reference reset.
*/
- GPIOD_API void open(const ::std::string &device, int how = OPEN_LOOKUP);
+ GPIOD_API void open(const ::std::string &path);
/**
* @brief Reset the internal smart pointer owned by this object.
@@ -184,21 +182,6 @@ public:
*/
GPIOD_API bool operator!(void) const noexcept;
- /**
- * @brief Affect the way in which chip::chip and chip::open will try
- * to open a GPIO chip character device.
- */
- enum : int {
- OPEN_LOOKUP = 1,
- /**< Open based on the best guess what the supplied string is. */
- OPEN_BY_PATH,
- /**< Assume the string is a path to the GPIO chardev. */
- OPEN_BY_NAME,
- /**< Assume the string is the name of the chip */
- OPEN_BY_NUMBER,
- /**< Assume the string is the number of the GPIO chip. */
- };
-
private:
chip(::gpiod_chip* chip);
@@ -32,72 +32,22 @@ TEST_CASE("GPIO chip device can be verified with is_gpiochip_device()", "[chip]"
}
}
-TEST_CASE("GPIO chip device can be opened in different modes", "[chip]")
+TEST_CASE("GPIO chip device can be opened", "[chip]")
{
mockup::probe_guard mockup_chips({ 8, 8, 8 });
- SECTION("open by name")
- {
- REQUIRE_NOTHROW(::gpiod::chip(mockup::instance().chip_name(1),
- ::gpiod::chip::OPEN_BY_NAME));
- }
-
- SECTION("open by path")
- {
- REQUIRE_NOTHROW(::gpiod::chip(mockup::instance().chip_path(1),
- ::gpiod::chip::OPEN_BY_PATH));
- }
-
- SECTION("open by number")
- {
- REQUIRE_NOTHROW(::gpiod::chip(::std::to_string(mockup::instance().chip_num(1)),
- ::gpiod::chip::OPEN_BY_NUMBER));
- }
-}
-
-TEST_CASE("GPIO chip device can be opened with implicit lookup", "[chip]")
-{
- mockup::probe_guard mockup_chips({ 8, 8, 8 });
-
- SECTION("lookup by name")
- {
- REQUIRE_NOTHROW(::gpiod::chip(mockup::instance().chip_name(1)));
- }
-
- SECTION("lookup by path")
+ SECTION("open from constructor")
{
REQUIRE_NOTHROW(::gpiod::chip(mockup::instance().chip_path(1)));
}
- SECTION("lookup by number")
+ SECTION("open from open() method")
{
- REQUIRE_NOTHROW(::gpiod::chip(::std::to_string(mockup::instance().chip_num(1))));
- }
-}
-
-TEST_CASE("GPIO chip can be opened with the open() method in different modes", "[chip]")
-{
- mockup::probe_guard mockup_chips({ 8, 8, 8 });
- ::gpiod::chip chip;
-
- REQUIRE_FALSE(!!chip);
+ ::gpiod::chip chip;
- SECTION("open by name")
- {
- REQUIRE_NOTHROW(chip.open(mockup::instance().chip_name(1),
- ::gpiod::chip::OPEN_BY_NAME));
- }
-
- SECTION("open by path")
- {
- REQUIRE_NOTHROW(chip.open(mockup::instance().chip_path(1),
- ::gpiod::chip::OPEN_BY_PATH));
- }
+ REQUIRE_FALSE(!!chip);
- SECTION("open by number")
- {
- REQUIRE_NOTHROW(chip.open(::std::to_string(mockup::instance().chip_num(1)),
- ::gpiod::chip::OPEN_BY_NUMBER));
+ REQUIRE_NOTHROW(chip.open(mockup::instance().chip_path(1)));
}
}
@@ -116,27 +66,6 @@ TEST_CASE("Uninitialized GPIO chip behaves correctly", "[chip]")
}
}
-TEST_CASE("GPIO chip can be opened with the open() method with implicit lookup", "[chip]")
-{
- mockup::probe_guard mockup_chips({ 8, 8, 8 });
- ::gpiod::chip chip;
-
- SECTION("lookup by name")
- {
- REQUIRE_NOTHROW(chip.open(mockup::instance().chip_name(1)));
- }
-
- SECTION("lookup by path")
- {
- REQUIRE_NOTHROW(chip.open(mockup::instance().chip_path(1)));
- }
-
- SECTION("lookup by number")
- {
- REQUIRE_NOTHROW(chip.open(::std::to_string(mockup::instance().chip_num(1))));
- }
-}
-
TEST_CASE("Trying to open a nonexistent chip throws system_error", "[chip]")
{
REQUIRE_THROWS_AS(::gpiod::chip("nonexistent-chip"), ::std::system_error);
@@ -146,7 +75,7 @@ TEST_CASE("Chip object can be reset", "[chip]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
REQUIRE(chip);
chip.reset();
REQUIRE_FALSE(!!chip);
@@ -156,7 +85,7 @@ TEST_CASE("Chip info can be correctly retrieved", "[chip]")
{
mockup::probe_guard mockup_chips({ 8, 16, 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(1));
+ ::gpiod::chip chip(mockup::instance().chip_path(1));
REQUIRE(chip.name() == mockup::instance().chip_name(1));
REQUIRE(chip.label() == "gpio-mockup-B");
REQUIRE(chip.num_lines() == 16);
@@ -166,11 +95,11 @@ TEST_CASE("Chip object can be copied and compared", "[chip]")
{
mockup::probe_guard mockup_chips({ 8, 8 });
- ::gpiod::chip chip1(mockup::instance().chip_name(0));
+ ::gpiod::chip chip1(mockup::instance().chip_path(0));
auto chip2 = chip1;
REQUIRE(chip1 == chip2);
REQUIRE_FALSE(chip1 != chip2);
- ::gpiod::chip chip3(mockup::instance().chip_name(1));
+ ::gpiod::chip chip3(mockup::instance().chip_path(1));
REQUIRE(chip1 != chip3);
REQUIRE_FALSE(chip2 == chip3);
}
@@ -178,7 +107,7 @@ TEST_CASE("Chip object can be copied and compared", "[chip]")
TEST_CASE("Lines can be retrieved from chip objects", "[chip]")
{
mockup::probe_guard mockup_chips({ 8, 8, 8 }, mockup::FLAG_NAMED_LINES);
- ::gpiod::chip chip(mockup::instance().chip_name(1));
+ ::gpiod::chip chip(mockup::instance().chip_path(1));
SECTION("get single line by offset")
{
@@ -216,7 +145,7 @@ TEST_CASE("Lines can be retrieved from chip objects", "[chip]")
TEST_CASE("All lines can be retrieved from a chip at once", "[chip]")
{
mockup::probe_guard mockup_chips({ 4 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto lines = chip.get_all_lines();
REQUIRE(lines.size() == 4);
@@ -229,7 +158,7 @@ TEST_CASE("All lines can be retrieved from a chip at once", "[chip]")
TEST_CASE("Errors occurring when retrieving lines are correctly reported", "[chip]")
{
mockup::probe_guard mockup_chips({ 8 }, mockup::FLAG_NAMED_LINES);
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
SECTION("invalid offset (single line)")
{
@@ -24,7 +24,7 @@ TEST_CASE("Line events can be detected", "[event][line]")
{
mockup::probe_guard mockup_chips({ 8 });
mockup::event_thread events(0, 4, 200);
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line = chip.get_line(4);
::gpiod::line_request config;
@@ -105,7 +105,7 @@ TEST_CASE("Watching line_bulk objects for events works", "[event][bulk]")
{
mockup::probe_guard mockup_chips({ 8 });
mockup::event_thread events(0, 2, 200);
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto lines = chip.get_lines({ 0, 1, 2, 3 });
::gpiod::line_request config;
@@ -133,7 +133,7 @@ TEST_CASE("Watching line_bulk objects for events works", "[event][bulk]")
TEST_CASE("It's possible to retrieve the event file descriptor", "[event][line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line = chip.get_line(4);
::gpiod::line_request config;
@@ -165,7 +165,7 @@ TEST_CASE("Event file descriptors can be used for polling", "[event]")
{
mockup::probe_guard mockup_chips({ 8 });
mockup::event_thread events(0, 3, 200);
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto lines = chip.get_lines({ 0, 1, 2, 3, 4, 5 });
::gpiod::line_request config;
@@ -196,7 +196,7 @@ TEST_CASE("Event file descriptors can be used for polling", "[event]")
TEST_CASE("It's possible to read a value from a line requested for events", "[event][line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line = chip.get_line(4);
::gpiod::line_request config;
@@ -222,7 +222,7 @@ TEST_CASE("It's possible to read a value from a line requested for events", "[ev
TEST_CASE("It's possible to read values from lines requested for events", "[event][bulk]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto lines = chip.get_lines({ 0, 1, 2, 3, 4 });
::gpiod::line_request config;
@@ -256,7 +256,7 @@ TEST_CASE("It's possible to read values from lines requested for events", "[even
TEST_CASE("It's possible to read more than one line event", "[event][line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line = chip.get_line(4);
::gpiod::line_request config;
@@ -15,7 +15,7 @@ using ::gpiod::test::mockup;
TEST_CASE("Line iterator works", "[iter][line]")
{
mockup::probe_guard mockup_chips({ 4 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
unsigned int count = 0;
for (auto& it: ::gpiod::line_iter(chip))
@@ -21,7 +21,7 @@ const ::std::string consumer = "line-test";
TEST_CASE("Line information can be correctly retrieved", "[line]")
{
mockup::probe_guard mockup_chips({ 8 }, mockup::FLAG_NAMED_LINES);
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line = chip.get_line(4);
SECTION("unexported line")
@@ -167,7 +167,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
TEST_CASE("Line bulk object works correctly", "[line][bulk]")
{
mockup::probe_guard mockup_chips({ 8 }, mockup::FLAG_NAMED_LINES);
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
SECTION("lines can be added, accessed and cleared")
{
@@ -210,7 +210,7 @@ TEST_CASE("Line bulk object works correctly", "[line][bulk]")
TEST_CASE("Line values can be set and read", "[line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
::gpiod::line_request config;
config.consumer = consumer.c_str();
@@ -308,7 +308,7 @@ TEST_CASE("Line values can be set and read", "[line]")
TEST_CASE("Line can be reconfigured", "[line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
::gpiod::line_request config;
config.consumer = consumer.c_str();
@@ -436,7 +436,7 @@ TEST_CASE("Line can be reconfigured", "[line]")
TEST_CASE("Exported line can be released", "[line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line = chip.get_line(4);
::gpiod::line_request config;
@@ -487,7 +487,7 @@ TEST_CASE("Uninitialized GPIO line_bulk behaves correctly", "[line][bulk]")
TEST_CASE("Cannot request the same line twice", "[line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
::gpiod::line_request config;
config.consumer = consumer.c_str();
@@ -516,7 +516,7 @@ TEST_CASE("Cannot request the same line twice", "[line]")
TEST_CASE("Cannot get/set values of unrequested lines", "[line]")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line = chip.get_line(3);
SECTION("get value")
@@ -533,7 +533,7 @@ TEST_CASE("Cannot get/set values of unrequested lines", "[line]")
TEST_CASE("Line objects can be compared")
{
mockup::probe_guard mockup_chips({ 8 });
- ::gpiod::chip chip(mockup::instance().chip_name(0));
+ ::gpiod::chip chip(mockup::instance().chip_path(0));
auto line1 = chip.get_line(3);
auto line2 = chip.get_line(3);
auto line3 = chip.get_line(4);
@@ -1952,44 +1952,19 @@ static gpiod_LineBulkObject *gpiod_LineToLineBulk(gpiod_LineObject *line)
return ret;
}
-enum {
- gpiod_OPEN_LOOKUP = 1,
- gpiod_OPEN_BY_NAME,
- gpiod_OPEN_BY_PATH,
- gpiod_OPEN_BY_NUMBER,
-};
-
static int gpiod_Chip_init(gpiod_ChipObject *self,
PyObject *args, PyObject *Py_UNUSED(ignored))
{
- int rv, how = gpiod_OPEN_LOOKUP;
- PyThreadState *thread;
- char *descr;
+ char *path;
+ int rv;
- rv = PyArg_ParseTuple(args, "s|i", &descr, &how);
+ rv = PyArg_ParseTuple(args, "s", &path);
if (!rv)
return -1;
- thread = PyEval_SaveThread();
- switch (how) {
- case gpiod_OPEN_LOOKUP:
- self->chip = gpiod_chip_open_lookup(descr);
- break;
- case gpiod_OPEN_BY_NAME:
- self->chip = gpiod_chip_open_by_name(descr);
- break;
- case gpiod_OPEN_BY_PATH:
- self->chip = gpiod_chip_open(descr);
- break;
- case gpiod_OPEN_BY_NUMBER:
- self->chip = gpiod_chip_open_by_number(atoi(descr));
- break;
- default:
- PyEval_RestoreThread(thread);
- PyErr_BadArgument();
- return -1;
- }
- PyEval_RestoreThread(thread);
+ Py_BEGIN_ALLOW_THREADS;
+ self->chip = gpiod_chip_open(path);
+ Py_END_ALLOW_THREADS;
if (!self->chip) {
PyErr_SetFromErrno(PyExc_OSError);
return -1;
@@ -2553,26 +2528,6 @@ typedef struct {
} gpiod_ConstDescr;
static gpiod_ConstDescr gpiod_ConstList[] = {
- {
- .typeobj = &gpiod_ChipType,
- .name = "OPEN_LOOKUP",
- .val = gpiod_OPEN_LOOKUP,
- },
- {
- .typeobj = &gpiod_ChipType,
- .name = "OPEN_BY_PATH",
- .val = gpiod_OPEN_BY_PATH,
- },
- {
- .typeobj = &gpiod_ChipType,
- .name = "OPEN_BY_NAME",
- .val = gpiod_OPEN_BY_NAME,
- },
- {
- .typeobj = &gpiod_ChipType,
- .name = "OPEN_BY_NUMBER",
- .val = gpiod_OPEN_BY_NUMBER,
- },
{
.typeobj = &gpiod_LineType,
.name = "DIRECTION_INPUT",
@@ -96,31 +96,10 @@ class ChipOpen(MockupTestCase):
chip_sizes = ( 8, 8, 8 )
- def test_open_chip_by_name(self):
- with gpiod.Chip(mockup.chip_name(1), gpiod.Chip.OPEN_BY_NAME) as chip:
- self.assertEqual(chip.name(), mockup.chip_name(1))
-
- def test_open_chip_by_path(self):
- with gpiod.Chip(mockup.chip_path(1), gpiod.Chip.OPEN_BY_PATH) as chip:
- self.assertEqual(chip.name(), mockup.chip_name(1))
-
- def test_open_chip_by_num(self):
- with gpiod.Chip('{}'.format(mockup.chip_num(1)),
- gpiod.Chip.OPEN_BY_NUMBER) as chip:
- self.assertEqual(chip.name(), mockup.chip_name(1))
-
- def test_lookup_chip_by_name(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
- self.assertEqual(chip.name(), mockup.chip_name(1))
-
- def test_lookup_chip_by_path(self):
+ def test_open_good(self):
with gpiod.Chip(mockup.chip_path(1)) as chip:
self.assertEqual(chip.name(), mockup.chip_name(1))
- def test_lookup_chip_by_num(self):
- with gpiod.Chip('{}'.format(mockup.chip_num(1))) as chip:
- self.assertEqual(chip.name(), mockup.chip_name(1))
-
def test_nonexistent_chip(self):
with self.assertRaises(FileNotFoundError):
chip = gpiod.Chip('nonexistent-chip')
@@ -134,7 +113,7 @@ class ChipClose(MockupTestCase):
chip_sizes = ( 8, )
def test_use_chip_after_close(self):
- chip = gpiod.Chip(mockup.chip_name(0))
+ chip = gpiod.Chip(mockup.chip_path(0))
self.assertEqual(chip.name(), mockup.chip_name(0))
chip.close()
with self.assertRaises(ValueError):
@@ -145,7 +124,7 @@ class ChipInfo(MockupTestCase):
chip_sizes = ( 16, )
def test_chip_get_info(self):
- chip = gpiod.Chip(mockup.chip_name(0))
+ chip = gpiod.Chip(mockup.chip_path(0))
self.assertEqual(chip.name(), mockup.chip_name(0))
self.assertEqual(chip.label(), 'gpio-mockup-A')
self.assertEqual(chip.num_lines(), 16)
@@ -156,29 +135,29 @@ class ChipGetLines(MockupTestCase):
flags = gpiomockup.Mockup.FLAG_NAMED_LINES
def test_get_single_line_by_offset(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
+ with gpiod.Chip(mockup.chip_path(1)) as chip:
line = chip.get_line(4)
self.assertEqual(line.name(), 'gpio-mockup-B-4')
def test_find_single_line_by_name(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
+ with gpiod.Chip(mockup.chip_path(1)) as chip:
lines = chip.find_line('gpio-mockup-B-4', unique=True).to_list()
self.assertEqual(lines[0].offset(), 4)
def test_get_single_line_invalid_offset(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
+ with gpiod.Chip(mockup.chip_path(1)) as chip:
with self.assertRaises(OSError) as err_ctx:
line = chip.get_line(11)
self.assertEqual(err_ctx.exception.errno, errno.EINVAL)
def test_find_single_line_nonexistent(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
+ with gpiod.Chip(mockup.chip_path(1)) as chip:
lines = chip.find_line('nonexistent-line', unique=True)
self.assertEqual(lines, None)
def test_get_multiple_lines_by_offsets_in_tuple(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
+ with gpiod.Chip(mockup.chip_path(1)) as chip:
lines = chip.get_lines(( 1, 3, 6, 7 )).to_list()
self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].name(), 'gpio-mockup-B-1')
@@ -187,7 +166,7 @@ class ChipGetLines(MockupTestCase):
self.assertEqual(lines[3].name(), 'gpio-mockup-B-7')
def test_get_multiple_lines_by_offsets_in_list(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
+ with gpiod.Chip(mockup.chip_path(1)) as chip:
lines = chip.get_lines([ 1, 3, 6, 7 ]).to_list()
self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].name(), 'gpio-mockup-B-1')
@@ -196,14 +175,14 @@ class ChipGetLines(MockupTestCase):
self.assertEqual(lines[3].name(), 'gpio-mockup-B-7')
def test_get_multiple_lines_invalid_offset(self):
- with gpiod.Chip(mockup.chip_name(1)) as chip:
+ with gpiod.Chip(mockup.chip_path(1)) as chip:
with self.assertRaises(OSError) as err_ctx:
line = chip.get_lines(( 1, 3, 11, 7 ))
self.assertEqual(err_ctx.exception.errno, errno.EINVAL)
def test_get_all_lines(self):
- with gpiod.Chip(mockup.chip_name(2)) as chip:
+ with gpiod.Chip(mockup.chip_path(2)) as chip:
lines = chip.get_all_lines().to_list()
self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].name(), 'gpio-mockup-C-0')
@@ -221,7 +200,7 @@ class LineInfo(MockupTestCase):
flags = gpiomockup.Mockup.FLAG_NAMED_LINES
def test_unexported_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
self.assertEqual(line.offset(), 4)
self.assertEqual(line.name(), 'gpio-mockup-A-4')
@@ -232,7 +211,7 @@ class LineInfo(MockupTestCase):
self.assertFalse(line.is_requested())
def test_exported_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -246,7 +225,7 @@ class LineInfo(MockupTestCase):
self.assertTrue(line.is_requested())
def test_exported_line_with_flags(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
flags = (gpiod.LINE_REQ_FLAG_ACTIVE_LOW |
gpiod.LINE_REQ_FLAG_OPEN_DRAIN)
@@ -265,7 +244,7 @@ class LineInfo(MockupTestCase):
self.assertEqual(line.bias(), gpiod.Line.BIAS_AS_IS)
def test_exported_open_drain_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
flags = gpiod.LINE_REQ_FLAG_OPEN_DRAIN
line.request(consumer=default_consumer,
@@ -283,7 +262,7 @@ class LineInfo(MockupTestCase):
self.assertEqual(line.bias(), gpiod.Line.BIAS_AS_IS)
def test_exported_open_source_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
flags = gpiod.LINE_REQ_FLAG_OPEN_SOURCE
line.request(consumer=default_consumer,
@@ -301,7 +280,7 @@ class LineInfo(MockupTestCase):
self.assertEqual(line.bias(), gpiod.Line.BIAS_AS_IS)
def test_exported_bias_disable_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
flags = gpiod.LINE_REQ_FLAG_BIAS_DISABLE
line.request(consumer=default_consumer,
@@ -319,7 +298,7 @@ class LineInfo(MockupTestCase):
self.assertEqual(line.bias(), gpiod.Line.BIAS_DISABLE)
def test_exported_bias_pull_down_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
flags = gpiod.LINE_REQ_FLAG_BIAS_PULL_DOWN
line.request(consumer=default_consumer,
@@ -337,7 +316,7 @@ class LineInfo(MockupTestCase):
self.assertEqual(line.bias(), gpiod.Line.BIAS_PULL_DOWN)
def test_exported_bias_pull_up_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
flags = gpiod.LINE_REQ_FLAG_BIAS_PULL_UP
line.request(consumer=default_consumer,
@@ -355,7 +334,7 @@ class LineInfo(MockupTestCase):
self.assertEqual(line.bias(), gpiod.Line.BIAS_PULL_UP)
def test_update_line_info(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.update()
@@ -364,7 +343,7 @@ class LineValues(MockupTestCase):
chip_sizes = ( 8, )
def test_get_value_single_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN)
@@ -373,7 +352,7 @@ class LineValues(MockupTestCase):
self.assertEqual(line.get_value(), 1)
def test_set_value_single_line(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT)
@@ -383,7 +362,7 @@ class LineValues(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 3), 0)
def test_set_value_with_default_value_argument(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -391,7 +370,7 @@ class LineValues(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 3), 1)
def test_get_value_multiple_lines(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 3, 4, 6 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN)
@@ -402,7 +381,7 @@ class LineValues(MockupTestCase):
self.assertEqual(lines.get_values(), [ 1, 0, 1, 1 ])
def test_set_value_multiple_lines(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 3, 4, 6 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT)
@@ -418,7 +397,7 @@ class LineValues(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 6), 0)
def test_set_multiple_values_with_default_vals_argument(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 3, 4, 6 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -429,7 +408,7 @@ class LineValues(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 6), 1)
def test_get_value_active_low(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN,
@@ -439,7 +418,7 @@ class LineValues(MockupTestCase):
self.assertEqual(line.get_value(), 0)
def test_set_value_active_low(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -454,7 +433,7 @@ class LineConfig(MockupTestCase):
chip_sizes = ( 8, )
def test_set_config_direction(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN)
@@ -465,7 +444,7 @@ class LineConfig(MockupTestCase):
self.assertEqual(line.direction(), gpiod.Line.DIRECTION_OUTPUT)
def test_set_config_flags(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT)
@@ -476,7 +455,7 @@ class LineConfig(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 3), 0)
def test_set_config_output_value(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN)
@@ -486,7 +465,7 @@ class LineConfig(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 3), 0)
def test_set_config_output_no_value(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -496,7 +475,7 @@ class LineConfig(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 3), 0)
def test_set_config_bulk_output_no_values(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 3, 4, 6 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -516,7 +495,7 @@ class LineFlags(MockupTestCase):
chip_sizes = ( 8, )
def test_set_flags(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -528,7 +507,7 @@ class LineFlags(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 3), 1)
def test_set_flags_bulk(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 3, 4, 6 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT,
@@ -553,7 +532,7 @@ class LineDirection(MockupTestCase):
chip_sizes = ( 8, )
def test_set_direction(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT)
@@ -571,7 +550,7 @@ class LineDirection(MockupTestCase):
self.assertEqual(mockup.chip_get_value(0, 3), 0)
def test_set_direction_bulk(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 3, 4, 6 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_OUT)
@@ -637,7 +616,7 @@ class LineRequestBehavior(MockupTestCase):
chip_sizes = ( 8, )
def test_line_export_release(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN)
@@ -647,7 +626,7 @@ class LineRequestBehavior(MockupTestCase):
self.assertFalse(line.is_requested())
def test_line_request_twice_two_calls(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN)
@@ -658,7 +637,7 @@ class LineRequestBehavior(MockupTestCase):
self.assertEqual(err_ctx.exception.errno, errno.EBUSY)
def test_line_request_twice_in_bulk(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 2, 3, 6, 6 ))
with self.assertRaises(OSError) as err_ctx:
lines.request(consumer=default_consumer,
@@ -667,7 +646,7 @@ class LineRequestBehavior(MockupTestCase):
self.assertEqual(err_ctx.exception.errno, errno.EBUSY)
def test_use_value_unrequested(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
with self.assertRaises(OSError) as err_ctx:
line.get_value()
@@ -675,7 +654,7 @@ class LineRequestBehavior(MockupTestCase):
self.assertEqual(err_ctx.exception.errno, errno.EPERM)
def test_request_with_no_kwds(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(2)
line.request(default_consumer)
self.assertTrue(line.is_requested())
@@ -692,7 +671,7 @@ class LineIterator(MockupTestCase):
chip_sizes = ( 4, )
def test_iterate_over_lines(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
count = 0
for line in gpiod.LineIter(chip):
@@ -706,7 +685,7 @@ class LineBulkIter(MockupTestCase):
chip_sizes = ( 4, )
def test_line_bulk_iterator(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_all_lines()
count = 0
@@ -726,7 +705,7 @@ class EventSingleLine(MockupTestCase):
def test_single_line_rising_edge_event(self):
with EventThread(0, 4, 200):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_RISING_EDGE)
@@ -737,7 +716,7 @@ class EventSingleLine(MockupTestCase):
def test_single_line_falling_edge_event(self):
with EventThread(0, 4, 200):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_FALLING_EDGE)
@@ -748,7 +727,7 @@ class EventSingleLine(MockupTestCase):
def test_single_line_both_edges_events(self):
with EventThread(0, 4, 200):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES)
@@ -763,7 +742,7 @@ class EventSingleLine(MockupTestCase):
def test_single_line_both_edges_events_active_low(self):
with EventThread(0, 4, 200):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES,
@@ -778,7 +757,7 @@ class EventSingleLine(MockupTestCase):
self.assertEqual(event.source.offset(), 4)
def test_single_line_read_multiple_events(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(4)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES)
@@ -804,7 +783,7 @@ class EventBulk(MockupTestCase):
def test_watch_multiple_lines_for_events(self):
with EventThread(0, 2, 200):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 1, 2, 3, 4 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES)
@@ -826,7 +805,7 @@ class EventValues(MockupTestCase):
chip_sizes = ( 8, )
def test_request_for_events_get_value(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES)
@@ -835,7 +814,7 @@ class EventValues(MockupTestCase):
self.assertEqual(line.get_value(), 1)
def test_request_for_events_get_value_active_low(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES,
@@ -849,7 +828,7 @@ class EventFileDescriptor(MockupTestCase):
chip_sizes = ( 8, )
def test_event_get_fd(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES)
@@ -857,7 +836,7 @@ class EventFileDescriptor(MockupTestCase):
self.assertGreaterEqual(fd, 0)
def test_event_get_fd_not_requested(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
with self.assertRaises(OSError) as err_ctx:
fd = line.event_get_fd();
@@ -865,7 +844,7 @@ class EventFileDescriptor(MockupTestCase):
self.assertEqual(err_ctx.exception.errno, errno.EPERM)
def test_event_get_fd_requested_for_values(self):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
line = chip.get_line(3)
line.request(consumer=default_consumer,
type=gpiod.LINE_REQ_DIR_IN)
@@ -876,7 +855,7 @@ class EventFileDescriptor(MockupTestCase):
def test_event_fd_polling(self):
with EventThread(0, 2, 200):
- with gpiod.Chip(mockup.chip_name(0)) as chip:
+ with gpiod.Chip(mockup.chip_path(0)) as chip:
lines = chip.get_lines(( 0, 1, 2, 3, 4, 5, 6 ))
lines.request(consumer=default_consumer,
type=gpiod.LINE_REQ_EV_BOTH_EDGES)
@@ -84,35 +84,6 @@ bool gpiod_is_gpiochip_device(const char *path) GPIOD_API;
*/
struct gpiod_chip *gpiod_chip_open(const char *path) GPIOD_API;
-/**
- * @brief Open a gpiochip by name.
- * @param name Name of the gpiochip to open.
- * @return GPIO chip handle or NULL if an error occurred.
- *
- * This routine appends name to '/dev/' to create the path.
- */
-struct gpiod_chip *gpiod_chip_open_by_name(const char *name) GPIOD_API;
-
-/**
- * @brief Open a gpiochip by number.
- * @param num Number of the gpiochip.
- * @return GPIO chip handle or NULL if an error occurred.
- *
- * This routine appends num to '/dev/gpiochip' to create the path.
- */
-struct gpiod_chip *gpiod_chip_open_by_number(unsigned int num) GPIOD_API;
-
-/**
- * @brief Open a gpiochip based on the best guess what the path is.
- * @param descr String describing the gpiochip.
- * @return GPIO chip handle or NULL if an error occurred.
- *
- * This routine tries to figure out whether the user passed it the path to the
- * GPIO chip, its name or number as a string. Then it tries to open it using
- * one of the gpiod_chip_open** variants.
- */
-struct gpiod_chip *gpiod_chip_open_lookup(const char *descr) GPIOD_API;
-
/**
* @brief Close a GPIO chip handle and release all allocated resources.
* @param chip The GPIO chip object.
@@ -10,68 +10,11 @@
* access to neither the internal library data structures nor the kernel UAPI.
*/
-#include <ctype.h>
#include <errno.h>
#include <gpiod.h>
#include <stdio.h>
#include <string.h>
-static bool isuint(const char *str)
-{
- for (; *str && isdigit(*str); str++)
- ;
-
- return *str == '\0';
-}
-
-struct gpiod_chip *gpiod_chip_open_by_name(const char *name)
-{
- struct gpiod_chip *chip;
- char *path;
- int rv;
-
- rv = asprintf(&path, "/dev/%s", name);
- if (rv < 0)
- return NULL;
-
- chip = gpiod_chip_open(path);
- free(path);
-
- return chip;
-}
-
-struct gpiod_chip *gpiod_chip_open_by_number(unsigned int num)
-{
- struct gpiod_chip *chip;
- char *path;
- int rv;
-
- rv = asprintf(&path, "/dev/gpiochip%u", num);
- if (!rv)
- return NULL;
-
- chip = gpiod_chip_open(path);
- free(path);
-
- return chip;
-}
-
-struct gpiod_chip *gpiod_chip_open_lookup(const char *descr)
-{
- struct gpiod_chip *chip;
-
- if (isuint(descr)) {
- chip = gpiod_chip_open_by_number(strtoul(descr, NULL, 10));
- } else {
- if (strncmp(descr, "/dev/", 5))
- chip = gpiod_chip_open_by_name(descr);
- else
- chip = gpiod_chip_open(descr);
- }
-
- return chip;
-}
-
struct gpiod_line_bulk *
gpiod_chip_get_lines(struct gpiod_chip *chip,
unsigned int *offsets, unsigned int num_offsets)
@@ -52,47 +52,6 @@ GPIOD_TEST_CASE(open_notty, 0, { 8 })
g_assert_cmpint(errno, ==, ENOTTY);
}
-GPIOD_TEST_CASE(open_by_name_good, 0, { 8 })
-{
- g_autoptr(gpiod_chip_struct) chip = NULL;
-
- chip = gpiod_chip_open_by_name(gpiod_test_chip_name(0));
- g_assert_nonnull(chip);
-}
-
-GPIOD_TEST_CASE(open_by_number_good, 0, { 8 })
-{
- g_autoptr(gpiod_chip_struct) chip = NULL;
-
- chip = gpiod_chip_open_by_number(gpiod_test_chip_num(0));
- g_assert_nonnull(chip);
-}
-
-GPIOD_TEST_CASE(open_lookup_good, 0, { 8, 8, 8})
-{
- g_autoptr(gpiod_chip_struct) chip_by_name = NULL;
- g_autoptr(gpiod_chip_struct) chip_by_path = NULL;
- g_autoptr(gpiod_chip_struct) chip_by_num = NULL;
- g_autofree gchar *chip_num_str = g_strdup_printf(
- "%u", gpiod_test_chip_num(1));
-
- chip_by_name = gpiod_chip_open_lookup(gpiod_test_chip_name(1));
- chip_by_path = gpiod_chip_open_lookup(gpiod_test_chip_path(1));
- chip_by_num = gpiod_chip_open_lookup(chip_num_str);
-
- g_assert_nonnull(chip_by_name);
- g_assert_nonnull(chip_by_path);
- g_assert_nonnull(chip_by_num);
- gpiod_test_return_if_failed();
-
- g_assert_cmpstr(gpiod_chip_name(chip_by_name),
- ==, gpiod_test_chip_name(1));
- g_assert_cmpstr(gpiod_chip_name(chip_by_path),
- ==, gpiod_test_chip_name(1));
- g_assert_cmpstr(gpiod_chip_name(chip_by_num),
- ==, gpiod_test_chip_name(1));
-}
-
GPIOD_TEST_CASE(get_name, 0, { 8, 8, 8})
{
g_autoptr(gpiod_chip_struct) chip0 = NULL;
@@ -69,7 +69,7 @@ int main(int argc, char **argv)
die_perror("unable to scan /dev");
for (i = 0; i < num_chips; i++) {
- chip = gpiod_chip_open_by_name(entries[i]->d_name);
+ chip = chip_open_by_name(entries[i]->d_name);
if (!chip) {
if (errno == EACCES)
printf("%s Permission denied\n",
@@ -70,7 +70,7 @@ int main(int argc, char **argv)
die_perror("unable to scan /dev");
for (i = 0; i < num_chips; i++) {
- chip = gpiod_chip_open_by_name(entries[i]->d_name);
+ chip = chip_open_by_name(entries[i]->d_name);
if (!chip) {
if (errno == EACCES)
continue;
@@ -97,7 +97,7 @@ int main(int argc, char **argv)
die("invalid GPIO offset: %s", argv[i + 1]);
}
- chip = gpiod_chip_open_lookup(device);
+ chip = chip_open_lookup(device);
if (!chip)
die_perror("unable to open %s", device);
@@ -214,7 +214,7 @@ int main(int argc, char **argv)
die_perror("unable to scan /dev");
for (i = 0; i < num_chips; i++) {
- chip = gpiod_chip_open_by_name(entries[i]->d_name);
+ chip = chip_open_by_name(entries[i]->d_name);
if (!chip) {
if (errno == EACCES)
printf("%s Permission denied\n",
@@ -230,7 +230,7 @@ int main(int argc, char **argv)
}
} else {
for (i = 0; i < argc; i++) {
- chip = gpiod_chip_open_lookup(argv[i]);
+ chip = chip_open_lookup(argv[i]);
if (!chip)
die_perror("looking up chip %s", argv[i]);
@@ -253,7 +253,7 @@ int main(int argc, char **argv)
num_lines++;
}
- chip = gpiod_chip_open_lookup(argv[0]);
+ chip = chip_open_lookup(argv[0]);
if (!chip)
die_perror("unable to open %s", argv[0]);
@@ -288,7 +288,7 @@ int main(int argc, char **argv)
die("invalid offset: %s", argv[i + 1]);
}
- chip = gpiod_chip_open_lookup(device);
+ chip = chip_open_lookup(device);
if (!chip)
die_perror("unable to open %s", device);
@@ -7,6 +7,7 @@
/* Common code for GPIO tools. */
+#include <ctype.h>
#include <errno.h>
#include <gpiod.h>
#include <libgen.h>
@@ -116,3 +117,59 @@ int chip_dir_filter(const struct dirent *entry)
free(path);
return !!is_chip;
}
+
+struct gpiod_chip *chip_open_by_name(const char *name)
+{
+ struct gpiod_chip *chip;
+ char *path;
+ int ret;
+
+ ret = asprintf(&path, "/dev/%s", name);
+ if (ret < 0)
+ return NULL;
+
+ chip = gpiod_chip_open(path);
+ free(path);
+
+ return chip;
+}
+
+static struct gpiod_chip *chip_open_by_number(unsigned int num)
+{
+ struct gpiod_chip *chip;
+ char *path;
+ int ret;
+
+ ret = asprintf(&path, "/dev/gpiochip%u", num);
+ if (!ret)
+ return NULL;
+
+ chip = gpiod_chip_open(path);
+ free(path);
+
+ return chip;
+}
+
+static bool isuint(const char *str)
+{
+ for (; *str && isdigit(*str); str++)
+ ;
+
+ return *str == '\0';
+}
+
+struct gpiod_chip *chip_open_lookup(const char *device)
+{
+ struct gpiod_chip *chip;
+
+ if (isuint(device)) {
+ chip = chip_open_by_number(strtoul(device, NULL, 10));
+ } else {
+ if (strncmp(device, "/dev/", 5))
+ chip = chip_open_by_name(device);
+ else
+ chip = gpiod_chip_open(device);
+ }
+
+ return chip;
+}
@@ -9,6 +9,7 @@
#define __GPIOD_TOOLS_COMMON_H__
#include <dirent.h>
+#include <gpiod.h>
/*
* Various helpers for the GPIO tools.
@@ -32,5 +33,7 @@ int bias_flags(const char *option);
void print_bias_help(void);
int make_signalfd(void);
int chip_dir_filter(const struct dirent *entry);
+struct gpiod_chip *chip_open_by_name(const char *name);
+struct gpiod_chip *chip_open_lookup(const char *device);
#endif /* __GPIOD_TOOLS_COMMON_H__ */