takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /* Copyright (c) 2017 ARM Limited
kadonotakashi 0:8fdf9a60065b 2 *
kadonotakashi 0:8fdf9a60065b 3 * Licensed under the Apache License, Version 2.0 (the "License");
kadonotakashi 0:8fdf9a60065b 4 * you may not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 5 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 6 *
kadonotakashi 0:8fdf9a60065b 7 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 8 *
kadonotakashi 0:8fdf9a60065b 9 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 10 * distributed under the License is distributed on an "AS IS" BASIS,
kadonotakashi 0:8fdf9a60065b 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 12 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 13 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 14 */
kadonotakashi 0:8fdf9a60065b 15
kadonotakashi 0:8fdf9a60065b 16 #include "pbuf.h"
kadonotakashi 0:8fdf9a60065b 17 #include "LWIPMemoryManager.h"
kadonotakashi 0:8fdf9a60065b 18
kadonotakashi 0:8fdf9a60065b 19 emac_mem_buf_t *LWIPMemoryManager::alloc_heap(uint32_t size, uint32_t align)
kadonotakashi 0:8fdf9a60065b 20 {
kadonotakashi 0:8fdf9a60065b 21 struct pbuf *pbuf = pbuf_alloc(PBUF_RAW, size + align, PBUF_RAM);
kadonotakashi 0:8fdf9a60065b 22 if (pbuf == NULL) {
kadonotakashi 0:8fdf9a60065b 23 return NULL;
kadonotakashi 0:8fdf9a60065b 24 }
kadonotakashi 0:8fdf9a60065b 25
kadonotakashi 0:8fdf9a60065b 26 align_memory(pbuf, align);
kadonotakashi 0:8fdf9a60065b 27
kadonotakashi 0:8fdf9a60065b 28 return static_cast<emac_mem_buf_t *>(pbuf);
kadonotakashi 0:8fdf9a60065b 29 }
kadonotakashi 0:8fdf9a60065b 30
kadonotakashi 0:8fdf9a60065b 31 emac_mem_buf_t *LWIPMemoryManager::alloc_pool(uint32_t size, uint32_t align)
kadonotakashi 0:8fdf9a60065b 32 {
kadonotakashi 0:8fdf9a60065b 33 uint32_t total_align = count_total_align(size, align);
kadonotakashi 0:8fdf9a60065b 34
kadonotakashi 0:8fdf9a60065b 35 struct pbuf *pbuf = pbuf_alloc(PBUF_RAW, size + total_align, PBUF_POOL);
kadonotakashi 0:8fdf9a60065b 36 if (pbuf == NULL) {
kadonotakashi 0:8fdf9a60065b 37 return NULL;
kadonotakashi 0:8fdf9a60065b 38 }
kadonotakashi 0:8fdf9a60065b 39
kadonotakashi 0:8fdf9a60065b 40 align_memory(pbuf, align);
kadonotakashi 0:8fdf9a60065b 41
kadonotakashi 0:8fdf9a60065b 42 return static_cast<emac_mem_buf_t *>(pbuf);
kadonotakashi 0:8fdf9a60065b 43 }
kadonotakashi 0:8fdf9a60065b 44
kadonotakashi 0:8fdf9a60065b 45 uint32_t LWIPMemoryManager::get_pool_alloc_unit(uint32_t align) const
kadonotakashi 0:8fdf9a60065b 46 {
kadonotakashi 0:8fdf9a60065b 47 uint32_t alloc_unit = LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) - align;
kadonotakashi 0:8fdf9a60065b 48 return alloc_unit;
kadonotakashi 0:8fdf9a60065b 49 }
kadonotakashi 0:8fdf9a60065b 50
kadonotakashi 0:8fdf9a60065b 51 void LWIPMemoryManager::free(emac_mem_buf_t *buf)
kadonotakashi 0:8fdf9a60065b 52 {
kadonotakashi 0:8fdf9a60065b 53 pbuf_free(static_cast<struct pbuf *>(buf));
kadonotakashi 0:8fdf9a60065b 54 }
kadonotakashi 0:8fdf9a60065b 55
kadonotakashi 0:8fdf9a60065b 56 uint32_t LWIPMemoryManager::get_total_len(const emac_mem_buf_t *buf) const
kadonotakashi 0:8fdf9a60065b 57 {
kadonotakashi 0:8fdf9a60065b 58 return (static_cast<const struct pbuf *>(buf))->tot_len;
kadonotakashi 0:8fdf9a60065b 59 }
kadonotakashi 0:8fdf9a60065b 60
kadonotakashi 0:8fdf9a60065b 61 void LWIPMemoryManager::copy(emac_mem_buf_t *to_buf, const emac_mem_buf_t *from_buf)
kadonotakashi 0:8fdf9a60065b 62 {
kadonotakashi 0:8fdf9a60065b 63 pbuf_copy(static_cast<struct pbuf *>(to_buf), static_cast<const struct pbuf *>(from_buf));
kadonotakashi 0:8fdf9a60065b 64 }
kadonotakashi 0:8fdf9a60065b 65
kadonotakashi 0:8fdf9a60065b 66 void LWIPMemoryManager::copy_to_buf(emac_mem_buf_t *to_buf, const void *ptr, uint32_t len)
kadonotakashi 0:8fdf9a60065b 67 {
kadonotakashi 0:8fdf9a60065b 68 pbuf_take(static_cast<struct pbuf *>(to_buf), ptr, len);
kadonotakashi 0:8fdf9a60065b 69 }
kadonotakashi 0:8fdf9a60065b 70
kadonotakashi 0:8fdf9a60065b 71 uint32_t LWIPMemoryManager::copy_from_buf(void *ptr, uint32_t len, const emac_mem_buf_t *from_buf) const
kadonotakashi 0:8fdf9a60065b 72 {
kadonotakashi 0:8fdf9a60065b 73 return pbuf_copy_partial(static_cast<const struct pbuf *>(from_buf), ptr, len, 0);
kadonotakashi 0:8fdf9a60065b 74 }
kadonotakashi 0:8fdf9a60065b 75
kadonotakashi 0:8fdf9a60065b 76 void LWIPMemoryManager::cat(emac_mem_buf_t *to_buf, emac_mem_buf_t *cat_buf)
kadonotakashi 0:8fdf9a60065b 77 {
kadonotakashi 0:8fdf9a60065b 78 pbuf_cat(static_cast<struct pbuf *>(to_buf), static_cast<struct pbuf *>(cat_buf));
kadonotakashi 0:8fdf9a60065b 79 }
kadonotakashi 0:8fdf9a60065b 80
kadonotakashi 0:8fdf9a60065b 81 emac_mem_buf_t *LWIPMemoryManager::get_next(const emac_mem_buf_t *buf) const
kadonotakashi 0:8fdf9a60065b 82 {
kadonotakashi 0:8fdf9a60065b 83 if (!buf) {
kadonotakashi 0:8fdf9a60065b 84 return NULL;
kadonotakashi 0:8fdf9a60065b 85 }
kadonotakashi 0:8fdf9a60065b 86 struct pbuf *next = (static_cast<const struct pbuf *>(buf))->next;
kadonotakashi 0:8fdf9a60065b 87 return static_cast<emac_mem_buf_t *>(next);
kadonotakashi 0:8fdf9a60065b 88 }
kadonotakashi 0:8fdf9a60065b 89
kadonotakashi 0:8fdf9a60065b 90 void *LWIPMemoryManager::get_ptr(const emac_mem_buf_t *buf) const
kadonotakashi 0:8fdf9a60065b 91 {
kadonotakashi 0:8fdf9a60065b 92 return (static_cast<const struct pbuf *>(buf))->payload;
kadonotakashi 0:8fdf9a60065b 93 }
kadonotakashi 0:8fdf9a60065b 94
kadonotakashi 0:8fdf9a60065b 95 uint32_t LWIPMemoryManager::get_len(const emac_mem_buf_t *buf) const
kadonotakashi 0:8fdf9a60065b 96 {
kadonotakashi 0:8fdf9a60065b 97 return (static_cast<const struct pbuf *>(buf))->len;
kadonotakashi 0:8fdf9a60065b 98 }
kadonotakashi 0:8fdf9a60065b 99
kadonotakashi 0:8fdf9a60065b 100 void LWIPMemoryManager::set_len(emac_mem_buf_t *buf, uint32_t len)
kadonotakashi 0:8fdf9a60065b 101 {
kadonotakashi 0:8fdf9a60065b 102 struct pbuf *pbuf = static_cast<struct pbuf *>(buf);
kadonotakashi 0:8fdf9a60065b 103 pbuf->len = len;
kadonotakashi 0:8fdf9a60065b 104 set_total_len(pbuf);
kadonotakashi 0:8fdf9a60065b 105 }
kadonotakashi 0:8fdf9a60065b 106
kadonotakashi 0:8fdf9a60065b 107 uint32_t LWIPMemoryManager::count_total_align(uint32_t size, uint32_t align)
kadonotakashi 0:8fdf9a60065b 108 {
kadonotakashi 0:8fdf9a60065b 109 uint32_t buffers = size / get_pool_alloc_unit(align);
kadonotakashi 0:8fdf9a60065b 110 if (size % get_pool_alloc_unit(align) != 0) {
kadonotakashi 0:8fdf9a60065b 111 buffers++;
kadonotakashi 0:8fdf9a60065b 112 }
kadonotakashi 0:8fdf9a60065b 113 return buffers * align;
kadonotakashi 0:8fdf9a60065b 114 }
kadonotakashi 0:8fdf9a60065b 115
kadonotakashi 0:8fdf9a60065b 116 void LWIPMemoryManager::align_memory(struct pbuf *pbuf, uint32_t align)
kadonotakashi 0:8fdf9a60065b 117 {
kadonotakashi 0:8fdf9a60065b 118 if (!align) {
kadonotakashi 0:8fdf9a60065b 119 return;
kadonotakashi 0:8fdf9a60065b 120 }
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 struct pbuf *pbuf_start = pbuf;
kadonotakashi 0:8fdf9a60065b 123
kadonotakashi 0:8fdf9a60065b 124 while (pbuf) {
kadonotakashi 0:8fdf9a60065b 125 uint32_t remainder = reinterpret_cast<uint32_t>(pbuf->payload) % align;
kadonotakashi 0:8fdf9a60065b 126 if (remainder) {
kadonotakashi 0:8fdf9a60065b 127 uint32_t offset = align - remainder;
kadonotakashi 0:8fdf9a60065b 128 if (offset >= align) {
kadonotakashi 0:8fdf9a60065b 129 offset = align;
kadonotakashi 0:8fdf9a60065b 130 }
kadonotakashi 0:8fdf9a60065b 131 pbuf->payload = static_cast<char *>(pbuf->payload) + offset;
kadonotakashi 0:8fdf9a60065b 132 }
kadonotakashi 0:8fdf9a60065b 133 pbuf->len -= align;
kadonotakashi 0:8fdf9a60065b 134 pbuf = pbuf->next;
kadonotakashi 0:8fdf9a60065b 135 }
kadonotakashi 0:8fdf9a60065b 136
kadonotakashi 0:8fdf9a60065b 137 // Correct total lengths
kadonotakashi 0:8fdf9a60065b 138 set_total_len(pbuf_start);
kadonotakashi 0:8fdf9a60065b 139 }
kadonotakashi 0:8fdf9a60065b 140
kadonotakashi 0:8fdf9a60065b 141 void LWIPMemoryManager::set_total_len(struct pbuf *pbuf)
kadonotakashi 0:8fdf9a60065b 142 {
kadonotakashi 0:8fdf9a60065b 143 if (!pbuf->next) {
kadonotakashi 0:8fdf9a60065b 144 pbuf->tot_len = pbuf->len;
kadonotakashi 0:8fdf9a60065b 145 return;
kadonotakashi 0:8fdf9a60065b 146 }
kadonotakashi 0:8fdf9a60065b 147
kadonotakashi 0:8fdf9a60065b 148 uint32_t total_len;
kadonotakashi 0:8fdf9a60065b 149 struct pbuf *pbuf_tailing;
kadonotakashi 0:8fdf9a60065b 150
kadonotakashi 0:8fdf9a60065b 151 while (pbuf) {
kadonotakashi 0:8fdf9a60065b 152 total_len = pbuf->len;
kadonotakashi 0:8fdf9a60065b 153
kadonotakashi 0:8fdf9a60065b 154 pbuf_tailing = pbuf->next;
kadonotakashi 0:8fdf9a60065b 155 while (pbuf_tailing) {
kadonotakashi 0:8fdf9a60065b 156 total_len += pbuf_tailing->len;
kadonotakashi 0:8fdf9a60065b 157 pbuf_tailing = pbuf_tailing->next;
kadonotakashi 0:8fdf9a60065b 158 }
kadonotakashi 0:8fdf9a60065b 159
kadonotakashi 0:8fdf9a60065b 160 pbuf->tot_len = total_len;
kadonotakashi 0:8fdf9a60065b 161 pbuf = pbuf->next;
kadonotakashi 0:8fdf9a60065b 162 }
kadonotakashi 0:8fdf9a60065b 163 }