Skip to main content
update
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212

After studying the available options I decided to enhance RPi.GPIO.

If I was 20 years younger I would writehave since written a new dynamic library in C and a Python overlay, but a few simple changes to RPi.GPIO met my needs pi-gpio & pi_gpio which makes this obsolete.

 

Version 0.7.1 is compatible with RPi.GPIO with 3 additions:-

`read_gpio` Returns the GPIO level.  Returns HIGH=1=True or LOW=0=False
`get_alt` Return the current GPIO mode (0-7)
`get_pullupdn`  Return the current GPIO pullup pulldown on Pi4

Version 0.7.2

Adds support for PAD drive,hysteresis & slew settings
Adds hardware PWM support
Fix for gcc version 10 & Python 3.9
Adds Pi400, CM4, 8GB to cpuinfo
Changed /dev/mem is used if started with root permission


This can be downloaded :-

git clone https://github.com/Milliways2/Pi.GPIO.git

or updated:- git pull

And installed with

sudo apt install python-dev python3-dev
sudo python3 setup.py install

There is a version of my gpioread program, which shows the current GPIO pullup pulldown on Pi4.

This is a refactored version of the original, which imports gpioread.py rather than duplicating code. gpioread and gpioread.py can be downloaded from https://github.com/Milliways2/gpioread

After studying the available options I decided to enhance RPi.GPIO.

If I was 20 years younger I would write a new dynamic library in C and a Python overlay, but a few simple changes to RPi.GPIO met my needs.

Version 0.7.1 is compatible with RPi.GPIO with 3 additions:-

`read_gpio` Returns the GPIO level.  Returns HIGH=1=True or LOW=0=False
`get_alt` Return the current GPIO mode (0-7)
`get_pullupdn`  Return the current GPIO pullup pulldown on Pi4

Version 0.7.2

Adds support for PAD drive,hysteresis & slew settings
Adds hardware PWM support
Fix for gcc version 10 & Python 3.9
Adds Pi400, CM4, 8GB to cpuinfo
Changed /dev/mem is used if started with root permission


This can be downloaded :-

git clone https://github.com/Milliways2/Pi.GPIO.git

or updated:- git pull

And installed with

sudo apt install python-dev python3-dev
sudo python3 setup.py install

There is a version of my gpioread program, which shows the current GPIO pullup pulldown on Pi4.

This is a refactored version of the original, which imports gpioread.py rather than duplicating code. gpioread and gpioread.py can be downloaded from https://github.com/Milliways2/gpioread

After studying the available options I decided to enhance RPi.GPIO.

I have since written a new dynamic library in C and a Python overlay pi-gpio & pi_gpio which makes this obsolete.

 

Version 0.7.1 is compatible with RPi.GPIO with 3 additions:-

`read_gpio` Returns the GPIO level.  Returns HIGH=1=True or LOW=0=False
`get_alt` Return the current GPIO mode (0-7)
`get_pullupdn`  Return the current GPIO pullup pulldown on Pi4

Version 0.7.2

Adds support for PAD drive,hysteresis & slew settings
Adds hardware PWM support
Fix for gcc version 10 & Python 3.9
Adds Pi400, CM4, 8GB to cpuinfo
Changed /dev/mem is used if started with root permission


This can be downloaded :-

git clone https://github.com/Milliways2/Pi.GPIO.git

or updated:- git pull

And installed with

sudo apt install python-dev python3-dev
sudo python3 setup.py install

There is a version of my gpioread program, which shows the current GPIO pullup pulldown on Pi4.

This is a refactored version of the original, which imports gpioread.py rather than duplicating code. gpioread and gpioread.py can be downloaded from https://github.com/Milliways2/gpioread

Delete code
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212

The followingThere is a version of my gpioread program, which shows the current GPIO pullup pulldown on Pi4.

This is a refactored version of the original, which imports gpioread.py rather than duplicating code. gpioread and gpioread.py can be downloaded from https://github.com/Milliways2/gpioread

#! /usr/bin/env python3
# 2020-10-30
"""
Read all GPIO
This version for Pi.GPIO - an enhanced RPi.GPIO
Code and constants imported from gpioread.py
"""
import sys, os, time
import Pi.GPIO as GPIO
import gpioread
from gpioread import *

def get_pull(g):
    """
    Determine "pull" of GPIO
    """
    pud = get_pullupdn(g)
    if(pud == 1): return('IN ^')
    if(pud == 2): return('IN v')
    return('IN')

