using libgpio to bitbang LCDs!
Rui Paulo
rpaulo at me.com
Sun Apr 12 01:00:59 UTC 2015
On Saturday 11 April 2015 17:11:47 Adrian Chadd wrote:
> Hi!
>
> I just ported an adafruit LCD driver to FreeBSD. This was a pretty trivial
> task:
>
> * convert C++ to C, which was done primarily to not rely on the
> arduino-isms; * use libgpio to bitbang the SPI bus needed to write to the
> LCD.
>
> It worked third time. First was "oh it runs on 5v power and 3.3v
> signaling", and I had it hooked up to 3.3. Second was "Oh, I haven't
> set the pins to be output pins yet." Third time worked - just slowly.
>
> However - using libgpio was just pleasant. Get a handle, set the pin
> config, set the pins high/low. It was pretty damned wonderful.
>
> It turns out that to fill the screen with individual pixel writes
> takes quite a few seconds pinning my AR9331 CPU doing ~ 190,000
> syscalls a second. Ian's suggested something sensible - a bulk data
> ioctl() that can bit bang a series of GPIO pins in the kernel. Ie, one
> syscall, a big chunk of data with instructions and timings.
Since this is an LCD, you probably want a way to export the GPIO bank via mmap
with write-combining enabled. It's not really a safe operation as it could
hang the GPIO driver, but it could be useful.
> The other interesting thing would be a kind of bulk pin set/get - ie,
> instead of doing rmw for one pin at a time, communicate down masks of
> pins to do together.
I think that's sensible and could be done via a separate (new) ioctl.
--
Rui Paulo
More information about the freebsd-arch
mailing list