Difference between revisions of "Unit RPIGPIOEXPANDER"

From Ultibo.org
Jump to: navigation, search
 
(3 intermediate revisions by the same user not shown)
Line 5: Line 5:
 
----
 
----
  
'''Raspberry Pi Firmware GPIO Expander Driver'''
+
'''Raspberry Pi Firmware GPIO Expander Driver unit'''
  
As of February 2017 the Raspberry Pi firmware contains a mailbox interface to allow control of the GPIO expander on the Raspberry Pi 3 and Compute Module 3.
+
As of February 2017 the Raspberry Pi firmware contains a mailbox interface to allow control of the GPIO expander on the Raspberry Pi 3/4 and Compute Module 3/4.
  
 
Unlike the earlier virtual GPIO interface this mailbox service now supports most GPIO functionality including getting and setting a pin value, getting and changing the pin function and getting or changing the pull up/down options.
 
Unlike the earlier virtual GPIO interface this mailbox service now supports most GPIO functionality including getting and setting a pin value, getting and changing the pin function and getting or changing the pull up/down options.
Line 13: Line 13:
 
This driver implements most of the functionality available in the new mailbox service as a standard Ultibo GPIO device and also provides direct mailbox calls to allow access to any additional options not covered by the GPIO device API.
 
This driver implements most of the functionality available in the new mailbox service as a standard Ultibo GPIO device and also provides direct mailbox calls to allow access to any additional options not covered by the GPIO device API.
 
   
 
   
When included in a project this driver replaces the Virtual GPIO functions provided by the PlatformRPi2 and PlatformRPi3 units.
+
When included in a project this driver replaces the Virtual GPIO functions provided by the PlatformRPi2, PlatformRPi3, PlatformRPi4 units.
 
    
 
    
 
According to /arch/arm/boot/dts/bcm2710-rpi-3-b.dts the following pin assignments are known:
 
According to /arch/arm/boot/dts/bcm2710-rpi-3-b.dts the following pin assignments are known:
Line 21: Line 21:
 
* GPIO_PIN_7 = Power LED (Input / Active Low)
 
* GPIO_PIN_7 = Power LED (Input / Active Low)
  
Note that this driver requires the most recent firmware (later than February 2017) and has been tested successfully with the firmware release from 22 May 2017.
+
For the Raspberry Pi 3B+ the assignments shown in /arch/arm/boot/dts/bcm2710-rpi-3-b.dts have changed as follows:
 +
 
 +
*GPIO_PIN_2 = Power LED (Active Low)
 +
*GPIO_PIN_4 = HDMI Detect (Input / Active Low)
 +
 
 +
For the Raspberry Pi 4B the assignments shown in /arch/arm/boot/dts/bcm2711-rpi-4-b.dts are:
 +
 +
*GPIO_PIN_0 = Bluetooth Power (Active High) (BT_ON)
 +
*GPIO_PIN_1 = WiFi Power Sequencer (Active Low) (WL_ON)
 +
*GPIO_PIN_2 = Power LED (Active Low) (PWR_LED_OFF)
 +
*GPIO_PIN_3 = (GLOBAL_RESET) (ANT1 on CM4)
 +
*GPIO_PIN_4 = SDIO 1.8V regulator (Active High) (VDD_SD_IO_SEL)
 +
*GPIO_PIN_5 = CAM1 regulator (Active High) (CAM_GPIO)
 +
*GPIO_PIN_6 = SD VCC regulator (Active High) (SD_PWR_ON)
 +
*GPIO_PIN_7 = (SD_OC_N) (ANT2 on CM4)
 +
 
 +
The Pi 400 and CM4 files at bcm2711-rpi-400.dts and bcm2711-rpi-cm4.dts show identical assignments as the Pi 4B.
 +
 
 +
Note that this driver requires recent firmware (later than February 2017) and has been tested successfully with the firmware release from 8 October 2020.
 
   
 
   
 
The latest version of the firmware is available from https://github.com/raspberrypi/firmware
 
The latest version of the firmware is available from https://github.com/raspberrypi/firmware
Line 121: Line 139:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| Called only during system startup
 