def pin_state(g):
    """
    Return "state" of BCM g
    Return is tuple (name, mode, value)
    """
    mode = get_alt(g)
    modename = MODES[mode]
    if(mode==0 and pi4):  # Input on Pi4
        try:
            modename = get_pull(g)  # modifies NAME to show pull
        except:
            modename = 'IN' # no pull found
    if(mode<2): # i.e. IN or OUT
        name = 'GPIO{}'.format(g)
    else:
        name = FUNCTION[MODES[mode]][g]
    return name, modename, read_gpio(g)

def main():
    global pi4
    global get_pullupdn, get_alt, read_gpio

    # module independent references
    get_alt = GPIO.get_alt
    read_gpio =  GPIO.read_gpio
    get_pullupdn = GPIO.get_pullupdn
    GPIO.setmode(GPIO.BCM)

    rev = int(GPIO.RPI_INFO['REVISION'], 16)
    TYPE = (rev&0x00000FF0)>>4
    pi4 = TYPE>16
    # ensure gpioread globals are initialised
    gpioread.rev = rev
    gpioread.TYPE = TYPE

    print_gpio(pin_state)   # call gpioread.print_gpio() using local pin_state())

if __name__ == '__main__':
    main()
#! /usr/bin/env python3
# 2020-10-11
"""
Read all GPIO
"""
import sys, os, time
import Pi.GPIO as GPIO

MODES=["IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"]
HEADER = ('3.3v', '5v', 2, '5v', 3, 'GND', 4, 14, 'GND', 15, 17, 18, 27, 'GND', 22, 23, '3.3v', 24, 10, 'GND', 9, 25, 11, 8, 'GND', 7, 0, 1, 5, 'GND', 6, 12, 13, 'GND', 19, 16, 26, 20, 'GND', 21)
GPIOPINS = 40

FUNCTION = {
'Pull': ('High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low'),
'ALT0': ('SDA0', 'SCL0', 'SDA1', 'SCL1', 'GPCLK0', 'GPCLK1', 'GPCLK2', 'SPI0_CE1_N', 'SPI0_CE0_N', 'SPI0_MISO', 'SPI0_MOSI', 'SPI0_SCLK', 'PWM0', 'PWM1', 'TXD0', 'RXD0', 'FL0', 'FL1', 'PCM_CLK', 'PCM_FS', 'PCM_DIN', 'PCM_DOUT', 'SD0_CLK', 'SD0_XMD', 'SD0_DATO', 'SD0_DAT1', 'SD0_DAT2', 'SD0_DAT3'),
'ALT1': ('SA5', 'SA4', 'SA3', 'SA2', 'SA1', 'SAO', 'SOE_N', 'SWE_N', 'SDO', 'SD1', 'SD2', 'SD3', 'SD4', 'SD5', 'SD6', 'SD7', 'SD8', 'SD9', 'SD10', 'SD11', 'SD12', 'SD13', 'SD14', 'SD15', 'SD16', 'SD17', 'TE0', 'TE1'),
'ALT2': ('PCLK', 'DE', 'LCD_VSYNC', 'LCD_HSYNC', 'DPI_D0', 'DPI_D1', 'DPI_D2', 'DPI_D3', 'DPI_D4', 'DPI_D5', 'DPI_D6', 'DPI_D7', 'DPI_D8', 'DPI_D9', 'DPI_D10', 'DPI_D11', 'DPI_D12', 'DPI_D13', 'DPI_D14', 'DPI_D15', 'DPI_D16', 'DPI_D17', 'DPI_D18', 'DPI_D19', 'DPI_D20', 'DPI_D21', 'DPI_D22', 'DPI_D23'),
'ALT3': ('SPI3_CE0_N', 'SPI3_MISO', 'SPI3_MOSI', 'SPI3_SCLK', 'SPI4_CE0_N', 'SPI4_MISO', 'SPI4_MOSI', 'SPI4_SCLK', '_', '_', '_', '_', 'SPI5_CE0_N', 'SPI5_MISO', 'SPI5_MOSI', 'SPI5_SCLK', 'CTS0', 'RTS0', 'SPI6_CE0_N', 'SPI6_MISO', 'SPI6_MOSI', 'SPI6_SCLK', 'SD1_CLK', 'SD1_CMD', 'SD1_DAT0', 'SD1_DAT1', 'SD1_DAT2', 'SD1_DAT3'),
'ALT4': ('TXD2', 'RXD2', 'CTS2', 'RTS2', 'TXD3', 'RXD3', 'CTS3', 'RTS3', 'TXD4', 'RXD4', 'CTS4', 'RTS4', 'TXD5', 'RXD5', 'CTS5', 'RTS5', 'SPI1_CE2_N', 'SPI1_CE1_N', 'SPI1_CE0_N', 'SPI1_MISO', 'SPIl_MOSI', 'SPI1_SCLK', 'ARM_TRST', 'ARM_RTCK', 'ARM_TDO', 'ARM_TCK', 'ARM_TDI', 'ARM_TMS'),
'ALT5': ('SDA6', 'SCL6', 'SDA3', 'SCL3', 'SDA3', 'SCL3', 'SDA4', 'SCL4', 'SDA4', 'SCL4', 'SDA5', 'SCL5', 'SDA5', 'SCL5', 'TXD1', 'RXD1', 'CTS1', 'RTS1', 'PWM0', 'PWM1', 'GPCLK0', 'GPCLK1', 'SDA6', 'SCL6', 'SPI3_CE1_N', 'SPI4_CE1_N', 'SPI5_CE1_N', 'SPI6_CE1_N')
}

