Improve multi (#7136)
[opentx.git] / radio / src / disk_cache.h
blob62c1d4f639654369b07cd76fbabf83ddca11ac8b
1 /*
2 * Copyright (C) OpenTX
4 * Based on code named
5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
21 #ifndef _DISK_CACHE_H_
22 #define _DISK_CACHE_H_
24 #include "diskio.h"
25 #include "sdio_sd.h"
27 // tunable parameters
28 #define DISK_CACHE_BLOCKS_NUM 32 // no cache blocks
29 #define DISK_CACHE_BLOCK_SECTORS 16 // no sectors
31 #define DISK_CACHE_BLOCK_SIZE (DISK_CACHE_BLOCK_SECTORS * BLOCK_SIZE)
33 class DiskCacheBlock
35 public:
36 DiskCacheBlock();
37 bool read(BYTE* buff, DWORD sector, UINT count);
38 DRESULT fill(BYTE drv, BYTE* buff, DWORD sector, UINT count);
39 void free(DWORD sector, UINT count);
40 void free();
41 bool empty() const;
43 private:
44 uint8_t data[DISK_CACHE_BLOCK_SIZE];
45 DWORD startSector;
46 DWORD endSector;
49 struct DiskCacheStats
51 uint32_t noHits;
52 uint32_t noMisses;
53 uint32_t noWrites;
56 class DiskCache
58 public:
59 DiskCache();
60 DRESULT read(BYTE drv, BYTE* buff, DWORD sector, UINT count);
61 DRESULT write(BYTE drv, const BYTE* buff, DWORD sector, UINT count);
62 const DiskCacheStats & getStats() const;
63 int getHitRate() const;
64 void clear();
66 private:
67 DiskCacheStats stats;
68 uint32_t lastBlock;
69 DiskCacheBlock * blocks;
72 extern DiskCache diskCache;
74 #endif // _DISK_CACHE_H_