| Called only during system startup
 
|-
 
|-
Line 136: Line 154:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODeviceStart instead
+
| Not intended to be called directly by applications, use GPIODeviceStart instead.
 
|-
 
|-
 
|}
 
|}
Line 148: Line 166:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODeviceStop instead
+
| Not intended to be called directly by applications, use GPIODeviceStop instead.
 
|-
 
|-
 
|}
 
|}
Line 160: Line 178:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODeviceInputGet instead
+
| Not intended to be called directly by applications, use GPIODeviceInputGet instead.
 
|-
 
|-
 
|}
 
|}
Line 172: Line 190:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODeviceOutputSet instead
+
| Not intended to be called directly by applications, use GPIODeviceOutputSet instead.
 
|-
 
|-
 
|}
 
|}
Line 184: Line 202:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODevicePullGet instead
+
| Not intended to be called directly by applications, use GPIODevicePullGet instead.
 
|-
 
|-
 
|}
 
|}
Line 196: Line 214:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODevicePullSelect instead
+
| Not intended to be called directly by applications, use GPIODevicePullSelect instead.
 
|-
 
|-
 
|}
 
|}
Line 208: Line 226:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODeviceFunctionGet instead
+
| Not intended to be called directly by applications, use GPIODeviceFunctionGet instead.
 
|-
 
|-
 
|}
 
|}
Line 220: Line 238:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| Not intended to be called directly by applications, use GPIODeviceFunctionSelect instead
+
| Not intended to be called directly by applications, use GPIODeviceFunctionSelect instead.
 
|-
 
|-
 
|}
 
|}
Line 235: Line 253:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Pin'''
+
! Pin
 
| The pin to get the state for (eg VIRTUAL_GPIO_PIN_1)
 
| The pin to get the state for (eg VIRTUAL_GPIO_PIN_1)
 
|-
 
|-
! '''Return'''
+
! Return
 
| The current state (eg GPIO_LEVEL_HIGH) or GPIO_LEVEL_UNKNOWN on failure
 
| The current state (eg GPIO_LEVEL_HIGH) or GPIO_LEVEL_UNKNOWN on failure
 
|-
 
|-
Line 250: Line 268:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Pin'''
+
! Pin
 
| The pin to set the state for (eg GPIO_PIN_1)
 
| The pin to set the state for (eg GPIO_PIN_1)
 
|-
 
|-
! '''Level'''
+
! Level
 
| The state to set the pin to (eg GPIO_LEVEL_HIGH)
 
| The state to set the pin to (eg GPIO_LEVEL_HIGH)
 
|-
 
|-
! '''Return'''
+
! Return
 
| ERROR_SUCCESS if completed successfully or another error code on failure
 
| ERROR_SUCCESS if completed successfully or another error code on failure
 
|-
 
|-
Line 268: Line 286:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Pin'''
+
! Pin
 
| The pin to get the function for (eg GPIO_PIN_1)
 
| The pin to get the function for (eg GPIO_PIN_1)
 
|-
 
|-
! '''Return'''
+
! Return
 
| The current function of the pin (eg GPIO_FUNCTION_IN) or GPIO_FUNCTION_UNKNOWN on failure
 
| The current function of the pin (eg GPIO_FUNCTION_IN) or GPIO_FUNCTION_UNKNOWN on failure
 
|-
 
|-
Line 283: Line 301:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Pin'''
+
! Pin
 
| The pin to change the function for (eg GPIO_PIN_1)
 
| The pin to change the function for (eg GPIO_PIN_1)
 
|-
 
|-
! '''Mode'''
+
! Mode
 
| The function to set for the pin (eg GPIO_FUNCTION_OUT)
 
| The function to set for the pin (eg GPIO_FUNCTION_OUT)
 
|-
 
|-
! '''Return'''
+
! Return
 
| ERROR_SUCCESS if completed successfully or another error code on failure
 
| ERROR_SUCCESS if completed successfully or another error code on failure
 
|-
 
|-
Line 304: Line 322:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 316: Line 334:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 328: Line 346:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 340: Line 358:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-

