Date: Sat, 11 Apr 2015 17:11:47 -0700 From: Adrian Chadd <adrian@freebsd.org> To: "freebsd-embedded@freebsd.org" <embedded@freebsd.org>, "freebsd-arch@freebsd.org" <freebsd-arch@freebsd.org> Subject: using libgpio to bitbang LCDs! Message-ID: <CAJ-Vmo=n=Lfh_XqkxwAA43jUi7suoPjWV1uSv4VnKNncw3%2BPfw@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
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. 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. There are some devices (eg these LCDs) that allow you to treat it as a 6800/8080 MCU and do 8 bit data reads/writes, so being able to do that via the GPIO interface would be nice. The arduino API doesn't do this, so people (and I'm not making this up) will bitshift a byte into different GPIO pin set/get, rather than use an 8 bit port as an 8 bit port. I'll put the code up soon in case anyone wants to start poking these embedded LCDs from FreeBSD. * = Carambola 2 (AR9331) with GPIO pins attached, to an Adafruit SSD1331 96x64 OLED display.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-Vmo=n=Lfh_XqkxwAA43jUi7suoPjWV1uSv4VnKNncw3%2BPfw>