source: rtems/c/src/lib/libbsp/arm/lpc176x/misc/dma.c @ 7b35a36

4.115
Last change on this file since 7b35a36 was 19260fb, checked in by Martin Boretto <martin.boretto@…>, on 06/09/14 at 14:27:18

bsp/lpc176x: New BSP

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup lpc176x_dma
5 *
6 * @brief Direct memory access (DMA) support.
7 */
8
9/*
10 * Copyright (c) 2008-2011 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Obere Lagerstr. 30
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.com/license/LICENSE.
21 */
22
23#include <rtems/endian.h>
24#include <bsp/dma.h>
25#include <bsp/io.h>
26
27/**
28 * @brief Table that indicates if a channel is currently occupied.
29 */
30static bool lpc176x_dma_channel_occupation[ GPDMA_CH_NUMBER ];
31
32void lpc176x_dma_initialize( void )
33{
34  /* Enable module power */
35  lpc176x_module_enable( LPC176X_MODULE_GPDMA, LPC176X_MODULE_PCLK_DEFAULT );
36
37  /* Disable module */
38  GPDMA_CONFIG = 0u;
39
40  /* Reset registers */
41  GPDMA_SOFT_SREQ = 0u;
42  GPDMA_SOFT_BREQ = 0u;
43  GPDMA_SOFT_LSREQ = 0u;
44  GPDMA_SOFT_LBREQ = 0u;
45  GPDMA_SYNC = 0u;
46  GPDMA_CH0_CFG = 0u;
47  GPDMA_CH1_CFG = 0u;
48
49  /* Enable module */
50#if BYTE_ORDER == LITTLE_ENDIAN
51  GPDMA_CONFIG = GPDMA_CONFIG_EN;
52#else
53  GPDMA_CONFIG = GPDMA_CONFIG_EN | GPDMA_CONFIG_MODE;
54#endif
55}
56
57rtems_status_code lpc176x_dma_channel_obtain( const unsigned channel )
58{
59  rtems_status_code status_code = RTEMS_INVALID_ID;
60
61  if ( channel < GPDMA_CH_NUMBER ) {
62    rtems_interrupt_level level = 0u;
63    bool                  occupation = true;
64
65    rtems_interrupt_disable( level );
66    occupation = lpc176x_dma_channel_occupation[ channel ];
67    lpc176x_dma_channel_occupation[ channel ] = true;
68    rtems_interrupt_enable( level );
69
70    status_code = occupation ? RTEMS_RESOURCE_IN_USE : RTEMS_SUCCESSFUL;
71  }
72
73  /* else implies that the channel is not valid. Also,
74     there is nothing to do. */
75
76  return status_code;
77}
78
79void lpc176x_dma_channel_release( const unsigned channel )
80{
81  if ( channel < GPDMA_CH_NUMBER ) {
82    lpc176x_dma_channel_occupation[ channel ] = false;
83  }
84
85  /* else implies that the channel is not valid. Also,
86     there is nothing to do. */
87}
88
89void lpc176x_dma_channel_disable(
90  const unsigned channel,
91  const bool     force
92)
93{
94  if ( channel < GPDMA_CH_NUMBER ) {
95    volatile lpc176x_dma_channel *ch = GPDMA_CH_BASE_ADDR( channel );
96    uint32_t                      cfg = ch->cfg;
97
98    if ( !force ) {
99      /* Halt */
100      ch->cfg |= GPDMA_CH_CFG_HALT;
101
102      /* Wait for inactive */
103      do {
104        cfg = ch->cfg;
105      } while ( ( cfg & GPDMA_CH_CFG_ACTIVE ) != 0u );
106    }
107
108    /* else implies that the channel is not to be forced. Also,
109       there is nothing to do. */
110
111    /* Disable */
112    ch->cfg &= ~GPDMA_CH_CFG_EN;
113  }
114
115  /* else implies that the channel is not valid. Also,
116     there is nothing to do. */
117}
Note: See TracBrowser for help on using the repository browser.