PINCTRL is a simple Raspberry PI OS CLI command to let the GPIO pins act as output or input, set them high or low, or read the status of an input.
No need for SUDO, simple syntax.
Type
$ PINCTRL -h for an overview
For simple operations with the GPIOs an easy (but not superfast) I have written two procedures that call the shell with a PINCTRL command.
No extensive error checking, just a fork of a shell with a command.
procedure rpiExcecuteLocalProcessFast(const cmdToExcecute:String)
executes the command in cmdToExecute.
procedure rpiExcecuteLocalProcess(const cmdToExcecute:String; var result : shortstring);
executes the command in cmdToExecute and returns the first line of any output in result.
Here a program, kept as simple as possible that expects a LED on GPIO 4 and a button on GPIO 24 (press to ground)
The program runs without sudo!
The procedures can also be included in a Lazarus program. Also no SUDO required.
program gpioPINCTRL ; uses Classes, SysUtils, Process, Pipes, BaseUnix ; var result : shortstring ; procedure rpiExcecuteLocalProcess(const cmdToExcecute:String; var result : shortstring); var lProcess: TProcess; sl : tstringlist; begin {$IFDEF LINUX} lProcess := TProcess.Create(nil); lProcess.Executable := '/bin/sh'; lProcess.Parameters.Add('-c'); lProcess.Parameters.add(cmdToExcecute); lProcess.Options := lProcess.Options + [poUsePipes]; lProcess.Execute; sl:=TStringList.create; sl.LoadFromStream(lProcess.Output); if sl.count > 0 then result := sl[0] else result := '' ; lProcess.Free; sl.free ; {$ENDIF} end ; procedure rpiExcecuteLocalProcessFast(const cmdToExcecute:String); var lProcess: TProcess; begin {$IFDEF LINUX} lProcess := TProcess.Create(nil); lProcess.Executable := '/bin/sh'; lProcess.Parameters.Add('-c'); lProcess.Parameters.add(cmdToExcecute); lProcess.Options := lProcess.Options + [poUsePipes]; lProcess.Execute; lProcess.Free; {$ENDIF} end ; begin rpiExcecuteLocalProcessFast('pinctrl 24 ip pu') ; rpiExcecuteLocalProcessFast('pinctrl 4 op dh') ; readln ; rpiExcecuteLocalProcessFast('pinctrl 4 op dl', result) ; rpiExcecuteLocalProcess('pinctrl lev 24', result) ; if result = '1' then writeln('GPIO 24 is high') else writeln('GPIO 24 is low') ; end.