|
|
| (4 intermediate revisions by 3 users not shown) |
| Line 1: |
Line 1: |
| − | [[Category: RaspberryPi]] | + | #REDIRECT [[RPi Low-level peripherals]] |
| − | [[File:GPIOs.gif|thumb|254px|right|the layout of the Rpi GPIO's, not colour coded to the table. [https://sites.google.com/site/burngatehouse/home/drawings/GPIOs.gif Source] ]]
| + | |
| − | The Rpi allows peripherals and expansion boards to access the CPU by exposing the in and outputs. The production board has a 26-pin 2.54mm (100mil)<ref>http://www.raspberrypi.org/forum/features-and-requests/easy-gpio-hardware-software/page-3/#p31907</ref> expansion header, arranged in a 2x13 strip. They provide 8 GPIO pins plus access to I2C, SPI, UART), as well as +3V3, +5V and GND supply lines. Pin one is column 0 on the bottom row. <ref>http://www.raspberrypi.org/archives/384</ref>
| + | |
| − | | + | |
| − | Voltage levels are 3v3. There is no over-voltage protection on the board - the intention is that people interested in serious interfacing will use an external board with buffers, level conversion and analog I/O rather than soldering directly onto the main board.
| + | |
| − | | + | |
| − | | + | |
| − | It is also possible to reconfigure some of the pins to provide a second I2C interface. [no-ref]
| + | |
| − | | + | |
| − | Kernel boot messages go to the UART at 115200bps.
| + | |
| − | | + | |
| − | '''Header Pinout:'''
| + | |
| − | {| border="1" style="text-align:center;"
| + | |
| − | | '''Top Row''' || bgcolor="red" | <span style="color:white">5V0</span> || DNC || bgcolor="black" | <span style="color:white">GND</span> || bgcolor="yellow" | TXD || bgcolor="yellow" | RXD || bgcolor="lime" | GPIO1 || DNC || bgcolor="lime" | GPIO4 || bgcolor="lime" | GPIO5 || DNC || bgcolor="lime" | GPIO6 || bgcolor="purple" | <span style="color:white">SPI_CE0_N</span> || bgcolor="purple" | <span style="color:white">SPI_CE1_N</span>
| + | |
| − | |-
| + | |
| − | | '''Bottom Row''' || bgcolor="orange" | 3V3 || bgcolor="cyan" | SDA0 || bgcolor="cyan" | SCL0 || bgcolor="lime" | GPIO7 || DNC || bgcolor="lime" | GPIO0 || bgcolor="lime" | GPIO2 || bgcolor="lime" | GPIO3 || DNC || bgcolor="purple" | <span style="color:white">SPI_MOSI</span> || bgcolor="purple" | <span style="color:white">SPI_MISO</span> || bgcolor="purple" | <span style="color:white">SPI_SCLK</span> || DNC
| + | |
| − | |}
| + | |
| − | | + | |
| − | | + | |
| − | {| border="1"
| + | |
| − | ! Colour legend
| + | |
| − | |-
| + | |
| − | | bgcolor="red" | <span style="color:white">+5V</span>
| + | |
| − | |-
| + | |
| − | | bgcolor="orange" | +3.3V
| + | |
| − | |-
| + | |
| − | | Do not connect
| + | |
| − | |-
| + | |
| − | | bgcolor="yellow" | UART
| + | |
| − | |-
| + | |
| − | | bgcolor="lime" | GPIO
| + | |
| − | |-
| + | |
| − | | bgcolor="purple" | <span style="color:white">SPI</span>
| + | |
| − | |-
| + | |
| − | | bgcolor="cyan" | I2C
| + | |
| − | |}
| + | |
| − | | + | |
| − | ==Power pins==
| + | |
| − | Maximum permitted current draw from the 3v3 pin is 50mA.
| + | |
| − | | + | |
| − | Maximum permitted current draw from the 5v pin is the USB input current (usually 1A) minus any current draw from the rest of the board.<ref>http://www.raspberrypi.org/forum?mingleforumaction=viewtopic&t=1536#postid-21841</ref>
| + | |
| − | *Model A: 1000mA - 500mA -> max power draw: 500mA
| + | |
| − | *Model B: 1000mA - 700mA -> max power draw: 300mA
| + | |
| − | | + | |
| − | ==General Purpose Input/Output (GPIO)==
| + | |
| − | | + | |
| − | General Purpose Input/Output (a.k.a. GPIO) is a generic pin on a chip whose behavior (including whether it is an input or output pin) can be controlled (programmed) through software. For more information see:[http://en.wikipedia.org/wiki/GPIO the wikipedia article].
| + | |
| − | | + | |
| − | On the production board, all the UART, SPI and I2C pins can be reconfigured as GPIO pins, to provide a total of 17 GPIO pins.<ref>http://www.raspberrypi.org/archives/384</ref>
| + | |
| − | | + | |
| − | | + | |
| − | At least some of the GPIO pins support PWM.<ref>http://twitter.com/#!/Raspberry_Pi/status/140548306886602752</ref>
| + | |
| − | | + | |
| − | Each GPIO can interrupt, high/low/rise/fall/change.<ref>http://www.raspberrypi.org/archives/384#comment-5217</ref>
| + | |
| − | | + | |
| − | It is also possible to reconfigure some of the pins to provide an ARM JTAG interface.<ref>http://www.raspberrypi.org/forum?mingleforumaction=viewtopic&t=1288.1</ref>
| + | |
| − | | + | |
| − | It is also possible to reconfigure some of the pins to provide an I2S or PCM interface.<ref>http://www.raspberrypi.org/forum?mingleforumaction=viewtopic&t=1288.2</ref>
| + | |
| − | | + | |
| − | | + | |
| − | ===Driver support===
| + | |
| − | | + | |
| − | The Foundation will not include a GPIO driver in the initial release, standard linux GPIO drivers should work with minimal modification.<ref>http://www.raspberrypi.org/forum?mingleforumaction=viewtopic&t=1278.0</ref>
| + | |
| − | The Foundation will not include a SPI driver in the initial release, we hope the community might write one.<ref>http://www.raspberrypi.org/forum?mingleforumaction=viewtopic&t=1278.0</ref>
| + | |
| − | The Foundation will not include an I2C driver in the initial release, we hope the community might provide one, standard linux I2C drivers should work with minimal modification.<ref>http://www.raspberrypi.org/forum?mingleforumaction=viewtopic&t=1202</ref>
| + | |
| − | ===Code examples===
| + | |
| − | [http://www.raspberrypi.org/forum/educational-applications/gertboard/page-4/#p31555 Gert van Loo & Dom, has provided] some tested code which accesses the GPIO pins through direct GPIO register manipulation in C-code.
| + | |
| − | (Thanks to Dom for doing the difficult work of finding and testing the mapping.)
| + | |
| − | Example GPIO code:
| + | |
| − | | + | |
| − | <pre>
| + | |
| − | //
| + | |
| − | // How to access GPIO registers from C-code on the Raspberry-Pi
| + | |
| − | // Example program
| + | |
| − | // 15-January-2012
| + | |
| − | // Dom and Gert
| + | |
| − | //
| + | |
| − | | + | |
| − | | + | |
| − | // Access from ARM Running Linux
| + | |
| − | | + | |
| − | #define BCM2708_PERI_BASE 0x20000000
| + | |
| − | #define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */
| + | |
| − | | + | |
| − | | + | |
| − | #include <stdio.h>
| + | |
| − | #include <string.h>
| + | |
| − | #include <stdlib.h>
| + | |
| − | #include <dirent.h>
| + | |
| − | #include <fcntl.h>
| + | |
| − | #include <assert.h>
| + | |
| − | #include <sys/mman.h>
| + | |
| − | #include <sys/types.h>
| + | |
| − | #include <sys/stat.h>
| + | |
| − | | + | |
| − | #include <unistd.h>
| + | |
| − | | + | |
| − | #define PAGE_SIZE (4*1024)
| + | |
| − | #define BLOCK_SIZE (4*1024)
| + | |
| − | | + | |
| − | int mem_fd;
| + | |
| − | char *gpio_mem, *gpio_map;
| + | |
| − | char *spi0_mem, *spi0_map;
| + | |
| − | | + | |
| − | | + | |
| − | // I/O access
| + | |
| − | volatile unsigned *gpio;
| + | |
| − | | + | |
| − | | + | |
| − | // GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y)
| + | |
| − | #define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
| + | |
| − | #define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3))
| + | |
| − | #define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
| + | |
| − | | + | |
| − | #define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0
| + | |
| − | #define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0
| + | |
| − | | + | |
| − | void setup_io();
| + | |
| − | | + | |
| − | int main(int argc, char **argv)
| + | |
| − | { int g,rep;
| + | |
| − | | + | |
| − | // Set up gpi pointer for direct register access
| + | |
| − | setup_io();
| + | |
| − | | + | |
| − | // Switch GPIO 7..11 to output mode
| + | |
| − | | + | |
| − | /************************************************************************\
| + | |
| − | * You are about to change the GPIO settings of your computer. *
| + | |
| − | * Mess this up and it will stop working! *
| + | |
| − | * It might be a good idea to 'sync' before running this program *
| + | |
| − | * so at least you still have your code changes written to the SD-card! *
| + | |
| − | \************************************************************************/
| + | |
| − | | + | |
| − | // Set GPIO pins 7-11 to output
| + | |
| − | for (g=7; g<=11; g++)
| + | |
| − | {
| + | |
| − | INP_GPIO(g); // must use INP_GPIO before we can use OUT_GPIO
| + | |
| − | OUT_GPIO(g);
| + | |
| − | }
| + | |
| − | | + | |
| − | for (rep=0; rep<10; rep++)
| + | |
| − | {
| + | |
| − | for (g=7; g<=11; g++)
| + | |
| − | {
| + | |
| − | GPIO_SET = 1<<g;
| + | |
| − | sleep(1);
| + | |
| − | }
| + | |
| − | for (g=7; g<=11; g++)
| + | |
| − | {
| + | |
| − | GPIO_CLR = 1<<g;
| + | |
| − | sleep(1);
| + | |
| − | }
| + | |
| − | }
| + | |
| − | | + | |
| − | return 0;
| + | |
| − | | + | |
| − | } // main
| + | |
| − | | + | |
| − | | + | |
| − | //
| + | |
| − | // Set up a memory regions to access GPIO
| + | |
| − | //
| + | |
| − | void setup_io()
| + | |
| − | {
| + | |
| − | | + | |
| − | /* open /dev/mem */
| + | |
| − | if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
| + | |
| − | printf("can't open /dev/mem \n");
| + | |
| − | exit (-1);
| + | |
| − | }
| + | |
| − | | + | |
| − | /* mmap GPIO */
| + | |
| − | | + | |
| − | // Allocate MAP block
| + | |
| − | if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) {
| + | |
| − | printf("allocation error \n");
| + | |
| − | exit (-1);
| + | |
| − | }
| + | |
| − | | + | |
| − | // Make sure pointer is on 4K boundary
| + | |
| − | if ((unsigned long)gpio_mem % PAGE_SIZE)
| + | |
| − | gpio_mem += PAGE_SIZE - ((unsigned long)gpio_mem % PAGE_SIZE);
| + | |
| − | | + | |
| − | // Now map it
| + | |
| − | gpio_map = (unsigned char *)mmap(
| + | |
| − | (caddr_t)gpio_mem,
| + | |
| − | BLOCK_SIZE,
| + | |
| − | PROT_READ|PROT_WRITE,
| + | |
| − | MAP_SHARED|MAP_FIXED,
| + | |
| − | mem_fd,
| + | |
| − | GPIO_BASE
| + | |
| − | );
| + | |
| − | | + | |
| − | if ((long)gpio_map < 0) {
| + | |
| − | printf("mmap error %d\n", (int)gpio_map);
| + | |
| − | exit (-1);
| + | |
| − | }
| + | |
| − | | + | |
| − | // Always use volatile pointer!
| + | |
| − | gpio = (volatile unsigned *)gpio_map;
| + | |
| − | | + | |
| − | | + | |
| − | } // setup_io
| + | |
| − | | + | |
| − | </pre>
| + | |
| − | | + | |
| − | ==MIPI CSI-2==
| + | |
| − | | + | |
| − | On the production board, we bring out the MIPI CSI-2 interface to pads for an unpopulated 15-way flat flex connector
| + | |
| − | | + | |
| − | is Sony sub-LVDS same as MIPI CSI-2? Sony IMX020 5Mbip module is available for $5-7 (SE K850i replacement camera).
| + | |
| − | | + | |
| − | Looks like Nokia N95 uses CSI-2 5Mpix camera module with autofocus. ~$15 replacement part.
| + | |
| − | | + | |
| − | ==DSI==
| + | |
| − | | + | |
| − | On the production board, we bring out the DSI interface to pads for an unpopulated 15-way flat flex connector
| + | |
| − | ==CEC==
| + | |
| − | | + | |
| − | HDMI-CEC is supported by hardware but some driver work will be needed and currently isn't exposed into Linux userland.
| + | |
| − | Eben notes that he has seen CEC demos on the Broadcom SoC they are using.
| + | |
| − | | + | |
| − | == References ==
| + | |
| − | <references/>
| + | |