Mbed SDK for XRange SX1272 LoRa module

Dependents:   XRangePingPong XRange-LoRaWAN-lmic-app lora-transceiver

SX1272 LoRa RF module

https://www.netblocks.eu/xrange-sx1272-lora-datasheet/

Committer:
dudmuck
Date:
Thu Jan 15 02:25:40 2015 +0000
Revision:
336:1e18a06a987b
updated to rev443 of official mbed-src

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 336:1e18a06a987b 1 /* mbed Microcontroller Library
dudmuck 336:1e18a06a987b 2 * Copyright (c) 2006-2013 ARM Limited
dudmuck 336:1e18a06a987b 3 *
dudmuck 336:1e18a06a987b 4 * Licensed under the Apache License, Version 2.0 (the "License");
dudmuck 336:1e18a06a987b 5 * you may not use this file except in compliance with the License.
dudmuck 336:1e18a06a987b 6 * You may obtain a copy of the License at
dudmuck 336:1e18a06a987b 7 *
dudmuck 336:1e18a06a987b 8 * http://www.apache.org/licenses/LICENSE-2.0
dudmuck 336:1e18a06a987b 9 *
dudmuck 336:1e18a06a987b 10 * Unless required by applicable law or agreed to in writing, software
dudmuck 336:1e18a06a987b 11 * distributed under the License is distributed on an "AS IS" BASIS,
dudmuck 336:1e18a06a987b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dudmuck 336:1e18a06a987b 13 * See the License for the specific language governing permissions and
dudmuck 336:1e18a06a987b 14 * limitations under the License.
dudmuck 336:1e18a06a987b 15 */
dudmuck 336:1e18a06a987b 16 #include "LocalFileSystem.h"
dudmuck 336:1e18a06a987b 17
dudmuck 336:1e18a06a987b 18 #if DEVICE_LOCALFILESYSTEM
dudmuck 336:1e18a06a987b 19
dudmuck 336:1e18a06a987b 20 #include "semihost_api.h"
dudmuck 336:1e18a06a987b 21 #include <string.h>
dudmuck 336:1e18a06a987b 22 #include <stdio.h>
dudmuck 336:1e18a06a987b 23
dudmuck 336:1e18a06a987b 24 namespace mbed {
dudmuck 336:1e18a06a987b 25
dudmuck 336:1e18a06a987b 26 /* Extension to FINFO type defined in RTL.h (in Keil RL) - adds 'create time'. */
dudmuck 336:1e18a06a987b 27 typedef struct {
dudmuck 336:1e18a06a987b 28 unsigned char hr; /* Hours [0..23] */
dudmuck 336:1e18a06a987b 29 unsigned char min; /* Minutes [0..59] */
dudmuck 336:1e18a06a987b 30 unsigned char sec; /* Seconds [0..59] */
dudmuck 336:1e18a06a987b 31 unsigned char day; /* Day [1..31] */
dudmuck 336:1e18a06a987b 32 unsigned char mon; /* Month [1..12] */
dudmuck 336:1e18a06a987b 33 unsigned short year; /* Year [1980..2107] */
dudmuck 336:1e18a06a987b 34 } FTIME;
dudmuck 336:1e18a06a987b 35
dudmuck 336:1e18a06a987b 36 typedef struct { /* File Search info record */
dudmuck 336:1e18a06a987b 37 char name[32]; /* File name */
dudmuck 336:1e18a06a987b 38 long size; /* File size in bytes */
dudmuck 336:1e18a06a987b 39 int fileID; /* System File Identification */
dudmuck 336:1e18a06a987b 40 FTIME create_time; /* Date & time file was created */
dudmuck 336:1e18a06a987b 41 FTIME write_time; /* Date & time of last write */
dudmuck 336:1e18a06a987b 42 } XFINFO;
dudmuck 336:1e18a06a987b 43
dudmuck 336:1e18a06a987b 44 #define RESERVED_FOR_USER_APPLICATIONS (0x100) /* 0x100 - 0x1ff */
dudmuck 336:1e18a06a987b 45 #define USR_XFFIND (RESERVED_FOR_USER_APPLICATIONS + 0)
dudmuck 336:1e18a06a987b 46
dudmuck 336:1e18a06a987b 47 static int xffind (const char *pattern, XFINFO *info) {
dudmuck 336:1e18a06a987b 48 unsigned param[4];
dudmuck 336:1e18a06a987b 49
dudmuck 336:1e18a06a987b 50 param[0] = (unsigned long)pattern;
dudmuck 336:1e18a06a987b 51 param[1] = (unsigned long)strlen(pattern);
dudmuck 336:1e18a06a987b 52 param[2] = (unsigned long)info;
dudmuck 336:1e18a06a987b 53 param[3] = (unsigned long)sizeof(XFINFO);
dudmuck 336:1e18a06a987b 54
dudmuck 336:1e18a06a987b 55 return __semihost(USR_XFFIND, param);
dudmuck 336:1e18a06a987b 56 }
dudmuck 336:1e18a06a987b 57
dudmuck 336:1e18a06a987b 58 #define OPEN_R 0
dudmuck 336:1e18a06a987b 59 #define OPEN_B 1
dudmuck 336:1e18a06a987b 60 #define OPEN_PLUS 2
dudmuck 336:1e18a06a987b 61 #define OPEN_W 4
dudmuck 336:1e18a06a987b 62 #define OPEN_A 8
dudmuck 336:1e18a06a987b 63 #define OPEN_INVALID -1
dudmuck 336:1e18a06a987b 64
dudmuck 336:1e18a06a987b 65 int posix_to_semihost_open_flags(int flags) {
dudmuck 336:1e18a06a987b 66 /* POSIX flags -> semihosting open mode */
dudmuck 336:1e18a06a987b 67 int openmode;
dudmuck 336:1e18a06a987b 68 if (flags & O_RDWR) {
dudmuck 336:1e18a06a987b 69 /* a plus mode */
dudmuck 336:1e18a06a987b 70 openmode = OPEN_PLUS;
dudmuck 336:1e18a06a987b 71 if (flags & O_APPEND) {
dudmuck 336:1e18a06a987b 72 openmode |= OPEN_A;
dudmuck 336:1e18a06a987b 73 } else if (flags & O_TRUNC) {
dudmuck 336:1e18a06a987b 74 openmode |= OPEN_W;
dudmuck 336:1e18a06a987b 75 } else {
dudmuck 336:1e18a06a987b 76 openmode |= OPEN_R;
dudmuck 336:1e18a06a987b 77 }
dudmuck 336:1e18a06a987b 78 } else if (flags & O_WRONLY) {
dudmuck 336:1e18a06a987b 79 /* write or append */
dudmuck 336:1e18a06a987b 80 if (flags & O_APPEND) {
dudmuck 336:1e18a06a987b 81 openmode = OPEN_A;
dudmuck 336:1e18a06a987b 82 } else {
dudmuck 336:1e18a06a987b 83 openmode = OPEN_W;
dudmuck 336:1e18a06a987b 84 }
dudmuck 336:1e18a06a987b 85 } else if (flags == O_RDONLY) {
dudmuck 336:1e18a06a987b 86 /* read mode */
dudmuck 336:1e18a06a987b 87 openmode = OPEN_R;
dudmuck 336:1e18a06a987b 88 } else {
dudmuck 336:1e18a06a987b 89 /* invalid flags */
dudmuck 336:1e18a06a987b 90 openmode = OPEN_INVALID;
dudmuck 336:1e18a06a987b 91 }
dudmuck 336:1e18a06a987b 92
dudmuck 336:1e18a06a987b 93 return openmode;
dudmuck 336:1e18a06a987b 94 }
dudmuck 336:1e18a06a987b 95
dudmuck 336:1e18a06a987b 96 FILEHANDLE local_file_open(const char* name, int flags) {
dudmuck 336:1e18a06a987b 97 int openmode = posix_to_semihost_open_flags(flags);
dudmuck 336:1e18a06a987b 98 if (openmode == OPEN_INVALID) {
dudmuck 336:1e18a06a987b 99 return (FILEHANDLE)NULL;
dudmuck 336:1e18a06a987b 100 }
dudmuck 336:1e18a06a987b 101
dudmuck 336:1e18a06a987b 102 FILEHANDLE fh = semihost_open(name, openmode);
dudmuck 336:1e18a06a987b 103 if (fh == -1) {
dudmuck 336:1e18a06a987b 104 return (FILEHANDLE)NULL;
dudmuck 336:1e18a06a987b 105 }
dudmuck 336:1e18a06a987b 106
dudmuck 336:1e18a06a987b 107 return fh;
dudmuck 336:1e18a06a987b 108 }
dudmuck 336:1e18a06a987b 109
dudmuck 336:1e18a06a987b 110 LocalFileHandle::LocalFileHandle(FILEHANDLE fh) : _fh(fh), pos(0) {
dudmuck 336:1e18a06a987b 111 }
dudmuck 336:1e18a06a987b 112
dudmuck 336:1e18a06a987b 113 int LocalFileHandle::close() {
dudmuck 336:1e18a06a987b 114 int retval = semihost_close(_fh);
dudmuck 336:1e18a06a987b 115 delete this;
dudmuck 336:1e18a06a987b 116 return retval;
dudmuck 336:1e18a06a987b 117 }
dudmuck 336:1e18a06a987b 118
dudmuck 336:1e18a06a987b 119 ssize_t LocalFileHandle::write(const void *buffer, size_t length) {
dudmuck 336:1e18a06a987b 120 ssize_t n = semihost_write(_fh, (const unsigned char*)buffer, length, 0); // number of characters not written
dudmuck 336:1e18a06a987b 121 n = length - n; // number of characters written
dudmuck 336:1e18a06a987b 122 pos += n;
dudmuck 336:1e18a06a987b 123 return n;
dudmuck 336:1e18a06a987b 124 }
dudmuck 336:1e18a06a987b 125
dudmuck 336:1e18a06a987b 126 ssize_t LocalFileHandle::read(void *buffer, size_t length) {
dudmuck 336:1e18a06a987b 127 ssize_t n = semihost_read(_fh, (unsigned char*)buffer, length, 0); // number of characters not read
dudmuck 336:1e18a06a987b 128 n = length - n; // number of characters read
dudmuck 336:1e18a06a987b 129 pos += n;
dudmuck 336:1e18a06a987b 130 return n;
dudmuck 336:1e18a06a987b 131 }
dudmuck 336:1e18a06a987b 132
dudmuck 336:1e18a06a987b 133 int LocalFileHandle::isatty() {
dudmuck 336:1e18a06a987b 134 return semihost_istty(_fh);
dudmuck 336:1e18a06a987b 135 }
dudmuck 336:1e18a06a987b 136
dudmuck 336:1e18a06a987b 137 off_t LocalFileHandle::lseek(off_t position, int whence) {
dudmuck 336:1e18a06a987b 138 if (whence == SEEK_CUR) {
dudmuck 336:1e18a06a987b 139 position += pos;
dudmuck 336:1e18a06a987b 140 } else if (whence == SEEK_END) {
dudmuck 336:1e18a06a987b 141 position += semihost_flen(_fh);
dudmuck 336:1e18a06a987b 142 } /* otherwise SEEK_SET, so position is fine */
dudmuck 336:1e18a06a987b 143
dudmuck 336:1e18a06a987b 144 /* Always seems to return -1, so just ignore for now. */
dudmuck 336:1e18a06a987b 145 semihost_seek(_fh, position);
dudmuck 336:1e18a06a987b 146 pos = position;
dudmuck 336:1e18a06a987b 147 return position;
dudmuck 336:1e18a06a987b 148 }
dudmuck 336:1e18a06a987b 149
dudmuck 336:1e18a06a987b 150 int LocalFileHandle::fsync() {
dudmuck 336:1e18a06a987b 151 return semihost_ensure(_fh);
dudmuck 336:1e18a06a987b 152 }
dudmuck 336:1e18a06a987b 153
dudmuck 336:1e18a06a987b 154 off_t LocalFileHandle::flen() {
dudmuck 336:1e18a06a987b 155 return semihost_flen(_fh);
dudmuck 336:1e18a06a987b 156 }
dudmuck 336:1e18a06a987b 157
dudmuck 336:1e18a06a987b 158 class LocalDirHandle : public DirHandle {
dudmuck 336:1e18a06a987b 159
dudmuck 336:1e18a06a987b 160 public:
dudmuck 336:1e18a06a987b 161 struct dirent cur_entry;
dudmuck 336:1e18a06a987b 162 XFINFO info;
dudmuck 336:1e18a06a987b 163
dudmuck 336:1e18a06a987b 164 LocalDirHandle() : cur_entry(), info() {
dudmuck 336:1e18a06a987b 165 }
dudmuck 336:1e18a06a987b 166
dudmuck 336:1e18a06a987b 167 virtual int closedir() {
dudmuck 336:1e18a06a987b 168 delete this;
dudmuck 336:1e18a06a987b 169 return 0;
dudmuck 336:1e18a06a987b 170 }
dudmuck 336:1e18a06a987b 171
dudmuck 336:1e18a06a987b 172 virtual struct dirent *readdir() {
dudmuck 336:1e18a06a987b 173 if (xffind("*", &info)!=0) {
dudmuck 336:1e18a06a987b 174 return NULL;
dudmuck 336:1e18a06a987b 175 }
dudmuck 336:1e18a06a987b 176 memcpy(cur_entry.d_name, info.name, sizeof(info.name));
dudmuck 336:1e18a06a987b 177 return &cur_entry;
dudmuck 336:1e18a06a987b 178 }
dudmuck 336:1e18a06a987b 179
dudmuck 336:1e18a06a987b 180 virtual void rewinddir() {
dudmuck 336:1e18a06a987b 181 info.fileID = 0;
dudmuck 336:1e18a06a987b 182 }
dudmuck 336:1e18a06a987b 183
dudmuck 336:1e18a06a987b 184 virtual off_t telldir() {
dudmuck 336:1e18a06a987b 185 return info.fileID;
dudmuck 336:1e18a06a987b 186 }
dudmuck 336:1e18a06a987b 187
dudmuck 336:1e18a06a987b 188 virtual void seekdir(off_t offset) {
dudmuck 336:1e18a06a987b 189 info.fileID = offset;
dudmuck 336:1e18a06a987b 190 }
dudmuck 336:1e18a06a987b 191 };
dudmuck 336:1e18a06a987b 192
dudmuck 336:1e18a06a987b 193 FileHandle *LocalFileSystem::open(const char* name, int flags) {
dudmuck 336:1e18a06a987b 194 /* reject filenames with / in them */
dudmuck 336:1e18a06a987b 195 for (const char *tmp = name; *tmp; tmp++) {
dudmuck 336:1e18a06a987b 196 if (*tmp == '/') {
dudmuck 336:1e18a06a987b 197 return NULL;
dudmuck 336:1e18a06a987b 198 }
dudmuck 336:1e18a06a987b 199 }
dudmuck 336:1e18a06a987b 200
dudmuck 336:1e18a06a987b 201 int openmode = posix_to_semihost_open_flags(flags);
dudmuck 336:1e18a06a987b 202 if (openmode == OPEN_INVALID) {
dudmuck 336:1e18a06a987b 203 return NULL;
dudmuck 336:1e18a06a987b 204 }
dudmuck 336:1e18a06a987b 205
dudmuck 336:1e18a06a987b 206 FILEHANDLE fh = semihost_open(name, openmode);
dudmuck 336:1e18a06a987b 207 if (fh == -1) {
dudmuck 336:1e18a06a987b 208 return NULL;
dudmuck 336:1e18a06a987b 209 }
dudmuck 336:1e18a06a987b 210 return new LocalFileHandle(fh);
dudmuck 336:1e18a06a987b 211 }
dudmuck 336:1e18a06a987b 212
dudmuck 336:1e18a06a987b 213 int LocalFileSystem::remove(const char *filename) {
dudmuck 336:1e18a06a987b 214 return semihost_remove(filename);
dudmuck 336:1e18a06a987b 215 }
dudmuck 336:1e18a06a987b 216
dudmuck 336:1e18a06a987b 217 DirHandle *LocalFileSystem::opendir(const char *name) {
dudmuck 336:1e18a06a987b 218 return new LocalDirHandle();
dudmuck 336:1e18a06a987b 219 }
dudmuck 336:1e18a06a987b 220
dudmuck 336:1e18a06a987b 221 } // namespace mbed
dudmuck 336:1e18a06a987b 222
dudmuck 336:1e18a06a987b 223 #endif