[{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/257/original/5813-01.jpg?1698256665","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eWith the new Raspberry Pi 5 coming out, it is time to add support to Blinka, our CircuitPython library compatibility layer. One of the biggest changes to the Raspberry Pi 5 is the addition of a new southbridge chip, called the RP1, which now handles the GPIOs. Like many other projects, we have been the RPi.GPIO library to handle the General Purpose Input/Outputs. The only issue is that RPi.GPIO does not work on the Raspberry Pi 5 due to a changed memory mapping. Whereas everything was handled by the \u003ccode\u003e/dev/gpiomem\u003c/code\u003e device before, now everything is dynamically split into multiple gpiomem devices. The 40-pin GPIO header happens to fall into \u003ccode\u003e/dev/gpiomem4\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSo this means it's time to look at a couple of new options that do work on the Raspberry Pi 5. The two biggest contenders are \u003cstrong\u003elibgpiod\u003c/strong\u003e and \u003cstrong\u003egpiozero\u003c/strong\u003e, though there does appear to be a pure python version of libgpiod called \u003cstrong\u003egpiod\u003c/strong\u003e. RPi.GPIO was written in c, so it should run faster than a pure python implementation, however as mentioned before, that no longer appears to be an option. So the replacement should be able to run as fast as possible.\u003c/p\u003e\n\u003cp\u003eOn the surface, libgpiod appears to be the better option because of several different factors:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe python bindings use the libgpiod library underneath, which itself is written in c\u003c/li\u003e\n\u003cli\u003eWe already have multiple other libraries using libgpiod, so adding it is much simpler\u003c/li\u003e\n\u003cli\u003eLooking at the source, gpiozero appears to be a pure python implementation\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOn the other hand, Raspberry Pi is recommending gpiozero as the replacement to use on the the Raspberry Pi 5. So it's time to compare them head to head on speed alone. In order to test the speed, each library will turn a GPIO on and off as rapidly as possible and the results will be measured with a logic analyzer. The environment will be a fresh install of the 64-bit lite version or Raspberry Pi OS Bookworm since that is the minimum that the Raspberry Pi 5 requires. The scripts will be running inside of a virtual environment as is recommended now.\u003c/p\u003e\n\u003cp\u003eFirst up will be libgpiod. The script that will be used is:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"code","content":"import gpiod\n\nchip = gpiod.Chip('gpiochip4', gpiod.Chip.OPEN_BY_NAME)\nline = chip.get_line(18)\nline.request(consumer=\"blinktest\", type=gpiod.LINE_REQ_DIR_OUT)\n\nwhile True:\n    line.set_value(1)\n    line.set_value(0)","metadata":{"language":"python","linenums":false}},{"element_type":"text","content":"\n  \n        \u003cp\u003eAfter running the script and measuring, it looks like the mean frequency is 281.57 kHz, which means it can turn the GPIO on or off at an astounding 281,570 times per second on average. Since this measures a full cycle of turning a GPIO both on and off, that means the speed just to flip it in one direction averages about 563.14 kHz,\u003c/p\u003e\n      \n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/255/original/libgpiod_results.jpg?1698255737","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eNext up is gpiozero. The script that will be used is:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"code","content":"from gpiozero import LED\n\nled = LED(18)\n\nwhile True:\n    led.on()\n    led.off()","metadata":{"language":"python","linenums":false}},{"element_type":"text","content":"\n        \u003cp\u003eAfter running the script and measuring, it looks like the mean frequency is 93.659 kHz, which means it can turn the GPIO on and off 93,659 times per second on average. The speed to flip it in a single direction would then average 187.318 kHz.\u003c/p\u003e\n      ","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/256/original/gpiozero_results.jpg?1698255898","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eSo clearly libgpiod is the winner at just over 3 times the speed of gpiozero!\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n","metadata":{}}]