mbed API for Raspberry Pi boards.

mbedPi

This is an attempt to implement a limited number of mbed APIs for Raspberry Pi single-board computers. The project was inspired by and based on the arduPi library developed for the Arduino by Cooking Hacks .

/media/uploads/hudakz/board01.jpg

Specifications

  • Chip: Broadcom BCM2836 SoC
  • Core architecture: Quad-core ARM Cortex-A7
  • CPU frequency: 900 MHz
  • GPU: Dual Core VideoCore IV® Multimedia Co-Processor
  • Memory: 1GB LPDDR2
  • Operating System: Boots from Micro SD card, running a version of the Linux operating system
  • Power: Micro USB socket 5V, 2A

Connectors

  • Ethernet: 10/100 BaseT Ethernet socket
  • Video Output: HDMI (rev 1.3 & 1.4)
  • Audio Output: 3.5mm jack, HDMI
  • USB: 4 x USB 2.0 Connector
  • GPIO Connector: 40-pin 2.54 mm (100 mil) expansion header: 2x20 strip providing 27 GPIO pins as well as +3.3 V, +5 V and GND supply lines
  • Camera Connector: 15-pin MIPI Camera Serial Interface (CSI-2)
  • JTAG: Not populated
  • Display Connector: Display Serial Interface (DSI) 15 way flat flex cable connector with two data lanes and a clock lane
  • Memory Card Slot: Micro SDIO

GPIO connector pinout

Zoom in /media/uploads/hudakz/mbedpi_pinout02.png

Information

Only the labels printed in blue/white or green/white (i.e. p3, gpio2 ...) must be used in your code. The other labels are given as information (alternate-functions, power pins, ...).


Building programs for the Raspberry Pi with mbedPi

I use Qt Creator for development, however you can use any other IDE available on the Raspberry Pi (e.g. Geany) if you like. For a quick try:

  • Install Qt and the Qt Creator onto your Raspberry Pi. Then create a new "Blinky" Plain non-Qt C++ Project as follows: /media/uploads/hudakz/newproject.png

  • Change the main code as below:

main.cpp

#include "mbedPi.h"

int main()
{
    DigitalOut  myled(p7);

    while(1) {
        myled = 1; // LED is ON
        wait(0.2); // 200 ms
        myled = 0; // LED is OFF
        wait(1.0); // 1 sec
        printf("Blink\r\n");
    }
}


  • Copy the mbedPi.zip file into your project's folder and unzip.
  • Add the mbedPi.h and mbedPi.cpp files to your project by right clicking on the "Blinky" project and then clicking on the "Add Existing Files..." option in the local menu:

    /media/uploads/hudakz/addfiles.png

    /media/uploads/hudakz/addfiles02.png

  • Double click on Blinky.pro to open it for editing and add new libraries by inserting a new line as follows:

    /media/uploads/hudakz/libs.png

  • Compile the project.

  • Connect an LED through a 1k resistor to pin 7 and the ground on the Raspberry Pi GPIO connector.

  • Run the binary as sudo (sudo ./Blinky) and you should see the LED blinking. /media/uploads/hudakz/mbedpi_run.png

  • Press Ctrl+c to stop running the application.
