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 .
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
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:
- 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:
- Double click on Blinky.pro to open it for editing and add new libraries by inserting a new line as follows:
- 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.
- Press Ctrl+c to stop running the application.
mbedPi.h@0:91392e1f8551, 2016-10-18 (annotated)
- Committer:
- hudakz
- Date:
- Tue Oct 18 18:18:37 2016 +0000
- Revision:
- 0:91392e1f8551
Initial issue.
Who changed what in which revision?
User | Revision | Line number | New 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 |