Simple USBHost library for STM32F746NG Discovery board. Only either the Fastspeed or the Highspeed port can be used( not both together)

Dependents:   DISCO-F746NG_USB_Host

Fork of KL46Z-USBHost by Norimasa Okamoto

Committer:
DieterGraef
Date:
Fri Jun 17 09:00:35 2016 +0000
Revision:
25:7d6d9fc471bf
Parent:
24:5396b6a93262
USB Host now works with both Interfaces even in parallel. Some changes in the USB MSD driver to make it operable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DieterGraef 24:5396b6a93262 1 /* mbed Microcontroller Library
DieterGraef 24:5396b6a93262 2 * Copyright (c) 2006-2012 ARM Limited
DieterGraef 24:5396b6a93262 3 *
DieterGraef 24:5396b6a93262 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
DieterGraef 24:5396b6a93262 5 * of this software and associated documentation files (the "Software"), to deal
DieterGraef 24:5396b6a93262 6 * in the Software without restriction, including without limitation the rights
DieterGraef 24:5396b6a93262 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
DieterGraef 24:5396b6a93262 8 * copies of the Software, and to permit persons to whom the Software is
DieterGraef 24:5396b6a93262 9 * furnished to do so, subject to the following conditions:
DieterGraef 24:5396b6a93262 10 *
DieterGraef 24:5396b6a93262 11 * The above copyright notice and this permission notice shall be included in
DieterGraef 24:5396b6a93262 12 * all copies or substantial portions of the Software.
DieterGraef 24:5396b6a93262 13 *
DieterGraef 24:5396b6a93262 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
DieterGraef 24:5396b6a93262 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
DieterGraef 24:5396b6a93262 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
DieterGraef 24:5396b6a93262 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
DieterGraef 24:5396b6a93262 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
DieterGraef 24:5396b6a93262 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
DieterGraef 24:5396b6a93262 20 * SOFTWARE.
DieterGraef 24:5396b6a93262 21 */
DieterGraef 24:5396b6a93262 22 #include "mbed.h"
DieterGraef 24:5396b6a93262 23
DieterGraef 24:5396b6a93262 24 #include "ffconf.h"
DieterGraef 24:5396b6a93262 25 #include "mbed_debug.h"
DieterGraef 24:5396b6a93262 26
DieterGraef 24:5396b6a93262 27 #include "FATFileSystem.h"
DieterGraef 24:5396b6a93262 28 #include "FATFileHandle.h"
DieterGraef 24:5396b6a93262 29 #include "FATDirHandle.h"
DieterGraef 24:5396b6a93262 30
DieterGraef 24:5396b6a93262 31 DWORD get_fattime(void) {
DieterGraef 24:5396b6a93262 32 time_t rawtime;
DieterGraef 24:5396b6a93262 33 time(&rawtime);
DieterGraef 24:5396b6a93262 34 struct tm *ptm = localtime(&rawtime);
DieterGraef 24:5396b6a93262 35 return (DWORD)(ptm->tm_year - 80) << 25
DieterGraef 24:5396b6a93262 36 | (DWORD)(ptm->tm_mon + 1 ) << 21
DieterGraef 24:5396b6a93262 37 | (DWORD)(ptm->tm_mday ) << 16
DieterGraef 24:5396b6a93262 38 | (DWORD)(ptm->tm_hour ) << 11
DieterGraef 24:5396b6a93262 39 | (DWORD)(ptm->tm_min ) << 5
DieterGraef 24:5396b6a93262 40 | (DWORD)(ptm->tm_sec/2 );
DieterGraef 24:5396b6a93262 41 }
DieterGraef 24:5396b6a93262 42
DieterGraef 24:5396b6a93262 43 FATFileSystem *FATFileSystem::_ffs[_VOLUMES] = {0};
DieterGraef 24:5396b6a93262 44
DieterGraef 24:5396b6a93262 45 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) {
DieterGraef 24:5396b6a93262 46 debug_if(FFS_DBG, "FATFileSystem(%s)\n", n);
DieterGraef 24:5396b6a93262 47 for(int i=0; i<_VOLUMES; i++) {
DieterGraef 24:5396b6a93262 48 if(_ffs[i] == 0) {
DieterGraef 24:5396b6a93262 49 _ffs[i] = this;
DieterGraef 24:5396b6a93262 50 _fsid[0] = '0' + i;
DieterGraef 24:5396b6a93262 51 _fsid[1] = '\0';
DieterGraef 24:5396b6a93262 52 debug_if(FFS_DBG, "Mounting [%s] on ffs drive [%s]\n", _name, _fsid);
DieterGraef 24:5396b6a93262 53 f_mount(&_fs, _fsid, 0);
DieterGraef 24:5396b6a93262 54 return;
DieterGraef 24:5396b6a93262 55 }
DieterGraef 24:5396b6a93262 56 }
DieterGraef 24:5396b6a93262 57 error("Couldn't create %s in FATFileSystem::FATFileSystem\n", n);
DieterGraef 24:5396b6a93262 58 }
DieterGraef 24:5396b6a93262 59
DieterGraef 24:5396b6a93262 60 FATFileSystem::~FATFileSystem() {
DieterGraef 24:5396b6a93262 61 for (int i=0; i<_VOLUMES; i++) {
DieterGraef 24:5396b6a93262 62 if (_ffs[i] == this) {
DieterGraef 24:5396b6a93262 63 _ffs[i] = 0;
DieterGraef 24:5396b6a93262 64 f_mount(NULL, _fsid, 0);
DieterGraef 24:5396b6a93262 65 }
DieterGraef 24:5396b6a93262 66 }
DieterGraef 24:5396b6a93262 67 }
DieterGraef 24:5396b6a93262 68
DieterGraef 24:5396b6a93262 69 FileHandle *FATFileSystem::open(const char* name, int flags) {
DieterGraef 24:5396b6a93262 70 debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", name, _name, _fsid);
DieterGraef 24:5396b6a93262 71 char n[64];
DieterGraef 24:5396b6a93262 72 sprintf(n, "%s:/%s", _fsid, name);
DieterGraef 24:5396b6a93262 73
DieterGraef 24:5396b6a93262 74 /* POSIX flags -> FatFS open mode */
DieterGraef 24:5396b6a93262 75 BYTE openmode;
DieterGraef 24:5396b6a93262 76 if (flags & O_RDWR) {
DieterGraef 24:5396b6a93262 77 openmode = FA_READ|FA_WRITE;
DieterGraef 24:5396b6a93262 78 } else if(flags & O_WRONLY) {
DieterGraef 24:5396b6a93262 79 openmode = FA_WRITE;
DieterGraef 24:5396b6a93262 80 } else {
DieterGraef 24:5396b6a93262 81 openmode = FA_READ;
DieterGraef 24:5396b6a93262 82 }
DieterGraef 24:5396b6a93262 83 if(flags & O_CREAT) {
DieterGraef 24:5396b6a93262 84 if(flags & O_TRUNC) {
DieterGraef 24:5396b6a93262 85 openmode |= FA_CREATE_ALWAYS;
DieterGraef 24:5396b6a93262 86 } else {
DieterGraef 24:5396b6a93262 87 openmode |= FA_OPEN_ALWAYS;
DieterGraef 24:5396b6a93262 88 }
DieterGraef 24:5396b6a93262 89 }
DieterGraef 24:5396b6a93262 90
DieterGraef 24:5396b6a93262 91 FIL fh;
DieterGraef 24:5396b6a93262 92 FRESULT res = f_open(&fh, n, openmode);
DieterGraef 24:5396b6a93262 93 if (res) {
DieterGraef 24:5396b6a93262 94 debug_if(FFS_DBG, "f_open('w') failed: %d\n", res);
DieterGraef 24:5396b6a93262 95 return NULL;
DieterGraef 24:5396b6a93262 96 }
DieterGraef 24:5396b6a93262 97 if (flags & O_APPEND) {
DieterGraef 24:5396b6a93262 98 f_lseek(&fh, fh.fsize);
DieterGraef 24:5396b6a93262 99 }
DieterGraef 24:5396b6a93262 100 return new FATFileHandle(fh);
DieterGraef 24:5396b6a93262 101 }
DieterGraef 24:5396b6a93262 102
DieterGraef 24:5396b6a93262 103 int FATFileSystem::remove(const char *filename) {
DieterGraef 24:5396b6a93262 104 FRESULT res = f_unlink(filename);
DieterGraef 24:5396b6a93262 105 if (res) {
DieterGraef 24:5396b6a93262 106 debug_if(FFS_DBG, "f_unlink() failed: %d\n", res);
DieterGraef 24:5396b6a93262 107 return -1;
DieterGraef 24:5396b6a93262 108 }
DieterGraef 24:5396b6a93262 109 return 0;
DieterGraef 24:5396b6a93262 110 }
DieterGraef 24:5396b6a93262 111
DieterGraef 24:5396b6a93262 112 int FATFileSystem::rename(const char *oldname, const char *newname) {
DieterGraef 24:5396b6a93262 113 FRESULT res = f_rename(oldname, newname);
DieterGraef 24:5396b6a93262 114 if (res) {
DieterGraef 24:5396b6a93262 115 debug_if(FFS_DBG, "f_rename() failed: %d\n", res);
DieterGraef 24:5396b6a93262 116 return -1;
DieterGraef 24:5396b6a93262 117 }
DieterGraef 24:5396b6a93262 118 return 0;
DieterGraef 24:5396b6a93262 119 }
DieterGraef 24:5396b6a93262 120
DieterGraef 24:5396b6a93262 121 int FATFileSystem::format() {
DieterGraef 24:5396b6a93262 122 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
DieterGraef 24:5396b6a93262 123 if (res) {
DieterGraef 24:5396b6a93262 124 debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res);
DieterGraef 24:5396b6a93262 125 return -1;
DieterGraef 24:5396b6a93262 126 }
DieterGraef 24:5396b6a93262 127 return 0;
DieterGraef 24:5396b6a93262 128 }
DieterGraef 24:5396b6a93262 129
DieterGraef 24:5396b6a93262 130 DirHandle *FATFileSystem::opendir(const char *name) {
DieterGraef 24:5396b6a93262 131 FATFS_DIR dir;
DieterGraef 24:5396b6a93262 132 FRESULT res = f_opendir(&dir, name);
DieterGraef 24:5396b6a93262 133 if (res != 0) {
DieterGraef 24:5396b6a93262 134 return NULL;
DieterGraef 24:5396b6a93262 135 }
DieterGraef 24:5396b6a93262 136 return new FATDirHandle(dir);
DieterGraef 24:5396b6a93262 137 }
DieterGraef 24:5396b6a93262 138
DieterGraef 24:5396b6a93262 139 int FATFileSystem::mkdir(const char *name, mode_t mode) {
DieterGraef 24:5396b6a93262 140 FRESULT res = f_mkdir(name);
DieterGraef 24:5396b6a93262 141 return res == 0 ? 0 : -1;
DieterGraef 24:5396b6a93262 142 }
DieterGraef 24:5396b6a93262 143
DieterGraef 24:5396b6a93262 144 int FATFileSystem::mount() {
DieterGraef 24:5396b6a93262 145 FRESULT res = f_mount(&_fs, _fsid, 1);
DieterGraef 24:5396b6a93262 146 return res == 0 ? 0 : -1;
DieterGraef 24:5396b6a93262 147 }
DieterGraef 24:5396b6a93262 148
DieterGraef 24:5396b6a93262 149 int FATFileSystem::unmount() {
DieterGraef 24:5396b6a93262 150 if (disk_sync())
DieterGraef 24:5396b6a93262 151 return -1;
DieterGraef 24:5396b6a93262 152 FRESULT res = f_mount(NULL, _fsid, 0);
DieterGraef 24:5396b6a93262 153 return res == 0 ? 0 : -1;
DieterGraef 24:5396b6a93262 154 }