PiModel = {
0: 'A',
1: 'B',
2: 'A+',
3: 'B+',
4: '2B',
6: 'CM1',
8: '3B',
9: 'Zero',
0xa: 'CM3',
0xc: 'ZeroW',
0xd: '3B+',
0xe: '3A+',
0x10: 'CM3+',
0x11: '4B'
}

def get_pull(g):
    """
    Determine "pull" of GPIO
    """
    pud = GPIO.get_pullupdn(g)
    if(pud == 1): return('IN ^')
    if(pud == 2): return('IN v')
    return('IN')

def pin_state(g):
    """
    Return "state" of BCM g
    Return is tuple (name, mode, value)
    """
    mode = GPIO.get_alt(g)
    modename = MODES[mode]
    if(mode==0 and TYPE>16):  # Input on Pi4
        modename = get_pull(g)
    if(mode<2):
        name = 'GPIO{}'.format(g)
    else:
        name = FUNCTION[MODES[mode]][g]
    return name, modename, GPIO.read_gpio(g)

GPIO.setmode(GPIO.BCM)

rev = int(GPIO.RPI_INFO['REVISION'], 16)
TYPE = (rev&0x00000FF0)>>4
Model = 'Pi ' + PiModel[TYPE]
if rev < 16 :
    GPIOPINS = 26

print('+-----+------------+------+---+{:^10}+---+------+-----------+-----+'.format(Model) )
print('| BCM |    Name    | Mode | V |  Board   | V | Mode | Name      | BCM |')
print('+-----+------------+------+---+----++----+---+------+-----------+-----+')
for h in range(1, GPIOPINS, 2):
# odd pin
    hh = HEADER[h-1]
    if(type(hh)==type(1)):
        print('|{0:4} | {1[0]:<10} | {1[1]:<4} | {1[2]} |{2:3} '.format(hh, pin_state(hh), h), end='|| ')
    else:
        print('|        {:18}   | {:2}'.format(hh, h), end=' || ')
# even pin
    hh = HEADER[h]
    if(type(hh)==type(1)):
        print('{0:2} | {1[2]:<2}| {1[1]:<5}| {1[0]:<10}|{2:4} |'.format(h+1, pin_state(hh), hh))
    else:
        print('{:2} |             {:9}      |'.format(h+1, hh))
print('+-----+------------+------+---+----++----+---+------+-----------+-----+')
print('| BCM |    Name    | Mode | V |  Board   | V | Mode | Name      | BCM |')
print('+-----+------------+------+---+{:^10}+---+------+-----------+-----+'.format(Model) )

The following is a version of my gpioread program, which shows the current GPIO pullup pulldown on Pi4.

This is a refactored version of the original, which imports gpioread.py rather than duplicating code. gpioread.py can be downloaded from https://github.com/Milliways2/gpioread

#! /usr/bin/env python3
# 2020-10-30
"""
Read all GPIO
This version for Pi.GPIO - an enhanced RPi.GPIO
Code and constants imported from gpioread.py
"""
import sys, os, time
import Pi.GPIO as GPIO
import gpioread
from gpioread import *

def get_pull(g):
    """
    Determine "pull" of GPIO
    """
    pud = get_pullupdn(g)
    if(pud == 1): return('IN ^')
    if(pud == 2): return('IN v')
    return('IN')

def pin_state(g):
    """
    Return "state" of BCM g
    Return is tuple (name, mode, value)
    """
    mode = get_alt(g)
    modename = MODES[mode]
    if(mode==0 and pi4):  # Input on Pi4
        try:
            modename = get_pull(g)  # modifies NAME to show pull
        except:
            modename = 'IN' # no pull found
    if(mode<2): # i.e. IN or OUT
        name = 'GPIO{}'.format(g)
    else:
        name = FUNCTION[MODES[mode]][g]
    return name, modename, read_gpio(g)

