PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

Dependents:   Sensitive

Fork of PokittoLib by Jonne Valola

Committer:
spinal
Date:
Wed Oct 18 14:47:54 2017 +0000
Revision:
15:0bbe8f6fae32
Parent:
7:72f87b7c7400
direct lcd stuff used by sensitive

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 7:72f87b7c7400 1 /**************************************************************************/
Pokitto 7:72f87b7c7400 2 /*!
Pokitto 7:72f87b7c7400 3 @file Pokitto_disk.cpp
Pokitto 7:72f87b7c7400 4 @author Jonne Valola
Pokitto 7:72f87b7c7400 5
Pokitto 7:72f87b7c7400 6 @section LICENSE
Pokitto 7:72f87b7c7400 7
Pokitto 7:72f87b7c7400 8 Pokitto development stage library
Pokitto 7:72f87b7c7400 9 Software License Agreement
Pokitto 7:72f87b7c7400 10
Pokitto 7:72f87b7c7400 11 Copyright (c) 2015, Jonne Valola ("Author")
Pokitto 7:72f87b7c7400 12 All rights reserved.
Pokitto 7:72f87b7c7400 13
Pokitto 7:72f87b7c7400 14 This library is intended solely for the purpose of Pokitto development.
Pokitto 7:72f87b7c7400 15
Pokitto 7:72f87b7c7400 16 Redistribution and use in source and binary forms, with or without
Pokitto 7:72f87b7c7400 17 modification requires written permission from Author.
Pokitto 7:72f87b7c7400 18 */
Pokitto 7:72f87b7c7400 19 /**************************************************************************/
Pokitto 7:72f87b7c7400 20
Pokitto 7:72f87b7c7400 21 #include "Pokitto.h"
Pokitto 7:72f87b7c7400 22
Pokitto 7:72f87b7c7400 23 #define SD_MOSI_PORT 0
Pokitto 7:72f87b7c7400 24 #define SD_MISO_PORT 0
Pokitto 7:72f87b7c7400 25 #define SD_SCK_PORT 0
Pokitto 7:72f87b7c7400 26 #define SD_CS_PORT 0
Pokitto 7:72f87b7c7400 27 #define SD_MOSI_PIN 9
Pokitto 7:72f87b7c7400 28 #define SD_MISO_PIN 8
Pokitto 7:72f87b7c7400 29 #define SD_SCK_PIN 6
Pokitto 7:72f87b7c7400 30 #define SD_CS_PIN 7
Pokitto 7:72f87b7c7400 31
Pokitto 7:72f87b7c7400 32 #if POK_ENABLE_SD > 0
Pokitto 7:72f87b7c7400 33 BYTE res;
Pokitto 7:72f87b7c7400 34 FATFS fs; /* File system object */
Pokitto 7:72f87b7c7400 35 FATDIR dir; /* Directory object */
Pokitto 7:72f87b7c7400 36 FILINFO fno; /* File information */
Pokitto 7:72f87b7c7400 37
Pokitto 7:72f87b7c7400 38 //static FATFS *FatFs; /* Pointer to the file system object (logical drive) */
Pokitto 7:72f87b7c7400 39
Pokitto 7:72f87b7c7400 40 bool diropened=false;
Pokitto 7:72f87b7c7400 41
Pokitto 7:72f87b7c7400 42 #define SPEAKER 3
Pokitto 7:72f87b7c7400 43 //#define BUFFER_SIZE 256 // was 128
Pokitto 7:72f87b7c7400 44 #define SONGLENGTH 0x1BFBCD // 1072223
Pokitto 7:72f87b7c7400 45 #define FILESIZE 0x1BFBCD
Pokitto 7:72f87b7c7400 46
Pokitto 7:72f87b7c7400 47 uint8_t filemode = FILE_MODE_UNINITIALIZED;
Pokitto 7:72f87b7c7400 48 char currentfile[15]; // holds current file's name
Pokitto 7:72f87b7c7400 49
Pokitto 7:72f87b7c7400 50 SPI device(CONNECT_MOSI,CONNECT_MISO,CONNECT_SCK);
Pokitto 7:72f87b7c7400 51 //DigitalOut mmccs(CONNECT_CS);
Pokitto 7:72f87b7c7400 52
Pokitto 7:72f87b7c7400 53 const char *get_filename_ext(const char *filename) {
Pokitto 7:72f87b7c7400 54 const char *dot = strrchr(filename, '.');
Pokitto 7:72f87b7c7400 55 if(!dot || dot == filename) return "";
Pokitto 7:72f87b7c7400 56 return dot + 1;
Pokitto 7:72f87b7c7400 57 }
Pokitto 7:72f87b7c7400 58
Pokitto 7:72f87b7c7400 59 __attribute__((section(".SD_Code"))) void initSDGPIO() {
Pokitto 7:72f87b7c7400 60 LPC_GPIO_PORT->DIR[SD_MOSI_PORT] |= (1 << SD_MOSI_PIN );
Pokitto 7:72f87b7c7400 61 LPC_GPIO_PORT->DIR[SD_MISO_PORT] |= (1 << SD_MISO_PIN );
Pokitto 7:72f87b7c7400 62 LPC_GPIO_PORT->DIR[SD_SCK_PORT] |= (1 << SD_SCK_PIN );
Pokitto 7:72f87b7c7400 63 LPC_GPIO_PORT->DIR[SD_CS_PORT] |= (1 << SD_CS_PIN );
Pokitto 7:72f87b7c7400 64 }
Pokitto 7:72f87b7c7400 65
Pokitto 7:72f87b7c7400 66 __attribute__((section(".SD_Code"))) int pokInitSD() {
Pokitto 7:72f87b7c7400 67 initSDGPIO();
Pokitto 7:72f87b7c7400 68 res = disk_initialize();
Pokitto 7:72f87b7c7400 69 res = (pf_mount(&fs));
Pokitto 7:72f87b7c7400 70 res = pf_opendir(&dir,"");
Pokitto 7:72f87b7c7400 71 if (res) diropened=false;
Pokitto 7:72f87b7c7400 72 else diropened=true;
Pokitto 7:72f87b7c7400 73 return res;
Pokitto 7:72f87b7c7400 74 }
Pokitto 7:72f87b7c7400 75
Pokitto 7:72f87b7c7400 76
Pokitto 7:72f87b7c7400 77 /** PUBLIC FUNCTIONS **/
Pokitto 7:72f87b7c7400 78
Pokitto 7:72f87b7c7400 79 char* getFirstDirEntry() {
Pokitto 7:72f87b7c7400 80 res=0;
Pokitto 7:72f87b7c7400 81 if (!diropened) {
Pokitto 7:72f87b7c7400 82 pokInitSD();
Pokitto 7:72f87b7c7400 83 }
Pokitto 7:72f87b7c7400 84 res = pf_opendir(&dir,"");
Pokitto 7:72f87b7c7400 85 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 7:72f87b7c7400 86 if (res) return 0;
Pokitto 7:72f87b7c7400 87 while (res==0) { //while res is ok
Pokitto 7:72f87b7c7400 88 if ((fno.fattrib & 0x02)==0) {
Pokitto 7:72f87b7c7400 89 if (fno.fattrib & 0x10) {
Pokitto 7:72f87b7c7400 90 fno.fname[8]='.';
Pokitto 7:72f87b7c7400 91 fno.fname[9]='D';
Pokitto 7:72f87b7c7400 92 fno.fname[10]='I';
Pokitto 7:72f87b7c7400 93 fno.fname[11]='R';
Pokitto 7:72f87b7c7400 94 fno.fname[12]='\0';
Pokitto 7:72f87b7c7400 95 }
Pokitto 7:72f87b7c7400 96 return fno.fname;
Pokitto 7:72f87b7c7400 97 }
Pokitto 7:72f87b7c7400 98 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 7:72f87b7c7400 99 if (res==0 && dir.index==0) break;
Pokitto 7:72f87b7c7400 100 }
Pokitto 7:72f87b7c7400 101 return 0;
Pokitto 7:72f87b7c7400 102 }
Pokitto 7:72f87b7c7400 103
Pokitto 7:72f87b7c7400 104 char* getNextDirEntry() {
Pokitto 7:72f87b7c7400 105 if (!diropened) pokInitSD();
Pokitto 7:72f87b7c7400 106 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 7:72f87b7c7400 107 if (res==0) {
Pokitto 7:72f87b7c7400 108 while (fno.fattrib & 0x02 && !res) res = pf_readdir(&dir,&fno); //system/hidden file
Pokitto 7:72f87b7c7400 109 if (fno.fattrib & 0x10) {
Pokitto 7:72f87b7c7400 110 int a=12;
Pokitto 7:72f87b7c7400 111 while (a) {
Pokitto 7:72f87b7c7400 112 fno.fname[a] = fno.fname[a-1];
Pokitto 7:72f87b7c7400 113 a--;
Pokitto 7:72f87b7c7400 114 }
Pokitto 7:72f87b7c7400 115 if (fno.fname[0]) {
Pokitto 7:72f87b7c7400 116 fno.fname[0]='/';
Pokitto 7:72f87b7c7400 117 a=0;
Pokitto 7:72f87b7c7400 118 while (fno.fname[a]) a++;
Pokitto 7:72f87b7c7400 119 fno.fname[a]='/';
Pokitto 7:72f87b7c7400 120 }
Pokitto 7:72f87b7c7400 121
Pokitto 7:72f87b7c7400 122 /*fno.fname[a++]='.';
Pokitto 7:72f87b7c7400 123 fno.fname[a++]='D';
Pokitto 7:72f87b7c7400 124 fno.fname[a++]='I';
Pokitto 7:72f87b7c7400 125 fno.fname[a++]='R';
Pokitto 7:72f87b7c7400 126 fno.fname[a]='\0';*/
Pokitto 7:72f87b7c7400 127 }
Pokitto 7:72f87b7c7400 128 return fno.fname;
Pokitto 7:72f87b7c7400 129 }
Pokitto 7:72f87b7c7400 130 return NULL;
Pokitto 7:72f87b7c7400 131 }
Pokitto 7:72f87b7c7400 132
Pokitto 7:72f87b7c7400 133 char* getNextFile (char* ext){
Pokitto 7:72f87b7c7400 134
Pokitto 7:72f87b7c7400 135 if (!diropened) pokInitSD();
Pokitto 7:72f87b7c7400 136 int a=1;
Pokitto 7:72f87b7c7400 137 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 7:72f87b7c7400 138 while (res==0 || a) { //while there are entries and
Pokitto 7:72f87b7c7400 139 if (dir.index==0) return 0; //end of list
Pokitto 7:72f87b7c7400 140 a = strcmp((const char*)get_filename_ext(fno.fname),(const char*)ext); // returns 0 if strings are identical
Pokitto 7:72f87b7c7400 141 if (strcmp(ext,"")==0 && (fno.fattrib & 0x10) == 0) a=0;
Pokitto 7:72f87b7c7400 142 if (a == 0 && (fno.fattrib & 0x10) == 0) return fno.fname;
Pokitto 7:72f87b7c7400 143 if (fno.fattrib&0x10) return NULL; //its a directory
Pokitto 7:72f87b7c7400 144 }
Pokitto 7:72f87b7c7400 145 return 0;
Pokitto 7:72f87b7c7400 146 }
Pokitto 7:72f87b7c7400 147
Pokitto 7:72f87b7c7400 148
Pokitto 7:72f87b7c7400 149 char* getNextFile() {
Pokitto 7:72f87b7c7400 150 return getNextFile("");
Pokitto 7:72f87b7c7400 151 }
Pokitto 7:72f87b7c7400 152
Pokitto 7:72f87b7c7400 153 char* getFirstFile(char* ext) {
Pokitto 7:72f87b7c7400 154 res=0;
Pokitto 7:72f87b7c7400 155 if (!diropened) {
Pokitto 7:72f87b7c7400 156 pokInitSD();
Pokitto 7:72f87b7c7400 157 }
Pokitto 7:72f87b7c7400 158 res = pf_opendir(&dir,"");
Pokitto 7:72f87b7c7400 159 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 7:72f87b7c7400 160 if (res) return 0;
Pokitto 7:72f87b7c7400 161 while (res==0 || (fno.fattrib & 0x10) == 0) {
Pokitto 7:72f87b7c7400 162 int a=0;
Pokitto 7:72f87b7c7400 163 a = strcmp((const char*)get_filename_ext(fno.fname),(const char*)ext); // returns 0 if strings are identical
Pokitto 7:72f87b7c7400 164 if (!strcmp(ext,"")) a=0;
Pokitto 7:72f87b7c7400 165 if ( a == 0 && (fno.fattrib & 0x10) == 0) return fno.fname;
Pokitto 7:72f87b7c7400 166 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 7:72f87b7c7400 167 if (res==0 && dir.index==0) break;
Pokitto 7:72f87b7c7400 168 }
Pokitto 7:72f87b7c7400 169 return 0;
Pokitto 7:72f87b7c7400 170 }
Pokitto 7:72f87b7c7400 171
Pokitto 7:72f87b7c7400 172 char* getFirstFile() {
Pokitto 7:72f87b7c7400 173 return getFirstFile("");
Pokitto 7:72f87b7c7400 174 }
Pokitto 7:72f87b7c7400 175
Pokitto 7:72f87b7c7400 176 int isThisFileOpen(char* buffer){
Pokitto 7:72f87b7c7400 177 int a=0;
Pokitto 7:72f87b7c7400 178 a = strcmp((const char*)buffer,(const char*)currentfile); // returns 0 if strings are identical
Pokitto 7:72f87b7c7400 179 if ( a == 0 && filemode != FILE_MODE_FAILED) return 1;
Pokitto 7:72f87b7c7400 180 return 0;
Pokitto 7:72f87b7c7400 181 }
Pokitto 7:72f87b7c7400 182
Pokitto 7:72f87b7c7400 183 int fileOK() {
Pokitto 7:72f87b7c7400 184 if (filemode != FILE_MODE_FAILED) return 1;
Pokitto 7:72f87b7c7400 185 return 0;
Pokitto 7:72f87b7c7400 186 }
Pokitto 7:72f87b7c7400 187
Pokitto 7:72f87b7c7400 188 uint8_t fileOpen(char* buffer, char fmode) {
Pokitto 7:72f87b7c7400 189 int err;
Pokitto 7:72f87b7c7400 190 if (filemode == FILE_MODE_UNINITIALIZED) {
Pokitto 7:72f87b7c7400 191 int a = pf_mount(&fs);
Pokitto 7:72f87b7c7400 192 if (a) return 1; // 1 means error in this context
Pokitto 7:72f87b7c7400 193 }
Pokitto 7:72f87b7c7400 194
Pokitto 7:72f87b7c7400 195 filemode = fmode;
Pokitto 7:72f87b7c7400 196 err = pf_open(buffer);
Pokitto 7:72f87b7c7400 197 if (err==0) {
Pokitto 7:72f87b7c7400 198 strcpy(currentfile,(const char*)buffer);
Pokitto 7:72f87b7c7400 199 return 0; // 0 means all clear
Pokitto 7:72f87b7c7400 200 }
Pokitto 7:72f87b7c7400 201 // file open failed
Pokitto 7:72f87b7c7400 202 filemode = FILE_MODE_FAILED;
Pokitto 7:72f87b7c7400 203 return 1; // 1 means failed
Pokitto 7:72f87b7c7400 204 }
Pokitto 7:72f87b7c7400 205
Pokitto 7:72f87b7c7400 206 void fileClose() {
Pokitto 7:72f87b7c7400 207 filemode = FILE_MODE_UNINITIALIZED;
Pokitto 7:72f87b7c7400 208 for (uint8_t i=0; i<15; i++) currentfile[i]=0;
Pokitto 7:72f87b7c7400 209 }
Pokitto 7:72f87b7c7400 210
Pokitto 7:72f87b7c7400 211 int fileGetChar() {
Pokitto 7:72f87b7c7400 212 BYTE buff[1];
Pokitto 7:72f87b7c7400 213 WORD br;
Pokitto 7:72f87b7c7400 214 int err = pf_read(buff, 1, &br); /* Read data to the buff[] */
Pokitto 7:72f87b7c7400 215 return buff[0];
Pokitto 7:72f87b7c7400 216 }
Pokitto 7:72f87b7c7400 217
Pokitto 7:72f87b7c7400 218 void filePutChar(char c) {
Pokitto 7:72f87b7c7400 219 WORD bw;
Pokitto 7:72f87b7c7400 220 pf_write((const void*)&c, 1, &bw);
Pokitto 7:72f87b7c7400 221 pf_write(0, 0, &bw);
Pokitto 7:72f87b7c7400 222 }
Pokitto 7:72f87b7c7400 223
Pokitto 7:72f87b7c7400 224 void fileWriteBytes(uint8_t * b, uint16_t n) {
Pokitto 7:72f87b7c7400 225 WORD bw;
Pokitto 7:72f87b7c7400 226 pf_write((const void*)&b, n, &bw);
Pokitto 7:72f87b7c7400 227 pf_write(0, 0, &bw);
Pokitto 7:72f87b7c7400 228 }
Pokitto 7:72f87b7c7400 229
Pokitto 7:72f87b7c7400 230 uint16_t fileReadBytes(uint8_t * b, uint16_t n) {
Pokitto 7:72f87b7c7400 231 WORD br;
Pokitto 7:72f87b7c7400 232 pf_read(b, n, &br); /* Read data to the buff[] */
Pokitto 7:72f87b7c7400 233 return br; /* Return number of bytes read */
Pokitto 7:72f87b7c7400 234 }
Pokitto 7:72f87b7c7400 235
Pokitto 7:72f87b7c7400 236 void fileSeekAbsolute(long n) {
Pokitto 7:72f87b7c7400 237 res = pf_lseek(n);
Pokitto 7:72f87b7c7400 238 }
Pokitto 7:72f87b7c7400 239
Pokitto 7:72f87b7c7400 240 void fileSeekRelative(long n) {
Pokitto 7:72f87b7c7400 241 if (n<0) if (fs.fptr < -n) n=-fs.fptr;
Pokitto 7:72f87b7c7400 242 else if (n>0) if (fs.fptr+n > fs.fsize) n=fs.fsize-fs.fptr;
Pokitto 7:72f87b7c7400 243 res = pf_lseek(fs.fptr + n);
Pokitto 7:72f87b7c7400 244 }
Pokitto 7:72f87b7c7400 245
Pokitto 7:72f87b7c7400 246 void fileRewind() {
Pokitto 7:72f87b7c7400 247 res = pf_lseek(0);
Pokitto 7:72f87b7c7400 248 }
Pokitto 7:72f87b7c7400 249
Pokitto 7:72f87b7c7400 250 void fileEnd() {
Pokitto 7:72f87b7c7400 251 res = pf_lseek(fs.fsize);
Pokitto 7:72f87b7c7400 252 }
Pokitto 7:72f87b7c7400 253
Pokitto 7:72f87b7c7400 254 long int fileGetPosition() {
Pokitto 7:72f87b7c7400 255 return fs.fptr;
Pokitto 7:72f87b7c7400 256 }
Pokitto 7:72f87b7c7400 257
Pokitto 7:72f87b7c7400 258 uint8_t filePeek(long n) {
Pokitto 7:72f87b7c7400 259 pf_lseek(n);
Pokitto 7:72f87b7c7400 260 return fileGetChar();
Pokitto 7:72f87b7c7400 261 }
Pokitto 7:72f87b7c7400 262
Pokitto 7:72f87b7c7400 263 void filePoke(long n, uint8_t c) {
Pokitto 7:72f87b7c7400 264 pf_lseek(n);
Pokitto 7:72f87b7c7400 265 filePutChar(c);
Pokitto 7:72f87b7c7400 266 }
Pokitto 7:72f87b7c7400 267
Pokitto 7:72f87b7c7400 268 int dirOpen() {
Pokitto 7:72f87b7c7400 269 return pf_opendir(&dir,"");
Pokitto 7:72f87b7c7400 270 }
Pokitto 7:72f87b7c7400 271
Pokitto 7:72f87b7c7400 272 int dirUp() {
Pokitto 7:72f87b7c7400 273
Pokitto 7:72f87b7c7400 274 return 0;
Pokitto 7:72f87b7c7400 275 }
Pokitto 7:72f87b7c7400 276
Pokitto 7:72f87b7c7400 277 #endif // POK_ENABLE_SD
Pokitto 7:72f87b7c7400 278
Pokitto 7:72f87b7c7400 279