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.
source/Thread.cpp@1:1f2d9982fa8c, 18 months ago (annotated)
- Committer:
- hudakz
- Date:
- Tue Dec 20 12:08:07 2022 +0000
- Revision:
- 1:1f2d9982fa8c
mbed API for Raspberry Pi boards equipped with BCM2836 SoC.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 1:1f2d9982fa8c | 1 | /* |
hudakz | 1:1f2d9982fa8c | 2 | * Copyright (C) 2016 Zoltan Hudak |
hudakz | 1:1f2d9982fa8c | 3 | * hudakz@outlook.com |
hudakz | 1:1f2d9982fa8c | 4 | * |
hudakz | 1:1f2d9982fa8c | 5 | * Parts Copyright (C) Libelium Comunicaciones Distribuidas S.L. |
hudakz | 1:1f2d9982fa8c | 6 | * http://www.libelium.com |
hudakz | 1:1f2d9982fa8c | 7 | * |
hudakz | 1:1f2d9982fa8c | 8 | * This program is free software: you can redistribute it and/or modify |
hudakz | 1:1f2d9982fa8c | 9 | * it under the terms of the GNU General Public License as published by |
hudakz | 1:1f2d9982fa8c | 10 | * the Free Software Foundation, either version 3 of the License, or |
hudakz | 1:1f2d9982fa8c | 11 | * (at your option) any later version. |
hudakz | 1:1f2d9982fa8c | 12 | * |
hudakz | 1:1f2d9982fa8c | 13 | * This program is distributed in the hope that it will be useful, |
hudakz | 1:1f2d9982fa8c | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
hudakz | 1:1f2d9982fa8c | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
hudakz | 1:1f2d9982fa8c | 16 | * GNU General Public License for more details. |
hudakz | 1:1f2d9982fa8c | 17 | * |
hudakz | 1:1f2d9982fa8c | 18 | * You should have received a copy of the GNU General Public License |
hudakz | 1:1f2d9982fa8c | 19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
hudakz | 1:1f2d9982fa8c | 20 | * |
hudakz | 1:1f2d9982fa8c | 21 | * Version 1.0 |
hudakz | 1:1f2d9982fa8c | 22 | */ |
hudakz | 1:1f2d9982fa8c | 23 | #include "Thread.h" |
hudakz | 1:1f2d9982fa8c | 24 | /*$off*/ |
hudakz | 1:1f2d9982fa8c | 25 | |
hudakz | 1:1f2d9982fa8c | 26 | pthread_t idThread2; |
hudakz | 1:1f2d9982fa8c | 27 | pthread_t idThread3; |
hudakz | 1:1f2d9982fa8c | 28 | pthread_t idThread4; |
hudakz | 1:1f2d9982fa8c | 29 | pthread_t idThread5; |
hudakz | 1:1f2d9982fa8c | 30 | pthread_t idThread6; |
hudakz | 1:1f2d9982fa8c | 31 | pthread_t idThread7; |
hudakz | 1:1f2d9982fa8c | 32 | pthread_t idThread8; |
hudakz | 1:1f2d9982fa8c | 33 | pthread_t idThread9; |
hudakz | 1:1f2d9982fa8c | 34 | pthread_t idThread10; |
hudakz | 1:1f2d9982fa8c | 35 | pthread_t idThread11; |
hudakz | 1:1f2d9982fa8c | 36 | pthread_t idThread12; |
hudakz | 1:1f2d9982fa8c | 37 | pthread_t idThread13; |
hudakz | 1:1f2d9982fa8c | 38 | pthread_t idThread14; |
hudakz | 1:1f2d9982fa8c | 39 | pthread_t idThread15; |
hudakz | 1:1f2d9982fa8c | 40 | pthread_t idThread16; |
hudakz | 1:1f2d9982fa8c | 41 | pthread_t idThread17; |
hudakz | 1:1f2d9982fa8c | 42 | pthread_t idThread18; |
hudakz | 1:1f2d9982fa8c | 43 | pthread_t idThread19; |
hudakz | 1:1f2d9982fa8c | 44 | pthread_t idThread20; |
hudakz | 1:1f2d9982fa8c | 45 | pthread_t idThread21; |
hudakz | 1:1f2d9982fa8c | 46 | pthread_t idThread22; |
hudakz | 1:1f2d9982fa8c | 47 | pthread_t idThread23; |
hudakz | 1:1f2d9982fa8c | 48 | pthread_t idThread24; |
hudakz | 1:1f2d9982fa8c | 49 | pthread_t idThread25; |
hudakz | 1:1f2d9982fa8c | 50 | pthread_t idThread26; |
hudakz | 1:1f2d9982fa8c | 51 | pthread_t idThread27; |
hudakz | 1:1f2d9982fa8c | 52 | |
hudakz | 1:1f2d9982fa8c | 53 | pthread_t* idThreads[26] = |
hudakz | 1:1f2d9982fa8c | 54 | { |
hudakz | 1:1f2d9982fa8c | 55 | &idThread2, |
hudakz | 1:1f2d9982fa8c | 56 | &idThread3, |
hudakz | 1:1f2d9982fa8c | 57 | &idThread4, |
hudakz | 1:1f2d9982fa8c | 58 | &idThread5, |
hudakz | 1:1f2d9982fa8c | 59 | &idThread6, |
hudakz | 1:1f2d9982fa8c | 60 | &idThread7, |
hudakz | 1:1f2d9982fa8c | 61 | &idThread8, |
hudakz | 1:1f2d9982fa8c | 62 | &idThread9, |
hudakz | 1:1f2d9982fa8c | 63 | &idThread10, |
hudakz | 1:1f2d9982fa8c | 64 | &idThread11, |
hudakz | 1:1f2d9982fa8c | 65 | &idThread12, |
hudakz | 1:1f2d9982fa8c | 66 | &idThread13, |
hudakz | 1:1f2d9982fa8c | 67 | &idThread14, |
hudakz | 1:1f2d9982fa8c | 68 | &idThread15, |
hudakz | 1:1f2d9982fa8c | 69 | &idThread16, |
hudakz | 1:1f2d9982fa8c | 70 | &idThread17, |
hudakz | 1:1f2d9982fa8c | 71 | &idThread18, |
hudakz | 1:1f2d9982fa8c | 72 | &idThread19, |
hudakz | 1:1f2d9982fa8c | 73 | &idThread20, |
hudakz | 1:1f2d9982fa8c | 74 | &idThread21, |
hudakz | 1:1f2d9982fa8c | 75 | &idThread22, |
hudakz | 1:1f2d9982fa8c | 76 | &idThread23, |
hudakz | 1:1f2d9982fa8c | 77 | &idThread24, |
hudakz | 1:1f2d9982fa8c | 78 | &idThread25, |
hudakz | 1:1f2d9982fa8c | 79 | &idThread26, |
hudakz | 1:1f2d9982fa8c | 80 | &idThread27 |
hudakz | 1:1f2d9982fa8c | 81 | }; |
hudakz | 1:1f2d9982fa8c | 82 | |
hudakz | 1:1f2d9982fa8c | 83 | /*$on*/ |
hudakz | 1:1f2d9982fa8c | 84 | |
hudakz | 1:1f2d9982fa8c | 85 | /* This is the function that will be running in a thread if |
hudakz | 1:1f2d9982fa8c | 86 | * attachInterrupt() is called */ |
hudakz | 1:1f2d9982fa8c | 87 | void* threadFunction(void* args) |
hudakz | 1:1f2d9982fa8c | 88 | { |
hudakz | 1:1f2d9982fa8c | 89 | ThreadArg* arguments = (ThreadArg*)args; |
hudakz | 1:1f2d9982fa8c | 90 | int pin = arguments->pin; |
hudakz | 1:1f2d9982fa8c | 91 | |
hudakz | 1:1f2d9982fa8c | 92 | int GPIO_FN_MAXLEN = 32; |
hudakz | 1:1f2d9982fa8c | 93 | int RDBUF_LEN = 5; |
hudakz | 1:1f2d9982fa8c | 94 | |
hudakz | 1:1f2d9982fa8c | 95 | char fn[GPIO_FN_MAXLEN]; |
hudakz | 1:1f2d9982fa8c | 96 | int fd, ret; |
hudakz | 1:1f2d9982fa8c | 97 | struct pollfd pfd; |
hudakz | 1:1f2d9982fa8c | 98 | char rdbuf[RDBUF_LEN]; |
hudakz | 1:1f2d9982fa8c | 99 | |
hudakz | 1:1f2d9982fa8c | 100 | memset(rdbuf, 0x00, RDBUF_LEN); |
hudakz | 1:1f2d9982fa8c | 101 | memset(fn, 0x00, GPIO_FN_MAXLEN); |
hudakz | 1:1f2d9982fa8c | 102 | |
hudakz | 1:1f2d9982fa8c | 103 | snprintf(fn, GPIO_FN_MAXLEN - 1, "/sys/class/gpio/gpio%d/value", pin); |
hudakz | 1:1f2d9982fa8c | 104 | fd = open(fn, O_RDONLY); |
hudakz | 1:1f2d9982fa8c | 105 | if (fd < 0) { |
hudakz | 1:1f2d9982fa8c | 106 | perror(fn); |
hudakz | 1:1f2d9982fa8c | 107 | exit(1); |
hudakz | 1:1f2d9982fa8c | 108 | } |
hudakz | 1:1f2d9982fa8c | 109 | |
hudakz | 1:1f2d9982fa8c | 110 | pfd.fd = fd; |
hudakz | 1:1f2d9982fa8c | 111 | pfd.events = POLLPRI; |
hudakz | 1:1f2d9982fa8c | 112 | |
hudakz | 1:1f2d9982fa8c | 113 | ret = unistd::read(fd, rdbuf, RDBUF_LEN - 1); |
hudakz | 1:1f2d9982fa8c | 114 | if (ret < 0) { |
hudakz | 1:1f2d9982fa8c | 115 | perror("Error reading interrupt file\n"); |
hudakz | 1:1f2d9982fa8c | 116 | exit(1); |
hudakz | 1:1f2d9982fa8c | 117 | } |
hudakz | 1:1f2d9982fa8c | 118 | |
hudakz | 1:1f2d9982fa8c | 119 | while (1) { |
hudakz | 1:1f2d9982fa8c | 120 | memset(rdbuf, 0x00, RDBUF_LEN); |
hudakz | 1:1f2d9982fa8c | 121 | unistd::lseek(fd, 0, SEEK_SET); |
hudakz | 1:1f2d9982fa8c | 122 | ret = poll(&pfd, 1, -1); |
hudakz | 1:1f2d9982fa8c | 123 | if (ret < 0) { |
hudakz | 1:1f2d9982fa8c | 124 | perror("Error waiting for interrupt\n"); |
hudakz | 1:1f2d9982fa8c | 125 | unistd::close(fd); |
hudakz | 1:1f2d9982fa8c | 126 | exit(1); |
hudakz | 1:1f2d9982fa8c | 127 | } |
hudakz | 1:1f2d9982fa8c | 128 | |
hudakz | 1:1f2d9982fa8c | 129 | if (ret == 0) { |
hudakz | 1:1f2d9982fa8c | 130 | printf("Timeout\n"); |
hudakz | 1:1f2d9982fa8c | 131 | continue; |
hudakz | 1:1f2d9982fa8c | 132 | } |
hudakz | 1:1f2d9982fa8c | 133 | |
hudakz | 1:1f2d9982fa8c | 134 | ret = unistd::read(fd, rdbuf, RDBUF_LEN - 1); |
hudakz | 1:1f2d9982fa8c | 135 | if (ret < 0) { |
hudakz | 1:1f2d9982fa8c | 136 | perror("Error reading interrupt file\n"); |
hudakz | 1:1f2d9982fa8c | 137 | exit(1); |
hudakz | 1:1f2d9982fa8c | 138 | } |
hudakz | 1:1f2d9982fa8c | 139 | |
hudakz | 1:1f2d9982fa8c | 140 | //Interrupt. We call user function. |
hudakz | 1:1f2d9982fa8c | 141 | arguments->func(); |
hudakz | 1:1f2d9982fa8c | 142 | } |
hudakz | 1:1f2d9982fa8c | 143 | } |
hudakz | 1:1f2d9982fa8c | 144 | |
hudakz | 1:1f2d9982fa8c | 145 | /** |
hudakz | 1:1f2d9982fa8c | 146 | * @brief |
hudakz | 1:1f2d9982fa8c | 147 | * @note |
hudakz | 1:1f2d9982fa8c | 148 | * @param |
hudakz | 1:1f2d9982fa8c | 149 | * @retval |
hudakz | 1:1f2d9982fa8c | 150 | */ |
hudakz | 1:1f2d9982fa8c | 151 | pthread_t* getThreadIdFromPin(int pin) |
hudakz | 1:1f2d9982fa8c | 152 | { |
hudakz | 1:1f2d9982fa8c | 153 | int i = pin - 2; |
hudakz | 1:1f2d9982fa8c | 154 | if ((0 <= i) && (i <= 25)) |
hudakz | 1:1f2d9982fa8c | 155 | return idThreads[i]; |
hudakz | 1:1f2d9982fa8c | 156 | else return NULL; |
hudakz | 1:1f2d9982fa8c | 157 | } |