Add support for bias flags in line requests and returning the line bias setting via a bias accessor. Based on initial work by Drew Fustini <drew@xxxxxxxx>. Signed-off-by: Kent Gibson <warthog618@xxxxxxxxx> --- bindings/python/gpiodmodule.c | 82 +++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/bindings/python/gpiodmodule.c b/bindings/python/gpiodmodule.c index 2f6ef51..4723771 100644 --- a/bindings/python/gpiodmodule.c +++ b/bindings/python/gpiodmodule.c @@ -60,6 +60,9 @@ enum { gpiod_LINE_REQ_FLAG_OPEN_DRAIN = GPIOD_BIT(0), gpiod_LINE_REQ_FLAG_OPEN_SOURCE = GPIOD_BIT(1), gpiod_LINE_REQ_FLAG_ACTIVE_LOW = GPIOD_BIT(2), + gpiod_LINE_REQ_FLAG_BIAS_DISABLE = GPIOD_BIT(3), + gpiod_LINE_REQ_FLAG_BIAS_PULL_DOWN = GPIOD_BIT(4), + gpiod_LINE_REQ_FLAG_BIAS_PULL_UP = GPIOD_BIT(5), }; enum { @@ -72,6 +75,13 @@ enum { gpiod_ACTIVE_LOW, }; +enum { + gpiod_BIAS_AS_IS = 1, + gpiod_BIAS_DISABLE, + gpiod_BIAS_PULL_UP, + gpiod_BIAS_PULL_DOWN, +}; + enum { gpiod_RISING_EDGE = 1, gpiod_FALLING_EDGE, @@ -358,6 +368,34 @@ static PyObject *gpiod_Line_active_state(gpiod_LineObject *self, return ret; } +PyDoc_STRVAR(gpiod_Line_bias_doc, +"bias() -> integer\n" +"\n" +"Get the bias setting of this GPIO line."); + +static PyObject *gpiod_Line_bias(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) +{ + int bias; + + if (gpiod_ChipIsClosed(self->owner)) + return NULL; + + bias = gpiod_line_bias(self->line); + + switch (bias) { + case GPIOD_LINE_BIAS_PULL_UP: + return Py_BuildValue("I", gpiod_BIAS_PULL_UP); + case GPIOD_LINE_BIAS_PULL_DOWN: + return Py_BuildValue("I", gpiod_BIAS_PULL_DOWN); + case GPIOD_LINE_BIAS_DISABLE: + return Py_BuildValue("I", gpiod_BIAS_DISABLE); + case GPIOD_LINE_BIAS_AS_IS: + default: + return Py_BuildValue("I", gpiod_BIAS_AS_IS); + } +} + PyDoc_STRVAR(gpiod_Line_is_used_doc, "is_used() -> boolean\n" "\n" @@ -752,6 +790,12 @@ static PyMethodDef gpiod_Line_methods[] = { .ml_flags = METH_NOARGS, .ml_doc = gpiod_Line_active_state_doc, }, + { + .ml_name = "bias", + .ml_meth = (PyCFunction)gpiod_Line_bias, + .ml_flags = METH_NOARGS, + .ml_doc = gpiod_Line_bias_doc, + }, { .ml_name = "is_used", .ml_meth = (PyCFunction)gpiod_Line_is_used, @@ -1030,6 +1074,12 @@ static void gpiod_MakeRequestConfig(struct gpiod_line_request_config *conf, conf->flags |= GPIOD_LINE_REQUEST_FLAG_OPEN_SOURCE; if (flags & gpiod_LINE_REQ_FLAG_ACTIVE_LOW) conf->flags |= GPIOD_LINE_REQUEST_FLAG_ACTIVE_LOW; + if (flags & gpiod_LINE_REQ_FLAG_BIAS_DISABLE) + conf->flags |= GPIOD_LINE_REQUEST_FLAG_BIAS_DISABLE; + if (flags & gpiod_LINE_REQ_FLAG_BIAS_PULL_DOWN) + conf->flags |= GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN; + if (flags & gpiod_LINE_REQ_FLAG_BIAS_PULL_UP) + conf->flags |= GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP; } PyDoc_STRVAR(gpiod_LineBulk_request_doc, @@ -2313,6 +2363,26 @@ static gpiod_ConstDescr gpiod_ConstList[] = { .name = "ACTIVE_LOW", .val = gpiod_ACTIVE_LOW, }, + { + .typeobj = &gpiod_LineType, + .name = "BIAS_AS_IS", + .val = gpiod_BIAS_AS_IS, + }, + { + .typeobj = &gpiod_LineType, + .name = "BIAS_DISABLE", + .val = gpiod_BIAS_DISABLE, + }, + { + .typeobj = &gpiod_LineType, + .name = "BIAS_PULL_UP", + .val = gpiod_BIAS_PULL_UP, + }, + { + .typeobj = &gpiod_LineType, + .name = "BIAS_PULL_DOWN", + .val = gpiod_BIAS_PULL_DOWN, + }, { .typeobj = &gpiod_LineEventType, .name = "RISING_EDGE", @@ -2381,6 +2451,18 @@ static gpiod_ModuleConst gpiod_ModuleConsts[] = { .name = "LINE_REQ_FLAG_ACTIVE_LOW", .value = gpiod_LINE_REQ_FLAG_ACTIVE_LOW, }, + { + .name = "LINE_REQ_FLAG_BIAS_DISABLE", + .value = gpiod_LINE_REQ_FLAG_BIAS_DISABLE, + }, + { + .name = "LINE_REQ_FLAG_BIAS_PULL_DOWN", + .value = gpiod_LINE_REQ_FLAG_BIAS_PULL_DOWN, + }, + { + .name = "LINE_REQ_FLAG_BIAS_PULL_UP", + .value = gpiod_LINE_REQ_FLAG_BIAS_PULL_UP, + }, { } }; -- 2.24.0