mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

Full URL: https://github.com/mbedmicro/mbed/commit/d5b4d2ab9c47edb4dc5776e7177b0c2263459081/

Initial version of drivers for SAMR21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 579:53297373a894 1 /* mbed Microcontroller Library
mbed_official 579:53297373a894 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 579:53297373a894 3 *
mbed_official 579:53297373a894 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 579:53297373a894 5 * you may not use this file except in compliance with the License.
mbed_official 579:53297373a894 6 * You may obtain a copy of the License at
mbed_official 579:53297373a894 7 *
mbed_official 579:53297373a894 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 579:53297373a894 9 *
mbed_official 579:53297373a894 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 579:53297373a894 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 579:53297373a894 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 579:53297373a894 13 * See the License for the specific language governing permissions and
mbed_official 579:53297373a894 14 * limitations under the License.
mbed_official 579:53297373a894 15 */
mbed_official 579:53297373a894 16 #include "mbed_assert.h"
mbed_official 579:53297373a894 17 #include "system.h"
mbed_official 579:53297373a894 18
mbed_official 579:53297373a894 19 #include <math.h>
mbed_official 579:53297373a894 20
mbed_official 579:53297373a894 21 #include "cmsis.h"
mbed_official 579:53297373a894 22 #include "pinmap.h"
mbed_official 579:53297373a894 23 #include "sercom.h"
mbed_official 579:53297373a894 24 #include "dma_api.h"
mbed_official 579:53297373a894 25 #include "dma_api_HAL.h"
mbed_official 579:53297373a894 26 #include "sercom_dma.h"
mbed_official 579:53297373a894 27
mbed_official 579:53297373a894 28 static struct sercom_dma sercom_channels[SERCOM_INST_NUM] = {{0}};
mbed_official 579:53297373a894 29
mbed_official 579:53297373a894 30 /** Allocate a channel for TX
mbed_official 579:53297373a894 31 *
mbed_official 579:53297373a894 32 * @param[in] sercom_index index of sercom instance
mbed_official 579:53297373a894 33 * @param[out] tx_id pointer to channel id
mbed_official 579:53297373a894 34 * @return allocated channel id
mbed_official 579:53297373a894 35 */
mbed_official 579:53297373a894 36 uint8_t sercom_setup_tx_channel(uint8_t sercom_index, uint8_t *tx_id)
mbed_official 579:53297373a894 37 {
mbed_official 579:53297373a894 38 if (sercom_channels[sercom_index].tx_status & DMA_ALLOCATED) {
mbed_official 579:53297373a894 39 *tx_id = sercom_channels[sercom_index].tx_channel_id;
mbed_official 579:53297373a894 40 } else {
mbed_official 579:53297373a894 41 /* Try to allocate a channel */
mbed_official 579:53297373a894 42 sercom_channels[sercom_index].tx_channel_id = dma_channel_allocate(DMA_CAP_NONE);
mbed_official 579:53297373a894 43 if (sercom_channels[sercom_index].tx_channel_id != (uint8_t)DMA_ERROR_OUT_OF_CHANNELS) {
mbed_official 579:53297373a894 44 *tx_id = sercom_channels[sercom_index].tx_channel_id;
mbed_official 579:53297373a894 45 sercom_channels[sercom_index].tx_status = DMA_ALLOCATED;
mbed_official 579:53297373a894 46 } else {
mbed_official 579:53297373a894 47 /* Couldn't find a channel */
mbed_official 579:53297373a894 48 return DMA_ERROR_OUT_OF_CHANNELS;
mbed_official 579:53297373a894 49 }
mbed_official 579:53297373a894 50 }
mbed_official 579:53297373a894 51 return *tx_id;
mbed_official 579:53297373a894 52 }
mbed_official 579:53297373a894 53
mbed_official 579:53297373a894 54 /** Allocate a channel for RX
mbed_official 579:53297373a894 55 *
mbed_official 579:53297373a894 56 * @param[in] sercom_index index of sercom instance
mbed_official 579:53297373a894 57 * @param[out] rx_id pointer to channel id
mbed_official 579:53297373a894 58 * @return allocated channel id
mbed_official 579:53297373a894 59 */
mbed_official 579:53297373a894 60 uint8_t sercom_setup_rx_channel(uint8_t sercom_index, uint8_t *rx_id)
mbed_official 579:53297373a894 61 {
mbed_official 579:53297373a894 62 if (sercom_channels[sercom_index].rx_status & DMA_ALLOCATED) {
mbed_official 579:53297373a894 63 *rx_id = sercom_channels[sercom_index].rx_channel_id;
mbed_official 579:53297373a894 64 } else {
mbed_official 579:53297373a894 65 /* Try to allocate a channel */
mbed_official 579:53297373a894 66 sercom_channels[sercom_index].rx_channel_id = dma_channel_allocate(DMA_CAP_NONE);
mbed_official 579:53297373a894 67 if (sercom_channels[sercom_index].rx_channel_id != (uint8_t)DMA_ERROR_OUT_OF_CHANNELS) {
mbed_official 579:53297373a894 68 *rx_id = sercom_channels[sercom_index].rx_channel_id;
mbed_official 579:53297373a894 69 sercom_channels[sercom_index].rx_status = DMA_ALLOCATED;
mbed_official 579:53297373a894 70 } else {
mbed_official 579:53297373a894 71 /* Couldn't find a channel */
mbed_official 579:53297373a894 72 return DMA_ERROR_OUT_OF_CHANNELS;
mbed_official 579:53297373a894 73 }
mbed_official 579:53297373a894 74 }
mbed_official 579:53297373a894 75 return *rx_id;
mbed_official 579:53297373a894 76 }
mbed_official 579:53297373a894 77
mbed_official 579:53297373a894 78 /** Release DMA channels if allocated
mbed_official 579:53297373a894 79 *
mbed_official 579:53297373a894 80 * @param[in] sercom_index index of sercom instance
mbed_official 579:53297373a894 81 * @return void
mbed_official 579:53297373a894 82 */
mbed_official 579:53297373a894 83 void sercom_release_channel(uint8_t sercom_index)
mbed_official 579:53297373a894 84 {
mbed_official 579:53297373a894 85 if (sercom_channels[sercom_index].rx_status & DMA_ALLOCATED) {
mbed_official 579:53297373a894 86 if (0 == dma_channel_free(sercom_channels[sercom_index].rx_channel_id)) {
mbed_official 579:53297373a894 87 sercom_channels[sercom_index].rx_status = DMA_NOT_USED;
mbed_official 579:53297373a894 88 }
mbed_official 579:53297373a894 89 }
mbed_official 579:53297373a894 90 if (sercom_channels[sercom_index].tx_status & DMA_ALLOCATED) {
mbed_official 579:53297373a894 91 if (0 == dma_channel_free(sercom_channels[sercom_index].tx_channel_id)) {
mbed_official 579:53297373a894 92 sercom_channels[sercom_index].tx_status = DMA_NOT_USED;
mbed_official 579:53297373a894 93 }
mbed_official 579:53297373a894 94 }
mbed_official 579:53297373a894 95 }