sgjava Posted April 17, 2020 Posted April 17, 2020 After working with sysfs and libgpiod as cross platform solutions I was wondering if there was a faster way using /dev/mem or mmio? I know this gets more bare metal and SBC specific, but for some things you may want absolute speed. https://opensource.com/life/16/4/bulldog-gpio-library for instance claims 1 MHz GPIO writes in Java. However it only supports 3 SBCs as you can see from https://github.com/SilverThings/bulldog. Is there a more generic way to do this and not lose performance? Using my generated JNA wrappers for libgpiod I get about 2K writes per second. In Python I think it's about 70K using libgpiod Python bindings. I realize you may not always need 1 MHz GPIO writes, but it would be neat to offer this in a more generic way. 1
sgjava Posted April 26, 2020 Author Posted April 26, 2020 OK, so no answers Well as usual I pressed on. My first mistake was using JNA generation (but it was easy), so I researched JNI. Well JNI is very cumbersome to do by hand, so I looked for a JNI code generator and found one call HawtJNI. Of course it wouldn't work with Java 11 which is the Java LTS version, so I created a fork. Use the JDK11 branch if you want to play with it because I don't know if the PR will be accepted. I started wrapping c-periphery since it now supports the new /dev/gpiochip way of accessing the GPIO chips. I ran a performance test (I validated on a scope) and I'm getting ~235 KHz on a v1 Nano Pi Duo! That's over 500K writes per second compared to 2K using JNA and libgpiod. Even python-periphery yields ~37 KHz which is a pure Python version. Any ways exciting news for bit bangers of the world or anyone needing high performance GPIO. Once I have the GPIO code working I'll post on my Github site and announce. Since Bulldog only supports three boards this is good news for Armbian folks with a wider array of supported boards. I still need to test ARMv8 64 bit. 1
Tido Posted April 26, 2020 Posted April 26, 2020 1 hour ago, sgjava said: That's over 500K writes per second Where do you see the use case for this almost insane speed. In the industry? Congrats for the improvement !!
sgjava Posted April 26, 2020 Author Posted April 26, 2020 https://en.wikipedia.org/wiki/Bit_banging where you write you own protocols in software without the need for I2C, UART, SPI, etc. https://calcium3000.wordpress.com/2016/08/19/i2c-bit-banging-tutorial-part-i Thus with two GPIO pins I can simulate I2C. With the slower speeds, not so much. You can also do square wave 1 bit PCM sound too. I'm going to date myself, but I was doing this on a C64 in the 1980s. https://github.com/sgjava/garage/blob/master/commodore/c64/digisound/src/digisnd.asm Then you only need a simple piezoelectric speaker. There are probably a bunch of other uses, but this should give you an idea. Just the fact that I'm half the speed of Bulldog with many more platforms is a good thing. I was shooting for a generic high performance solution instead of coding directly to the GPIO chip like Bulldog. 1
sgjava Posted April 26, 2020 Author Posted April 26, 2020 Looks like ARMV8 64 bit is good as well, so I can proceed to finishing up the GPIO wrapper methods.
Hect Posted October 29, 2020 Posted October 29, 2020 (edited) That's interesting, have you tried this with C or C++ instead of python?, if so, is there any improvement at all? and can you share that library with us?. Thank you. Regards. Edited October 29, 2020 by Hect
sgjava Posted October 30, 2020 Author Posted October 30, 2020 This is basically what https://github.com/sgjava/java-periphery uses. You could use C directly or my Java wrapper.
Recommended Posts