Committer:
hudakz
Date:
Tue Oct 18 18:18:37 2016 +0000
Revision:
0:91392e1f8551
Initial issue.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:91392e1f8551 1 /*
hudakz 0:91392e1f8551 2 * Copyright (C) 2016 Zoltan Hudak
hudakz 0:91392e1f8551 3 * hudakz@outlook.com
hudakz 0:91392e1f8551 4 *
hudakz 0:91392e1f8551 5 * Portions Copyright (C) Libelium Comunicaciones Distribuidas S.L.
hudakz 0:91392e1f8551 6 * http://www.libelium.com
hudakz 0:91392e1f8551 7 *
hudakz 0:91392e1f8551 8 * This program is free software: you can redistribute it and/or modify
hudakz 0:91392e1f8551 9 * it under the terms of the GNU General Public License as published by
hudakz 0:91392e1f8551 10 * the Free Software Foundation, either version 3 of the License, or
hudakz 0:91392e1f8551 11 * (at your option) any later version.
hudakz 0:91392e1f8551 12 *
hudakz 0:91392e1f8551 13 * This program is distributed in the hope that it will be useful,
hudakz 0:91392e1f8551 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
hudakz 0:91392e1f8551 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
hudakz 0:91392e1f8551 16 * GNU General Public License for more details.
hudakz 0:91392e1f8551 17 *
hudakz 0:91392e1f8551 18 * You should have received a copy of the GNU General Public License
hudakz 0:91392e1f8551 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
hudakz 0:91392e1f8551 20 *
hudakz 0:91392e1f8551 21 * Version 1.0
hudakz 0:91392e1f8551 22 */
hudakz 0:91392e1f8551 23 //
hudakz 0:91392e1f8551 24 /*$off*/
hudakz 0:91392e1f8551 25 #ifndef MBEDPI_H
hudakz 0:91392e1f8551 26 #define MBEDPI_H
hudakz 0:91392e1f8551 27
hudakz 0:91392e1f8551 28 #include <errno.h>
hudakz 0:91392e1f8551 29 #include <fcntl.h>
hudakz 0:91392e1f8551 30 #include <netinet/in.h>
hudakz 0:91392e1f8551 31 #include <signal.h>
hudakz 0:91392e1f8551 32 #include <stdlib.h>
hudakz 0:91392e1f8551 33 #include <stdio.h>
hudakz 0:91392e1f8551 34 #include <sys/ipc.h>
hudakz 0:91392e1f8551 35 #include <sys/sem.h>
hudakz 0:91392e1f8551 36 #include <sys/socket.h>
hudakz 0:91392e1f8551 37 #include <sys/time.h>
hudakz 0:91392e1f8551 38 #include <sys/types.h>
hudakz 0:91392e1f8551 39 #include <sys/wait.h>
hudakz 0:91392e1f8551 40 #include <sys/mman.h>
hudakz 0:91392e1f8551 41 #include <string.h>
hudakz 0:91392e1f8551 42 #include <time.h>
hudakz 0:91392e1f8551 43 #include <termios.h>
hudakz 0:91392e1f8551 44 #include <ctype.h>
hudakz 0:91392e1f8551 45 #include <sys/ioctl.h>
hudakz 0:91392e1f8551 46 #include <limits.h>
hudakz 0:91392e1f8551 47 #include <algorithm>
hudakz 0:91392e1f8551 48 #include <limits.h>
hudakz 0:91392e1f8551 49 #include <pthread.h>
hudakz 0:91392e1f8551 50 #include <poll.h>
hudakz 0:91392e1f8551 51
hudakz 0:91392e1f8551 52 #define IOBASE 0x20000000
hudakz 0:91392e1f8551 53 #define GPIO_BASE (IOBASE + 0x200000)
hudakz 0:91392e1f8551 54 #define BCM2835_SPI0_BASE (IOBASE + 0x204000)
hudakz 0:91392e1f8551 55 #define BCM2835_BSC1_BASE (IOBASE + 0x804000)
hudakz 0:91392e1f8551 56
hudakz 0:91392e1f8551 57 // Defines for I2C
hudakz 0:91392e1f8551 58 // GPIO register offsets from BCM2835_BSC*_BASE.
hudakz 0:91392e1f8551 59 // Offsets into the BSC Peripheral block in bytes per 3.1 BSC Register Map
hudakz 0:91392e1f8551 60 #define BCM2835_BSC_C 0x0000 ///< BSC Master Control
hudakz 0:91392e1f8551 61 #define BCM2835_BSC_S 0x0004 ///< BSC Master Status
hudakz 0:91392e1f8551 62 #define BCM2835_BSC_DLEN 0x0008 ///< BSC Master Data Length
hudakz 0:91392e1f8551 63 #define BCM2835_BSC_A 0x000c ///< BSC Master Slave Address
hudakz 0:91392e1f8551 64 #define BCM2835_BSC_FIFO 0x0010 ///< BSC Master Data FIFO
hudakz 0:91392e1f8551 65 #define BCM2835_BSC_DIV 0x0014 ///< BSC Master Clock Divider
hudakz 0:91392e1f8551 66 #define BCM2835_BSC_DEL 0x0018 ///< BSC Master Data Delay
hudakz 0:91392e1f8551 67 #define BCM2835_BSC_CLKT 0x001c ///< BSC Master Clock Stretch Timeout
hudakz 0:91392e1f8551 68
hudakz 0:91392e1f8551 69 // Register masks for BSC_C
hudakz 0:91392e1f8551 70 #define BCM2835_BSC_C_I2CEN 0x00008000 ///< I2C Enable, 0 = disabled, 1 = enabled
hudakz 0:91392e1f8551 71 #define BCM2835_BSC_C_INTR 0x00000400 ///< Interrupt on RX
hudakz 0:91392e1f8551 72 #define BCM2835_BSC_C_INTT 0x00000200 ///< Interrupt on TX
hudakz 0:91392e1f8551 73 #define BCM2835_BSC_C_INTD 0x00000100 ///< Interrupt on DONE
hudakz 0:91392e1f8551 74 #define BCM2835_BSC_C_ST 0x00000080 ///< Start transfer, 1 = Start a new transfer
hudakz 0:91392e1f8551 75 #define BCM2835_BSC_C_CLEAR_1 0x00000020 ///< Clear FIFO Clear
hudakz 0:91392e1f8551 76 #define BCM2835_BSC_C_CLEAR_2 0x00000010 ///< Clear FIFO Clear
hudakz 0:91392e1f8551 77 #define BCM2835_BSC_C_READ 0x00000001 ///< Read transfer
hudakz 0:91392e1f8551 78
hudakz 0:91392e1f8551 79 // Register masks for BSC_S
hudakz 0:91392e1f8551 80 #define BCM2835_BSC_S_CLKT 0x00000200 ///< Clock stretch timeout
hudakz 0:91392e1f8551 81 #define BCM2835_BSC_S_ERR 0x00000100 ///< ACK error
hudakz 0:91392e1f8551 82 #define BCM2835_BSC_S_RXF 0x00000080 ///< RXF FIFO full, 0 = FIFO is not full, 1 = FIFO is full
hudakz 0:91392e1f8551 83 #define BCM2835_BSC_S_TXE 0x00000040 ///< TXE FIFO full, 0 = FIFO is not full, 1 = FIFO is full
hudakz 0:91392e1f8551 84 #define BCM2835_BSC_S_RXD 0x00000020 ///< RXD FIFO contains data
hudakz 0:91392e1f8551 85 #define BCM2835_BSC_S_TXD 0x00000010 ///< TXD FIFO can accept data
hudakz 0:91392e1f8551 86 #define BCM2835_BSC_S_RXR 0x00000008 ///< RXR FIFO needs reading (full)
hudakz 0:91392e1f8551 87 #define BCM2835_BSC_S_TXW 0x00000004 ///< TXW FIFO needs writing (full)
hudakz 0:91392e1f8551 88 #define BCM2835_BSC_S_DONE 0x00000002 ///< Transfer DONE
hudakz 0:91392e1f8551 89 #define BCM2835_BSC_S_TA 0x00000001 ///< Transfer Active
hudakz 0:91392e1f8551 90 #define BCM2835_BSC_FIFO_SIZE 16 ///< BSC FIFO size
hudakz 0:91392e1f8551 91 #define BCM2835_CORE_CLK_HZ 250000000 ///< 250 MHz
hudakz 0:91392e1f8551 92
hudakz 0:91392e1f8551 93 /// \brief bcm2835I2CClockDivider
hudakz 0:91392e1f8551 94 /// Specifies the divider used to generate the I2C clock from the system clock.
hudakz 0:91392e1f8551 95 /// Clock divided is based on nominal base clock rate of 250MHz
hudakz 0:91392e1f8551 96 typedef enum
hudakz 0:91392e1f8551 97 {
hudakz 0:91392e1f8551 98 BCM2835_I2C_CLOCK_DIVIDER_2500 = 2500, ///< 2500 = 10us = 100 kHz
hudakz 0:91392e1f8551 99 BCM2835_I2C_CLOCK_DIVIDER_626 = 626, ///< 622 = 2.504us = 399.3610 kHz
hudakz 0:91392e1f8551 100 BCM2835_I2C_CLOCK_DIVIDER_150 = 150, ///< 150 = 60ns = 1.666 MHz (default at reset)
hudakz 0:91392e1f8551 101 BCM2835_I2C_CLOCK_DIVIDER_148 = 148, ///< 148 = 59ns = 1.689 MHz
hudakz 0:91392e1f8551 102 } bcm2835I2CClockDivider;
hudakz 0:91392e1f8551 103
hudakz 0:91392e1f8551 104 /// \brief bcm2835I2CReasonCodes
hudakz 0:91392e1f8551 105 /// Specifies the reason codes for the bcm2835_i2c_write and bcm2835_i2c_read functions.
hudakz 0:91392e1f8551 106 typedef enum
hudakz 0:91392e1f8551 107 {
hudakz 0:91392e1f8551 108 BCM2835_I2C_REASON_OK = 0x00, ///< Success
hudakz 0:91392e1f8551 109 BCM2835_I2C_REASON_ERROR_NACK = 0x01, ///< Received a NACK
hudakz 0:91392e1f8551 110 BCM2835_I2C_REASON_ERROR_CLKT = 0x02, ///< Received Clock Stretch Timeout
hudakz 0:91392e1f8551 111 BCM2835_I2C_REASON_ERROR_DATA = 0x04, ///< Not all data is sent / received
hudakz 0:91392e1f8551 112 } bcm2835I2CReasonCodes;
hudakz 0:91392e1f8551 113
hudakz 0:91392e1f8551 114 typedef enum
hudakz 0:91392e1f8551 115 {
hudakz 0:91392e1f8551 116 RPI_V2_GPIO_P1_03 = 2, ///< Version 2, Pin P1-03
hudakz 0:91392e1f8551 117 RPI_V2_GPIO_P1_05 = 3, ///< Version 2, Pin P1-05
hudakz 0:91392e1f8551 118 } RPiGPIOPin;
hudakz 0:91392e1f8551 119
hudakz 0:91392e1f8551 120 #define BSC0_C *(bsc0.addr + 0x00)
hudakz 0:91392e1f8551 121 #define BSC0_S *(bsc0.addr + 0x01)
hudakz 0:91392e1f8551 122 #define BSC0_DLEN *(bsc0.addr + 0x02)
hudakz 0:91392e1f8551 123 #define BSC0_A *(bsc0.addr + 0x03)
hudakz 0:91392e1f8551 124 #define BSC0_FIFO *(bsc0.addr + 0x04)
hudakz 0:91392e1f8551 125
hudakz 0:91392e1f8551 126 #define BSC_C_I2CEN (1<< 15)
hudakz 0:91392e1f8551 127 #define BSC_C_INTR (1<< 10)
hudakz 0:91392e1f8551 128 #define BSC_C_INTT (1<< 9)
hudakz 0:91392e1f8551 129 #define BSC_C_INTD (1<< 8)
hudakz 0:91392e1f8551 130 #define BSC_C_ST (1<< 7)
hudakz 0:91392e1f8551 131 #define BSC_C_CLEAR (1<< 4)
hudakz 0:91392e1f8551 132 #define BSC_C_READ 1
hudakz 0:91392e1f8551 133
hudakz 0:91392e1f8551 134 #define START_READ BSC_C_I2CEN|BSC_C_ST|BSC_C_CLEAR|BSC_C_READ
hudakz 0:91392e1f8551 135 #define START_WRITE BSC_C_I2CEN|BSC_C_ST
hudakz 0:91392e1f8551 136
hudakz 0:91392e1f8551 137 #define BSC_S_CLKT (1<< 9)
hudakz 0:91392e1f8551 138 #define BSC_S_ERR (1<< 8)
hudakz 0:91392e1f8551 139 #define BSC_S_RXF (1<< 7)
hudakz 0:91392e1f8551 140 #define BSC_S_TXE (1<< 6)
hudakz 0:91392e1f8551 141 #define BSC_S_RXD (1<< 5)
hudakz 0:91392e1f8551 142 #define BSC_S_TXD (1<< 4)
hudakz 0:91392e1f8551 143 #define BSC_S_RXR (1<< 3)
hudakz 0:91392e1f8551 144 #define BSC_S_TXW (1<< 2)
hudakz 0:91392e1f8551 145 #define BSC_S_DONE (1<< 1)
hudakz 0:91392e1f8551 146 #define BSC_S_TA 1
hudakz 0:91392e1f8551 147
hudakz 0:91392e1f8551 148 #define CLEAR_STATUS BSC_S_CLKT|BSC_S_ERR|BSC_S_DONE
hudakz 0:91392e1f8551 149
hudakz 0:91392e1f8551 150 #define GPFSEL0 *(gpio.addr + 0)
hudakz 0:91392e1f8551 151 #define GPFSEL1 *(gpio.addr + 1)
hudakz 0:91392e1f8551 152 #define GPFSEL2 *(gpio.addr + 2)
hudakz 0:91392e1f8551 153 #define GPFSEL3 *(gpio.addr + 3)
hudakz 0:91392e1f8551 154 #define GPFSEL4 *(gpio.addr + 4)
hudakz 0:91392e1f8551 155 #define GPFSEL5 *(gpio.addr + 5)
hudakz 0:91392e1f8551 156 // Reserved @ word offset 6
hudakz 0:91392e1f8551 157 #define GPSET0 *(gpio.addr + 7)
hudakz 0:91392e1f8551 158 #define GPSET1 *(gpio.addr + 8)
hudakz 0:91392e1f8551 159 // Reserved @ word offset 9
hudakz 0:91392e1f8551 160 #define GPCLR0 *(gpio.addr + 10)
hudakz 0:91392e1f8551 161 #define GPCLR1 *(gpio.addr + 11)
hudakz 0:91392e1f8551 162 // Reserved @ word offset 12
hudakz 0:91392e1f8551 163 #define GPLEV0 *(gpio.addr + 13)
hudakz 0:91392e1f8551 164 #define GPLEV1 *(gpio.addr + 14)
hudakz 0:91392e1f8551 165
hudakz 0:91392e1f8551 166 #define PAGESIZE 4096
hudakz 0:91392e1f8551 167 #define BLOCK_SIZE 4096
hudakz 0:91392e1f8551 168
hudakz 0:91392e1f8551 169 /// Defines for SPI
hudakz 0:91392e1f8551 170 /// GPIO register offsets from BCM2835_SPI0_BASE.
hudakz 0:91392e1f8551 171 /// Offsets into the SPI Peripheral block in bytes per 10.5 SPI Register Map
hudakz 0:91392e1f8551 172 #define BCM2835_SPI0_CS 0x0000 ///< SPI Master Control and Status
hudakz 0:91392e1f8551 173 #define BCM2835_SPI0_FIFO 0x0004 ///< SPI Master TX and RX FIFOs
hudakz 0:91392e1f8551 174 #define BCM2835_SPI0_CLK 0x0008 ///< SPI Master Clock Divider
hudakz 0:91392e1f8551 175 #define BCM2835_SPI0_DLEN 0x000c ///< SPI Master Data Length
hudakz 0:91392e1f8551 176 #define BCM2835_SPI0_LTOH 0x0010 ///< SPI LOSSI mode TOH
hudakz 0:91392e1f8551 177 #define BCM2835_SPI0_DC 0x0014 ///< SPI DMA DREQ Controls
hudakz 0:91392e1f8551 178
hudakz 0:91392e1f8551 179 // Register masks for SPI0_CS
hudakz 0:91392e1f8551 180 #define BCM2835_SPI0_CS_LEN_LONG 0x02000000 ///< Enable Long data word in Lossi mode if DMA_LEN is set
hudakz 0:91392e1f8551 181 #define BCM2835_SPI0_CS_DMA_LEN 0x01000000 ///< Enable DMA mode in Lossi mode
hudakz 0:91392e1f8551 182 #define BCM2835_SPI0_CS_CSPOL2 0x00800000 ///< Chip Select 2 Polarity
hudakz 0:91392e1f8551 183 #define BCM2835_SPI0_CS_CSPOL1 0x00400000 ///< Chip Select 1 Polarity
hudakz 0:91392e1f8551 184 #define BCM2835_SPI0_CS_CSPOL0 0x00200000 ///< Chip Select 0 Polarity
hudakz 0:91392e1f8551 185 #define BCM2835_SPI0_CS_RXF 0x00100000 ///< RXF - RX FIFO Full
hudakz 0:91392e1f8551 186 #define BCM2835_SPI0_CS_RXR 0x00080000 ///< RXR RX FIFO needs Reading ( full)
hudakz 0:91392e1f8551 187 #define BCM2835_SPI0_CS_TXD 0x00040000 ///< TXD TX FIFO can accept Data
hudakz 0:91392e1f8551 188 #define BCM2835_SPI0_CS_RXD 0x00020000 ///< RXD RX FIFO contains Data
hudakz 0:91392e1f8551 189 #define BCM2835_SPI0_CS_DONE 0x00010000 ///< Done transfer Done
hudakz 0:91392e1f8551 190 #define BCM2835_SPI0_CS_TE_EN 0x00008000 ///< Unused
hudakz 0:91392e1f8551 191 #define BCM2835_SPI0_CS_LMONO 0x00004000 ///< Unused
hudakz 0:91392e1f8551 192 #define BCM2835_SPI0_CS_LEN 0x00002000 ///< LEN LoSSI enable
hudakz 0:91392e1f8551 193 #define BCM2835_SPI0_CS_REN 0x00001000 ///< REN Read Enable
hudakz 0:91392e1f8551 194 #define BCM2835_SPI0_CS_ADCS 0x00000800 ///< ADCS Automatically Deassert Chip Select
hudakz 0:91392e1f8551 195 #define BCM2835_SPI0_CS_INTR 0x00000400 ///< INTR Interrupt on RXR
hudakz 0:91392e1f8551 196 #define BCM2835_SPI0_CS_INTD 0x00000200 ///< INTD Interrupt on Done
hudakz 0:91392e1f8551 197 #define BCM2835_SPI0_CS_DMAEN 0x00000100 ///< DMAEN DMA Enable
hudakz 0:91392e1f8551 198 #define BCM2835_SPI0_CS_TA 0x00000080 ///< Transfer Active
hudakz 0:91392e1f8551 199 #define BCM2835_SPI0_CS_CSPOL 0x00000040 ///< Chip Select Polarity
hudakz 0:91392e1f8551 200 #define BCM2835_SPI0_CS_CLEAR 0x00000030 ///< Clear FIFO Clear RX and TX
hudakz 0:91392e1f8551 201 #define BCM2835_SPI0_CS_CLEAR_RX 0x00000020 ///< Clear FIFO Clear RX
hudakz 0:91392e1f8551 202 #define BCM2835_SPI0_CS_CLEAR_TX 0x00000010 ///< Clear FIFO Clear TX
hudakz 0:91392e1f8551 203 #define BCM2835_SPI0_CS_CPOL 0x00000008 ///< Clock Polarity
hudakz 0:91392e1f8551 204 #define BCM2835_SPI0_CS_CPHA 0x00000004 ///< Clock Phase
hudakz 0:91392e1f8551 205 #define BCM2835_SPI0_CS_CS 0x00000003 ///< Chip Select
hudakz 0:91392e1f8551 206
hudakz 0:91392e1f8551 207 #define BCM2835_GPFSEL0 0x0000 ///< GPIO Function Select 0
hudakz 0:91392e1f8551 208
hudakz 0:91392e1f8551 209 #define BCM2835_GPEDS0 0x0040 ///< GPIO Pin Event Detect Status 0
hudakz 0:91392e1f8551 210 #define BCM2835_GPREN0 0x004c ///< GPIO Pin Rising Edge Detect Enable 0
hudakz 0:91392e1f8551 211 #define BCM2835_GPFEN0 0x0048 ///< GPIO Pin Falling Edge Detect Enable 0
hudakz 0:91392e1f8551 212 #define BCM2835_GPHEN0 0x0064 ///< GPIO Pin High Detect Enable 0
hudakz 0:91392e1f8551 213 #define BCM2835_GPLEN0 0x0070 ///< GPIO Pin Low Detect Enable 0
hudakz 0:91392e1f8551 214
hudakz 0:91392e1f8551 215 static int REV = 0;
hudakz 0:91392e1f8551 216
hudakz 0:91392e1f8551 217 typedef enum {
hudakz 0:91392e1f8551 218 // Not connected
hudakz 0:91392e1f8551 219 NC = (int)0xFFFFFFFF,
hudakz 0:91392e1f8551 220
hudakz 0:91392e1f8551 221 // GPIO names
hudakz 0:91392e1f8551 222 gpio2 = 2,
hudakz 0:91392e1f8551 223 gpio3 = 3,
hudakz 0:91392e1f8551 224 gpio4 = 4,
hudakz 0:91392e1f8551 225 gpio5 = 5,
hudakz 0:91392e1f8551 226 gpio6 = 6,
hudakz 0:91392e1f8551 227 gpio7 = 7,
hudakz 0:91392e1f8551 228 gpio8 = 8,
hudakz 0:91392e1f8551 229 gpio9 = 9,
hudakz 0:91392e1f8551 230 gpio10 = 10,
hudakz 0:91392e1f8551 231 gpio11 = 11,
hudakz 0:91392e1f8551 232 gpio12 = 12,
hudakz 0:91392e1f8551 233 gpio13 = 13,
hudakz 0:91392e1f8551 234 gpio14 = 14,
hudakz 0:91392e1f8551 235 gpio15 = 15,
hudakz 0:91392e1f8551 236 gpio16 = 16,
hudakz 0:91392e1f8551 237 gpio17 = 17,
hudakz 0:91392e1f8551 238 gpio18 = 18,
hudakz 0:91392e1f8551 239 gpio19 = 19,
hudakz 0:91392e1f8551 240 gpio20 = 20,
hudakz 0:91392e1f8551 241 gpio21 = 21,
hudakz 0:91392e1f8551 242 gpio22 = 22,
hudakz 0:91392e1f8551 243 gpio23 = 23,
hudakz 0:91392e1f8551 244 gpio24 = 24,
hudakz 0:91392e1f8551 245 gpio25 = 25,
hudakz 0:91392e1f8551 246 gpio26 = 26,
hudakz 0:91392e1f8551 247 gpio27 = 27,
hudakz 0:91392e1f8551 248
hudakz 0:91392e1f8551 249 // Rapsberry Pi pin names
hudakz 0:91392e1f8551 250 p3 = gpio2,
hudakz 0:91392e1f8551 251 p5 = gpio3,
hudakz 0:91392e1f8551 252 p7 = gpio4,
hudakz 0:91392e1f8551 253 p8 = gpio14,
hudakz 0:91392e1f8551 254 p10 = gpio15,
hudakz 0:91392e1f8551 255 p11 = gpio17,
hudakz 0:91392e1f8551 256 p12 = gpio18,
hudakz 0:91392e1f8551 257 p13 = gpio27,
hudakz 0:91392e1f8551 258 p15 = gpio22,
hudakz 0:91392e1f8551 259 p16 = gpio23,
hudakz 0:91392e1f8551 260 p18 = gpio24,
hudakz 0:91392e1f8551 261 p19 = gpio10,
hudakz 0:91392e1f8551 262 p21 = gpio9,
hudakz 0:91392e1f8551 263 p22 = gpio25,
hudakz 0:91392e1f8551 264 p23 = gpio11,
hudakz 0:91392e1f8551 265 p24 = gpio8,
hudakz 0:91392e1f8551 266 p26 = gpio7,
hudakz 0:91392e1f8551 267 p29 = gpio5,
hudakz 0:91392e1f8551 268 p31 = gpio6,
hudakz 0:91392e1f8551 269 p32 = gpio12,
hudakz 0:91392e1f8551 270 p33 = gpio13,
hudakz 0:91392e1f8551 271 p35 = gpio19,
hudakz 0:91392e1f8551 272 p36 = gpio16,
hudakz 0:91392e1f8551 273 p37 = gpio26,
hudakz 0:91392e1f8551 274 p38 = gpio20,
hudakz 0:91392e1f8551 275 p40 = gpio21,
hudakz 0:91392e1f8551 276
hudakz 0:91392e1f8551 277 // Extension board V2.1 pin names
hudakz 0:91392e1f8551 278 P0 = gpio17,
hudakz 0:91392e1f8551 279 P1 = gpio18,
hudakz 0:91392e1f8551 280 P2 = gpio27,
hudakz 0:91392e1f8551 281 P3 = gpio22,
hudakz 0:91392e1f8551 282 P4 = gpio23,
hudakz 0:91392e1f8551 283 P5 = gpio24,
hudakz 0:91392e1f8551 284 P6 = gpio25,
hudakz 0:91392e1f8551 285 P7 = gpio4,
hudakz 0:91392e1f8551 286 CE1 = gpio7,
hudakz 0:91392e1f8551 287 CE0 = gpio8,
hudakz 0:91392e1f8551 288 CS = gpio8,
hudakz 0:91392e1f8551 289 SCLK = gpio11,
hudakz 0:91392e1f8551 290 MISO = gpio9,
hudakz 0:91392e1f8551 291 MOSI = gpio10,
hudakz 0:91392e1f8551 292 RXD = gpio15,
hudakz 0:91392e1f8551 293 TXD = gpio14,
hudakz 0:91392e1f8551 294 SCL = gpio3,
hudakz 0:91392e1f8551 295 SDA = gpio2,
hudakz 0:91392e1f8551 296 PWM = gpio18
hudakz 0:91392e1f8551 297
hudakz 0:91392e1f8551 298 } PinName;
hudakz 0:91392e1f8551 299
hudakz 0:91392e1f8551 300 typedef enum
hudakz 0:91392e1f8551 301 {
hudakz 0:91392e1f8551 302 PIN_INPUT,
hudakz 0:91392e1f8551 303 PIN_OUTPUT
hudakz 0:91392e1f8551 304 } PinDirection;
hudakz 0:91392e1f8551 305
hudakz 0:91392e1f8551 306 typedef enum
hudakz 0:91392e1f8551 307 {
hudakz 0:91392e1f8551 308 PullNone,
hudakz 0:91392e1f8551 309 PullUp,
hudakz 0:91392e1f8551 310 PullDown,
hudakz 0:91392e1f8551 311 OpenDrain,
hudakz 0:91392e1f8551 312 PullDefault = PullNone
hudakz 0:91392e1f8551 313 } PinMode;
hudakz 0:91392e1f8551 314
hudakz 0:91392e1f8551 315 typedef void (*FunctionPointer) (void);
hudakz 0:91392e1f8551 316
hudakz 0:91392e1f8551 317 /// \brief bcm2835SPIBitOrder
hudakz 0:91392e1f8551 318 /// Specifies the SPI data bit ordering
hudakz 0:91392e1f8551 319 typedef enum
hudakz 0:91392e1f8551 320 {
hudakz 0:91392e1f8551 321 LSBFIRST = 0, ///< LSB First
hudakz 0:91392e1f8551 322 MSBFIRST = 1///< MSB First
hudakz 0:91392e1f8551 323 }bcm2835SPIBitOrder;
hudakz 0:91392e1f8551 324
hudakz 0:91392e1f8551 325 /// \brief bcm2835SPIMode
hudakz 0:91392e1f8551 326 /// Specify the SPI data mode
hudakz 0:91392e1f8551 327 typedef enum
hudakz 0:91392e1f8551 328 {
hudakz 0:91392e1f8551 329 SPI_MODE0 = 0, ///< CPOL = 0, CPHA = 0
hudakz 0:91392e1f8551 330 SPI_MODE1 = 1, ///< CPOL = 0, CPHA = 1
hudakz 0:91392e1f8551 331 SPI_MODE2 = 2, ///< CPOL = 1, CPHA = 0
hudakz 0:91392e1f8551 332 SPI_MODE3 = 3, ///< CPOL = 1, CPHA = 1
hudakz 0:91392e1f8551 333 }bcm2835SPIMode;
hudakz 0:91392e1f8551 334
hudakz 0:91392e1f8551 335 /// \brief bcm2835SPIChipSelect
hudakz 0:91392e1f8551 336 /// Specify the SPI chip select pin(s)
hudakz 0:91392e1f8551 337 typedef enum
hudakz 0:91392e1f8551 338 {
hudakz 0:91392e1f8551 339 SPI_CS0 = 0, ///< Chip Select 0
hudakz 0:91392e1f8551 340 SPI_CS1 = 1, ///< Chip Select 1
hudakz 0:91392e1f8551 341 SPI_CS2 = 2, ///< Chip Select 2 (ie pins CS1 and CS2 are asserted)
hudakz 0:91392e1f8551 342 SPI_CS_NONE = 3, ///< No CS, control it yourself
hudakz 0:91392e1f8551 343 } bcm2835SPIChipSelect;
hudakz 0:91392e1f8551 344
hudakz 0:91392e1f8551 345 /// \brief bcm2835SPIClockDivider
hudakz 0:91392e1f8551 346 /// Specifies the divider used to generate the SPI clock from the system clock.
hudakz 0:91392e1f8551 347 /// Figures below give the divider, clock period and clock frequency.
hudakz 0:91392e1f8551 348 typedef enum
hudakz 0:91392e1f8551 349 {
hudakz 0:91392e1f8551 350 SPI_CLOCK_DIV65536 = 0, ///< 65536 = 256us = 4kHz
hudakz 0:91392e1f8551 351 SPI_CLOCK_DIV32768 = 32768, ///< 32768 = 126us = 8kHz
hudakz 0:91392e1f8551 352 SPI_CLOCK_DIV16384 = 16384, ///< 16384 = 64us = 15.625kHz
hudakz 0:91392e1f8551 353 SPI_CLOCK_DIV8192 = 8192, ///< 8192 = 32us = 31.25kHz
hudakz 0:91392e1f8551 354 SPI_CLOCK_DIV4096 = 4096, ///< 4096 = 16us = 62.5kHz
hudakz 0:91392e1f8551 355 SPI_CLOCK_DIV2048 = 2048, ///< 2048 = 8us = 125kHz
hudakz 0:91392e1f8551 356 SPI_CLOCK_DIV1024 = 1024, ///< 1024 = 4us = 250kHz
hudakz 0:91392e1f8551 357 SPI_CLOCK_DIV512 = 512, ///< 512 = 2us = 500kHz
hudakz 0:91392e1f8551 358 SPI_CLOCK_DIV256 = 256, ///< 256 = 1us = 1MHz
hudakz 0:91392e1f8551 359 SPI_CLOCK_DIV128 = 128, ///< 128 = 500ns = = 2MHz
hudakz 0:91392e1f8551 360 SPI_CLOCK_DIV64 = 64, ///< 64 = 250ns = 4MHz
hudakz 0:91392e1f8551 361 SPI_CLOCK_DIV32 = 32, ///< 32 = 125ns = 8MHz
hudakz 0:91392e1f8551 362 SPI_CLOCK_DIV16 = 16, ///< 16 = 50ns = 20MHz
hudakz 0:91392e1f8551 363 SPI_CLOCK_DIV8 = 8, ///< 8 = 25ns = 40MHz
hudakz 0:91392e1f8551 364 SPI_CLOCK_DIV4 = 4, ///< 4 = 12.5ns 80MHz
hudakz 0:91392e1f8551 365 SPI_CLOCK_DIV2 = 2, ///< 2 = 6.25ns = 160MHz
hudakz 0:91392e1f8551 366 SPI_CLOCK_DIV1 = 1, ///< 0 = 256us = 4kHz
hudakz 0:91392e1f8551 367 } bcm2835SPIClockDivider;
hudakz 0:91392e1f8551 368
hudakz 0:91392e1f8551 369 typedef enum
hudakz 0:91392e1f8551 370 {
hudakz 0:91392e1f8551 371 BCM2835_GPIO_FSEL_INPT = 0b000, ///< Input
hudakz 0:91392e1f8551 372 BCM2835_GPIO_FSEL_OUTP = 0b001, ///< Output
hudakz 0:91392e1f8551 373 BCM2835_GPIO_FSEL_ALT0 = 0b100, ///< Alternate function 0
hudakz 0:91392e1f8551 374 BCM2835_GPIO_FSEL_ALT1 = 0b101, ///< Alternate function 1
hudakz 0:91392e1f8551 375 BCM2835_GPIO_FSEL_ALT2 = 0b110, ///< Alternate function 2
hudakz 0:91392e1f8551 376 BCM2835_GPIO_FSEL_ALT3 = 0b111, ///< Alternate function 3
hudakz 0:91392e1f8551 377 BCM2835_GPIO_FSEL_ALT4 = 0b011, ///< Alternate function 4
hudakz 0:91392e1f8551 378 BCM2835_GPIO_FSEL_ALT5 = 0b010, ///< Alternate function 5
hudakz 0:91392e1f8551 379 BCM2835_GPIO_FSEL_MASK = 0b111 ///< Function select bits mask
hudakz 0:91392e1f8551 380 } bcm2835FunctionSelect;
hudakz 0:91392e1f8551 381
hudakz 0:91392e1f8551 382 namespace unistd {
hudakz 0:91392e1f8551 383 //All functions of unistd.h must be called like this: unistd::the_function()
hudakz 0:91392e1f8551 384 #include <unistd.h>
hudakz 0:91392e1f8551 385 }
hudakz 0:91392e1f8551 386
hudakz 0:91392e1f8551 387 enum Representation{
hudakz 0:91392e1f8551 388 BIN,
hudakz 0:91392e1f8551 389 OCT,
hudakz 0:91392e1f8551 390 DEC,
hudakz 0:91392e1f8551 391 HEX,
hudakz 0:91392e1f8551 392 BYTE
hudakz 0:91392e1f8551 393 };
hudakz 0:91392e1f8551 394
hudakz 0:91392e1f8551 395 typedef enum {
hudakz 0:91392e1f8551 396 LOW = 0,
hudakz 0:91392e1f8551 397 HIGH = 1,
hudakz 0:91392e1f8551 398 RISING = 2,
hudakz 0:91392e1f8551 399 FALLING = 3,
hudakz 0:91392e1f8551 400 BOTH = 4
hudakz 0:91392e1f8551 401 } Digivalue;
hudakz 0:91392e1f8551 402 //
hudakz 0:91392e1f8551 403 /*$on*/
hudakz 0:91392e1f8551 404 //
hudakz 0:91392e1f8551 405 typedef bool boolean;
hudakz 0:91392e1f8551 406 typedef unsigned char byte;
hudakz 0:91392e1f8551 407
hudakz 0:91392e1f8551 408 struct bcm2835_peripheral
hudakz 0:91392e1f8551 409 {
hudakz 0:91392e1f8551 410 unsigned long addr_p;
hudakz 0:91392e1f8551 411 int mem_fd;
hudakz 0:91392e1f8551 412 void* map;
hudakz 0:91392e1f8551 413 volatile unsigned int* addr;
hudakz 0:91392e1f8551 414 };
hudakz 0:91392e1f8551 415
hudakz 0:91392e1f8551 416 struct ThreadArg
hudakz 0:91392e1f8551 417 {
hudakz 0:91392e1f8551 418 void (*func) ();
hudakz 0:91392e1f8551 419 int pin;
hudakz 0:91392e1f8551 420 };
hudakz 0:91392e1f8551 421
hudakz 0:91392e1f8551 422 void wait(float s);
hudakz 0:91392e1f8551 423 void wait_ms(int ms);
hudakz 0:91392e1f8551 424 void wait_us(int us);
hudakz 0:91392e1f8551 425
hudakz 0:91392e1f8551 426 void gpio_dir(PinName pin, PinDirection direction);
hudakz 0:91392e1f8551 427 void gpio_mode(PinName pin, PinMode mode);
hudakz 0:91392e1f8551 428 void gpio_write(PinName pin, int value);
hudakz 0:91392e1f8551 429 int gpio_read(PinName pin);
hudakz 0:91392e1f8551 430 uint8_t shiftIn(PinName dPin, PinName cPin, bcm2835SPIBitOrder order);
hudakz 0:91392e1f8551 431 void shiftOut(PinName dPin, PinName cPin, bcm2835SPIBitOrder order, uint8_t val);
hudakz 0:91392e1f8551 432 void attachInterrupt(PinName p, void (*f) (), Digivalue m);
hudakz 0:91392e1f8551 433 void detachInterrupt(PinName p);
hudakz 0:91392e1f8551 434
hudakz 0:91392e1f8551 435 class DigitalIn
hudakz 0:91392e1f8551 436 {
hudakz 0:91392e1f8551 437 public:
hudakz 0:91392e1f8551 438 DigitalIn(PinName pin) : gpio(pin) { gpio_dir(gpio, PIN_INPUT); gpio_write(gpio, LOW); }
hudakz 0:91392e1f8551 439 DigitalIn(PinName pin, PinMode mode) : gpio(pin) { gpio_dir(gpio, PIN_INPUT); gpio_mode(pin, mode); }
hudakz 0:91392e1f8551 440 int read(void) { return gpio_read(gpio); }
hudakz 0:91392e1f8551 441 void mode(PinMode mode) { mode == PullUp ? gpio_write(gpio, HIGH) : gpio_write(gpio, LOW); }
hudakz 0:91392e1f8551 442 void attach(FunctionPointer fptr, Digivalue m) { attachInterrupt(gpio, fptr, m); }
hudakz 0:91392e1f8551 443 operator int(void) { return read(); }
hudakz 0:91392e1f8551 444 protected:
hudakz 0:91392e1f8551 445 PinName gpio;
hudakz 0:91392e1f8551 446 };
hudakz 0:91392e1f8551 447
hudakz 0:91392e1f8551 448 class DigitalOut
hudakz 0:91392e1f8551 449 {
hudakz 0:91392e1f8551 450 public:
hudakz 0:91392e1f8551 451 DigitalOut(PinName pin) : gpio(pin) { gpio_dir(gpio, PIN_OUTPUT); }
hudakz 0:91392e1f8551 452 DigitalOut(PinName pin, int value) : gpio(pin) { gpio_dir(gpio, PIN_OUTPUT); gpio_write(gpio, value); }
hudakz 0:91392e1f8551 453 void write(int value) { gpio_write(gpio, value); }
hudakz 0:91392e1f8551 454 int read(void) { return gpio_read(gpio); }
hudakz 0:91392e1f8551 455 DigitalOut &operator =(int value) { write(value); return *this; }
hudakz 0:91392e1f8551 456 DigitalOut &operator =(DigitalOut& rhs) { write(rhs.read()); return *this; }
hudakz 0:91392e1f8551 457 operator int(void) { return read(); }
hudakz 0:91392e1f8551 458 protected:
hudakz 0:91392e1f8551 459 PinName gpio;
hudakz 0:91392e1f8551 460 };
hudakz 0:91392e1f8551 461
hudakz 0:91392e1f8551 462 class DigitalInOut
hudakz 0:91392e1f8551 463 {
hudakz 0:91392e1f8551 464 public:
hudakz 0:91392e1f8551 465 DigitalInOut(PinName pin) : gpio(pin) { PinMode(PIN_INPUT); }
hudakz 0:91392e1f8551 466 DigitalInOut(PinName pin, PinDirection direction, PinMode mode, int value) :
hudakz 0:91392e1f8551 467 gpio(pin) {
hudakz 0:91392e1f8551 468 if(direction == PIN_INPUT) {
hudakz 0:91392e1f8551 469 gpio_dir(gpio, PIN_INPUT);
hudakz 0:91392e1f8551 470 if(mode == PullUp)
hudakz 0:91392e1f8551 471 gpio_write(gpio, HIGH);
hudakz 0:91392e1f8551 472 else
hudakz 0:91392e1f8551 473 gpio_write(gpio, LOW);
hudakz 0:91392e1f8551 474 }
hudakz 0:91392e1f8551 475 else {
hudakz 0:91392e1f8551 476 gpio_dir(gpio, PIN_OUTPUT);
hudakz 0:91392e1f8551 477 gpio_write(gpio, value);
hudakz 0:91392e1f8551 478 }
hudakz 0:91392e1f8551 479 }
hudakz 0:91392e1f8551 480 void write(int value) { gpio_write(gpio, value); }
hudakz 0:91392e1f8551 481 int read(void) { return gpio_read(gpio); }
hudakz 0:91392e1f8551 482 void output(void) { gpio_dir(gpio, PIN_OUTPUT); }
hudakz 0:91392e1f8551 483 void input(void) { gpio_dir(gpio, PIN_INPUT); }
hudakz 0:91392e1f8551 484 DigitalInOut &operator =(int value) { write(value); return *this; }
hudakz 0:91392e1f8551 485 operator int(void) { return read(); }
hudakz 0:91392e1f8551 486 protected:
hudakz 0:91392e1f8551 487 PinName gpio;
hudakz 0:91392e1f8551 488 };
hudakz 0:91392e1f8551 489
hudakz 0:91392e1f8551 490 class InterruptIn
hudakz 0:91392e1f8551 491 {
hudakz 0:91392e1f8551 492 public:
hudakz 0:91392e1f8551 493 InterruptIn(PinName pin) :
hudakz 0:91392e1f8551 494 _digitalIn(pin) { }
hudakz 0:91392e1f8551 495
hudakz 0:91392e1f8551 496 void rise(FunctionPointer fptr) { _digitalIn.attach(fptr, RISING); }
hudakz 0:91392e1f8551 497 void fall(FunctionPointer fptr) { _digitalIn.attach(fptr, FALLING); }
hudakz 0:91392e1f8551 498 void both(FunctionPointer fptr) { _digitalIn.attach(fptr, BOTH); }
hudakz 0:91392e1f8551 499 int read(void) { return _digitalIn.read(); }
hudakz 0:91392e1f8551 500 void mode(PinMode mode) { _digitalIn.mode(mode); }
hudakz 0:91392e1f8551 501 operator int(void) { return _digitalIn.read(); }
hudakz 0:91392e1f8551 502 protected:
hudakz 0:91392e1f8551 503 DigitalIn _digitalIn;
hudakz 0:91392e1f8551 504 };
hudakz 0:91392e1f8551 505
hudakz 0:91392e1f8551 506 class Serial
hudakz 0:91392e1f8551 507 {
hudakz 0:91392e1f8551 508 private:
hudakz 0:91392e1f8551 509 int sd, status;
hudakz 0:91392e1f8551 510 const char* serialPort;
hudakz 0:91392e1f8551 511 unsigned char c;
hudakz 0:91392e1f8551 512 struct termios options;
hudakz 0:91392e1f8551 513 int speed;
hudakz 0:91392e1f8551 514 long timeOut;
hudakz 0:91392e1f8551 515 timespec time1, time2;
hudakz 0:91392e1f8551 516 timespec timeDiff(timespec start, timespec close);
hudakz 0:91392e1f8551 517 char* int2bin(int i);
hudakz 0:91392e1f8551 518 char* int2hex(int i);
hudakz 0:91392e1f8551 519 char* int2oct(int i);
hudakz 0:91392e1f8551 520 public:
hudakz 0:91392e1f8551 521 Serial(void);
hudakz 0:91392e1f8551 522 void baud(int serialSpeed);
hudakz 0:91392e1f8551 523 int readable(void);
hudakz 0:91392e1f8551 524 char read(void);
hudakz 0:91392e1f8551 525 int readBytes(char message[], int size);
hudakz 0:91392e1f8551 526 int readBytesUntil(char character, char buffer[], int length);
hudakz 0:91392e1f8551 527 bool find(const char* target);
hudakz 0:91392e1f8551 528 bool findUntil(const char* target, const char* terminal);
hudakz 0:91392e1f8551 529 long parseInt(void);
hudakz 0:91392e1f8551 530 float parseFloat(void);
hudakz 0:91392e1f8551 531 char peek(void);
hudakz 0:91392e1f8551 532 void printf(const char* format, ...);
hudakz 0:91392e1f8551 533 int write(uint8_t message);
hudakz 0:91392e1f8551 534 int write(const char* message);
hudakz 0:91392e1f8551 535 int write(char* message, int size);
hudakz 0:91392e1f8551 536 void flush(void);
hudakz 0:91392e1f8551 537 void setTimeout(long millis);
hudakz 0:91392e1f8551 538 void close(void);
hudakz 0:91392e1f8551 539 };
hudakz 0:91392e1f8551 540
hudakz 0:91392e1f8551 541 class I2C
hudakz 0:91392e1f8551 542 {
hudakz 0:91392e1f8551 543 private:
hudakz 0:91392e1f8551 544 int i2c_byte_wait_us;
hudakz 0:91392e1f8551 545 int i2c_bytes_to_read;
hudakz 0:91392e1f8551 546 void dump_bsc_status(void);
hudakz 0:91392e1f8551 547
hudakz 0:91392e1f8551 548 void wait_i2c_done(void);
hudakz 0:91392e1f8551 549 public:
hudakz 0:91392e1f8551 550 I2C(void);
hudakz 0:91392e1f8551 551 void begin(void);
hudakz 0:91392e1f8551 552 void beginTransmission(unsigned char address);
hudakz 0:91392e1f8551 553 void write(char data);
hudakz 0:91392e1f8551 554 uint8_t write(const char* buf, uint32_t len);
hudakz 0:91392e1f8551 555 void endTransmission(void);
hudakz 0:91392e1f8551 556 void requestFrom(unsigned char address, int quantity);
hudakz 0:91392e1f8551 557 unsigned char read(void);
hudakz 0:91392e1f8551 558 uint8_t read(char* buf);
hudakz 0:91392e1f8551 559 uint8_t read_rs(char* regaddr, char* buf, uint32_t len);
hudakz 0:91392e1f8551 560 };
hudakz 0:91392e1f8551 561
hudakz 0:91392e1f8551 562 class SPI
hudakz 0:91392e1f8551 563 {
hudakz 0:91392e1f8551 564 public:
hudakz 0:91392e1f8551 565 SPI(void);
hudakz 0:91392e1f8551 566 void begin(void);
hudakz 0:91392e1f8551 567 void end(void);
hudakz 0:91392e1f8551 568 void setBitOrder(uint8_t order);
hudakz 0:91392e1f8551 569 void setClockDivider(uint16_t divider);
hudakz 0:91392e1f8551 570 void setDataMode(uint8_t mode);
hudakz 0:91392e1f8551 571 void chipSelect(uint8_t cs);
hudakz 0:91392e1f8551 572 void setChipSelectPolarity(uint8_t cs, uint8_t active);
hudakz 0:91392e1f8551 573 uint8_t transfer(uint8_t value);
hudakz 0:91392e1f8551 574 void transfernb(char* tbuf, char* rbuf, uint32_t len);
hudakz 0:91392e1f8551 575 };
hudakz 0:91392e1f8551 576
hudakz 0:91392e1f8551 577 class Peripheral
hudakz 0:91392e1f8551 578 {
hudakz 0:91392e1f8551 579 private:
hudakz 0:91392e1f8551 580 int memfd;
hudakz 0:91392e1f8551 581 int map_peripheral(struct bcm2835_peripheral* p);
hudakz 0:91392e1f8551 582 void unmap_peripheral(struct bcm2835_peripheral* p);
hudakz 0:91392e1f8551 583 public:
hudakz 0:91392e1f8551 584 Peripheral(void);
hudakz 0:91392e1f8551 585 ~Peripheral(void);
hudakz 0:91392e1f8551 586 };
hudakz 0:91392e1f8551 587
hudakz 0:91392e1f8551 588 /* Helper functions */
hudakz 0:91392e1f8551 589 int getBoardRev(void);
hudakz 0:91392e1f8551 590 uint32_t* mapmem(const char* msg, size_t size, int fd, off_t off);
hudakz 0:91392e1f8551 591 void setBoardRev(int rev);
hudakz 0:91392e1f8551 592 pthread_t* getThreadIdFromPin(int pin);
hudakz 0:91392e1f8551 593 void* threadFunction(void* args);
hudakz 0:91392e1f8551 594 uint32_t bcm2835_peri_read(volatile uint32_t* paddr);
hudakz 0:91392e1f8551 595 uint32_t bcm2835_peri_read_nb(volatile uint32_t* paddr);
hudakz 0:91392e1f8551 596 void bcm2835_peri_write(volatile uint32_t* paddr, uint32_t value);
hudakz 0:91392e1f8551 597 void bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value);
hudakz 0:91392e1f8551 598 void bcm2835_peri_set_bits(volatile uint32_t* paddr, uint32_t value, uint32_t mask);
hudakz 0:91392e1f8551 599 void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode);
hudakz 0:91392e1f8551 600
hudakz 0:91392e1f8551 601 #endif // MBEDPI_H