Latest revision as of 05:19, 17 June 2021

Return to Unit Reference


Description


Raspberry Pi Firmware GPIO Expander Driver unit

As of February 2017 the Raspberry Pi firmware contains a mailbox interface to allow control of the GPIO expander on the Raspberry Pi 3/4 and Compute Module 3/4.

Unlike the earlier virtual GPIO interface this mailbox service now supports most GPIO functionality including getting and setting a pin value, getting and changing the pin function and getting or changing the pull up/down options.

This driver implements most of the functionality available in the new mailbox service as a standard Ultibo GPIO device and also provides direct mailbox calls to allow access to any additional options not covered by the GPIO device API.

When included in a project this driver replaces the Virtual GPIO functions provided by the PlatformRPi2, PlatformRPi3, PlatformRPi4 units.

According to /arch/arm/boot/dts/bcm2710-rpi-3-b.dts the following pin assignments are known:

  • GPIO_PIN_2 = Activity LED
  • GPIO_PIN_4 = HDMI Detect (Input / Active Low)
  • GPIO_PIN_7 = Power LED (Input / Active Low)

For the Raspberry Pi 3B+ the assignments shown in /arch/arm/boot/dts/bcm2710-rpi-3-b.dts have changed as follows:

  • GPIO_PIN_2 = Power LED (Active Low)
  • GPIO_PIN_4 = HDMI Detect (Input / Active Low)

For the Raspberry Pi 4B the assignments shown in /arch/arm/boot/dts/bcm2711-rpi-4-b.dts are:

  • GPIO_PIN_0 = Bluetooth Power (Active High) (BT_ON)
  • GPIO_PIN_1 = WiFi Power Sequencer (Active Low) (WL_ON)
  • GPIO_PIN_2 = Power LED (Active Low) (PWR_LED_OFF)
  • GPIO_PIN_3 = (GLOBAL_RESET) (ANT1 on CM4)
  • GPIO_PIN_4 = SDIO 1.8V regulator (Active High) (VDD_SD_IO_SEL)
  • GPIO_PIN_5 = CAM1 regulator (Active High) (CAM_GPIO)
  • GPIO_PIN_6 = SD VCC regulator (Active High) (SD_PWR_ON)
  • GPIO_PIN_7 = (SD_OC_N) (ANT2 on CM4)

The Pi 400 and CM4 files at bcm2711-rpi-400.dts and bcm2711-rpi-cm4.dts show identical assignments as the Pi 4B.

Note that this driver requires recent firmware (later than February 2017) and has been tested successfully with the firmware release from 8 October 2020.

The latest version of the firmware is available from https://github.com/raspberrypi/firmware

Constants



RPiGPIO expander specific constants RPIGPIOEXP_GPIO_*
RPIGPIOEXP_GPIO_DESCRIPTION = 'Raspberry Pi Firmware GPIO Expander'; Description of RPiGPIO Expander device
 
RPIGPIOEXP_GPIO_MIN_PIN = GPIO_PIN_0;  
RPIGPIOEXP_GPIO_MAX_PIN = GPIO_PIN_7;  
 
RPIGPIOEXP_GPIO_PIN_COUNT = 8;  
 
RPIGPIOEXP_GPIO_PIN_OFFSET = 128;  
 
RPIGPIOEXP_GPIO_MAX_LEVEL = GPIO_LEVEL_HIGH;  
 
RPIGPIOEXP_GPIO_MAX_PULL = GPIO_PULL_DOWN;  
 
RPIGPIOEXP_GPIO_MIN_FUNCTION = GPIO_FUNCTION_IN;  
RPIGPIOEXP_GPIO_MAX_FUNCTION = GPIO_FUNCTION_OUT;  


Type definitions



RPiGPIO expander specific types

PRPiGPIOExpander = ^TRPiGPIOExpander;

TRPiGPIOExpander = record

GPIO Properties
GPIO:TGPIODevice;  
RPiGPIO Expander Properties
   


Public variables


None defined

Function declarations



Initialization functions