def main():
    global pi4
    global get_pullupdn, get_alt, read_gpio

    # module independent references
    get_alt = GPIO.get_alt
    read_gpio =  GPIO.read_gpio
    get_pullupdn = GPIO.get_pullupdn
    GPIO.setmode(GPIO.BCM)

    rev = int(GPIO.RPI_INFO['REVISION'], 16)
    TYPE = (rev&0x00000FF0)>>4
    pi4 = TYPE>16
    # ensure gpioread globals are initialised
    gpioread.rev = rev
    gpioread.TYPE = TYPE

    print_gpio(pin_state)   # call gpioread.print_gpio() using local pin_state())

if __name__ == '__main__':
    main()
#! /usr/bin/env python3
# 2020-10-11
"""
Read all GPIO
"""
import sys, os, time
import Pi.GPIO as GPIO

MODES=["IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"]
HEADER = ('3.3v', '5v', 2, '5v', 3, 'GND', 4, 14, 'GND', 15, 17, 18, 27, 'GND', 22, 23, '3.3v', 24, 10, 'GND', 9, 25, 11, 8, 'GND', 7, 0, 1, 5, 'GND', 6, 12, 13, 'GND', 19, 16, 26, 20, 'GND', 21)
GPIOPINS = 40

FUNCTION = {
'Pull': ('High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low', 'Low'),
'ALT0': ('SDA0', 'SCL0', 'SDA1', 'SCL1', 'GPCLK0', 'GPCLK1', 'GPCLK2', 'SPI0_CE1_N', 'SPI0_CE0_N', 'SPI0_MISO', 'SPI0_MOSI', 'SPI0_SCLK', 'PWM0', 'PWM1', 'TXD0', 'RXD0', 'FL0', 'FL1', 'PCM_CLK', 'PCM_FS', 'PCM_DIN', 'PCM_DOUT', 'SD0_CLK', 'SD0_XMD', 'SD0_DATO', 'SD0_DAT1', 'SD0_DAT2', 'SD0_DAT3'),
'ALT1': ('SA5', 'SA4', 'SA3', 'SA2', 'SA1', 'SAO', 'SOE_N', 'SWE_N', 'SDO', 'SD1', 'SD2', 'SD3', 'SD4', 'SD5', 'SD6', 'SD7', 'SD8', 'SD9', 'SD10', 'SD11', 'SD12', 'SD13', 'SD14', 'SD15', 'SD16', 'SD17', 'TE0', 'TE1'),
'ALT2': ('PCLK', 'DE', 'LCD_VSYNC', 'LCD_HSYNC', 'DPI_D0', 'DPI_D1', 'DPI_D2', 'DPI_D3', 'DPI_D4', 'DPI_D5', 'DPI_D6', 'DPI_D7', 'DPI_D8', 'DPI_D9', 'DPI_D10', 'DPI_D11', 'DPI_D12', 'DPI_D13', 'DPI_D14', 'DPI_D15', 'DPI_D16', 'DPI_D17', 'DPI_D18', 'DPI_D19', 'DPI_D20', 'DPI_D21', 'DPI_D22', 'DPI_D23'),
'ALT3': ('SPI3_CE0_N', 'SPI3_MISO', 'SPI3_MOSI', 'SPI3_SCLK', 'SPI4_CE0_N', 'SPI4_MISO', 'SPI4_MOSI', 'SPI4_SCLK', '_', '_', '_', '_', 'SPI5_CE0_N', 'SPI5_MISO', 'SPI5_MOSI', 'SPI5_SCLK', 'CTS0', 'RTS0', 'SPI6_CE0_N', 'SPI6_MISO', 'SPI6_MOSI', 'SPI6_SCLK', 'SD1_CLK', 'SD1_CMD', 'SD1_DAT0', 'SD1_DAT1', 'SD1_DAT2', 'SD1_DAT3'),
'ALT4': ('TXD2', 'RXD2', 'CTS2', 'RTS2', 'TXD3', 'RXD3', 'CTS3', 'RTS3', 'TXD4', 'RXD4', 'CTS4', 'RTS4', 'TXD5', 'RXD5', 'CTS5', 'RTS5', 'SPI1_CE2_N', 'SPI1_CE1_N', 'SPI1_CE0_N', 'SPI1_MISO', 'SPIl_MOSI', 'SPI1_SCLK', 'ARM_TRST', 'ARM_RTCK', 'ARM_TDO', 'ARM_TCK', 'ARM_TDI', 'ARM_TMS'),
'ALT5': ('SDA6', 'SCL6', 'SDA3', 'SCL3', 'SDA3', 'SCL3', 'SDA4', 'SCL4', 'SDA4', 'SCL4', 'SDA5', 'SCL5', 'SDA5', 'SCL5', 'TXD1', 'RXD1', 'CTS1', 'RTS1', 'PWM0', 'PWM1', 'GPCLK0', 'GPCLK1', 'SDA6', 'SCL6', 'SPI3_CE1_N', 'SPI4_CE1_N', 'SPI5_CE1_N', 'SPI6_CE1_N')
}

