Changeset 61e7c69 in rtems


Ignore:
Timestamp:
Jul 27, 2015, 4:01:44 PM (5 years ago)
Author:
Andre Marques <andre.lousa.marques@…>
Branches:
5, master
Children:
b09a578
Parents:
87f8b01
git-author:
Andre Marques <andre.lousa.marques@…> (07/27/15 16:01:44)
git-committer:
Gedare Bloom <gedare@…> (08/06/15 14:53:46)
Message:

Raspberry Pi implementation for the RTEMS GPIO API.

Added support for the new RTEMS GPIO API functions.

Test cases can be found in https://github.com/asuol/RTEMS_rpi_testing/tree/master/GPIO

Location:
c/src/lib/libbsp/arm/raspberrypi
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/arm/raspberrypi/Makefile.am

    r87f8b01 r61e7c69  
    4545include_bsp_HEADERS += include/usart.h
    4646include_bsp_HEADERS += include/raspberrypi.h
     47include_bsp_HEADERS += include/rpi-gpio.h
    4748
    4849include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache_.h \
     
    8788libbsp_a_SOURCES += ../../shared/sbrk.c
    8889libbsp_a_SOURCES += ../../shared/src/stackalloc.c
     90libbsp_a_SOURCES += ../../shared/gpio.c
    8991libbsp_a_SOURCES += ../shared/startup/bsp-start-memcpy.S
    9092libbsp_a_SOURCES += ../shared/arm-cp15-set-ttb-entries.c
     
    117119# Timer
    118120libbsp_a_SOURCES += misc/timer.c
     121
     122# GPIO
     123libbsp_a_SOURCES += gpio/rpi-gpio.c
    119124
    120125# RTC
  • c/src/lib/libbsp/arm/raspberrypi/include/bsp.h

    r87f8b01 r61e7c69  
    3434#define BSP_FEATURE_IRQ_EXTENSION
    3535
     36#define BSP_GPIO_PIN_COUNT 32
     37#define BSP_GPIO_PINS_PER_BANK 32
     38#define BSP_GPIO_PINS_PER_SELECT_BANK 10
     39
    3640#ifdef __cplusplus
    3741}
  • c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h

    r87f8b01 r61e7c69  
    1 
    2 /**
    3  * @file
     1/**
     2 * @file raspberrypi.h
    43 *
    54 * @ingroup raspberrypi_reg
     
    98
    109/*
    11  * Copyright (c) 2013 Alan Cudmore.
     10 *  Copyright (c) 2014 Andre Marques <andre.lousa.marques at gmail.com>
     11 *  Copyright (c) 2013 Alan Cudmore.
    1212 *
    1313 *  The license and distribution terms for this file may be
     
    9494#define BCM2835_GPIO_GPSET0      (BCM2835_GPIO_REGS_BASE+0x1C)
    9595#define BCM2835_GPIO_GPCLR0      (BCM2835_GPIO_REGS_BASE+0x28)
     96#define BCM2835_GPIO_GPLEV0      (BCM2835_GPIO_REGS_BASE+0x34)
     97#define BCM2835_GPIO_GPEDS0      (BCM2835_GPIO_REGS_BASE+0x40)
     98#define BCM2835_GPIO_GPREN0      (BCM2835_GPIO_REGS_BASE+0x4C)
     99#define BCM2835_GPIO_GPFEN0      (BCM2835_GPIO_REGS_BASE+0x58)
     100#define BCM2835_GPIO_GPHEN0      (BCM2835_GPIO_REGS_BASE+0x64)
     101#define BCM2835_GPIO_GPLEN0      (BCM2835_GPIO_REGS_BASE+0x70)
     102#define BCM2835_GPIO_GPAREN0     (BCM2835_GPIO_REGS_BASE+0x7C)
     103#define BCM2835_GPIO_GPAFEN0     (BCM2835_GPIO_REGS_BASE+0x88)
    96104#define BCM2835_GPIO_GPPUD       (BCM2835_GPIO_REGS_BASE+0x94)
    97 #define BCM2835_GPIO_GPPUDCLK0   (BCM2835_GPIO_REGS_BASE+0x98)
     105#define BCM2835_GPIO_GPPUDCLK0   (BCM2835_GPIO_REGS_BASE+0x98) 
    98106
    99107/** @} */
     
    122130/** @} */
    123131
    124 
    125132/**
    126133 * @name UART 0 (PL011) Registers
     
    128135 * @{
    129136 */
    130 
    131137
    132138#define BCM2835_UART0_BASE       (RPI_PERIPHERAL_BASE + 0x201000)
     
    160166#define BCM2835_UART0_ICR_TX    0x20
    161167
    162 
    163 /** @} */
    164 
     168/** @} */
     169
     170/**
     171 * @name I2C (BSC) Registers
     172 *
     173 * @{
     174 */
     175
     176#define BCM2835_I2C_BASE           (0x20804000)
     177
     178#define BCM2835_I2C_C              (BCM2835_I2C_BASE+0x00)
     179#define BCM2835_I2C_S              (BCM2835_I2C_BASE+0x04)
     180#define BCM2835_I2C_DLEN           (BCM2835_I2C_BASE+0x08)
     181#define BCM2835_I2C_A              (BCM2835_I2C_BASE+0x0C)
     182#define BCM2835_I2C_FIFO           (BCM2835_I2C_BASE+0x10)
     183#define BCM2835_I2C_DIV            (BCM2835_I2C_BASE+0x14)
     184#define BCM2835_I2C_DEL            (BCM2835_I2C_BASE+0x18)
     185#define BCM2835_I2C_CLKT           (BCM2835_I2C_BASE+0x1C)
     186
     187/** @} */
     188
     189/**
     190 * @name SPI Registers
     191 *
     192 * @{
     193 */
     194
     195#define BCM2835_SPI_BASE           (0x20204000)
     196
     197#define BCM2835_SPI_CS             (BCM2835_SPI_BASE+0x00)
     198#define BCM2835_SPI_FIFO           (BCM2835_SPI_BASE+0x04)
     199#define BCM2835_SPI_CLK            (BCM2835_SPI_BASE+0x08)
     200#define BCM2835_SPI_DLEN           (BCM2835_SPI_BASE+0x0C)
     201#define BCM2835_SPI_LTOH           (BCM2835_SPI_BASE+0x10)
     202#define BCM2835_SPI_DC             (BCM2835_SPI_BASE+0x14)
     203
     204/** @} */
     205
     206/**
     207 * @name I2C/SPI slave BSC Registers
     208 *
     209 * @{
     210 */
     211
     212#define BCM2835_I2C_SPI_BASE       (0x20214000)
     213
     214#define BCM2835_I2C_SPI_DR         (BCM2835_I2C_SPI_BASE+0x00)
     215#define BCM2835_I2C_SPI_RSR        (BCM2835_I2C_SPI_BASE+0x04)
     216#define BCM2835_I2C_SPI_SLV        (BCM2835_I2C_SPI_BASE+0x08)
     217#define BCM2835_I2C_SPI_CR         (BCM2835_I2C_SPI_BASE+0x0C)
     218#define BCM2835_I2C_SPI_FR         (BCM2835_I2C_SPI_BASE+0x10)
     219#define BCM2835_I2C_SPI_IFLS       (BCM2835_I2C_SPI_BASE+0x14)
     220#define BCM2835_I2C_SPI_IMSC       (BCM2835_I2C_SPI_BASE+0x18)
     221#define BCM2835_I2C_SPI_RIS        (BCM2835_I2C_SPI_BASE+0x1C)
     222#define BCM2835_I2C_SPI_MIS        (BCM2835_I2C_SPI_BASE+0x20)
     223#define BCM2835_I2C_SPI_ICR        (BCM2835_I2C_SPI_BASE+0x24)
     224#define BCM2835_I2C_SPI_DMACR      (BCM2835_I2C_SPI_BASE+0x28)
     225#define BCM2835_I2C_SPI_TDR        (BCM2835_I2C_SPI_BASE+0x2C)
     226#define BCM2835_I2C_SPI_GPUSTAT    (BCM2835_I2C_SPI_BASE+0x30)
     227#define BCM2835_I2C_SPI_HCTRL      (BCM2835_I2C_SPI_BASE+0x34)
     228
     229/** @} */
    165230
    166231/**
     
    185250/** @} */
    186251
    187 
    188252/**
    189253 * @name GPU Timer Registers
     
    209273/** @} */
    210274
    211 
    212275/** @} */
    213276
  • c/src/lib/libbsp/arm/raspberrypi/irq/irq.c

    r87f8b01 r61e7c69  
    11/**
    2  * @file
     2 * @file irq.c
    33 *
    44 * @ingroup raspberrypi_interrupt
     
    88
    99/*
     10 * Copyright (c) 2014 Andre Marques <andre.lousa.marques at gmail.com>
     11 *
    1012 * Copyright (c) 2009
    1113 * embedded brains GmbH
     
    5355
    5456  /* ARM timer */
    55   if (BCM2835_REG(BCM2835_IRQ_BASIC) && 0x1)
     57  if ( BCM2835_REG(BCM2835_IRQ_BASIC) & 0x1 )
    5658  {
    5759      vector = BCM2835_IRQ_ID_TIMER_0;
    58 
    5960  }
    6061  /* UART 0 */
    61   else if ( BCM2835_REG(BCM2835_IRQ_BASIC) && BCM2835_BIT(19))
     62  else if ( BCM2835_REG(BCM2835_IRQ_BASIC) & BCM2835_BIT(19) )
    6263  {
    6364      vector = BCM2835_IRQ_ID_UART;
    6465  }
     66  /* GPIO 0*/
     67  else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(17) )
     68  {
     69      vector = BCM2835_IRQ_ID_GPIO_0;
     70  }
     71  else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(18) )
     72  {
     73      vector = BCM2835_IRQ_ID_GPIO_1;
     74  }
     75  else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(19) )
     76  {
     77      vector = BCM2835_IRQ_ID_GPIO_2;
     78  }
     79  else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(20) )
     80  {
     81      vector = BCM2835_IRQ_ID_GPIO_3;
     82  }
     83  /* I2C */
     84  else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(21) )
     85  {
     86      vector = BCM2835_IRQ_ID_I2C;
     87  }
     88  /* SPI */
     89  else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(22) )
     90  {
     91      vector = BCM2835_IRQ_ID_SPI;
     92  }
    6593
    6694  if ( vector < 255 )
     
    6896      bsp_interrupt_handler_dispatch(vector);
    6997  }
    70 
    7198}
    7299
     
    76103
    77104  rtems_interrupt_disable(level);
    78 
    79    /* ARM Timer */
     105 
     106  /* ARM Timer */
    80107  if ( vector == BCM2835_IRQ_ID_TIMER_0 )
    81108  {
     
    86113  {
    87114      BCM2835_REG(BCM2835_IRQ_ENABLE2) =  BCM2835_BIT(25);
    88 
    89   }
     115  }
     116  /* GPIO 0 */
     117  else if ( vector == BCM2835_IRQ_ID_GPIO_0 )
     118  {
     119      BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(17);
     120  }
     121  /* GPIO 1 */
     122  else if ( vector == BCM2835_IRQ_ID_GPIO_1 )
     123  {
     124      BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(18);
     125  }
     126  /* GPIO 2 */
     127  else if ( vector == BCM2835_IRQ_ID_GPIO_2 )
     128  {
     129      BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(19);
     130  }
     131  /* GPIO 3 */
     132  else if ( vector == BCM2835_IRQ_ID_GPIO_3 )
     133  {
     134      BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(20);
     135  }
     136  /* I2C */
     137  else if ( vector == BCM2835_IRQ_ID_I2C )
     138  {
     139      BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(21);
     140  }
     141  /* SPI */
     142  else if ( vector == BCM2835_IRQ_ID_SPI )
     143  {
     144      BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(22);
     145  }
     146 
    90147  rtems_interrupt_enable(level);
    91148
     
    107164      BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(25);
    108165  }
     166  /* GPIO 0 */
     167  else if ( vector == BCM2835_IRQ_ID_GPIO_0 )
     168  {
     169      BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(17);
     170  }
     171  /* GPIO 1 */
     172  else if ( vector == BCM2835_IRQ_ID_GPIO_1 )
     173  {
     174      BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(18);
     175  }
     176  /* GPIO 2 */
     177  else if ( vector == BCM2835_IRQ_ID_GPIO_2 )
     178  {
     179      BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(19);
     180  }
     181  /* GPIO 3 */
     182  else if ( vector == BCM2835_IRQ_ID_GPIO_3 )
     183  {
     184      BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(20);
     185  }
     186  /* I2C */
     187  else if ( vector == BCM2835_IRQ_ID_I2C )
     188  {
     189      BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(21);
     190  }
     191  /* SPI */
     192  else if ( vector == BCM2835_IRQ_ID_SPI )
     193  {
     194      BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(22);
     195  }
     196
    109197  rtems_interrupt_enable(level);
    110198
    111199  return RTEMS_SUCCESSFUL;
    112200}
    113 
    114201
    115202void bsp_interrupt_handler_default(rtems_vector_number vector)
  • c/src/lib/libbsp/arm/raspberrypi/preinstall.am

    r87f8b01 r61e7c69  
    131131PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/raspberrypi.h
    132132
     133$(PROJECT_INCLUDE)/bsp/rpi-gpio.h: include/rpi-gpio.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
     134        $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/rpi-gpio.h
     135PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/rpi-gpio.h
     136
    133137$(PROJECT_INCLUDE)/libcpu/cache_.h: ../../../libcpu/arm/shared/include/cache_.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
    134138        $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache_.h
Note: See TracChangeset for help on using the changeset viewer.