This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

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