procedure RPiGPIOExpanderInit;
Description: Initialize the RPiGPIO Expander unit and create, register and start the device
Note Called only during system startup


RPiGPIO expander GPIO functions

function RPiGPIOExpanderStart(GPIO:PGPIODevice):LongWord;
Description: Implementation of GPIODeviceStart API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODeviceStart instead.


function RPiGPIOExpanderStop(GPIO:PGPIODevice):LongWord;
Description: Implementation of GPIODeviceStop API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODeviceStop instead.


function RPiGPIOExpanderInputGet(GPIO:PGPIODevice; Pin:LongWord):LongWord;
Description: Implementation of GPIODeviceInputGet API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODeviceInputGet instead.


function RPiGPIOExpanderOutputSet(GPIO:PGPIODevice; Pin,Level:LongWord):LongWord;
Description: Implementation of GPIODeviceOutputSet API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODeviceOutputSet instead.


function RPiGPIOExpanderPullGet(GPIO:PGPIODevice; Pin:LongWord):LongWord;
Description: Implementation of GPIODevicePullGet API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODevicePullGet instead.


function RPiGPIOExpanderPullSelect(GPIO:PGPIODevice; Pin,Mode:LongWord):LongWord;
Description: Implementation of GPIODevicePullSelect API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODevicePullSelect instead.


function RPiGPIOExpanderFunctionGet(GPIO:PGPIODevice; Pin:LongWord):LongWord;
Description: Implementation of GPIODeviceFunctionGet API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODeviceFunctionGet instead.


function RPiGPIOExpanderFunctionSelect(GPIO:PGPIODevice; Pin,Mode:LongWord):LongWord;
Description: Implementation of GPIODeviceFunctionSelect API for RPiGPIO Expander
Note Not intended to be called directly by applications, use GPIODeviceFunctionSelect instead.


RTL virtual GPIO functions

function SysVirtualGPIOInputGet(Pin:LongWord):LongWord;
Description: Get the current state of a virtual GPIO input pin
Pin The pin to get the state for (eg VIRTUAL_GPIO_PIN_1)
Return The current state (eg GPIO_LEVEL_HIGH) or GPIO_LEVEL_UNKNOWN on failure


function SysVirtualGPIOOutputSet(Pin,Level:LongWord):LongWord;
Description: Set the state of a virtual GPIO output pin
Pin The pin to set the state for (eg GPIO_PIN_1)
Level The state to set the pin to (eg GPIO_LEVEL_HIGH)
Return ERROR_SUCCESS if completed successfully or another error code on failure


function SysVirtualGPIOFunctionGet(Pin:LongWord):LongWord;
Description: Get the current function of a virtual GPIO pin
Pin The pin to get the function for (eg GPIO_PIN_1)
Return The current function of the pin (eg GPIO_FUNCTION_IN) or GPIO_FUNCTION_UNKNOWN on failure


function SysVirtualGPIOFunctionSelect(Pin,Mode:LongWord):LongWord;
Description: Change the function of a virtual GPIO pin
Pin The pin to change the function for (eg GPIO_PIN_1)
Mode The function to set for the pin (eg GPIO_FUNCTION_OUT)
Return ERROR_SUCCESS if completed successfully or another error code on failure


RPiGPIO expander helper functions

function RPiGPIOExpanderGetState(GPIO:LongWord; var State:LongWord):LongWord;
Description: Raspberry Pi Firmware Mailbox call for Get GPIO State
Note None documented


function RPiGPIOExpanderSetState(GPIO,State:LongWord):LongWord;
Description: Raspberry Pi Firmware Mailbox call for Set GPIO State
Note None documented


function RPiGPIOExpanderGetConfig(GPIO:LongWord; var Direction,Polarity,Terminator,PullUp:LongWord):LongWord;
Description: Raspberry Pi Firmware Mailbox call for Get GPIO Config
Note None documented


function RPiGPIOExpanderSetConfig(GPIO,Direction,Polarity,Terminator,PullUp,State:LongWord):LongWord;
Description: Raspberry Pi Firmware Mailbox call for Set GPIO Config
Note None documented


Return to Unit Reference