GGTA team / nRF51822

Fork of nRF51822 by Nordic Semiconductor

Committer:
marcpl
Date:
Sat May 09 17:04:09 2015 +0000
Revision:
162:5fd73fb47b21
Parent:
103:138bdc859cc9
Add a quick and dirty workaround in the nRF51822 library in order to avoid duplicate definition of GPIOTE_IRQHandler.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 103:138bdc859cc9 1 /* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
rgrover1 103:138bdc859cc9 2 *
rgrover1 103:138bdc859cc9 3 * The information contained herein is property of Nordic Semiconductor ASA.
rgrover1 103:138bdc859cc9 4 * Terms and conditions of usage are described in detail in NORDIC
rgrover1 103:138bdc859cc9 5 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
rgrover1 103:138bdc859cc9 6 *
rgrover1 103:138bdc859cc9 7 * Licensees are granted free, non-transferable use of the information. NO
rgrover1 103:138bdc859cc9 8 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
rgrover1 103:138bdc859cc9 9 * the file.
rgrover1 103:138bdc859cc9 10 *
rgrover1 103:138bdc859cc9 11 */
rgrover1 103:138bdc859cc9 12
rgrover1 103:138bdc859cc9 13 #include "hci_mem_pool.h"
rgrover1 103:138bdc859cc9 14 #include "hci_mem_pool_internal.h"
rgrover1 103:138bdc859cc9 15 #include <stdbool.h>
rgrover1 103:138bdc859cc9 16 #include <stdio.h>
rgrover1 103:138bdc859cc9 17
rgrover1 103:138bdc859cc9 18 /**@brief RX buffer element instance structure.
rgrover1 103:138bdc859cc9 19 */
rgrover1 103:138bdc859cc9 20 typedef struct
rgrover1 103:138bdc859cc9 21 {
rgrover1 103:138bdc859cc9 22 uint8_t rx_buffer[RX_BUF_SIZE]; /**< RX buffer memory array. */
rgrover1 103:138bdc859cc9 23 uint32_t length; /**< Length of the RX buffer memory array. */
rgrover1 103:138bdc859cc9 24 } rx_buffer_elem_t;
rgrover1 103:138bdc859cc9 25
rgrover1 103:138bdc859cc9 26 /**@brief RX buffer queue element instance structure.
rgrover1 103:138bdc859cc9 27 */
rgrover1 103:138bdc859cc9 28 typedef struct
rgrover1 103:138bdc859cc9 29 {
rgrover1 103:138bdc859cc9 30 rx_buffer_elem_t * p_buffer; /**< Pointer to RX buffer element. */
rgrover1 103:138bdc859cc9 31 uint32_t free_window_count; /**< Free space element count. */
rgrover1 103:138bdc859cc9 32 uint32_t free_available_count; /**< Free area element count. */
rgrover1 103:138bdc859cc9 33 uint32_t read_available_count; /**< Read area element count. */
rgrover1 103:138bdc859cc9 34 uint32_t write_index; /**< Write position index. */
rgrover1 103:138bdc859cc9 35 uint32_t read_index; /**< Read position index. */
rgrover1 103:138bdc859cc9 36 uint32_t free_index; /**< Free position index. */
rgrover1 103:138bdc859cc9 37 } rx_buffer_queue_t;
rgrover1 103:138bdc859cc9 38
rgrover1 103:138bdc859cc9 39 static bool m_is_tx_allocated; /**< Boolean value to determine if the TX buffer is allocated. */
rgrover1 103:138bdc859cc9 40 static rx_buffer_elem_t m_rx_buffer_elem_queue[RX_BUF_QUEUE_SIZE]; /**< RX buffer element instances. */
rgrover1 103:138bdc859cc9 41 static rx_buffer_queue_t m_rx_buffer_queue; /**< RX buffer queue element instance. */
rgrover1 103:138bdc859cc9 42
rgrover1 103:138bdc859cc9 43
rgrover1 103:138bdc859cc9 44 uint32_t hci_mem_pool_open(void)
rgrover1 103:138bdc859cc9 45 {
rgrover1 103:138bdc859cc9 46 m_is_tx_allocated = false;
rgrover1 103:138bdc859cc9 47 m_rx_buffer_queue.p_buffer = m_rx_buffer_elem_queue;
rgrover1 103:138bdc859cc9 48 m_rx_buffer_queue.free_window_count = RX_BUF_QUEUE_SIZE;
rgrover1 103:138bdc859cc9 49 m_rx_buffer_queue.free_available_count = 0;
rgrover1 103:138bdc859cc9 50 m_rx_buffer_queue.read_available_count = 0;
rgrover1 103:138bdc859cc9 51 m_rx_buffer_queue.write_index = 0;
rgrover1 103:138bdc859cc9 52 m_rx_buffer_queue.read_index = 0;
rgrover1 103:138bdc859cc9 53 m_rx_buffer_queue.free_index = 0;
rgrover1 103:138bdc859cc9 54
rgrover1 103:138bdc859cc9 55 return NRF_SUCCESS;
rgrover1 103:138bdc859cc9 56 }
rgrover1 103:138bdc859cc9 57
rgrover1 103:138bdc859cc9 58
rgrover1 103:138bdc859cc9 59 uint32_t hci_mem_pool_close(void)
rgrover1 103:138bdc859cc9 60 {
rgrover1 103:138bdc859cc9 61 return NRF_SUCCESS;
rgrover1 103:138bdc859cc9 62 }
rgrover1 103:138bdc859cc9 63
rgrover1 103:138bdc859cc9 64
rgrover1 103:138bdc859cc9 65 uint32_t hci_mem_pool_tx_alloc(void ** pp_buffer)
rgrover1 103:138bdc859cc9 66 {
rgrover1 103:138bdc859cc9 67 static uint8_t tx_buffer[TX_BUF_SIZE];
rgrover1 103:138bdc859cc9 68
rgrover1 103:138bdc859cc9 69 uint32_t err_code;
rgrover1 103:138bdc859cc9 70
rgrover1 103:138bdc859cc9 71 if (pp_buffer == NULL)
rgrover1 103:138bdc859cc9 72 {
rgrover1 103:138bdc859cc9 73 return NRF_ERROR_NULL;
rgrover1 103:138bdc859cc9 74 }
rgrover1 103:138bdc859cc9 75
rgrover1 103:138bdc859cc9 76 if (!m_is_tx_allocated)
rgrover1 103:138bdc859cc9 77 {
rgrover1 103:138bdc859cc9 78 m_is_tx_allocated = true;
rgrover1 103:138bdc859cc9 79 *pp_buffer = tx_buffer;
rgrover1 103:138bdc859cc9 80 err_code = NRF_SUCCESS;
rgrover1 103:138bdc859cc9 81 }
rgrover1 103:138bdc859cc9 82 else
rgrover1 103:138bdc859cc9 83 {
rgrover1 103:138bdc859cc9 84 err_code = NRF_ERROR_NO_MEM;
rgrover1 103:138bdc859cc9 85 }
rgrover1 103:138bdc859cc9 86
rgrover1 103:138bdc859cc9 87 return err_code;
rgrover1 103:138bdc859cc9 88 }
rgrover1 103:138bdc859cc9 89
rgrover1 103:138bdc859cc9 90
rgrover1 103:138bdc859cc9 91 uint32_t hci_mem_pool_tx_free(void)
rgrover1 103:138bdc859cc9 92 {
rgrover1 103:138bdc859cc9 93 m_is_tx_allocated = false;
rgrover1 103:138bdc859cc9 94
rgrover1 103:138bdc859cc9 95 return NRF_SUCCESS;
rgrover1 103:138bdc859cc9 96 }
rgrover1 103:138bdc859cc9 97
rgrover1 103:138bdc859cc9 98
rgrover1 103:138bdc859cc9 99 uint32_t hci_mem_pool_rx_produce(uint32_t length, void ** pp_buffer)
rgrover1 103:138bdc859cc9 100 {
rgrover1 103:138bdc859cc9 101 uint32_t err_code;
rgrover1 103:138bdc859cc9 102
rgrover1 103:138bdc859cc9 103 if (pp_buffer == NULL)
rgrover1 103:138bdc859cc9 104 {
rgrover1 103:138bdc859cc9 105 return NRF_ERROR_NULL;
rgrover1 103:138bdc859cc9 106 }
rgrover1 103:138bdc859cc9 107 *pp_buffer = NULL;
rgrover1 103:138bdc859cc9 108
rgrover1 103:138bdc859cc9 109 if (m_rx_buffer_queue.free_window_count != 0)
rgrover1 103:138bdc859cc9 110 {
rgrover1 103:138bdc859cc9 111 if (length <= RX_BUF_SIZE)
rgrover1 103:138bdc859cc9 112 {
rgrover1 103:138bdc859cc9 113 --(m_rx_buffer_queue.free_window_count);
rgrover1 103:138bdc859cc9 114 ++(m_rx_buffer_queue.read_available_count);
rgrover1 103:138bdc859cc9 115
rgrover1 103:138bdc859cc9 116 *pp_buffer =
rgrover1 103:138bdc859cc9 117 m_rx_buffer_queue.p_buffer[m_rx_buffer_queue.write_index].rx_buffer;
rgrover1 103:138bdc859cc9 118
rgrover1 103:138bdc859cc9 119 m_rx_buffer_queue.free_index |= (1u << m_rx_buffer_queue.write_index);
rgrover1 103:138bdc859cc9 120
rgrover1 103:138bdc859cc9 121 // @note: Adjust the write_index making use of the fact that the buffer size is of
rgrover1 103:138bdc859cc9 122 // power of two and two's complement arithmetic. For details refer example to book
rgrover1 103:138bdc859cc9 123 // "Making embedded systems: Elicia White".
rgrover1 103:138bdc859cc9 124 m_rx_buffer_queue.write_index =
rgrover1 103:138bdc859cc9 125 (m_rx_buffer_queue.write_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u);
rgrover1 103:138bdc859cc9 126
rgrover1 103:138bdc859cc9 127 err_code = NRF_SUCCESS;
rgrover1 103:138bdc859cc9 128 }
rgrover1 103:138bdc859cc9 129 else
rgrover1 103:138bdc859cc9 130 {
rgrover1 103:138bdc859cc9 131 err_code = NRF_ERROR_DATA_SIZE;
rgrover1 103:138bdc859cc9 132 }
rgrover1 103:138bdc859cc9 133 }
rgrover1 103:138bdc859cc9 134 else
rgrover1 103:138bdc859cc9 135 {
rgrover1 103:138bdc859cc9 136 err_code = NRF_ERROR_NO_MEM;
rgrover1 103:138bdc859cc9 137 }
rgrover1 103:138bdc859cc9 138
rgrover1 103:138bdc859cc9 139 return err_code;
rgrover1 103:138bdc859cc9 140 }
rgrover1 103:138bdc859cc9 141
rgrover1 103:138bdc859cc9 142
rgrover1 103:138bdc859cc9 143 uint32_t hci_mem_pool_rx_consume(uint8_t * p_buffer)
rgrover1 103:138bdc859cc9 144 {
rgrover1 103:138bdc859cc9 145 uint32_t err_code;
rgrover1 103:138bdc859cc9 146 uint32_t consume_index;
rgrover1 103:138bdc859cc9 147 uint32_t start_index;
rgrover1 103:138bdc859cc9 148
rgrover1 103:138bdc859cc9 149 if (m_rx_buffer_queue.free_available_count != 0)
rgrover1 103:138bdc859cc9 150 {
rgrover1 103:138bdc859cc9 151 // Find the buffer that has been freed -
rgrover1 103:138bdc859cc9 152 // Start at read_index minus free_available_count and then increment until read index.
rgrover1 103:138bdc859cc9 153 err_code = NRF_ERROR_INVALID_ADDR;
rgrover1 103:138bdc859cc9 154 consume_index = (m_rx_buffer_queue.read_index - m_rx_buffer_queue.free_available_count) &
rgrover1 103:138bdc859cc9 155 (RX_BUF_QUEUE_SIZE - 1u);
rgrover1 103:138bdc859cc9 156 start_index = consume_index;
rgrover1 103:138bdc859cc9 157
rgrover1 103:138bdc859cc9 158 do
rgrover1 103:138bdc859cc9 159 {
rgrover1 103:138bdc859cc9 160 if (m_rx_buffer_queue.p_buffer[consume_index].rx_buffer == p_buffer)
rgrover1 103:138bdc859cc9 161 {
rgrover1 103:138bdc859cc9 162 m_rx_buffer_queue.free_index ^= (1u << consume_index);
rgrover1 103:138bdc859cc9 163 err_code = NRF_SUCCESS;
rgrover1 103:138bdc859cc9 164 break;
rgrover1 103:138bdc859cc9 165 }
rgrover1 103:138bdc859cc9 166 else
rgrover1 103:138bdc859cc9 167 {
rgrover1 103:138bdc859cc9 168 consume_index = (consume_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u);
rgrover1 103:138bdc859cc9 169 }
rgrover1 103:138bdc859cc9 170 }
rgrover1 103:138bdc859cc9 171 while (consume_index != m_rx_buffer_queue.read_index);
rgrover1 103:138bdc859cc9 172
rgrover1 103:138bdc859cc9 173 while (!(m_rx_buffer_queue.free_index & (1 << start_index)) &&
rgrover1 103:138bdc859cc9 174 (m_rx_buffer_queue.free_available_count != 0))
rgrover1 103:138bdc859cc9 175 {
rgrover1 103:138bdc859cc9 176 --(m_rx_buffer_queue.free_available_count);
rgrover1 103:138bdc859cc9 177 ++(m_rx_buffer_queue.free_window_count);
rgrover1 103:138bdc859cc9 178 start_index = (consume_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u);
rgrover1 103:138bdc859cc9 179 }
rgrover1 103:138bdc859cc9 180 }
rgrover1 103:138bdc859cc9 181 else
rgrover1 103:138bdc859cc9 182 {
rgrover1 103:138bdc859cc9 183 err_code = NRF_ERROR_NO_MEM;
rgrover1 103:138bdc859cc9 184 }
rgrover1 103:138bdc859cc9 185
rgrover1 103:138bdc859cc9 186 return err_code;
rgrover1 103:138bdc859cc9 187 }
rgrover1 103:138bdc859cc9 188
rgrover1 103:138bdc859cc9 189
rgrover1 103:138bdc859cc9 190 uint32_t hci_mem_pool_rx_data_size_set(uint32_t length)
rgrover1 103:138bdc859cc9 191 {
rgrover1 103:138bdc859cc9 192 // @note: Adjust the write_index making use of the fact that the buffer size is of power
rgrover1 103:138bdc859cc9 193 // of two and two's complement arithmetic. For details refer example to book
rgrover1 103:138bdc859cc9 194 // "Making embedded systems: Elicia White".
rgrover1 103:138bdc859cc9 195 const uint32_t index = (m_rx_buffer_queue.write_index - 1u) & (RX_BUF_QUEUE_SIZE - 1u);
rgrover1 103:138bdc859cc9 196 m_rx_buffer_queue.p_buffer[index].length = length;
rgrover1 103:138bdc859cc9 197
rgrover1 103:138bdc859cc9 198 return NRF_SUCCESS;
rgrover1 103:138bdc859cc9 199 }
rgrover1 103:138bdc859cc9 200
rgrover1 103:138bdc859cc9 201
rgrover1 103:138bdc859cc9 202 uint32_t hci_mem_pool_rx_extract(uint8_t ** pp_buffer, uint32_t * p_length)
rgrover1 103:138bdc859cc9 203 {
rgrover1 103:138bdc859cc9 204 uint32_t err_code;
rgrover1 103:138bdc859cc9 205
rgrover1 103:138bdc859cc9 206 if ((pp_buffer == NULL) || (p_length == NULL))
rgrover1 103:138bdc859cc9 207 {
rgrover1 103:138bdc859cc9 208 return NRF_ERROR_NULL;
rgrover1 103:138bdc859cc9 209 }
rgrover1 103:138bdc859cc9 210
rgrover1 103:138bdc859cc9 211 if (m_rx_buffer_queue.read_available_count != 0)
rgrover1 103:138bdc859cc9 212 {
rgrover1 103:138bdc859cc9 213 --(m_rx_buffer_queue.read_available_count);
rgrover1 103:138bdc859cc9 214 ++(m_rx_buffer_queue.free_available_count);
rgrover1 103:138bdc859cc9 215
rgrover1 103:138bdc859cc9 216 *pp_buffer =
rgrover1 103:138bdc859cc9 217 m_rx_buffer_queue.p_buffer[m_rx_buffer_queue.read_index].rx_buffer;
rgrover1 103:138bdc859cc9 218 *p_length =
rgrover1 103:138bdc859cc9 219 m_rx_buffer_queue.p_buffer[m_rx_buffer_queue.read_index].length;
rgrover1 103:138bdc859cc9 220
rgrover1 103:138bdc859cc9 221 // @note: Adjust the write_index making use of the fact that the buffer size is of power
rgrover1 103:138bdc859cc9 222 // of two and two's complement arithmetic. For details refer example to book
rgrover1 103:138bdc859cc9 223 // "Making embedded systems: Elicia White".
rgrover1 103:138bdc859cc9 224 m_rx_buffer_queue.read_index =
rgrover1 103:138bdc859cc9 225 (m_rx_buffer_queue.read_index + 1u) & (RX_BUF_QUEUE_SIZE - 1u);
rgrover1 103:138bdc859cc9 226
rgrover1 103:138bdc859cc9 227 err_code = NRF_SUCCESS;
rgrover1 103:138bdc859cc9 228 }
rgrover1 103:138bdc859cc9 229 else
rgrover1 103:138bdc859cc9 230 {
rgrover1 103:138bdc859cc9 231 err_code = NRF_ERROR_NO_MEM;
rgrover1 103:138bdc859cc9 232 }
rgrover1 103:138bdc859cc9 233
rgrover1 103:138bdc859cc9 234 return err_code;
rgrover1 103:138bdc859cc9 235 }