PiModel = {
0: 'A',
1: 'B',
2: 'A+',
3: 'B+',
4: '2B',
6: 'CM1',
8: '3B',
9: 'Zero',
0xa: 'CM3',
0xc: 'ZeroW',
0xd: '3B+',
0xe: '3A+',
0x10: 'CM3+',
0x11: '4B'
}

def get_pull(g):
    """
    Determine "pull" of GPIO
    """
    pud = GPIO.get_pullupdn(g)
    if(pud == 1): return('IN ^')
    if(pud == 2): return('IN v')
    return('IN')

def pin_state(g):
    """
    Return "state" of BCM g
    Return is tuple (name, mode, value)
    """
    mode = GPIO.get_alt(g)
    modename = MODES[mode]
    if(mode==0 and TYPE>16):  # Input on Pi4
        modename = get_pull(g)
    if(mode<2):
        name = 'GPIO{}'.format(g)
    else:
        name = FUNCTION[MODES[mode]][g]
    return name, modename, GPIO.read_gpio(g)

GPIO.setmode(GPIO.BCM)

rev = int(GPIO.RPI_INFO['REVISION'], 16)
TYPE = (rev&0x00000FF0)>>4
Model = 'Pi ' + PiModel[TYPE]
if rev < 16 :
    GPIOPINS = 26

print('+-----+------------+------+---+{:^10}+---+------+-----------+-----+'.format(Model) )
print('| BCM |    Name    | Mode | V |  Board   | V | Mode | Name      | BCM |')
print('+-----+------------+------+---+----++----+---+------+-----------+-----+')
for h in range(1, GPIOPINS, 2):
# odd pin
    hh = HEADER[h-1]
    if(type(hh)==type(1)):
        print('|{0:4} | {1[0]:<10} | {1[1]:<4} | {1[2]} |{2:3} '.format(hh, pin_state(hh), h), end='|| ')
    else:
        print('|        {:18}   | {:2}'.format(hh, h), end=' || ')
# even pin
    hh = HEADER[h]
    if(type(hh)==type(1)):
        print('{0:2} | {1[2]:<2}| {1[1]:<5}| {1[0]:<10}|{2:4} |'.format(h+1, pin_state(hh), hh))
    else:
        print('{:2} |             {:9}      |'.format(h+1, hh))
print('+-----+------------+------+---+----++----+---+------+-----------+-----+')
print('| BCM |    Name    | Mode | V |  Board   | V | Mode | Name      | BCM |')
print('+-----+------------+------+---+{:^10}+---+------+-----------+-----+'.format(Model) )

There is a version of my gpioread program, which shows the current GPIO pullup pulldown on Pi4.

This is a refactored version of the original, which imports gpioread.py rather than duplicating code. gpioread and gpioread.py can be downloaded from https://github.com/Milliways2/gpioread

edited body
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212

Adds support for PAD drive,hysteresis & slew settings
Adds hardware PWM support
Fix for gcc version 10 & Python 3.9
Adds Pi400, CM4, 8GB to cpuinfo
Changed /dev/binmem is used if started with root permission

Adds support for PAD drive,hysteresis & slew settings
Adds hardware PWM support
Fix for gcc version 10 & Python 3.9
Adds Pi400, CM4, 8GB to cpuinfo
Changed /dev/bin is used if started with root permission

Adds support for PAD drive,hysteresis & slew settings
Adds hardware PWM support
Fix for gcc version 10 & Python 3.9
Adds Pi400, CM4, 8GB to cpuinfo
Changed /dev/mem is used if started with root permission

Version 0.7.2
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading
Version 0.7.2
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading
the original git file was corrupted
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading
clarified install instructions
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading
refactor code
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading
code commented
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading
deleted 17 characters in body
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading
Source Link
Milliways
  • 61.5k
  • 32
  • 108
  • 212
Loading