using libgpio to bitbang LCDs!

Luiz Otavio O Souza lists.br at gmail.com
Sun Apr 12 14:45:42 UTC 2015


On 11 April 2015 at 22:00, Rui Paulo wrote:
> 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.

I've patches for this (bank read and writing), it is pretty simple and
should not block other approaches (mmap, bulk transfers, ...).

Luiz


More information about the freebsd-arch mailing list