Difference between revisions of "Unit BCM2709"
(47 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
=== Description === | === Description === | ||
---- | ---- | ||
+ | |||
+ | '''Ultibo BCM2709 Interface unit''' | ||
This unit provides the BCM2709 specific implementations of the following devices: | This unit provides the BCM2709 specific implementations of the following devices: | ||
Line 10: | Line 12: | ||
*I2C0 | *I2C0 | ||
*I2C1 | *I2C1 | ||
+ | *I2C2 | ||
*SPI1 | *SPI1 | ||
*SPI2 | *SPI2 | ||
Line 42: | Line 45: | ||
By default SPI0 can appear on GPIO pins 7 to 11 (CS1, CS0, MISO, MOSI, SCLK) using alternate function 0 or on GPIO pins 35 to 39 (CS1, CS0, MISO, MOSI, SCLK) using alternate function 0, only pins 7 to 11 are available on the header. | By default SPI0 can appear on GPIO pins 7 to 11 (CS1, CS0, MISO, MOSI, SCLK) using alternate function 0 or on GPIO pins 35 to 39 (CS1, CS0, MISO, MOSI, SCLK) using alternate function 0, only pins 7 to 11 are available on the header. | ||
− | '''BCM2709 I2C0/1 Device''' | + | '''BCM2709 I2C0/1/2 Device''' |
The BCM2709 has 3 Broadcom Serial Controller (BSC) devices which are fast mode (400Kz) masters numbered BSC0, BSC1 and BSC2. | The BCM2709 has 3 Broadcom Serial Controller (BSC) devices which are fast mode (400Kz) masters numbered BSC0, BSC1 and BSC2. | ||
− | Device BSC2 is dedicated to the HDMI interface | + | Device BSC2 is dedicated to the HDMI interface but can be accessed by the ARM processor for controlling some HDMI functionality. All BSC devices contain a 16 byte FIFO, support 7 bit and 10 bit addressing and have software configurable clock timing. |
By default BSC0 can appear on GPIO pins 0 and 1 (Alternate function 0), 28 and 29 (Alternate function 0) or 44 and 45 (Alternate function 1). Unfortunately on all except the Revision 1 models none of these pins are available on the 26 or 40 pin header. | By default BSC0 can appear on GPIO pins 0 and 1 (Alternate function 0), 28 and 29 (Alternate function 0) or 44 and 45 (Alternate function 1). Unfortunately on all except the Revision 1 models none of these pins are available on the 26 or 40 pin header. | ||
Line 59: | Line 62: | ||
Both devices support 3 chip selects, by default SPI1 is available on GPIO pins 16 to 21 (CS2, CS1, CS0, MISO, MOSI, SCLK) using alternate function 4 and SPI2 is available on GPIO pins 40 to 45 (MISO, MOSI, SCLK, CS0, CS1, CS2) using alternate function 4. Only pins 16 to 21 are available on the header and only on the 40 pin header of the Raspberry Pi A+/B+/Zero/2B/3B. | Both devices support 3 chip selects, by default SPI1 is available on GPIO pins 16 to 21 (CS2, CS1, CS0, MISO, MOSI, SCLK) using alternate function 4 and SPI2 is available on GPIO pins 40 to 45 (MISO, MOSI, SCLK, CS0, CS1, CS2) using alternate function 4. Only pins 16 to 21 are available on the header and only on the 40 pin header of the Raspberry Pi A+/B+/Zero/2B/3B. | ||
+ | |||
+ | '''BCM2709 SPI/I2C Slave Device''' | ||
+ | |||
+ | The slave device can be used as either an I2C or an SPI interface, the I2C slave supports 400KHz fast mode operation. Only 7 bit addressing is supported, DMA is not supported and neither is clock stretching. | ||
+ | |||
+ | Note: On the Raspberry Pi A+/B+/Zero/2B/3B the SPI slave device is apparently faulty and cannot be used. | ||
+ | |||
+ | The I2C Slave device can only appear on GPIO pins 18 (SDA) and 19 (SCL) (Alternate function 3). | ||
'''BCM2709 DMA Device''' | '''BCM2709 DMA Device''' | ||
Line 82: | Line 93: | ||
On the Raspberry Pi A and B only pin 18 is exposed on the 26 pin header. | On the Raspberry Pi A and B only pin 18 is exposed on the 26 pin header. | ||
− | On the Raspberry Pi A+/B+/Zero/2B/3B pins 12, 18 and 19 are exposed on the 40 pin header. | + | On the Raspberry Pi A+/B+/Zero/2B/3B pins 12, 13, 18 and 19 are exposed on the 40 pin header. |
'''BCM2709 GPIO Device''' | '''BCM2709 GPIO Device''' | ||
Line 100: | Line 111: | ||
'''BCM2709 UART0 Device''' | '''BCM2709 UART0 Device''' | ||
− | The UART0 device is an ARM PL011 UART which supports programmable baud rates, start, stop and parity bits and hardware flow control and many others. The UART0 is similar to the industry standard 16C650 but with a number of differences, the PL011 has | + | The UART0 device is an ARM PL011 UART which supports programmable baud rates, start, stop and parity bits and hardware flow control and many others. The UART0 is similar to the industry standard 16C650 but with a number of differences, the PL011 has some optional features such as IrDA, Serial InfraRed and DMA which are not supported by the Broadcom implementation. In the standard configuration the UART0 TX and RX lines are connected to GPIO pins 14 and 15 respectively (Alternate function 0) but they can be remapped via GPIO function selects to a number of other locations. On the Raspberry Pi (all models) none of these alternate pin mappings are exposed via the 26 or 40 pin header and therefore cannot be used easily. This means that UART0 and UART1 cannot be used at the same time. |
On the Raspberry Pi 3B the UART0 can be mapped to GPIO pins 32 and 33 (Alternate function 3) to communicate with the built in Bluetooth module. | On the Raspberry Pi 3B the UART0 can be mapped to GPIO pins 32 and 33 (Alternate function 3) to communicate with the built in Bluetooth module. | ||
Line 120: | Line 131: | ||
The Write Protect pin is not connected. | The Write Protect pin is not connected. | ||
− | '''BCM2709 Clock Device''' | + | The device can be routed to GPIO pins 22 to 27 (ALT3) or 48 to 53 (ALT3), it can also be routed to GPIO pins 34 to 39 (ALT3) to provide an SDIO controller for the on board WiFi. |
+ | |||
+ | '''BCM2709 SDHOST Device''' | ||
+ | |||
+ | The SDHOST controller on the BCM2709 is a non SDHCI-compliant device which requires a specific driver. | ||
+ | |||
+ | It can be routed to GPIO pins 22 to 27 (ALT0) or 48 to 53 (ALT0) in order to control the SD card slot when the SDHCI device is being used for the on board WiFi. | ||
+ | |||
+ | Note: The actual driver is implemented in the BCMSDHOST unit | ||
+ | |||
+ | '''BCM2709 Clock (System Timer) Device''' | ||
The clock device in the BCM2709 is based on the System Timer which is a 64 bit free running counter that runs at 1MHz regardless of core or CPU clock speeds. | The clock device in the BCM2709 is based on the System Timer which is a 64 bit free running counter that runs at 1MHz regardless of core or CPU clock speeds. | ||
Line 134: | Line 155: | ||
The divider is 10 bits wide which means that the ARM Timer can be set to clock rates of between 250KHz and 250MHz (or 400KHz to 400MHz on the Raspberry Pi 3B). Both the counter and the load/reload value are 32 bits wide by default giving a wide range of tick intervals. | The divider is 10 bits wide which means that the ARM Timer can be set to clock rates of between 250KHz and 250MHz (or 400KHz to 400MHz on the Raspberry Pi 3B). Both the counter and the load/reload value are 32 bits wide by default giving a wide range of tick intervals. | ||
− | The ARM Timer features a free running counter which is not enabled or used by this driver and a down counter which operates in wrapping mode so that each time it reaches 0 it triggers an interrupt and reloads the value | + | The ARM Timer features a free running counter which is not enabled or used by this driver and a down counter which operates in wrapping mode so that each time it reaches 0 it triggers an interrupt and reloads the value from a load or reload register to begin counting again. |
=== Constants === | === Constants === | ||
---- | ---- | ||
− | '' | + | |
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 SPI0''' <code> BCM2709_SPI0_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_DESCRIPTION = 'BCM2836 SPI0 Master';</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MAX_SIZE = $FFFF;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MIN_CLOCK = 3814;</code> | ||
+ | | Default minimum based on the default settings from the firmware (Recalculated during open) | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MAX_CLOCK = 125000000;</code> | ||
+ | | Default maximum based on the default settings from the firmware (Recalculated during open) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MIN_DIVIDER = 2;</code> | ||
+ | | Divider is always rounded down to an even number and a value of 0 sets the divider to 65536 | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MAX_DIVIDER = $FFFE;</code> | ||
+ | | Divider is always rounded down to an even number} | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_CORE_CLOCK = 250000000;</code> | ||
+ | | Default core clock based on the default settings from the firmware (Requested from firmware during start) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MODE_IRQ = 0;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MODE_DMA = 1;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_SPI0_MODE_PIO = 2;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 BSCI2C (BSC0/1/2)''' <code> BCM2709_BSCI2C_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_MAX_SIZE = $FFFF;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_MIN_CLOCK = 3814;</code> | ||
+ | | Default minimum based on the default settings from the firmware (Recalculated during open) | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_MAX_CLOCK = 125000000;</code> | ||
+ | | Default maximum based on the default settings from the firmware (Recalculated during open) | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_DEFAULT_CLOCK = 100000;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_MIN_DIVIDER = 2;</code> | ||
+ | | Divider is always rounded down to an even number and a value of 0 sets the divider to 32768 | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_MAX_DIVIDER = $FFFE;</code> | ||
+ | | Divider is always rounded down to an even number} | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_CORE_CLOCK = 250000000;</code> | ||
+ | | Default core clock based on the default settings from the firmware (Requested from firmware during start) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_MODE_WRITE = 0;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_BSCI2C_MODE_READ = 1;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 I2C0 (BSC0)''' <code> BCM2709_I2C0_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_I2C0_DESCRIPTION = 'BCM2836 BSC0 Master I2C';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 I2C1 (BSC1)''' <code> BCM2709_I2C1_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_I2C1_DESCRIPTION = 'BCM2836 BSC1 Master I2C';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 I2C2 (BSC2)''' <code> BCM2709_I2C2_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_I2C2_DESCRIPTION = 'BCM2836 BSC2 Master I2C';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 SPI1''' <code> BCM2709_SPI1_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_SPI1_DESCRIPTION = 'BCM2836 AUX SPI1 Master';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 SPI2''' <code> BCM2709_SPI2_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_SPI2_DESCRIPTION = 'BCM2836 AUX SPI2 Master';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 I2C slave''' <code> BCM2709_I2CSLAVE_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_I2CSLAVE_DESCRIPTION = 'BCM2836 I2C Slave';</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_I2CSLAVE_TIMEOUT = 10;</code> | ||
+ | | Timeout (Milliseconds) for RX/TX wait data | ||
+ | |- | ||
+ | | <code>BCM2709_I2CSLAVE_BUFFER_SIZE = 1024;</code> | ||
+ | | Size in bytes of the RX/TX data buffer | ||
+ | |- | ||
+ | | <code>BCM2709_I2CSLAVE_RX_POLL_LIMIT = 256;</code> | ||
+ | | Number of times interrupt handler may poll the read FIFO | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 SPI slave''' <code> BCM2709_SPISLAVE_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_SPISLAVE_DESCRIPTION = 'BCM2836 SPI Slave';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 DMA''' <code> BCM2709_DMA_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_DESCRIPTION = 'BCM2836 DMA';</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_CHANNEL_COUNT = 16;</code> | ||
+ | | Total number of DMA channels (Not all are usable) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_LITE_CHANNELS = $7F80;</code> | ||
+ | | Mask of DMA Lite channels (7 to 14) | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_NORMAL_CHANNELS = $007E;</code> | ||
+ | | (807F) Mask of normal channels (1 to 6) | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_BULK_CHANNELS = $8001;</code> | ||
+ | | Mask of DMA Bulk channels (0 and 15) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_SHARED_CHANNELS = $7800;</code> | ||
+ | | Mask of channels with shared interrupt (11 to 14) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_MAX_LITE_TRANSFER = 65536;</code> | ||
+ | | Maximum transfer length for a DMA Lite channel | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_MAX_NORMAL_TRANSFER = 1073741824;</code> | ||
+ | | Maximum transfer length for a normal channel | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_MAX_STRIDE = $FFFF;</code> | ||
+ | | Maximum stride value (Increment between rows) (Note this is a signed value (Min -32768/Max 32767) | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_MAX_Y_COUNT = $3FFF;</code> | ||
+ | | Maximum number of X length transfers in 2D stride | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_MAX_X_LENGTH = $FFFF;</code> | ||
+ | | Maximum X transfer length in 2D stride | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_CB_ALIGNMENT = 32;</code> | ||
+ | | Alignment required for DMA control blocks | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_LITE_BURST_LENGTH = 2;</code> | ||
+ | | Burst length for DMA Lite channels | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_NORMAL_BURST_LENGTH = 4;</code> | ||
+ | | Burst length for normal channels | ||
+ | |- | ||
+ | | <code>BCM2709_DMA_BULK_BURST_LENGTH = 16;</code> | ||
+ | | Burst length for DMA Bulk channels | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 PWM''' <code> BCM2709_PWM_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_PWM_MIN_PERIOD = 108;</code> | ||
+ | | Default based on 19.2MHz PWM clock (Oscillator source) | ||
+ | |- | ||
+ | | <code>BCM2709_PWM_DEFAULT_CLOCK = 19200000;</code> | ||
+ | | Default to the 19.2MHz oscillator clock | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 PWM0''' <code> BCM2709_PWM0_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_PWM0_DESCRIPTION = 'BCM2836 PWM0';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 PWM1''' <code> BCM2709_PWM1_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_PWM1_DESCRIPTION = 'BCM2836 PWM1';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 GPIO''' <code> BCM2709_GPIO_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_DESCRIPTION = 'BCM2836 GPIO';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MIN_PIN = GPIO_PIN_0;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MAX_PIN = GPIO_PIN_53;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MAX_LEVEL = GPIO_LEVEL_HIGH;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MAX_PULL = GPIO_PULL_DOWN;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MIN_FUNCTION = GPIO_FUNCTION_IN;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MAX_FUNCTION = GPIO_FUNCTION_ALT5;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MIN_TRIGGER = GPIO_TRIGGER_LOW;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_GPIO_MAX_TRIGGER = GPIO_TRIGGER_ASYNC_FALLING;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | |colspan="2"|''GPIO pull up/down to BCM2836 pull up/down'' | ||
+ | |- | ||
+ | |colspan="2"|<code>BCM2709_GPIO_PULL_MAP:array[GPIO_PULL_NONE..GPIO_PULL_DOWN] of LongWord = (</code> | ||
+ | |- | ||
+ | | <code>BCM2836_GPPUD_NONE,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPPUD_UP,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPPUD_DOWN);</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | |colspan="2"|''GPIO functions to BCM2836 functions'' | ||
+ | |- | ||
+ | |colspan="2"|<code>BCM2709_GPIO_FUNCTION_MAP:array[BCM2709_GPIO_MIN_FUNCTION..BCM2709_GPIO_MAX_FUNCTION] of LongWord = (</code> | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_IN,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_OUT,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_ALT0,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_ALT1,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_ALT2,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_ALT3,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_ALT4,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFSEL_ALT5);</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | |colspan="2"|''BCM2836 functions to GPIO functions'' | ||
+ | |- | ||
+ | |colspan="2"|<code>BCM2709_GPIO_FUNCTION_UNMAP:array[BCM2709_GPIO_MIN_FUNCTION..BCM2709_GPIO_MAX_FUNCTION] of LongWord = (</code> | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_IN,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_OUT,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_ALT5,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_ALT4,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_ALT0,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_ALT1,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_ALT2,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>GPIO_FUNCTION_ALT3);</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | |colspan="2"|''GPIO triggers to BCM2836 event registers'' | ||
+ | |- | ||
+ | |colspan="2"|<code>BCM2709_GPIO_TRIGGER_MAP:array[BCM2709_GPIO_MIN_TRIGGER..BCM2709_GPIO_MAX_TRIGGER] of LongWord = (</code> | ||
+ | |- | ||
+ | | <code>BCM2836_GPLEN0,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPHEN0,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPREN0,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPFEN0,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPAREN0,</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2836_GPAFEN0);</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 UART0 (PL011)''' <code> BCM2709_UART0_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_DESCRIPTION = 'BCM2836 PL011 UART';</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MIN_BAUD = 300;</code> | ||
+ | | Default minimum of 300 baud | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MAX_BAUD = 187500;</code> | ||
+ | | Default maximum based on the default settings from the firmware (Recalculated during open) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MIN_DATABITS = SERIAL_DATA_5BIT;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MAX_DATABITS = SERIAL_DATA_8BIT;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MIN_STOPBITS = SERIAL_STOP_1BIT;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MAX_STOPBITS = SERIAL_STOP_2BIT;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MAX_PARITY = SERIAL_PARITY_EVEN;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_MAX_FLOW = SERIAL_FLOW_RTS_CTS;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_CLOCK_RATE = 3000000;</code> | ||
+ | | Default clock rate based on the default settings from the firmware (Requested from firmware during open) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_RX_POLL_LIMIT = 256;</code> | ||
+ | | Number of times interrupt handler may poll the read FIFO | ||
+ | |- | ||
+ | | <code>BCM2709_UART0_RX_BUFFER_SIZE = 1024;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 UART1 (AUX)''' <code> BCM2709_UART1_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_UART1_DESCRIPTION = 'BCM2836 AUX (Mini) UART';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 SDHCI''' <code> BCM2709_EMMC_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_EMMC_DESCRIPTION = 'BCM2836 Arasan SD Host';</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_EMMC_MIN_FREQ = 400000;</code> | ||
+ | | Default minimum of 400KHz | ||
+ | |- | ||
+ | | <code>BCM2709_EMMC_MAX_FREQ = 200000000;</code> | ||
+ | | Default clock rate based on the default settings from the firmware (Requested from firmware during start) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 SDHOST''' <code> BCM2709_SDHOST_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_SDHOST_DESCRIPTION = 'BCM2836 SDHOST';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_SDHOST_MIN_FREQ = 400000;</code> | ||
+ | | style="width: 50%;"|Default minimum of 400KHz | ||
+ | |- | ||
+ | | <code>BCM2709_SDHOST_MAX_FREQ = 250000000;</code> | ||
+ | | style="width: 50%;"|Default clock rate based on the default settings from the firmware (Requested from firmware during start) | ||
+ | |- | ||
+ | |colspan="2"|See: BCMSDHOST for the driver implementation | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 clock (system timer)''' <code> BCM2709_SYS_CLOCK_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_SYS_CLOCK_DESCRIPTION = 'BCM2836 System Timer Clock';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 clock (ARM timer)''' <code> BCM2709_ARM_CLOCK_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_DESCRIPTION = 'BCM2836 ARM Timer Clock';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_MIN_RATE = 976562;</code> | ||
+ | | Default minimum (Divider 255) based on the default settings from the firmware (Recalculated during start) | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_MAX_RATE = 250000000;</code> | ||
+ | | Default maximum (Divider 0) based on the default settings from the firmware (Recalculated during start) | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_DEFAULT_RATE = 3968253;</code> | ||
+ | | Default rate (Divider 62) based on the default settings from the firmware (Recalculated during start) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_MIN_DIVIDER = 0;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_MAX_DIVIDER = 255;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_DEFAULT_DIVIDER = 62;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_CLOCK_CORE_CLOCK = 250000000;</code> | ||
+ | | Default core clock based on the default settings from the firmware (Requested from firmware during start) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 clock (local timer)''' <code> BCM2709_LOCAL_CLOCK_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_LOCAL_CLOCK_DESCRIPTION = 'BCM2836 Local Timer Clock';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 ARM timer''' <code> BCM2709_ARM_TIMER_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_DESCRIPTION = 'BCM2836 ARM Timer';</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_MIN_RATE = 244140;</code> | ||
+ | | Default minimum (Divider 1023) based on the default settings from the firmware (Recalculated during start) | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_MAX_RATE = 250000000;</code> | ||
+ | | Default maximum (Divider 0) based on the default settings from the firmware (Recalculated during start) | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_DEFAULT_RATE = 1000000;</code> | ||
+ | | Default rate (Divider 249) based on the default settings from the firmware (Recalculated during start) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_MIN_INTERVAL = 1;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_MAX_INTERVAL = $FFFFFFFF;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_MIN_DIVIDER = 0;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_MAX_DIVIDER = 1023;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_DEFAULT_DIVIDER = 249;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_ARM_TIMER_CORE_CLOCK = 250000000;</code> | ||
+ | | Default core clock based on the default settings from the firmware (Requested from firmware during start) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 local timer''' <code> BCM2709_LOCAL_TIMER_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_LOCAL_TIMER_DESCRIPTION = 'BCM2836 Local Timer';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 random''' <code> BCM2709_RANDOM_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_RANDOM_DESCRIPTION = 'BCM2836 Random Number Generator';</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>BCM2709_RANDOM_WARMUP_COUNT = $00040000;</code> | ||
+ | | The initial numbers generated are "less random" so will be discarded | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 mailbox''' <code> BCM2709_MAILBOX_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_MAILBOX_DESCRIPTION = 'BCM2836 Mailbox';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 watchdog''' <code> BCM2709_WATCHDOG_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_WATCHDOG_DESCRIPTION = 'BCM2836 Watchdog Timer';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''BCM2709 framebuffer''' <code> BCM2709_FRAMEBUFFER_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>BCM2709_FRAMEBUFFER_DESCRIPTION = 'BCM2836 Framebuffer';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Type definitions === | === Type definitions === | ||
---- | ---- | ||
− | '' | + | |
+ | '''BCM2709 SPI0''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709SPI0Device = ^TBCM2709SPI0Device;</code> | ||
+ | |||
+ | <code>TBCM2709SPI0Device = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''SPI Properties'' | ||
+ | |- | ||
+ | | <code>SPI:TSPIDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>Address:Pointer;</code> | ||
+ | | Device register base address | ||
+ | |- | ||
+ | | <code>CoreClock:LongWord;</code> | ||
+ | | Core clock rate | ||
+ | |- | ||
+ | |colspan="2"|''Transfer Properties'' | ||
+ | |- | ||
+ | | <code>Mode:LongWord;</code> | ||
+ | | Mode of current transfer (BCM2709_SPI0_MODE_IRQ/BCM2709_SPI0_MODE_DMA / BCM2709_SPI0_MODE_PIO) | ||
+ | |- | ||
+ | | <code>Source:Pointer;</code> | ||
+ | | Pointer to the source for current transfer (nil if reading only) | ||
+ | |- | ||
+ | | <code>Dest:Pointer;</code> | ||
+ | | Pointer to the destination for current transfer (nil if writing only) | ||
+ | |- | ||
+ | | <code>Count:LongWord;</code> | ||
+ | | Count of bytes for current transfer | ||
+ | |- | ||
+ | | <code>SourceRemain:LongWord;</code> | ||
+ | | Source bytes remaining for current transfer | ||
+ | |- | ||
+ | | <code>DestRemain:LongWord;</code> | ||
+ | | Destination bytes remaining for current transfer | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 BSCI2C (I2C0/1/2)''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709BSCI2CDevice = ^TBCM2709BSCI2CDevice;</code> | ||
+ | |||
+ | <code>TBCM2709BSCI2CDevice = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''I2C Properties'' | ||
+ | |- | ||
+ | | <code>I2C:TI2CDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>Address:Pointer;</code> | ||
+ | | Device register base address | ||
+ | |- | ||
+ | | <code>CoreClock:LongWord;</code> | ||
+ | | Core clock rate | ||
+ | |- | ||
+ | | <code>SDAPin:LongWord;</code> | ||
+ | | GPIO pin for the SDA line | ||
+ | |- | ||
+ | | <code>SCLPin:LongWord;</code> | ||
+ | | GPIO pin for the SCL line | ||
+ | |- | ||
+ | | <code>SDAFunction:LongWord;</code> | ||
+ | | GPIO function for the SDA line | ||
+ | |- | ||
+ | | <code>SCLFunction:LongWord;</code> | ||
+ | | GPIO function for the SCL line | ||
+ | |- | ||
+ | |colspan="2"|''Transfer Properties'' | ||
+ | |- | ||
+ | | <code>Index:LongWord;</code> | ||
+ | | Index of this device in the IRQData array (Set during device initialization) | ||
+ | |- | ||
+ | | <code>Mode:LongWord;</code> | ||
+ | | Mode of current transfer (BCM2709_BSCI2C_MODE_WRITE/BCM2709_BSCI2C_MODE_READ) | ||
+ | |- | ||
+ | | <code>Data:Pointer;</code> | ||
+ | | Pointer to the data for current transfer | ||
+ | |- | ||
+ | | <code>Count:LongWord;</code> | ||
+ | | Count of bytes for current transfer | ||
+ | |- | ||
+ | | <code>Remain:LongWord;</code> | ||
+ | | Bytes remaining for current transfer | ||
+ | |- | ||
+ | | <code>Error:LongBool;</code> | ||
+ | | True if an error occurred during the transfer | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 BSCI2C (I2C0/1) IRQ data''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709BSCI2CIRQData = ^TBCM2709BSCI2CIRQData;</code> | ||
+ | |||
+ | <code>TBCM2709BSCI2CIRQData = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: BSC I2C devices share a single interrupt | ||
+ | |- | ||
+ | | <code>Count:LongWord;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>Lock:TSpinHandle;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Devices:array[0..2] of PBCM2709BSCI2CDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 SPI AUX (SPI1/2)''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709SPIAUXDevice = ^TBCM2709SPIAUXDevice;</code> | ||
+ | |||
+ | <code>TBCM2709SPIAUXDevice = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''SPI Properties'' | ||
+ | |- | ||
+ | | <code>SPI:TSPIDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>Address:Pointer;</code> | ||
+ | | Device register base address | ||
+ | |- | ||
+ | | <code>CoreClock:LongWord;</code> | ||
+ | | Core clock rate | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 I2C slave buffer''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709I2CSlaveBuffer = ^TBCM2709I2CSlaveBuffer;</code> | ||
+ | |||
+ | <code>TBCM2709I2CSlaveBuffer = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Wait:TSemaphoreHandle;</code> | ||
+ | | Data ready semaphore | ||
+ | |- | ||
+ | | <code>Start:LongWord;</code> | ||
+ | | Index of first available buffer entry | ||
+ | |- | ||
+ | | <code>Count:LongWord;</code> | ||
+ | | Number of available entries in the buffer | ||
+ | |- | ||
+ | | <code>Buffer:array[0..(BCM2709_I2CSLAVE_BUFFER_SIZE - 1)] of Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 I2C slave''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709I2CSlave = ^TBCM2709I2CSlave;</code> | ||
+ | |||
+ | <code>TBCM2709I2CSlave = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''I2C Properties'' | ||
+ | |- | ||
+ | | <code>I2C:TI2CDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>IRQ:LongWord;</code> | ||
+ | | IRQ of this device | ||
+ | |- | ||
+ | | <code>Address:Pointer;</code> | ||
+ | | Device register base address | ||
+ | |- | ||
+ | | <code>Lock:TSpinHandle;</code> | ||
+ | | Device lock (Differs from lock in I2C device) (Spin lock due to use by interrupt handler) | ||
+ | |- | ||
+ | | <code>SDAPin:LongWord;</code> | ||
+ | | GPIO pin for the SDA line | ||
+ | |- | ||
+ | | <code>SCLPin:LongWord;</code> | ||
+ | | GPIO pin for the SCL line | ||
+ | |- | ||
+ | | <code>SDAFunction:LongWord;</code> | ||
+ | | GPIO function for the SDA line | ||
+ | |- | ||
+ | | <code>SCLFunction:LongWord;</code> | ||
+ | | GPIO function for the SCL line | ||
+ | |- | ||
+ | |colspan="2"|''Transfer Properties'' | ||
+ | |- | ||
+ | | <code>Receive:TBCM2709I2CSlaveBuffer;</code> | ||
+ | | Receive Data Buffer | ||
+ | |- | ||
+ | | <code>Transmit:TBCM2709I2CSlaveBuffer;</code> | ||
+ | | Transmit Data Buffer | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 DMA channel''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709DMAChannel = ^TBCM2709DMAChannel;</code> | ||
+ | |||
+ | <code>TBCM2709DMAChannel = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Host:PBCM2709DMAHost;</code> | ||
+ | | DMA host this channel belongs to | ||
+ | |- | ||
+ | | <code>Request:PDMARequest;</code> | ||
+ | | Current DMA request pending on this channel (or nil of no request is pending) | ||
+ | |- | ||
+ | | <code>Number:LongWord;</code> | ||
+ | | The channel number of this channel | ||
+ | |- | ||
+ | | <code>Interrupt:LongWord;</code> | ||
+ | | The interrupt number of this channel | ||
+ | |- | ||
+ | | <code>Registers:PBCM2836DMARegisters;</code> | ||
+ | | The channel registers for configuration | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 DMA''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709DMAHost = ^TBCM2709DMAHost;</code> | ||
+ | |||
+ | <code>TBCM2709DMAHost = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''DMA Properties'' | ||
+ | |- | ||
+ | | <code>DMA:TDMAHost;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>ChannelMask:LongWord;</code> | ||
+ | | Mask of available channels (Passed from GPU firmware) | ||
+ | |- | ||
+ | | <code>ChannelFree:LongWord;</code> | ||
+ | | Bitmap of current free channels | ||
+ | |- | ||
+ | | <code>ChannelLock:TMutexHandle;</code> | ||
+ | | Lock for access to ChannelFree | ||
+ | |- | ||
+ | | <code>ChannelWait:TSemaphoreHandle;</code> | ||
+ | | Number of free normal channels in ChannelFree | ||
+ | |- | ||
+ | | <code>ChannelLite:TSemaphoreHandle;</code> | ||
+ | | Number of free DMA Lite channels in ChannelFree | ||
+ | |- | ||
+ | | <code>ChannelBulk:TSemaphoreHandle;</code> | ||
+ | | Number of free DMA Bulk channels in ChannelFree | ||
+ | |- | ||
+ | | <code>Channels:array[0..BCM2709_DMA_CHANNEL_COUNT - 1] of TBCM2709DMAChannel;</code> | ||
+ | | Channel information for each DMA channel on the host | ||
+ | |- | ||
+ | | <code>EnableRegister:PLongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>InterruptRegister:PLongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the host controller | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 PWM device''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709PWMDevice = ^TBCM2709PWMDevice;</code> | ||
+ | |||
+ | <code>TBCM2709PWMDevice = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''PWM Properties'' | ||
+ | |- | ||
+ | | <code>PWM:TPWMDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>Address:Pointer;</code> | ||
+ | | Device register base address | ||
+ | |- | ||
+ | | <code>Channel:LongWord;</code> | ||
+ | | Channel for this device | ||
+ | |- | ||
+ | | <code>Scaler:LongWord;</code> | ||
+ | | Scaler for Duty cycle and Period | ||
+ | |- | ||
+ | | <code>Pair:PBCM2709PWMDevice;</code> | ||
+ | | The paired PWM device for the other channel | ||
+ | |- | ||
+ | |colspan="2"|''Audio Properties'' | ||
+ | |- | ||
+ | | <code>Audio:PBCM2709PWMAudio;</code> | ||
+ | | The associated PWM Audio device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 PCM audio''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709PWMAudio = ^TBCM2709PWMAudio;</code> | ||
+ | |||
+ | <code>TBCM2709PWMAudio = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Audio Properties'' | ||
+ | |- | ||
+ | | <code>Audio:TAudioDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''PWM Properties'' | ||
+ | |- | ||
+ | | <code>PWM0:PBCM2709PWMDevice;</code> | ||
+ | | The PWM device for channel 0 | ||
+ | |- | ||
+ | | <code>PWM1:PBCM2709PWMDevice;</code> | ||
+ | | The PWM device for channel 1 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 GPIO''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709GPIOBank = ^TBCM2709GPIOBank;</code> | ||
+ | |||
+ | <code>TBCM2709GPIOBank = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>GPIO:PGPIODevice;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>Bank:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Address:PtrUInt;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>PinStart:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 GPIO device''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709GPIODevice = ^TBCM2709GPIODevice;</code> | ||
+ | |||
+ | <code>TBCM2709GPIODevice = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''GPIO Properties'' | ||
+ | |- | ||
+ | | <code>GPIO:TGPIODevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>Lock:TSpinHandle;</code> | ||
+ | | Device lock (Differs from lock in Device portion) (Spin lock due to use by interrupt handler) | ||
+ | |- | ||
+ | | <code>Banks:array[0..BCM2836_GPIO_BANK_COUNT - 1] of TBCM2709GPIOBank;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 UART0''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709UART0Device = ^TBCM2709UART0Device;</code> | ||
+ | |||
+ | <code>TBCM2709UART0Device = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''UART Properties'' | ||
+ | |- | ||
+ | | <code>UART:TUARTDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>Address:Pointer;</code> | ||
+ | | Device register base address | ||
+ | |- | ||
+ | | <code>ClockRate:LongWord;</code> | ||
+ | | Device clock rate | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>Start:LongWord;</code> | ||
+ | | Index of first available buffer entry | ||
+ | |- | ||
+ | | <code>Count:LongWord;</code> | ||
+ | | Number of available entries in the buffer | ||
+ | |- | ||
+ | | <code>Buffer:array[0..(BCM2709_UART0_RX_BUFFER_SIZE - 1)] of Word;</code> | ||
+ | | Buffer for received data (Includes data and status) | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 SDHCI''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709SDHCIHost = ^TBCM2709SDHCIHost;</code> | ||
+ | |||
+ | <code>TBCM2709SDHCIHost = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''SDHCI Properties'' | ||
+ | |- | ||
+ | | <code>SDHCI:TSDHCIHost;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>FIQ:LongBool;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>SDIO:LongBool;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>WriteDelay:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>DelayClock:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ShadowRegister:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 system clock''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709SystemClock = ^TBCM2709SystemClock;</code> | ||
+ | |||
+ | <code>TBCM2709SystemClock = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Clock Properties'' | ||
+ | |- | ||
+ | | <code>Clock:TClockDevice;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 ARM clock''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709ARMClock = ^TBCM2709ARMClock;</code> | ||
+ | |||
+ | <code>TBCM2709ARMClock = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Clock Properties'' | ||
+ | |- | ||
+ | | <code>Clock:TClockDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>CoreClock:LongWord;</code> | ||
+ | | Core clock rate | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 ARM timer''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709ARMTimer = ^TBCM2709ARMTimer;</code> | ||
+ | |||
+ | <code>TBCM2709ARMTimer = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Timer Properties'' | ||
+ | |- | ||
+ | | <code>Timer:TTimerDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>CoreClock:LongWord;</code> | ||
+ | | Core clock rate | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 local timer''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709LocalTimer = ^TBCM2709LocalTimer;</code> | ||
+ | |||
+ | <code>TBCM2709LocalTimer = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Timer Properties'' | ||
+ | |- | ||
+ | | <code>Timer:TTimerDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>CoreClock:LongWord;</code> | ||
+ | | Core clock rate | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>InterruptCount:LongWord;</code> | ||
+ | | Number of interrupt requests received by the device | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 random''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709Random = ^TBCM2709Random;</code> | ||
+ | |||
+ | <code>TBCM2709Random = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Random Properties'' | ||
+ | |- | ||
+ | | <code>Random:TRandomDevice;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 mailbox''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709Mailbox = ^TBCM2709Mailbox;</code> | ||
+ | |||
+ | <code>TBCM2709Mailbox = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Mailbox Properties'' | ||
+ | |- | ||
+ | | <code>Mailbox:TMailboxDevice;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 watchdog''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709Watchdog = ^TBCM2709Watchdog;</code> | ||
+ | |||
+ | <code>TBCM2709Watchdog = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Watchdog Properties'' | ||
+ | |- | ||
+ | | <code>Watchdog:TWatchdogDevice;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''BCM2709 framebuffer''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PBCM2709Framebuffer = ^TBCM2709Framebuffer;</code> | ||
+ | |||
+ | <code>TBCM2709Framebuffer = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Framebuffer Properties'' | ||
+ | |- | ||
+ | | <code>Framebuffer:TFramebufferDevice;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"|''BCM2709 Properties'' | ||
+ | |- | ||
+ | | <code>MultiDisplay:LongBool;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>DisplayNum:LongWord;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>DisplaySettings:TDisplaySettings;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Public variables === | === Public variables === | ||
---- | ---- | ||
− | '' | + | ''None defined'' |
=== Function declarations === | === Function declarations === | ||
Line 163: | Line 1,562: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 178: | Line 1,577: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 190: | Line 1,589: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 202: | Line 1,601: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 214: | Line 1,613: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 226: | Line 1,625: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 238: | Line 1,637: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 250: | Line 1,649: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 262: | Line 1,661: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 274: | Line 1,673: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | Called | + | | Called from within the interrupt handler |
|- | |- | ||
|} | |} | ||
Line 286: | Line 1,685: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | Called | + | | Called from within the interrupt handler |
|- | |- | ||
|} | |} | ||
Line 298: | Line 1,697: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 310: | Line 1,709: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 317: | Line 1,716: | ||
<br /> | <br /> | ||
− | '''BCM2709 BSCI2C (I2C0/1) functions''' | + | '''BCM2709 BSCI2C (I2C0/1/2) functions''' |
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
Line 325: | Line 1,724: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 337: | Line 1,736: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 349: | Line 1,748: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 361: | Line 1,760: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 373: | Line 1,772: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 385: | Line 1,784: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 397: | Line 1,796: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 409: | Line 1,808: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 421: | Line 1,820: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | Called | + | | Called from within the interrupt handler |
|- | |- | ||
|} | |} | ||
Line 433: | Line 1,832: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | Called | + | | Called from within the interrupt handler |
|- | |- | ||
|} | |} | ||
Line 445: | Line 1,844: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| Thread submitting the current request will hold the I2C device lock | | Thread submitting the current request will hold the I2C device lock | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 SPI/I2C slave functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709I2CSlaveStart(I2C:PI2CDevice; Rate:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of I2CSlaveStart API for BCM2709 I2C slave</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use I2CSlaveStart instead. | ||
+ | Rate is not applicable for I2C slave devices | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709I2CSlaveStop(I2C:PI2CDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of I2CSlaveStop API for BCM2709 I2C slave</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use I2CSlaveStop instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709I2CSlaveRead(I2C:PI2CDevice; Address:Word; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of I2CSlaveRead API for BCM2709 I2C slave</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use I2CSlaveRead instead. | ||
+ | Address is not applicable for I2C slave devices | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709I2CSlaveWrite(I2C:PI2CDevice; Address:Word; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of I2CSlaveWrite API for BCM2709 I2C slave</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use I2CSlaveWrite instead. | ||
+ | Address is not applicable for I2C slave devices | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709I2CSlaveSetAddress(I2C:PI2CDevice; Address:Word):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of I2CSlaveSetAddress API for BCM2709 I2C slave</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use I2CSlaveSetAddress instead. | ||
|- | |- | ||
|} | |} | ||
Line 460: | Line 1,925: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 472: | Line 1,937: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 484: | Line 1,949: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 496: | Line 1,961: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 508: | Line 1,973: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 520: | Line 1,985: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 532: | Line 1,997: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 544: | Line 2,009: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 556: | Line 2,021: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 571: | Line 2,036: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 583: | Line 2,048: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 595: | Line 2,060: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 607: | Line 2,072: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 619: | Line 2,084: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 631: | Line 2,096: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 643: | Line 2,108: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 655: | Line 2,120: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 667: | Line 2,132: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 679: | Line 2,144: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 691: | Line 2,156: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 703: | Line 2,168: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 715: | Line 2,180: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 730: | Line 2,195: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 742: | Line 2,207: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 754: | Line 2,219: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 766: | Line 2,231: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 778: | Line 2,243: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 790: | Line 2,255: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 802: | Line 2,267: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 814: | Line 2,279: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 826: | Line 2,291: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 838: | Line 2,303: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 850: | Line 2,315: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 862: | Line 2,327: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 874: | Line 2,339: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 886: | Line 2,351: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 898: | Line 2,363: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 909: | Line 2,374: | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
<pre style="border: 0; padding-bottom:0px;">function BCM2709UART0Open(UART:PUARTDevice; BaudRate,DataBits,StopBits,Parity,FlowControl:LongWord):LongWord;</pre> | <pre style="border: 0; padding-bottom:0px;">function BCM2709UART0Open(UART:PUARTDevice; BaudRate,DataBits,StopBits,Parity,FlowControl:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of UARTDeviceOpen API for BCM2709 UART0</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use UARTDeviceOpen instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709UART0Close(UART:PUARTDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of UARTDeviceClose API for BCM2709 UART0</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use UARTDeviceClose instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709UART0Read(UART:PUARTDevice; Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of UARTDeviceRead API for BCM2709 UART0</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use UARTDeviceRead instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709UART0PushRX(UART:PUARTDevice):LongWord;</pre> | ||
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 920: | Line 2,421: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function BCM2709UART0Write(UART:PUARTDevice; Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;</pre> |
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of UARTDeviceWrite API for BCM2709 UART0</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use UARTDeviceWrite instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709UART0GetStatus(UART:PUARTDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of UARTDeviceGetStatus API for BCM2709 UART0</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use UARTDeviceGetStatus instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709UART0SetStatus(UART:PUARTDevice; Status:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of UARTDeviceSetStatus API for BCM2709 UART0</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use UARTDeviceSetStatus instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709UART0InterruptHandler(UART:PUARTDevice);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Interrupt handler for the BCM2709 UART0 device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709UART0Receive(UART:PUARTDevice);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Receive handler for the BCM2709 UART0 device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709UART0Transmit(UART:PUARTDevice);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Transmit handler for the BCM2709 UART0 device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709UART0EnableInterrupt(UART:PBCM2709UART0Device; Interrupt:LongWord);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Enable the specified interrupt in the interrupt mask register of a BCM2709 UART0 device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! UART | ||
+ | | The BCM2709 UART0 device to enable the interrupt for | ||
+ | |- | ||
+ | ! Interrupt | ||
+ | | The interrupt to enable | ||
+ | |- | ||
+ | ! Note | ||
+ | | Caller must hold the UART lock | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709UART0DisableInterrupt(UART:PBCM2709UART0Device; Interrupt:LongWord);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Disable the specified interrupt in the interrupt mask register of a BCM2709 UART0 device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! UART | ||
+ | | The BCM2709 UART0 device to disable the interrupt for | ||
+ | |- | ||
+ | ! Interrupt | ||
+ | | The interrupt to disable | ||
+ | |- | ||
+ | ! Note | ||
+ | | Caller must hold the UART lock | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 SDHCI functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostStart(SDHCI:PSDHCIHost):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostStart API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostStart instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostStop(SDHCI:PSDHCIHost):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostStop API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostStop instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostLock(SDHCI:PSDHCIHost):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostLock API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostLock instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostUnlock(SDHCI:PSDHCIHost):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostUnlock API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostUnlock instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostSignal(SDHCI:PSDHCIHost; Semaphore:TSemaphoreHandle):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostSignal API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostSignal instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostReadByte(SDHCI:PSDHCIHost; Reg:LongWord):Byte;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostReadByte API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostReadByte instead. | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word reads using LongWord reads. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostReadWord(SDHCI:PSDHCIHost; Reg:LongWord):Word;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostReadWord API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostReadWord instead. | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word reads using LongWord reads. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCIHostReadLong(SDHCI:PSDHCIHost; Reg:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostReadLong API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostReadLong instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709SDHCIHostWriteByte(SDHCI:PSDHCIHost; Reg:LongWord; Value:Byte);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostWriteByte API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostWriteByte instead. | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word writes using LongWord writes. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709SDHCIHostWriteWord(SDHCI:PSDHCIHost; Reg:LongWord; Value:Word);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostWriteWord API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostWriteWord instead. | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word writes using LongWord writes. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709SDHCIHostWriteLong(SDHCI:PSDHCIHost; Reg:LongWord; Value:LongWord);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of SDHCIHostWriteLong API for BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use SDHCIHostWriteLong instead. | ||
+ | |- | ||
+ | ! Note | ||
+ | | The source code of U-Boot and Linux kernel drivers have this comment The Arasan has a bugette whereby it may lose the content of successive writes to registers that are within two SD-card clock cycles of each other (a clock domain crossing problem). It seems, however, that the data register does not have this problem. (Which is just as well - otherwise we'd have to nobble the DMA engine too) For this reason this code must delay after each write to the registers. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709SDHCIInterruptHandler(SDHCI:PSDHCIHost);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Interrupt handler for the BCM2709 SDHCI host controller</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SDHCISetupInterrupts(SDHCI:PSDHCIHost):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Configure and enable interrupt handling for the BCM2709 SDHCI</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709MMCDeviceGetCardDetect(MMC:PMMCDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of MMC GetCardDetect for the BCM2709 which does not update the bits in the SDHCI_PRESENT_STATE register to reflect card insertion or removal</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use MMCDeviceGetCardDetect instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 system clock functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SystemClockRead(Clock:PClockDevice):LongWord;</pre> | ||
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 932: | Line 2,730: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function BCM2709SystemClockRead64(Clock:PClockDevice):Int64;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 943: | Line 2,741: | ||
</div></div> | </div></div> | ||
<br /> | <br /> | ||
+ | |||
+ | '''BCM2709 ARM clock functions''' | ||
+ | |||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMClockStart(Clock:PClockDevice):LongWord;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 956: | Line 2,757: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMClockStop(Clock:PClockDevice):LongWord;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 968: | Line 2,769: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;"> | + | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMClockRead(Clock:PClockDevice):LongWord;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 980: | Line 2,781: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;"> | + | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMClockRead64(Clock:PClockDevice):Int64;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 992: | Line 2,793: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;"> | + | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMClockSetRate(Clock:PClockDevice; Rate:LongWord):LongWord;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 ARM timer functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerStart(Timer:PTimerDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceStart API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceStart instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerStop(Timer:PTimerDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceStop API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceStop instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerRead64(Timer:PTimerDevice):Int64;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceRead64 API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceRead64 instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerWait(Timer:PTimerDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceWait API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceWait instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerEvent(Timer:PTimerDevice; Flags:LongWord; Callback:TTimerCallback; Data:Pointer):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceEvent API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceEvent instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerCancel(Timer:PTimerDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceCancel API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceCancel instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerSetRate(Timer:PTimerDevice; Rate:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceSetRate API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceSetRate instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709ARMTimerSetInterval(Timer:PTimerDevice; Interval:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of TimerDeviceSetInterval API for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use TimerDeviceSetInterval instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709ARMTimerInterruptHandler(Timer:PTimerDevice);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Interrupt handler for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure BCM2709ARMTimerEventTrigger(Timer:PTimerDevice);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Event handler for ARM Timer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 random functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709RandomStart(Random:PRandomDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709RandomStop(Random:PRandomDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709RandomReadLongWord(Random:PRandomDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 watchdog functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709WatchdogStart(Watchdog:PWatchdogDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709WatchdogStop(Watchdog:PWatchdogDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709WatchdogRefresh(Watchdog:PWatchdogDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709WatchdogGetRemain(Watchdog:PWatchdogDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 framebuffer functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferAllocate(Framebuffer:PFramebufferDevice; Properties:PFramebufferProperties):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceAllocate API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceAllocate instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferRelease(Framebuffer:PFramebufferDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceRelease API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceRelease instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferBlank(Framebuffer:PFramebufferDevice; Blank:Boolean):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceBlank API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceBlank instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferCommit(Framebuffer:PFramebufferDevice;Address:PtrUInt;Size,Flags:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceCommit API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceCommit instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferWaitSync(Framebuffer:PFramebufferDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceWaitSync API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceWaitSync instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferSetOffsetEx(Framebuffer:PFramebufferDevice; X,Y:LongWord; Pan,Switch:Boolean):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceSetOffsetEx API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceSetOffsetEx instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferGetPalette(Framebuffer:PFramebufferDevice; Palette:PFramebufferPalette):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceGetPalette API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceGetPalette instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferSetPalette(Framebuffer:PFramebufferDevice; Palette:PFramebufferPalette):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceSetPalette API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceSetPalette instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferSetBacklight(Framebuffer:PFramebufferDevice; Brightness:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceSetBacklight API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceSetBacklight instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferSetCursor(Framebuffer:PFramebufferDevice; Width,Height,HotspotX,HotspotY:LongWord; Image:Pointer; Len:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceSetCursor API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceSetCursor instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709FramebufferUpdateCursor(Framebuffer:PFramebufferDevice; Enabled:Boolean; X,Y:LongInt; Relative:Boolean):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Implementation of FramebufferDeviceUpdateCursor API for BCM2709 Framebuffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Not intended to be called directly by applications, use FramebufferDeviceUpdateCursor instead. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''BCM2709 helper functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709SPIGetDescription(Id:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the device description of an SPI device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Id | ||
+ | | The Id number of the SPI device (0 to 2) | ||
+ | |- | ||
+ | ! Return | ||
+ | | The correct device description suitable for passing to SPIDeviceFindByDescription | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Id number supplied to this function may differ from the Ultibo device id value. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709I2CGetDescription(Id:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the device description of an I2C device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Id | ||
+ | | The Id number of the I2C device (0 to 2) | ||
+ | |- | ||
+ | ! Return | ||
+ | | The correct device description suitable for passing to I2CDeviceFindByDescription | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Id number supplied to this function may differ from the Ultibo device id value. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709I2CSlaveGetDescription(Id:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the device description of an I2C slave device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Id | ||
+ | | The Id number of the I2C slave device (Always 0) | ||
+ | |- | ||
+ | ! Return | ||
+ | | The correct device description suitable for passing to I2CSlaveFindByDescription | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Id number supplied to this function may differ from the Ultibo device id value | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709PWMGetDescription(Id,Channel:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the device description of a PWM device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Id | ||
+ | | The Id number of the PWM device (0 or 1) | ||
+ | |- | ||
+ | ! Channel | ||
+ | | The channel number of the PWM device (0 or 1) | ||
+ | |- | ||
+ | ! Return | ||
+ | | The correct device description suitable for passing to PWMDeviceFindByDescription | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Id number supplied to this function may differ from the Ultibo device id value. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function BCM2709UARTGetDescription(Id:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the device description of a UART device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Id | ||
+ | | The Id number of the UART device (0 or 1) | ||
+ | |- | ||
+ | ! Return | ||
+ | | The correct device description suitable for passing to UARTDeviceFindByDescription | ||
+ | |- | ||
+ | ! Note | ||
+ | | The Id number supplied to this function may differ from the Ultibo device id value. | ||
|- | |- | ||
|} | |} |
Latest revision as of 03:48, 5 September 2023
Return to Unit Reference
Description
Ultibo BCM2709 Interface unit
This unit provides the BCM2709 specific implementations of the following devices:
- SPI0
- I2C0
- I2C1
- I2C2
- SPI1
- SPI2
- I2C Slave
- SPI Slave
- DMA
- PWM0
- PWM1
- PCM
- GPIO
- UART0
- UART1
- SDHCI (eMMC)
- Clock
- ARM Timer
- Local Timer
- Random
- Mailbox
- Watchdog
- Framebuffer
- MIPI CSI-2 (Camera Serial Interface)
- DSI (Display Serial Interface)
BCM2709 SPI0 Device
The BCM2709 has a single master mode SPI controller that supports 3 wire, 2 wire and LoSSI modes of operation. It also has 2 auxiliary SPI masters which do not support DMA mode (see SPI1/2 below).
The main SPI0 controller supports polled, interrupt and DMA modes and includes 3 chip selects although only CS0 and 1 are available on the 26 or 40 pin header.
By default SPI0 can appear on GPIO pins 7 to 11 (CS1, CS0, MISO, MOSI, SCLK) using alternate function 0 or on GPIO pins 35 to 39 (CS1, CS0, MISO, MOSI, SCLK) using alternate function 0, only pins 7 to 11 are available on the header.
BCM2709 I2C0/1/2 Device
The BCM2709 has 3 Broadcom Serial Controller (BSC) devices which are fast mode (400Kz) masters numbered BSC0, BSC1 and BSC2.
Device BSC2 is dedicated to the HDMI interface but can be accessed by the ARM processor for controlling some HDMI functionality. All BSC devices contain a 16 byte FIFO, support 7 bit and 10 bit addressing and have software configurable clock timing.
By default BSC0 can appear on GPIO pins 0 and 1 (Alternate function 0), 28 and 29 (Alternate function 0) or 44 and 45 (Alternate function 1). Unfortunately on all except the Revision 1 models none of these pins are available on the 26 or 40 pin header.
Note: On the Raspberry Pi A+/B+/Zero/2B/3B the ID EEPROM pins on the 40 pin header are actually connected to GPIO 0 and 1 (BSC0)
Device BSC1 can appear on GPIO pins 2 and 3 (Alternate function 0) or 44 and 45 (Alternate function 2) but only pins 2 and 3 are exposed on the 26 or 40 pin header.
BCM2709 SPI1/2 Device
The BCM2709 has 2 additional SPI universal masters available as part of the AUX device which support interrupt mode but not DMA and therefore only allow limited bandwidth transfers due to the CPU overhead required to sustain high data rates.
Both devices support 3 chip selects, by default SPI1 is available on GPIO pins 16 to 21 (CS2, CS1, CS0, MISO, MOSI, SCLK) using alternate function 4 and SPI2 is available on GPIO pins 40 to 45 (MISO, MOSI, SCLK, CS0, CS1, CS2) using alternate function 4. Only pins 16 to 21 are available on the header and only on the 40 pin header of the Raspberry Pi A+/B+/Zero/2B/3B.
BCM2709 SPI/I2C Slave Device
The slave device can be used as either an I2C or an SPI interface, the I2C slave supports 400KHz fast mode operation. Only 7 bit addressing is supported, DMA is not supported and neither is clock stretching.
Note: On the Raspberry Pi A+/B+/Zero/2B/3B the SPI slave device is apparently faulty and cannot be used.
The I2C Slave device can only appear on GPIO pins 18 (SDA) and 19 (SCL) (Alternate function 3).
BCM2709 DMA Device
The DMA controller has 16 channels in total although not all are available for software to use as some are already used by the GPU.
The firmware will pass the value dma.dmachans on the command line which will indicate which channels are available for our use.
Channels 0 to 6 are normal channels which support 2D stride and transfers up to 1GB per control block
Channels 7 to 14 are Lite channels which do not support stride and only allow transfers up to 64KB per control block
Channel 15 is not mentioned in most documentation and is shown as not available in the mask passed in dma.dmachans
Channel 0 and 15 are Bulk channels which have an additional FIFO for faster transfers (8 beat burst per read)
BCM2709 PWM0/1 Device
The BCM2709 has a single PWM controller with 2 independent output bit streams with multiple algorithms for generating the output pulse. The PWM controller supports either a single data register (independent per channel) or a 16 x 32 FIFO which also supports DMA mode transmission.
On the Raspberry Pi PWM0 and PWM1 are also connected via GPIO pins 40 and 45 (40 and 41 on the Raspberry Pi 3B) to the audio circuit and allow playback of digital audio signals via the 3 or 4 pole line jack (depending on model). PWM0 is available on GPIO pins 12 (function 0), 18 (function 5), 40 (function 0) and 52 (function 1). PWM1 is available on GPIO pins 13 (function 0), 19 (function 5), 41, 45 (function 0) and 53 (function 1).
On the Raspberry Pi A and B only pin 18 is exposed on the 26 pin header.
On the Raspberry Pi A+/B+/Zero/2B/3B pins 12, 13, 18 and 19 are exposed on the 40 pin header.
BCM2709 GPIO Device
The GPIO has 54 pins available each with multiple alternate functions. All pins can be configured as input or output and all can have pull up or down applied.
Not all pins are exposed on the 26 or 40 pin header of the Raspberry Pi, for details of which pins are available see:
Raspberry Pi A and B - https://www.raspberrypi.org/documentation/usage/gpio/README.md
Raspberry Pi A+/B+/2B/3B/Zero - https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md
Some of the 54 pins are used for peripheral communication (such as the SD card) and are not available for general use, take care when changing function selects on pins to avoid disabling certain system peripherals.
Event detection can be enabled for both high and low levels as well as rising and falling edges, there is also an asynchronous rising or falling edge detection which can detect edges of very short duration.
BCM2709 UART0 Device
The UART0 device is an ARM PL011 UART which supports programmable baud rates, start, stop and parity bits and hardware flow control and many others. The UART0 is similar to the industry standard 16C650 but with a number of differences, the PL011 has some optional features such as IrDA, Serial InfraRed and DMA which are not supported by the Broadcom implementation. In the standard configuration the UART0 TX and RX lines are connected to GPIO pins 14 and 15 respectively (Alternate function 0) but they can be remapped via GPIO function selects to a number of other locations. On the Raspberry Pi (all models) none of these alternate pin mappings are exposed via the 26 or 40 pin header and therefore cannot be used easily. This means that UART0 and UART1 cannot be used at the same time.
On the Raspberry Pi 3B the UART0 can be mapped to GPIO pins 32 and 33 (Alternate function 3) to communicate with the built in Bluetooth module.
BCM2709 UART1 Device
The UART1 device is a Broadcom implementation that is part of the AUX device which also includes the SPI1 and SPI2 devices. This device is termed a Mini UART and has a smaller feature set than the PL011 UART but still supports a fairly standard communication protocol with programmable baud rate and hardware flow control.
The Mini UART is similar to the standard 16550 device but is missing some of the features, the device also has no DMA support so high speed transfers will produce a higher CPU load. In the standard configuration the UART1 TX and RX lines are connected to GPIO pins 14 and 15 respectively (Alternate function 5) but they can be remapped via GPIO function selects to a number of other locations. On the Raspberry Pi (all models) none of these alternate pin mappings are exposed via the 26 or 40 pin header and therefore cannot be used easily. This means that UART0 and UART1 cannot be used at the same time.
On the Raspberry Pi 3B the UART1 can be mapped to GPIO pins 32 and 33 (Alternate function 5) to communicate with the built in Bluetooth module.
BCM2709 SDHCI Device
The SDHCI controller on the BCM2709 is an Arasan SD Host controller.
The Card Detect pin is not connected.
The Write Protect pin is not connected.
The device can be routed to GPIO pins 22 to 27 (ALT3) or 48 to 53 (ALT3), it can also be routed to GPIO pins 34 to 39 (ALT3) to provide an SDIO controller for the on board WiFi.
BCM2709 SDHOST Device
The SDHOST controller on the BCM2709 is a non SDHCI-compliant device which requires a specific driver.
It can be routed to GPIO pins 22 to 27 (ALT0) or 48 to 53 (ALT0) in order to control the SD card slot when the SDHCI device is being used for the on board WiFi.
Note: The actual driver is implemented in the BCMSDHOST unit
BCM2709 Clock (System Timer) Device
The clock device in the BCM2709 is based on the System Timer which is a 64 bit free running counter that runs at 1MHz regardless of core or CPU clock speeds.
The System Timer includes 4 compare registers which can each generate an interrupt when the compare value is matched, however 2 of the 4 are consumed by the GPU and on the Raspberry Pi A/B/A+/B+/Zero the other 2 are used for the scheduler and clock interrupts in Ultibo.
This device simply exposes the free running counter as a clock value and does not provide access to the timer compare functionality or to interrupt based events, for those see the timer devices below.
BCM2709 ARM Timer Device
The ARM Timer device in the BCM2709 is based on the ARM SP804 timer with some modifications and additions. In the Raspberry Pi it is connected to the core clock which by default is 250MHz but was increased to 400MHz on the Raspberry Pi 3B.
The divider is 10 bits wide which means that the ARM Timer can be set to clock rates of between 250KHz and 250MHz (or 400KHz to 400MHz on the Raspberry Pi 3B). Both the counter and the load/reload value are 32 bits wide by default giving a wide range of tick intervals.
The ARM Timer features a free running counter which is not enabled or used by this driver and a down counter which operates in wrapping mode so that each time it reaches 0 it triggers an interrupt and reloads the value from a load or reload register to begin counting again.
Constants
BCM2709_SPI0_*
BCM2709_SPI0_DESCRIPTION = 'BCM2836 SPI0 Master';
|
|
BCM2709_SPI0_MAX_SIZE = $FFFF;
|
|
BCM2709_SPI0_MIN_CLOCK = 3814;
|
Default minimum based on the default settings from the firmware (Recalculated during open) |
BCM2709_SPI0_MAX_CLOCK = 125000000;
|
Default maximum based on the default settings from the firmware (Recalculated during open) |
BCM2709_SPI0_MIN_DIVIDER = 2;
|
Divider is always rounded down to an even number and a value of 0 sets the divider to 65536 |
BCM2709_SPI0_MAX_DIVIDER = $FFFE;
|
Divider is always rounded down to an even number} |
BCM2709_SPI0_CORE_CLOCK = 250000000;
|
Default core clock based on the default settings from the firmware (Requested from firmware during start) |
BCM2709_SPI0_MODE_IRQ = 0;
|
|
BCM2709_SPI0_MODE_DMA = 1;
|
|
BCM2709_SPI0_MODE_PIO = 2;
|
BCM2709_BSCI2C_*
BCM2709_BSCI2C_MAX_SIZE = $FFFF;
|
|
BCM2709_BSCI2C_MIN_CLOCK = 3814;
|
Default minimum based on the default settings from the firmware (Recalculated during open) |
BCM2709_BSCI2C_MAX_CLOCK = 125000000;
|
Default maximum based on the default settings from the firmware (Recalculated during open) |
BCM2709_BSCI2C_DEFAULT_CLOCK = 100000;
|
|
BCM2709_BSCI2C_MIN_DIVIDER = 2;
|
Divider is always rounded down to an even number and a value of 0 sets the divider to 32768 |
BCM2709_BSCI2C_MAX_DIVIDER = $FFFE;
|
Divider is always rounded down to an even number} |
BCM2709_BSCI2C_CORE_CLOCK = 250000000;
|
Default core clock based on the default settings from the firmware (Requested from firmware during start) |
BCM2709_BSCI2C_MODE_WRITE = 0;
|
|
BCM2709_BSCI2C_MODE_READ = 1;
|
BCM2709_I2C0_*
BCM2709_I2C0_DESCRIPTION = 'BCM2836 BSC0 Master I2C';
|
BCM2709_I2C1_*
BCM2709_I2C1_DESCRIPTION = 'BCM2836 BSC1 Master I2C';
|
BCM2709_I2C2_*
BCM2709_I2C2_DESCRIPTION = 'BCM2836 BSC2 Master I2C';
|
BCM2709_SPI1_*
BCM2709_SPI1_DESCRIPTION = 'BCM2836 AUX SPI1 Master';
|
BCM2709_SPI2_*
BCM2709_SPI2_DESCRIPTION = 'BCM2836 AUX SPI2 Master';
|
BCM2709_I2CSLAVE_*
BCM2709_I2CSLAVE_DESCRIPTION = 'BCM2836 I2C Slave';
|
|
BCM2709_I2CSLAVE_TIMEOUT = 10;
|
Timeout (Milliseconds) for RX/TX wait data |
BCM2709_I2CSLAVE_BUFFER_SIZE = 1024;
|
Size in bytes of the RX/TX data buffer |
BCM2709_I2CSLAVE_RX_POLL_LIMIT = 256;
|
Number of times interrupt handler may poll the read FIFO |
BCM2709_SPISLAVE_*
BCM2709_SPISLAVE_DESCRIPTION = 'BCM2836 SPI Slave';
|
BCM2709_DMA_*
BCM2709_DMA_DESCRIPTION = 'BCM2836 DMA';
|
|
BCM2709_DMA_CHANNEL_COUNT = 16;
|
Total number of DMA channels (Not all are usable) |
BCM2709_DMA_LITE_CHANNELS = $7F80;
|
Mask of DMA Lite channels (7 to 14) |
BCM2709_DMA_NORMAL_CHANNELS = $007E;
|
(807F) Mask of normal channels (1 to 6) |
BCM2709_DMA_BULK_CHANNELS = $8001;
|
Mask of DMA Bulk channels (0 and 15) |
BCM2709_DMA_SHARED_CHANNELS = $7800;
|
Mask of channels with shared interrupt (11 to 14) |
BCM2709_DMA_MAX_LITE_TRANSFER = 65536;
|
Maximum transfer length for a DMA Lite channel |
BCM2709_DMA_MAX_NORMAL_TRANSFER = 1073741824;
|
Maximum transfer length for a normal channel |
BCM2709_DMA_MAX_STRIDE = $FFFF;
|
Maximum stride value (Increment between rows) (Note this is a signed value (Min -32768/Max 32767) |
BCM2709_DMA_MAX_Y_COUNT = $3FFF;
|
Maximum number of X length transfers in 2D stride |
BCM2709_DMA_MAX_X_LENGTH = $FFFF;
|
Maximum X transfer length in 2D stride |
BCM2709_DMA_CB_ALIGNMENT = 32;
|
Alignment required for DMA control blocks |
BCM2709_DMA_LITE_BURST_LENGTH = 2;
|
Burst length for DMA Lite channels |
BCM2709_DMA_NORMAL_BURST_LENGTH = 4;
|
Burst length for normal channels |
BCM2709_DMA_BULK_BURST_LENGTH = 16;
|
Burst length for DMA Bulk channels |
BCM2709_PWM_*
BCM2709_PWM_MIN_PERIOD = 108;
|
Default based on 19.2MHz PWM clock (Oscillator source) |
BCM2709_PWM_DEFAULT_CLOCK = 19200000;
|
Default to the 19.2MHz oscillator clock |
BCM2709_PWM0_*
BCM2709_PWM0_DESCRIPTION = 'BCM2836 PWM0';
|
BCM2709_PWM1_*
BCM2709_PWM1_DESCRIPTION = 'BCM2836 PWM1';
|
BCM2709_GPIO_*
BCM2709_GPIO_DESCRIPTION = 'BCM2836 GPIO';
|
|
BCM2709_GPIO_MIN_PIN = GPIO_PIN_0;
|
|
BCM2709_GPIO_MAX_PIN = GPIO_PIN_53;
|
|
BCM2709_GPIO_MAX_LEVEL = GPIO_LEVEL_HIGH;
|
|
BCM2709_GPIO_MAX_PULL = GPIO_PULL_DOWN;
|
|
BCM2709_GPIO_MIN_FUNCTION = GPIO_FUNCTION_IN;
|
|
BCM2709_GPIO_MAX_FUNCTION = GPIO_FUNCTION_ALT5;
|
|
BCM2709_GPIO_MIN_TRIGGER = GPIO_TRIGGER_LOW;
|
|
BCM2709_GPIO_MAX_TRIGGER = GPIO_TRIGGER_ASYNC_FALLING;
|
|
GPIO pull up/down to BCM2836 pull up/down | |
BCM2709_GPIO_PULL_MAP:array[GPIO_PULL_NONE..GPIO_PULL_DOWN] of LongWord = (
| |
BCM2836_GPPUD_NONE,
|
|
BCM2836_GPPUD_UP,
|
|
BCM2836_GPPUD_DOWN);
|
|
GPIO functions to BCM2836 functions | |
BCM2709_GPIO_FUNCTION_MAP:array[BCM2709_GPIO_MIN_FUNCTION..BCM2709_GPIO_MAX_FUNCTION] of LongWord = (
| |
BCM2836_GPFSEL_IN,
|
|
BCM2836_GPFSEL_OUT,
|
|
BCM2836_GPFSEL_ALT0,
|
|
BCM2836_GPFSEL_ALT1,
|
|
BCM2836_GPFSEL_ALT2,
|
|
BCM2836_GPFSEL_ALT3,
|
|
BCM2836_GPFSEL_ALT4,
|
|
BCM2836_GPFSEL_ALT5);
|
|
BCM2836 functions to GPIO functions | |
BCM2709_GPIO_FUNCTION_UNMAP:array[BCM2709_GPIO_MIN_FUNCTION..BCM2709_GPIO_MAX_FUNCTION] of LongWord = (
| |
GPIO_FUNCTION_IN,
|
|
GPIO_FUNCTION_OUT,
|
|
GPIO_FUNCTION_ALT5,
|
|
GPIO_FUNCTION_ALT4,
|
|
GPIO_FUNCTION_ALT0,
|
|
GPIO_FUNCTION_ALT1,
|
|
GPIO_FUNCTION_ALT2,
|
|
GPIO_FUNCTION_ALT3);
|
|
GPIO triggers to BCM2836 event registers | |
BCM2709_GPIO_TRIGGER_MAP:array[BCM2709_GPIO_MIN_TRIGGER..BCM2709_GPIO_MAX_TRIGGER] of LongWord = (
| |
BCM2836_GPLEN0,
|
|
BCM2836_GPHEN0,
|
|
BCM2836_GPREN0,
|
|
BCM2836_GPFEN0,
|
|
BCM2836_GPAREN0,
|
|
BCM2836_GPAFEN0);
|
BCM2709_UART0_*
BCM2709_UART0_DESCRIPTION = 'BCM2836 PL011 UART';
|
|
BCM2709_UART0_MIN_BAUD = 300;
|
Default minimum of 300 baud |
BCM2709_UART0_MAX_BAUD = 187500;
|
Default maximum based on the default settings from the firmware (Recalculated during open) |
BCM2709_UART0_MIN_DATABITS = SERIAL_DATA_5BIT;
|
|
BCM2709_UART0_MAX_DATABITS = SERIAL_DATA_8BIT;
|
|
BCM2709_UART0_MIN_STOPBITS = SERIAL_STOP_1BIT;
|
|
BCM2709_UART0_MAX_STOPBITS = SERIAL_STOP_2BIT;
|
|
BCM2709_UART0_MAX_PARITY = SERIAL_PARITY_EVEN;
|
|
BCM2709_UART0_MAX_FLOW = SERIAL_FLOW_RTS_CTS;
|
|
BCM2709_UART0_CLOCK_RATE = 3000000;
|
Default clock rate based on the default settings from the firmware (Requested from firmware during open) |
BCM2709_UART0_RX_POLL_LIMIT = 256;
|
Number of times interrupt handler may poll the read FIFO |
BCM2709_UART0_RX_BUFFER_SIZE = 1024;
|
BCM2709_UART1_*
BCM2709_UART1_DESCRIPTION = 'BCM2836 AUX (Mini) UART';
|
BCM2709_EMMC_*
BCM2709_EMMC_DESCRIPTION = 'BCM2836 Arasan SD Host';
|
|
BCM2709_EMMC_MIN_FREQ = 400000;
|
Default minimum of 400KHz |
BCM2709_EMMC_MAX_FREQ = 200000000;
|
Default clock rate based on the default settings from the firmware (Requested from firmware during start) |
BCM2709_SDHOST_*
BCM2709_SDHOST_DESCRIPTION = 'BCM2836 SDHOST';
|
|
BCM2709_SDHOST_MIN_FREQ = 400000;
|
Default minimum of 400KHz |
BCM2709_SDHOST_MAX_FREQ = 250000000;
|
Default clock rate based on the default settings from the firmware (Requested from firmware during start) |
See: BCMSDHOST for the driver implementation |
BCM2709_SYS_CLOCK_*
BCM2709_SYS_CLOCK_DESCRIPTION = 'BCM2836 System Timer Clock';
|
BCM2709_ARM_CLOCK_*
BCM2709_ARM_CLOCK_DESCRIPTION = 'BCM2836 ARM Timer Clock';
|
|
BCM2709_ARM_CLOCK_MIN_RATE = 976562;
|
Default minimum (Divider 255) based on the default settings from the firmware (Recalculated during start) |
BCM2709_ARM_CLOCK_MAX_RATE = 250000000;
|
Default maximum (Divider 0) based on the default settings from the firmware (Recalculated during start) |
BCM2709_ARM_CLOCK_DEFAULT_RATE = 3968253;
|
Default rate (Divider 62) based on the default settings from the firmware (Recalculated during start) |
BCM2709_ARM_CLOCK_MIN_DIVIDER = 0;
|
|
BCM2709_ARM_CLOCK_MAX_DIVIDER = 255;
|
|
BCM2709_ARM_CLOCK_DEFAULT_DIVIDER = 62;
|
|
BCM2709_ARM_CLOCK_CORE_CLOCK = 250000000;
|
Default core clock based on the default settings from the firmware (Requested from firmware during start) |
BCM2709_LOCAL_CLOCK_*
BCM2709_LOCAL_CLOCK_DESCRIPTION = 'BCM2836 Local Timer Clock';
|
BCM2709_ARM_TIMER_*
BCM2709_ARM_TIMER_DESCRIPTION = 'BCM2836 ARM Timer';
|
|
BCM2709_ARM_TIMER_MIN_RATE = 244140;
|
Default minimum (Divider 1023) based on the default settings from the firmware (Recalculated during start) |
BCM2709_ARM_TIMER_MAX_RATE = 250000000;
|
Default maximum (Divider 0) based on the default settings from the firmware (Recalculated during start) |
BCM2709_ARM_TIMER_DEFAULT_RATE = 1000000;
|
Default rate (Divider 249) based on the default settings from the firmware (Recalculated during start) |
BCM2709_ARM_TIMER_MIN_INTERVAL = 1;
|
|
BCM2709_ARM_TIMER_MAX_INTERVAL = $FFFFFFFF;
|
|
BCM2709_ARM_TIMER_MIN_DIVIDER = 0;
|
|
BCM2709_ARM_TIMER_MAX_DIVIDER = 1023;
|
|
BCM2709_ARM_TIMER_DEFAULT_DIVIDER = 249;
|
|
BCM2709_ARM_TIMER_CORE_CLOCK = 250000000;
|
Default core clock based on the default settings from the firmware (Requested from firmware during start) |
BCM2709_LOCAL_TIMER_*
BCM2709_LOCAL_TIMER_DESCRIPTION = 'BCM2836 Local Timer';
|
BCM2709_RANDOM_*
BCM2709_RANDOM_DESCRIPTION = 'BCM2836 Random Number Generator';
|
|
BCM2709_RANDOM_WARMUP_COUNT = $00040000;
|
The initial numbers generated are "less random" so will be discarded |
BCM2709_MAILBOX_*
BCM2709_MAILBOX_DESCRIPTION = 'BCM2836 Mailbox';
|
BCM2709_WATCHDOG_*
BCM2709_WATCHDOG_DESCRIPTION = 'BCM2836 Watchdog Timer';
|
BCM2709_FRAMEBUFFER_*
BCM2709_FRAMEBUFFER_DESCRIPTION = 'BCM2836 Framebuffer';
|
Type definitions
BCM2709 SPI0
PBCM2709SPI0Device = ^TBCM2709SPI0Device;
TBCM2709SPI0Device = record
SPI Properties | |
SPI:TSPIDevice;
|
|
BCM2709 Properties | |
Address:Pointer;
|
Device register base address |
CoreClock:LongWord;
|
Core clock rate |
Transfer Properties | |
Mode:LongWord;
|
Mode of current transfer (BCM2709_SPI0_MODE_IRQ/BCM2709_SPI0_MODE_DMA / BCM2709_SPI0_MODE_PIO) |
Source:Pointer;
|
Pointer to the source for current transfer (nil if reading only) |
Dest:Pointer;
|
Pointer to the destination for current transfer (nil if writing only) |
Count:LongWord;
|
Count of bytes for current transfer |
SourceRemain:LongWord;
|
Source bytes remaining for current transfer |
DestRemain:LongWord;
|
Destination bytes remaining for current transfer |
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
BCM2709 BSCI2C (I2C0/1/2)
PBCM2709BSCI2CDevice = ^TBCM2709BSCI2CDevice;
TBCM2709BSCI2CDevice = record
I2C Properties | |
I2C:TI2CDevice;
|
|
BCM2709 Properties | |
Address:Pointer;
|
Device register base address |
CoreClock:LongWord;
|
Core clock rate |
SDAPin:LongWord;
|
GPIO pin for the SDA line |
SCLPin:LongWord;
|
GPIO pin for the SCL line |
SDAFunction:LongWord;
|
GPIO function for the SDA line |
SCLFunction:LongWord;
|
GPIO function for the SCL line |
Transfer Properties | |
Index:LongWord;
|
Index of this device in the IRQData array (Set during device initialization) |
Mode:LongWord;
|
Mode of current transfer (BCM2709_BSCI2C_MODE_WRITE/BCM2709_BSCI2C_MODE_READ) |
Data:Pointer;
|
Pointer to the data for current transfer |
Count:LongWord;
|
Count of bytes for current transfer |
Remain:LongWord;
|
Bytes remaining for current transfer |
Error:LongBool;
|
True if an error occurred during the transfer |
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
BCM2709 BSCI2C (I2C0/1) IRQ data
PBCM2709BSCI2CIRQData = ^TBCM2709BSCI2CIRQData;
TBCM2709BSCI2CIRQData = record
Note: BSC I2C devices share a single interrupt | |
Count:LongWord;
|
|
Lock:TSpinHandle;
|
|
Devices:array[0..2] of PBCM2709BSCI2CDevice;
|
BCM2709 SPI AUX (SPI1/2)
PBCM2709SPIAUXDevice = ^TBCM2709SPIAUXDevice;
TBCM2709SPIAUXDevice = record
SPI Properties | |
SPI:TSPIDevice;
|
|
BCM2709 Properties | |
Address:Pointer;
|
Device register base address |
CoreClock:LongWord;
|
Core clock rate |
BCM2709 I2C slave buffer
PBCM2709I2CSlaveBuffer = ^TBCM2709I2CSlaveBuffer;
TBCM2709I2CSlaveBuffer = record
Wait:TSemaphoreHandle;
|
Data ready semaphore |
Start:LongWord;
|
Index of first available buffer entry |
Count:LongWord;
|
Number of available entries in the buffer |
Buffer:array[0..(BCM2709_I2CSLAVE_BUFFER_SIZE - 1)] of Byte;
|
BCM2709 I2C slave
PBCM2709I2CSlave = ^TBCM2709I2CSlave;
TBCM2709I2CSlave = record
I2C Properties | |
I2C:TI2CDevice;
|
|
BCM2709 Properties | |
IRQ:LongWord;
|
IRQ of this device |
Address:Pointer;
|
Device register base address |
Lock:TSpinHandle;
|
Device lock (Differs from lock in I2C device) (Spin lock due to use by interrupt handler) |
SDAPin:LongWord;
|
GPIO pin for the SDA line |
SCLPin:LongWord;
|
GPIO pin for the SCL line |
SDAFunction:LongWord;
|
GPIO function for the SDA line |
SCLFunction:LongWord;
|
GPIO function for the SCL line |
Transfer Properties | |
Receive:TBCM2709I2CSlaveBuffer;
|
Receive Data Buffer |
Transmit:TBCM2709I2CSlaveBuffer;
|
Transmit Data Buffer |
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
BCM2709 DMA channel
PBCM2709DMAChannel = ^TBCM2709DMAChannel;
TBCM2709DMAChannel = record
Host:PBCM2709DMAHost;
|
DMA host this channel belongs to |
Request:PDMARequest;
|
Current DMA request pending on this channel (or nil of no request is pending) |
Number:LongWord;
|
The channel number of this channel |
Interrupt:LongWord;
|
The interrupt number of this channel |
Registers:PBCM2836DMARegisters;
|
The channel registers for configuration |
BCM2709 DMA
PBCM2709DMAHost = ^TBCM2709DMAHost;
TBCM2709DMAHost = record
DMA Properties | |
DMA:TDMAHost;
|
|
BCM2709 Properties | |
ChannelMask:LongWord;
|
Mask of available channels (Passed from GPU firmware) |
ChannelFree:LongWord;
|
Bitmap of current free channels |
ChannelLock:TMutexHandle;
|
Lock for access to ChannelFree |
ChannelWait:TSemaphoreHandle;
|
Number of free normal channels in ChannelFree |
ChannelLite:TSemaphoreHandle;
|
Number of free DMA Lite channels in ChannelFree |
ChannelBulk:TSemaphoreHandle;
|
Number of free DMA Bulk channels in ChannelFree |
Channels:array[0..BCM2709_DMA_CHANNEL_COUNT - 1] of TBCM2709DMAChannel;
|
Channel information for each DMA channel on the host |
EnableRegister:PLongWord;
|
|
InterruptRegister:PLongWord;
|
|
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the host controller |
BCM2709 PWM device
PBCM2709PWMDevice = ^TBCM2709PWMDevice;
TBCM2709PWMDevice = record
PWM Properties | |
PWM:TPWMDevice;
|
|
BCM2709 Properties | |
Address:Pointer;
|
Device register base address |
Channel:LongWord;
|
Channel for this device |
Scaler:LongWord;
|
Scaler for Duty cycle and Period |
Pair:PBCM2709PWMDevice;
|
The paired PWM device for the other channel |
Audio Properties | |
Audio:PBCM2709PWMAudio;
|
The associated PWM Audio device |
BCM2709 PCM audio
PBCM2709PWMAudio = ^TBCM2709PWMAudio;
TBCM2709PWMAudio = record
Audio Properties | |
Audio:TAudioDevice;
|
|
PWM Properties | |
PWM0:PBCM2709PWMDevice;
|
The PWM device for channel 0 |
PWM1:PBCM2709PWMDevice;
|
The PWM device for channel 1 |
BCM2709 GPIO
PBCM2709GPIOBank = ^TBCM2709GPIOBank;
TBCM2709GPIOBank = record
GPIO:PGPIODevice;
|
|
Bank:LongWord;
|
|
Address:PtrUInt;
|
|
PinStart:LongWord;
|
BCM2709 GPIO device
PBCM2709GPIODevice = ^TBCM2709GPIODevice;
TBCM2709GPIODevice = record
GPIO Properties | |
GPIO:TGPIODevice;
|
|
BCM2709 Properties | |
Lock:TSpinHandle;
|
Device lock (Differs from lock in Device portion) (Spin lock due to use by interrupt handler) |
Banks:array[0..BCM2836_GPIO_BANK_COUNT - 1] of TBCM2709GPIOBank;
|
|
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
BCM2709 UART0
PBCM2709UART0Device = ^TBCM2709UART0Device;
TBCM2709UART0Device = record
UART Properties | |
UART:TUARTDevice;
|
|
BCM2709 Properties | |
Address:Pointer;
|
Device register base address |
ClockRate:LongWord;
|
Device clock rate |
Start:LongWord;
|
Index of first available buffer entry |
Count:LongWord;
|
Number of available entries in the buffer |
Buffer:array[0..(BCM2709_UART0_RX_BUFFER_SIZE - 1)] of Word;
|
Buffer for received data (Includes data and status) |
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
BCM2709 SDHCI
PBCM2709SDHCIHost = ^TBCM2709SDHCIHost;
TBCM2709SDHCIHost = record
SDHCI Properties | |
SDHCI:TSDHCIHost;
|
|
BCM2709 Properties | |
FIQ:LongBool;
|
|
SDIO:LongBool;
|
|
WriteDelay:LongWord;
|
|
DelayClock:LongWord;
|
|
ShadowRegister:LongWord;
|
BCM2709 system clock
PBCM2709SystemClock = ^TBCM2709SystemClock;
TBCM2709SystemClock = record
Clock Properties | |
Clock:TClockDevice;
|
BCM2709 ARM clock
PBCM2709ARMClock = ^TBCM2709ARMClock;
TBCM2709ARMClock = record
Clock Properties | |
Clock:TClockDevice;
|
|
BCM2709 Properties | |
CoreClock:LongWord;
|
Core clock rate |
BCM2709 ARM timer
PBCM2709ARMTimer = ^TBCM2709ARMTimer;
TBCM2709ARMTimer = record
Timer Properties | |
Timer:TTimerDevice;
|
|
BCM2709 Properties | |
CoreClock:LongWord;
|
Core clock rate |
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
BCM2709 local timer
PBCM2709LocalTimer = ^TBCM2709LocalTimer;
TBCM2709LocalTimer = record
Timer Properties | |
Timer:TTimerDevice;
|
|
BCM2709 Properties | |
CoreClock:LongWord;
|
Core clock rate |
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
BCM2709 random
PBCM2709Random = ^TBCM2709Random;
TBCM2709Random = record
Random Properties | |
Random:TRandomDevice;
|
BCM2709 mailbox
PBCM2709Mailbox = ^TBCM2709Mailbox;
TBCM2709Mailbox = record
Mailbox Properties | |
Mailbox:TMailboxDevice;
|
BCM2709 watchdog
PBCM2709Watchdog = ^TBCM2709Watchdog;
TBCM2709Watchdog = record
Watchdog Properties | |
Watchdog:TWatchdogDevice;
|
BCM2709 framebuffer
PBCM2709Framebuffer = ^TBCM2709Framebuffer;
TBCM2709Framebuffer = record
Framebuffer Properties | |
Framebuffer:TFramebufferDevice;
|
|
BCM2709 Properties | |
MultiDisplay:LongBool;
|
|
DisplayNum:LongWord;
|
|
DisplaySettings:TDisplaySettings;
|
Public variables
None defined
Function declarations
Initialization functions
procedure BCM2709Init;
Note | None documented |
---|
BCM2709 SPI0 functions
function BCM2709SPI0Start(SPI:PSPIDevice; Mode,ClockRate,ClockPhase,ClockPolarity:LongWord):LongWord;
Note | None documented |
---|
function BCM2709SPI0Stop(SPI:PSPIDevice):LongWord;
Note | None documented |
---|
function BCM2709SPI0WriteRead(SPI:PSPIDevice; ChipSelect:Word; Source,Dest:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;
Note | None documented |
---|
function BCM2709SPI0SetMode(SPI:PSPIDevice; Mode:LongWord):LongWord;
Note | None documented |
---|
function BCM2709SPI0SetClockRate(SPI:PSPIDevice; ChipSelect:Word; ClockRate:LongWord):LongWord;
Note | None documented |
---|
function BCM2709SPI0SetClockPhase(SPI:PSPIDevice; ClockPhase:LongWord):LongWord;
Note | None documented |
---|
function BCM2709SPI0SetClockPolarity(SPI:PSPIDevice; ClockPolarity:LongWord):LongWord;
Note | None documented |
---|
function BCM2709SPI0SetSelectPolarity(SPI:PSPIDevice; ChipSelect:Word; SelectPolarity:LongWord):LongWord;
Note | None documented |
---|
procedure BCM2709SPI0ReadFIFO(SPI:PBCM2709SPI0Device);
Note | Called from within the interrupt handler |
---|
procedure BCM2709SPI0WriteFIFO(SPI:PBCM2709SPI0Device);
Note | Called from within the interrupt handler |
---|
procedure BCM2709SPI0InterruptHandler(SPI:PBCM2709SPI0Device);
Note | None documented |
---|
procedure BCM2709SPI0DMARequestCompleted(Request:PDMARequest);
Note | None documented |
---|
BCM2709 BSCI2C (I2C0/1/2) functions
function BCM2709BSCI2CStart(I2C:PI2CDevice;Rate:LongWord):LongWord;
Note | None documented |
---|
function BCM2709BSCI2CStop(I2C:PI2CDevice):LongWord;
Note | None documented |
---|
function BCM2709BSCI2CRead(I2C:PI2CDevice; Address:Word; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Note | None documented |
---|
function BCM2709BSCI2CWrite(I2C:PI2CDevice; Address:Word; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Note | None documented |
---|
function BCM2709BSCI2CWriteRead(I2C:PI2CDevice; Address:Word; Initial:Pointer; Len:LongWord; Data:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Note | None documented |
---|
function BCM2709BSCI2CWriteWrite(I2C:PI2CDevice; Address:Word; Initial:Pointer; Len:LongWord; Data:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Note | None documented |
---|
function BCM2709BSCI2CSetRate(I2C:PI2CDevice; Rate:LongWord):LongWord;
Note | None documented |
---|
function BCM2709BSCI2CSetAddress(I2C:PI2CDevice; Address:Word):LongWord;
Note | None documented |
---|
procedure BCM2709BSCI2CFillFIFO(I2C:PBCM2709BSCI2CDevice);
Note | Called from within the interrupt handler |
---|
procedure BCM2709BSCI2CDrainFIFO(I2C:PBCM2709BSCI2CDevice);
Note | Called from within the interrupt handler |
---|
procedure BCM2709BSCI2CInterruptHandler(IRQData:PBCM2709BSCI2CIRQData);
Note | Thread submitting the current request will hold the I2C device lock |
---|
BCM2709 SPI/I2C slave functions
function BCM2709I2CSlaveStart(I2C:PI2CDevice; Rate:LongWord):LongWord;
Note | Not intended to be called directly by applications, use I2CSlaveStart instead.
Rate is not applicable for I2C slave devices |
---|
function BCM2709I2CSlaveStop(I2C:PI2CDevice):LongWord;
Note | Not intended to be called directly by applications, use I2CSlaveStop instead. |
---|
function BCM2709I2CSlaveRead(I2C:PI2CDevice; Address:Word; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Note | Not intended to be called directly by applications, use I2CSlaveRead instead.
Address is not applicable for I2C slave devices |
---|
function BCM2709I2CSlaveWrite(I2C:PI2CDevice; Address:Word; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Note | Not intended to be called directly by applications, use I2CSlaveWrite instead.
Address is not applicable for I2C slave devices |
---|
function BCM2709I2CSlaveSetAddress(I2C:PI2CDevice; Address:Word):LongWord;
Note | Not intended to be called directly by applications, use I2CSlaveSetAddress instead. |
---|
BCM2709 DMA functions
function BCM2709DMAHostStart(DMA:PDMAHost):LongWord;
Note | None documented |
---|
function BCM2709DMAHostStop(DMA:PDMAHost):LongWord;
Note | None documented |
---|
function BCM2709DMAHostSubmit(DMA:PDMAHost; Request:PDMARequest):LongWord;
Note | None documented |
---|
function BCM2709DMAHostCancel(DMA:PDMAHost; Request:PDMARequest):LongWord;
Note | None documented |
---|
procedure BCM2709DMAInterruptHandler(Channel:PBCM2709DMAChannel);
Note | None documented |
---|
procedure BCM2709DMASharedInterruptHandler(DMA:PBCM2709DMAHost);
Note | None documented |
---|
procedure BCM2709DMARequestComplete(Channel:PBCM2709DMAChannel);
Note | None documented |
---|
function BCM2709DMAPeripheralToDREQ(Peripheral:LongWord):LongWord;
Note | None documented |
---|
procedure BCM2709DMADataToControlBlock(Request:PDMARequest; Data:PDMAData; Block:PBCM2836DMAControlBlock; Bulk,Lite:Boolean);
Note | None documented |
---|
BCM2709 PWM0/1 functions
function BCM2709PWMStart(PWM:PPWMDevice):LongWord;
Note | None documented |
---|
function BCM2709PWMStop(PWM:PPWMDevice):LongWord;
Note | None documented |
---|
function BCM2709PWMWrite(PWM:PPWMDevice; Value:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMSetGPIO(PWM:PPWMDevice; GPIO:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMResetGPIO(PWM:PPWMDevice; GPIO:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMSetMode(PWM:PPWMDevice; Mode:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMSetRange(PWM:PPWMDevice; Range:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMSetFrequency(PWM:PPWMDevice; Frequency:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMSetPolarity(PWM:PPWMDevice; Polarity:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMConfigure(PWM:PPWMDevice; DutyNS,PeriodNS:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMClockStart(PWM:PPWMDevice; Frequency:LongWord):LongWord;
Note | None documented |
---|
function BCM2709PWMClockStop(PWM:PPWMDevice):LongWord;
Note | None documented |
---|
function BCM2709PWMClockEnabled(PWM:PPWMDevice):Boolean;
Note | None documented |
---|
BCM2709 GPIO functions
function BCM2709GPIOStart(GPIO:PGPIODevice):LongWord;
Note | None documented |
---|
function BCM2709GPIOStop(GPIO:PGPIODevice):LongWord;
Note | None documented |
---|
function BCM2709GPIORead(GPIO:PGPIODevice; Reg:LongWord):LongWord;
Note | None documented |
---|
procedure BCM2709GPIOWrite(GPIO:PGPIODevice; Reg,Value:LongWord);
Note | None documented |
---|
function BCM2709GPIOInputGet(GPIO:PGPIODevice; Pin:LongWord):LongWord;
Note | None documented |
---|
function BCM2709GPIOInputWait(GPIO:PGPIODevice; Pin,Trigger,Timeout:LongWord):LongWord;
Note | None documented |
---|
function BCM2709GPIOInputEvent(GPIO:PGPIODevice; Pin,Trigger,Flags,Timeout:LongWord; Callback:TGPIOCallback; Data:Pointer):LongWord;
Note | None documented |
---|
function BCM2709GPIOInputCancel(GPIO:PGPIODevice; Pin:LongWord):LongWord;
Note | None documented |
---|
function BCM2709GPIOOutputSet(GPIO:PGPIODevice; Pin,Level:LongWord):LongWord;
Note | None documented |
---|
function BCM2709GPIOPullSelect(GPIO:PGPIODevice; Pin,Mode:LongWord):LongWord;
Note | None documented |
---|
function BCM2709GPIOFunctionGet(GPIO:PGPIODevice; Pin:LongWord):LongWord;
Note | None documented |
---|
function BCM2709GPIOFunctionSelect(GPIO:PGPIODevice; Pin,Mode:LongWord):LongWord;
Note | None documented |
---|
procedure BCM2709GPIOInterruptHandler(Bank:PBCM2709GPIOBank);
Note | None documented |
---|
procedure BCM2709GPIOEventTrigger(Pin:PGPIOPin);
Note | None documented |
---|
procedure BCM2709GPIOEventTimeout(Event:PGPIOEvent);
Note | None documented |
---|
BCM2709 UART0 functions
function BCM2709UART0Open(UART:PUARTDevice; BaudRate,DataBits,StopBits,Parity,FlowControl:LongWord):LongWord;
Note | Not intended to be called directly by applications, use UARTDeviceOpen instead. |
---|
function BCM2709UART0Close(UART:PUARTDevice):LongWord;
Note | Not intended to be called directly by applications, use UARTDeviceClose instead. |
---|
function BCM2709UART0Read(UART:PUARTDevice; Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;
Note | Not intended to be called directly by applications, use UARTDeviceRead instead. |
---|
function BCM2709UART0PushRX(UART:PUARTDevice):LongWord;
Note | None documented |
---|
function BCM2709UART0Write(UART:PUARTDevice; Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;
Note | Not intended to be called directly by applications, use UARTDeviceWrite instead. |
---|
function BCM2709UART0GetStatus(UART:PUARTDevice):LongWord;
Note | Not intended to be called directly by applications, use UARTDeviceGetStatus instead. |
---|
function BCM2709UART0SetStatus(UART:PUARTDevice; Status:LongWord):LongWord;
Note | Not intended to be called directly by applications, use UARTDeviceSetStatus instead. |
---|
procedure BCM2709UART0InterruptHandler(UART:PUARTDevice);
Note | Not intended to be called directly by applications |
---|
procedure BCM2709UART0Receive(UART:PUARTDevice);
Note | Not intended to be called directly by applications |
---|
procedure BCM2709UART0Transmit(UART:PUARTDevice);
Note | Not intended to be called directly by applications |
---|
procedure BCM2709UART0EnableInterrupt(UART:PBCM2709UART0Device; Interrupt:LongWord);
UART | The BCM2709 UART0 device to enable the interrupt for |
---|---|
Interrupt | The interrupt to enable |
Note | Caller must hold the UART lock |
procedure BCM2709UART0DisableInterrupt(UART:PBCM2709UART0Device; Interrupt:LongWord);
UART | The BCM2709 UART0 device to disable the interrupt for |
---|---|
Interrupt | The interrupt to disable |
Note | Caller must hold the UART lock |
BCM2709 SDHCI functions
function BCM2709SDHCIHostStart(SDHCI:PSDHCIHost):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostStart instead. |
---|
function BCM2709SDHCIHostStop(SDHCI:PSDHCIHost):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostStop instead. |
---|
function BCM2709SDHCIHostLock(SDHCI:PSDHCIHost):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostLock instead. |
---|
function BCM2709SDHCIHostUnlock(SDHCI:PSDHCIHost):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostUnlock instead. |
---|
function BCM2709SDHCIHostSignal(SDHCI:PSDHCIHost; Semaphore:TSemaphoreHandle):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostSignal instead. |
---|
function BCM2709SDHCIHostReadByte(SDHCI:PSDHCIHost; Reg:LongWord):Byte;
Note | Not intended to be called directly by applications, use SDHCIHostReadByte instead. |
---|---|
Note | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word reads using LongWord reads. |
function BCM2709SDHCIHostReadWord(SDHCI:PSDHCIHost; Reg:LongWord):Word;
Note | Not intended to be called directly by applications, use SDHCIHostReadWord instead. |
---|---|
Note | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word reads using LongWord reads. |
function BCM2709SDHCIHostReadLong(SDHCI:PSDHCIHost; Reg:LongWord):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostReadLong instead. |
---|
procedure BCM2709SDHCIHostWriteByte(SDHCI:PSDHCIHost; Reg:LongWord; Value:Byte);
Note | Not intended to be called directly by applications, use SDHCIHostWriteByte instead. |
---|---|
Note | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word writes using LongWord writes. |
procedure BCM2709SDHCIHostWriteWord(SDHCI:PSDHCIHost; Reg:LongWord; Value:Word);
Note | Not intended to be called directly by applications, use SDHCIHostWriteWord instead. |
---|---|
Note | The Broadcom document BCM2835-ARM-Peripherals page 66 states the following: Contrary to Arasans documentation the EMMC module registers can only be accessed as 32 bit registers, i.e. the two LSBs of the address are always zero. For this reason this code must simulate Byte and Word writes using LongWord writes. |
procedure BCM2709SDHCIHostWriteLong(SDHCI:PSDHCIHost; Reg:LongWord; Value:LongWord);
Note | Not intended to be called directly by applications, use SDHCIHostWriteLong instead. |
---|---|
Note | The source code of U-Boot and Linux kernel drivers have this comment The Arasan has a bugette whereby it may lose the content of successive writes to registers that are within two SD-card clock cycles of each other (a clock domain crossing problem). It seems, however, that the data register does not have this problem. (Which is just as well - otherwise we'd have to nobble the DMA engine too) For this reason this code must delay after each write to the registers. |
procedure BCM2709SDHCIInterruptHandler(SDHCI:PSDHCIHost);
Note | Not intended to be called directly by applications |
---|
function BCM2709SDHCISetupInterrupts(SDHCI:PSDHCIHost):LongWord;
Note | Not intended to be called directly by applications |
---|
function BCM2709MMCDeviceGetCardDetect(MMC:PMMCDevice):LongWord;
Note | Not intended to be called directly by applications, use MMCDeviceGetCardDetect instead. |
---|
BCM2709 system clock functions
function BCM2709SystemClockRead(Clock:PClockDevice):LongWord;
Note | None documented |
---|
function BCM2709SystemClockRead64(Clock:PClockDevice):Int64;
Note | None documented |
---|
BCM2709 ARM clock functions
function BCM2709ARMClockStart(Clock:PClockDevice):LongWord;
Note | None documented |
---|
function BCM2709ARMClockStop(Clock:PClockDevice):LongWord;
Note | None documented |
---|
function BCM2709ARMClockRead(Clock:PClockDevice):LongWord;
Note | None documented |
---|
function BCM2709ARMClockRead64(Clock:PClockDevice):Int64;
Note | None documented |
---|
function BCM2709ARMClockSetRate(Clock:PClockDevice; Rate:LongWord):LongWord;
Note | None documented |
---|
BCM2709 ARM timer functions
function BCM2709ARMTimerStart(Timer:PTimerDevice):LongWord;
Note | Not intended to be called directly by applications, use TimerDeviceStart instead. |
---|
function BCM2709ARMTimerStop(Timer:PTimerDevice):LongWord;
Note | Not intended to be called directly by applications, use TimerDeviceStop instead. |
---|
function BCM2709ARMTimerRead64(Timer:PTimerDevice):Int64;
Note | Not intended to be called directly by applications, use TimerDeviceRead64 instead. |
---|
function BCM2709ARMTimerWait(Timer:PTimerDevice):LongWord;
Note | Not intended to be called directly by applications, use TimerDeviceWait instead. |
---|
function BCM2709ARMTimerEvent(Timer:PTimerDevice; Flags:LongWord; Callback:TTimerCallback; Data:Pointer):LongWord;
Note | Not intended to be called directly by applications, use TimerDeviceEvent instead. |
---|
function BCM2709ARMTimerCancel(Timer:PTimerDevice):LongWord;
Note | Not intended to be called directly by applications, use TimerDeviceCancel instead. |
---|
function BCM2709ARMTimerSetRate(Timer:PTimerDevice; Rate:LongWord):LongWord;
Note | Not intended to be called directly by applications, use TimerDeviceSetRate instead. |
---|
function BCM2709ARMTimerSetInterval(Timer:PTimerDevice; Interval:LongWord):LongWord;
Note | Not intended to be called directly by applications, use TimerDeviceSetInterval instead. |
---|
procedure BCM2709ARMTimerInterruptHandler(Timer:PTimerDevice);
Note | Not intended to be called directly by applications |
---|
procedure BCM2709ARMTimerEventTrigger(Timer:PTimerDevice);
Note | Not intended to be called directly by applications |
---|
BCM2709 random functions
function BCM2709RandomStart(Random:PRandomDevice):LongWord;
Note | None documented |
---|
function BCM2709RandomStop(Random:PRandomDevice):LongWord;
Note | None documented |
---|
function BCM2709RandomReadLongWord(Random:PRandomDevice):LongWord;
Note | None documented |
---|
BCM2709 watchdog functions
function BCM2709WatchdogStart(Watchdog:PWatchdogDevice):LongWord;
Note | None documented |
---|
function BCM2709WatchdogStop(Watchdog:PWatchdogDevice):LongWord;
Note | None documented |
---|
function BCM2709WatchdogRefresh(Watchdog:PWatchdogDevice):LongWord;
Note | None documented |
---|
function BCM2709WatchdogGetRemain(Watchdog:PWatchdogDevice):LongWord;
Note | None documented |
---|
BCM2709 framebuffer functions
function BCM2709FramebufferAllocate(Framebuffer:PFramebufferDevice; Properties:PFramebufferProperties):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceAllocate instead. |
---|
function BCM2709FramebufferRelease(Framebuffer:PFramebufferDevice):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceRelease instead. |
---|
function BCM2709FramebufferBlank(Framebuffer:PFramebufferDevice; Blank:Boolean):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceBlank instead. |
---|
function BCM2709FramebufferCommit(Framebuffer:PFramebufferDevice;Address:PtrUInt;Size,Flags:LongWord):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceCommit instead. |
---|
function BCM2709FramebufferWaitSync(Framebuffer:PFramebufferDevice):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceWaitSync instead. |
---|
function BCM2709FramebufferSetOffsetEx(Framebuffer:PFramebufferDevice; X,Y:LongWord; Pan,Switch:Boolean):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceSetOffsetEx instead. |
---|
function BCM2709FramebufferGetPalette(Framebuffer:PFramebufferDevice; Palette:PFramebufferPalette):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceGetPalette instead. |
---|
function BCM2709FramebufferSetPalette(Framebuffer:PFramebufferDevice; Palette:PFramebufferPalette):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceSetPalette instead. |
---|
function BCM2709FramebufferSetBacklight(Framebuffer:PFramebufferDevice; Brightness:LongWord):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceSetBacklight instead. |
---|
function BCM2709FramebufferSetCursor(Framebuffer:PFramebufferDevice; Width,Height,HotspotX,HotspotY:LongWord; Image:Pointer; Len:LongWord):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceSetCursor instead. |
---|
function BCM2709FramebufferUpdateCursor(Framebuffer:PFramebufferDevice; Enabled:Boolean; X,Y:LongInt; Relative:Boolean):LongWord;
Note | Not intended to be called directly by applications, use FramebufferDeviceUpdateCursor instead. |
---|
BCM2709 helper functions
function BCM2709SPIGetDescription(Id:LongWord):String;
Id | The Id number of the SPI device (0 to 2) |
---|---|
Return | The correct device description suitable for passing to SPIDeviceFindByDescription |
Note | The Id number supplied to this function may differ from the Ultibo device id value. |
function BCM2709I2CGetDescription(Id:LongWord):String;
Id | The Id number of the I2C device (0 to 2) |
---|---|
Return | The correct device description suitable for passing to I2CDeviceFindByDescription |
Note | The Id number supplied to this function may differ from the Ultibo device id value. |
function BCM2709I2CSlaveGetDescription(Id:LongWord):String;
Id | The Id number of the I2C slave device (Always 0) |
---|---|
Return | The correct device description suitable for passing to I2CSlaveFindByDescription |
Note | The Id number supplied to this function may differ from the Ultibo device id value |
function BCM2709PWMGetDescription(Id,Channel:LongWord):String;
Id | The Id number of the PWM device (0 or 1) |
---|---|
Channel | The channel number of the PWM device (0 or 1) |
Return | The correct device description suitable for passing to PWMDeviceFindByDescription |
Note | The Id number supplied to this function may differ from the Ultibo device id value. |
function BCM2709UARTGetDescription(Id:LongWord):String;
Id | The Id number of the UART device (0 or 1) |
---|---|
Return | The correct device description suitable for passing to UARTDeviceFindByDescription |
Note | The Id number supplied to this function may differ from the Ultibo device id value. |
Return to Unit Reference