FWIW, when I was looking at doing a gpio drive I was thinking of
something like the following.
Devices:
#G/gpio/ctl
#G/gpio/$pin/ctl
#G/gpio/$pin/data
#G/gpio/$pin/event
...
bing -a '#G' /dev
A pin must be configured before use (and only if neither of
its data & event file is open). For example:
echo 'in rising edge high' > /dev/gpio/10/ctl
Syntax
reset # reset to default
in [async][rising|falling][edge] [high|low] [init $value] [buf $value]
out [pullup|pulldown] [init $value] [strength $value]
alt [0..5] # pi specific
You can use the same syntax to configure multiple pins by
writing to /dev/gpio/ctl and appending pin numbers.
echo 'out pullup 4 12 17' > /dev/gpio/ctl
You can *gang* multiple pins into a single port. For example:
echo 'create 100 1 2 5 10' > /dev/gpio/ctl
This creates a new "pin" 100 (number must be >= # of physical
pins) and creates a new entry in /dev/gpio. This succeeds
only if the pins can actually be ganged (this is device
dependent). You can now configure the port:
echo 'in rising edge low' > /dev/gpio/100/ctl
To delete a port
echo 'delete 100' > /dev/gpio/ctl
All constituent pins revert to their default state.
Reading /dev/gpio/N/data returns a sample of the present value.
[The following needs more work]
Reading /dev/pio/N/event blocks the caller until something
changes. Returns value and timestamp (in case of "async"
inputs, events are handled in the interrupt handler and
buffered).
Random notes:
An "in" pin has an init value since some pins can be
bidirectional. "alt" may create other devices as a
side-effect such as SPI, I2C, I2S, PWM, UART etc.
Configs are sticky and persist across device opens, which is
why there is a "reset" command.
While this may be easy to use, its implementation would be
somewhat complex.... Ideally one would break this into a small
core kernel mode driver and a fancier user mode one for
configuring. I stopped at this point for various reasons and
never got back to it.
On Sat, 02 Jan 2016 10:06:31 PST erik quanstrom <[email protected]> wrote:
> On Fri Jan 1 21:15:03 PST 2016, [email protected] wrote:
> > On Fri, 1/1/16, erik quanstrom <[email protected]> wrote:
> > > i'm looking @ the gpio interface, and i wonder what the recommended
> > > technique for sampling a pin might be from a shell script?
> >
> > I haven't really used it in shell scripts, but if I were going to do
> > so, I'd probably write up a little utility to take a hex string and
> > a bit number and do the 'and' on it. Then feed that with the
> > result of dd to get exactly one sample from devgpio. On the
> > other hand, if one of the usual suspects (e.g. hoc, bc, dc, awk)
> > have some bit-wise operators I'm forgetting, use that.
>
> the (atom) aux/number program does do that; none of the others do
> for fairly fundamental reasons: as awk and hoc are really floating
> point, and bc and dc are mp, and the mp library has no bit operations.
> i believe acid can as well, but only with great pain.
>
> perhaps just using base 2 for the encoding would make life a lot easer. so
>
> 00000000000000000000000000010000000000000000000000000000000000000
>
> for bit 27 active. with this format there's no limit to the number of bits
> one could represent.
>
> also, mightn't there be some value in presenting the full state of the device
> to allow it to be restored directly from the status file, so perhaps 3 lines
> could be added, one each for up/down/float settings?
>
> 00000000000000000000000000010000000000000000000000000000000000000
> 00000000000000000000000000010000000000000000000000000000000000000
> 00000000000000000000000000000000000000000000000000000000000000000
> 00000000000000000000000000000000000000000000000000000000000000000
>
> might represent bit 27 set, with the pull up resistor active. (perhaps
> float =E2=89=A1 (pullup | pulldown) =3D=3D 0? and could be elimitated.
>
> i'm sure a little tinkering with this idea can make it a lot more useful.
>
> - erik