Semihosted file handles for targets without DEVICE_SEMIHOST or DEVICE_LOCALFILESYSTEM

Dependents:   SemihostingTest

Committer:
devanlai
Date:
Wed Oct 11 23:14:14 2017 +0000
Revision:
0:d5e731da01f0
Initial Semihosting file I/O shim for devices without DEVICE_SEMIHOST and DEVICE_LOCALFILESYSTEM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
devanlai 0:d5e731da01f0 1 /* mbed Microcontroller Library
devanlai 0:d5e731da01f0 2 * Copyright (c) 2006-2013 ARM Limited
devanlai 0:d5e731da01f0 3 *
devanlai 0:d5e731da01f0 4 * Licensed under the Apache License, Version 2.0 (the "License");
devanlai 0:d5e731da01f0 5 * you may not use this file except in compliance with the License.
devanlai 0:d5e731da01f0 6 * You may obtain a copy of the License at
devanlai 0:d5e731da01f0 7 *
devanlai 0:d5e731da01f0 8 * http://www.apache.org/licenses/LICENSE-2.0
devanlai 0:d5e731da01f0 9 *
devanlai 0:d5e731da01f0 10 * Unless required by applicable law or agreed to in writing, software
devanlai 0:d5e731da01f0 11 * distributed under the License is distributed on an "AS IS" BASIS,
devanlai 0:d5e731da01f0 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
devanlai 0:d5e731da01f0 13 * See the License for the specific language governing permissions and
devanlai 0:d5e731da01f0 14 * limitations under the License.
devanlai 0:d5e731da01f0 15 */
devanlai 0:d5e731da01f0 16 #include "cmsis.h"
devanlai 0:d5e731da01f0 17 #include "mbed_semihost_api_shim.h"
devanlai 0:d5e731da01f0 18
devanlai 0:d5e731da01f0 19 #include <stdint.h>
devanlai 0:d5e731da01f0 20 #include <string.h>
devanlai 0:d5e731da01f0 21
devanlai 0:d5e731da01f0 22 // ARM Semihosting Commands
devanlai 0:d5e731da01f0 23 #define SYS_OPEN (0x1)
devanlai 0:d5e731da01f0 24 #define SYS_CLOSE (0x2)
devanlai 0:d5e731da01f0 25 #define SYS_WRITE (0x5)
devanlai 0:d5e731da01f0 26 #define SYS_READ (0x6)
devanlai 0:d5e731da01f0 27 #define SYS_ISTTY (0x9)
devanlai 0:d5e731da01f0 28 #define SYS_SEEK (0xa)
devanlai 0:d5e731da01f0 29 #define SYS_ENSURE (0xb)
devanlai 0:d5e731da01f0 30 #define SYS_FLEN (0xc)
devanlai 0:d5e731da01f0 31 #define SYS_REMOVE (0xe)
devanlai 0:d5e731da01f0 32 #define SYS_RENAME (0xf)
devanlai 0:d5e731da01f0 33 #define SYS_EXIT (0x18)
devanlai 0:d5e731da01f0 34
devanlai 0:d5e731da01f0 35 #if !DEVICE_LOCALFILESYSTEM
devanlai 0:d5e731da01f0 36 FILEHANDLE semihost_open(const char* name, int openmode) {
devanlai 0:d5e731da01f0 37 uint32_t args[3];
devanlai 0:d5e731da01f0 38 args[0] = (uint32_t)name;
devanlai 0:d5e731da01f0 39 args[1] = (uint32_t)openmode;
devanlai 0:d5e731da01f0 40 args[2] = (uint32_t)strlen(name);
devanlai 0:d5e731da01f0 41 return __semihost(SYS_OPEN, args);
devanlai 0:d5e731da01f0 42 }
devanlai 0:d5e731da01f0 43
devanlai 0:d5e731da01f0 44 int semihost_close(FILEHANDLE fh) {
devanlai 0:d5e731da01f0 45 return __semihost(SYS_CLOSE, &fh);
devanlai 0:d5e731da01f0 46 }
devanlai 0:d5e731da01f0 47
devanlai 0:d5e731da01f0 48 int semihost_write(FILEHANDLE fh, const unsigned char* buffer, unsigned int length, int mode) {
devanlai 0:d5e731da01f0 49 if (length == 0) return 0;
devanlai 0:d5e731da01f0 50
devanlai 0:d5e731da01f0 51 uint32_t args[3];
devanlai 0:d5e731da01f0 52 args[0] = (uint32_t)fh;
devanlai 0:d5e731da01f0 53 args[1] = (uint32_t)buffer;
devanlai 0:d5e731da01f0 54 args[2] = (uint32_t)length;
devanlai 0:d5e731da01f0 55 return __semihost(SYS_WRITE, args);
devanlai 0:d5e731da01f0 56 }
devanlai 0:d5e731da01f0 57
devanlai 0:d5e731da01f0 58 int semihost_read(FILEHANDLE fh, unsigned char* buffer, unsigned int length, int mode) {
devanlai 0:d5e731da01f0 59 uint32_t args[3];
devanlai 0:d5e731da01f0 60 args[0] = (uint32_t)fh;
devanlai 0:d5e731da01f0 61 args[1] = (uint32_t)buffer;
devanlai 0:d5e731da01f0 62 args[2] = (uint32_t)length;
devanlai 0:d5e731da01f0 63 return __semihost(SYS_READ, args);
devanlai 0:d5e731da01f0 64 }
devanlai 0:d5e731da01f0 65
devanlai 0:d5e731da01f0 66 int semihost_istty(FILEHANDLE fh) {
devanlai 0:d5e731da01f0 67 return __semihost(SYS_ISTTY, &fh);
devanlai 0:d5e731da01f0 68 }
devanlai 0:d5e731da01f0 69
devanlai 0:d5e731da01f0 70 int semihost_seek(FILEHANDLE fh, long position) {
devanlai 0:d5e731da01f0 71 uint32_t args[2];
devanlai 0:d5e731da01f0 72 args[0] = (uint32_t)fh;
devanlai 0:d5e731da01f0 73 args[1] = (uint32_t)position;
devanlai 0:d5e731da01f0 74 return __semihost(SYS_SEEK, args);
devanlai 0:d5e731da01f0 75 }
devanlai 0:d5e731da01f0 76
devanlai 0:d5e731da01f0 77 int semihost_ensure(FILEHANDLE fh) {
devanlai 0:d5e731da01f0 78 return __semihost(SYS_ENSURE, &fh);
devanlai 0:d5e731da01f0 79 }
devanlai 0:d5e731da01f0 80
devanlai 0:d5e731da01f0 81 long semihost_flen(FILEHANDLE fh) {
devanlai 0:d5e731da01f0 82 return __semihost(SYS_FLEN, &fh);
devanlai 0:d5e731da01f0 83 }
devanlai 0:d5e731da01f0 84
devanlai 0:d5e731da01f0 85 int semihost_remove(const char *name) {
devanlai 0:d5e731da01f0 86 uint32_t args[2];
devanlai 0:d5e731da01f0 87 args[0] = (uint32_t)name;
devanlai 0:d5e731da01f0 88 args[1] = (uint32_t)strlen(name);
devanlai 0:d5e731da01f0 89 return __semihost(SYS_REMOVE, args);
devanlai 0:d5e731da01f0 90 }
devanlai 0:d5e731da01f0 91
devanlai 0:d5e731da01f0 92 int semihost_rename(const char *old_name, const char *new_name) {
devanlai 0:d5e731da01f0 93 uint32_t args[4];
devanlai 0:d5e731da01f0 94 args[0] = (uint32_t)old_name;
devanlai 0:d5e731da01f0 95 args[1] = (uint32_t)strlen(old_name);
devanlai 0:d5e731da01f0 96 args[0] = (uint32_t)new_name;
devanlai 0:d5e731da01f0 97 args[1] = (uint32_t)strlen(new_name);
devanlai 0:d5e731da01f0 98 return __semihost(SYS_RENAME, args);
devanlai 0:d5e731da01f0 99 }
devanlai 0:d5e731da01f0 100
devanlai 0:d5e731da01f0 101 #endif