@@ -1,5 +1,5 @@ | |||
This is a beta version with major changes so bugs and compatibility | |||
problems are likely. | |||
This is a beta version so there may be bugs and compatibility | |||
problems. | |||
Please report problems to the email address listed in the | |||
"Bugs and Comments" section of the html documentation. | |||
@@ -17,7 +17,7 @@ For more information see the Manual installation section of this guide: | |||
http://arduino.cc/en/Guide/Libraries | |||
A number of configuration options can be set by editing SdFatConfig.h | |||
#define macros. See the html documentation for details | |||
define macros. See the html documentation for details | |||
Read changes.txt if you have used previous releases of this library. | |||
@@ -28,4 +28,4 @@ StdioStream, ifstream, ofstream, and others. | |||
Please continue by reading the html documentation. | |||
Updated 19 Jul 2015 | |||
Updated 23 Jan 2016 |
@@ -20,7 +20,7 @@ | |||
/** | |||
\mainpage Arduino %SdFat Library | |||
<CENTER>Copyright © 2012, 2013, 2014, 2015 by William Greiman | |||
<CENTER>Copyright © 2012, 2013, 2014, 2015, 2016 by William Greiman | |||
</CENTER> | |||
\section Intro Introduction | |||
@@ -115,9 +115,6 @@ Set ENABLE_SPI_TRANSACTIONS nonzero to enable the SPI transaction feature | |||
of the standard Arduino SPI library. You must include SPI.h in your | |||
programs when ENABLE_SPI_TRANSACTIONS is nonzero. | |||
Set ENABLE_SPI_YIELD nonzero to enable release of the SPI bus during | |||
SD card busy waits. ENABLE_SPI_TRANSACTIONS must be nonzero. | |||
\section SDPath Paths and Working Directories | |||
Relative paths in SdFat are resolved in a manner similar to Windows. | |||
@@ -285,11 +282,10 @@ display properly. Examples this type name are UPPER.low, lower.TXT, | |||
UPPER.TXT, and lower.txt. | |||
An application which writes to a file using print(), println() or | |||
\link SdFile::write write() \endlink must close the file or call | |||
\link SdFile::sync() sync() \endlink at the appropriate time to | |||
write() must close the file or call sync() at the appropriate time to | |||
force data and directory information to be written to the SD Card. | |||
Applications must use care calling \link SdFile::sync() sync() \endlink | |||
Applications must use care calling sync() sync() | |||
since 2048 bytes of I/O is required to update file and | |||
directory information. This includes writing the current data block, reading | |||
the block that contains the directory entry for update, writing the directory | |||
@@ -344,11 +340,9 @@ AnalogBinLogger - Fast AVR ADC logger - see the AnalogBinLoggerExtras folder. | |||
bench - A read/write benchmark. | |||
cin_cout - Demo of ArduinoInStream and ArduinoOutStream. | |||
dataLogger - A simple modifiable data logger. | |||
directoryFunctions - Demo of chdir(), ls(), mkdir(), and rmdir(). | |||
DirectoryFunctions - Demo of chdir(), ls(), mkdir(), and rmdir(). | |||
fgets - Demo of the fgets read line/string function. | |||
@@ -370,6 +364,10 @@ RawWrite - A test of raw write functions for contiguous files. | |||
readCSV - Read a comma-separated value file using iostream extractors. | |||
ReadCsvArray - Read a two dimensional array from a CSV file. | |||
ReadCsvFields - Function to read a CSV text file one field at a time. | |||
ReadWriteSdFat - SdFat version of Arduino SD ReadWrite example. | |||
rename - A demo of SdFat::rename(old, new) and SdFile::rename(dirFile, newPath). | |||
@@ -391,4 +389,6 @@ Timestamp - Sets file create, modify, and access timestamps. | |||
TwoCards - Example using two SD cards. | |||
VolumeFreeSpace - Demonstrate the freeClusterCount() call. | |||
wipe - Example to wipe all data from an already formatted SD. | |||
*/ |
@@ -1,8 +1,8 @@ | |||
// A simple data logger for the Arduino analog pins with optional DS1307 | |||
// uses RTClib from https://github.com/adafruit/RTClib | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
#define SD_CHIP_SELECT SS // SD chip select pin | |||
#define USE_DS1307 0 // set nonzero to use DS1307 RTC |
@@ -2,7 +2,7 @@ | |||
* Program to test Short File Name character case flags. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
SdFat sd; | |||
@@ -1,5 +1,5 @@ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// create a serial output stream | |||
ArduinoOutStream cout(Serial); |
@@ -5,10 +5,10 @@ | |||
// Will not work on Due, Leonardo, or Teensy | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
#ifdef UDR0 // Must be AVR with serial port zero. | |||
#include <MinimumSerial.h> | |||
#include "MinimumSerial.h" | |||
MinimumSerial MiniSerial; | |||
@@ -4,7 +4,7 @@ | |||
* | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
SdFat sd; | |||
@@ -1,7 +1,7 @@ | |||
// Simple demo of the Stream parsInt() member function. | |||
#include <SPI.h> | |||
// The next two lines replace #include <SD.h>. | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
SdFat SD; | |||
// SD card chip select pin - Modify the value of csPin for your SD module. |
@@ -6,7 +6,7 @@ | |||
* The program will open and close the file 100 times. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -2,7 +2,7 @@ | |||
* Calculate the sum and average of a list of floating point numbers | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -2,7 +2,7 @@ | |||
* Use of ibufsteam to parse a line and obufstream to format a line | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// create a serial output stream | |||
ArduinoOutStream cout(Serial); |
@@ -2,7 +2,7 @@ | |||
* Demo of ArduinoInStream and ArduinoOutStream | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// create serial output stream | |||
ArduinoOutStream cout(Serial); |
@@ -2,7 +2,7 @@ | |||
* Append a line to a file - demo of pathnames and streams | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -1,6 +1,6 @@ | |||
// Demo of rewriting a line read by fgets | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD card chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -3,7 +3,7 @@ | |||
* Demo of pathnames and working directories | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -7,9 +7,13 @@ append - This sketch creates a large file by successive | |||
average - A demonstration of parsing floating point numbers. | |||
BaseExtCaseTest - Long file name test. | |||
benchSD - A read/write benchmark for the standard Arduino SD.h library. | |||
bufstream - ibufsteam to parse a line and obufstream to format a line. | |||
bufstream - ibufsteam to parse a line and obufstream to format a line. | |||
cin_cout - Demo of ArduinoInStream and ArduinoOutStream. | |||
eventlog - Append a line to a file - demo of pathnames and streams. | |||
@@ -26,3 +30,5 @@ readlog - Read file. Demo of pathnames and current working directory. | |||
SD_Size - Determine flash used by SD.h example. | |||
SdFatSize - Determine flash used by SdFat. | |||
StreamParseInt - Simple demo of the Stream parsInt() member function. |
@@ -21,8 +21,8 @@ | |||
*/ | |||
#ifdef __AVR__ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
#include "AnalogBinLogger.h" | |||
//------------------------------------------------------------------------------ | |||
// Analog pin number list for a sample. Pins may be in any order and pin |
@@ -2,8 +2,8 @@ | |||
// You can use test files located in | |||
// SdFat/examples/LongFileName/testFiles. | |||
#include<SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
// SD card chip select pin. | |||
const uint8_t SD_CS_PIN = SS; |
@@ -14,8 +14,8 @@ | |||
* Data is written to the file using a SD multiple block write command. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
//------------------------------------------------------------------------------ | |||
// User data functions. Modify these functions for your data items. | |||
#include "UserDataType.h" // Edit this include file to change data_t. |
@@ -2,7 +2,7 @@ | |||
* Print size, modify date/time, and name for all files in root. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; | |||
@@ -27,6 +27,7 @@ void setup() { | |||
// Open next file in root. The volume working directory, vwd, is root. | |||
// Warning, openNext starts at the current position of sd.vwd() so a | |||
// rewind may be neccessary in your application. | |||
sd.vwd()->rewind(); | |||
while (file.openNext(sd.vwd(), O_READ)) { | |||
file.printFileSize(&Serial); | |||
Serial.write(' '); |
@@ -2,8 +2,8 @@ | |||
* This program is a simple Print benchmark. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; | |||
@@ -37,7 +37,7 @@ void loop() { | |||
while (Serial.read() >= 0) { | |||
} | |||
// pstr stores strings in flash to save RAM | |||
// F stores strings in flash to save RAM | |||
cout << F("Type any character to start\n"); | |||
while (Serial.read() <= 0) { | |||
} |
@@ -1,7 +1,7 @@ | |||
// Quick hardware test. | |||
// | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// | |||
// Set DISABLE_CHIP_SELECT to disable a second SPI device. | |||
// For example, with the Ethernet shield, set DISABLE_CHIP_SELECT |
@@ -15,8 +15,8 @@ | |||
* marks the blocks as erased; no data transfer is required. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; | |||
@@ -56,7 +56,7 @@ void setup(void) { | |||
//------------------------------------------------------------------------------ | |||
void loop(void) { | |||
while (Serial.read() >= 0) {} | |||
// pstr stores strings in flash to save RAM | |||
// F stores strings in flash to save RAM | |||
cout << F("Type any character to start\n"); | |||
while (Serial.read() <= 0) {} | |||
delay(400); // catch Due reset problem |
@@ -0,0 +1,131 @@ | |||
// Read a two dimensional array from a CSV file. | |||
// | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#define CS_PIN 10 | |||
// 5 X 4 array | |||
#define ROW_DIM 5 | |||
#define COL_DIM 4 | |||
SdFat SD; | |||
File file; | |||
/* | |||
* Read a file one field at a time. | |||
* | |||
* file - File to read. | |||
* | |||
* str - Character array for the field. | |||
* | |||
* size - Size of str array. | |||
* | |||
* delim - String containing field delimiters. | |||
* | |||
* return - length of field including terminating delimiter. | |||
* | |||
* Note, the last character of str will not be a delimiter if | |||
* a read error occurs, the field is too long, or the file | |||
* does not end with a delimiter. Consider this an error | |||
* if not at end-of-file. | |||
* | |||
*/ | |||
size_t readField(File* file, char* str, size_t size, char* delim) { | |||
char ch; | |||
size_t n = 0; | |||
while ((n + 1) < size && file->read(&ch, 1) == 1) { | |||
// Delete CR. | |||
if (ch == '\r') { | |||
continue; | |||
} | |||
str[n++] = ch; | |||
if (strchr(delim, ch)) { | |||
break; | |||
} | |||
} | |||
str[n] = '\0'; | |||
return n; | |||
} | |||
//------------------------------------------------------------------------------ | |||
#define errorHalt(msg) {Serial.println(F(msg)); while(1);} | |||
//------------------------------------------------------------------------------ | |||
void setup() { | |||
Serial.begin(9600); | |||
// Initialize the SD. | |||
if (!SD.begin(CS_PIN)) { | |||
errorHalt("begin failed"); | |||
} | |||
// Create or open the file. | |||
file = SD.open("READNUM.TXT", FILE_WRITE); | |||
if (!file) { | |||
errorHalt("open failed"); | |||
} | |||
// Rewind file so test data is not appended. | |||
file.seek(0); | |||
// Write test data. | |||
file.print(F( | |||
"11,12,13,14\r\n" | |||
"21,22,23,24\r\n" | |||
"31,32,33,34\r\n" | |||
"41,42,43,44\r\n" | |||
"51,52,53,54" // Allow missing endl at eof. | |||
)); | |||
// Rewind the file for read. | |||
file.seek(0); | |||
// Array for data. | |||
int array[ROW_DIM][COL_DIM]; | |||
int i = 0; // First array index. | |||
int j = 0; // Second array index | |||
size_t n; // Length of returned field with delimiter. | |||
char str[20]; // Must hold longest field with delimiter and zero byte. | |||
char *ptr; // Test for valid field. | |||
// Read the file and store the data. | |||
for (i = 0; i < ROW_DIM; i++) { | |||
for (j = 0; j < COL_DIM; j++) { | |||
n = readField(&file, str, sizeof(str), ",\n"); | |||
if (n == 0) { | |||
errorHalt("Too few lines"); | |||
} | |||
array[i][j] = strtol(str, &ptr, 10); | |||
if (ptr == str) { | |||
errorHalt("bad number"); | |||
} | |||
while (*ptr == ' ') { | |||
ptr++; | |||
} | |||
if (*ptr != ',' && *ptr != '\n' && *ptr != '\0') { | |||
errorHalt("extra characters in field"); | |||
} | |||
if (j < (COL_DIM-1) && str[n-1] != ',') { | |||
errorHalt("line with too few fields"); | |||
} | |||
} | |||
// Allow missing endl at eof. | |||
if (str[n-1] != '\n' && file.available()) { | |||
errorHalt("missing endl"); | |||
} | |||
} | |||
// Print the array. | |||
for (i = 0; i < ROW_DIM; i++) { | |||
for (j = 0; j < COL_DIM; j++) { | |||
if (j) { | |||
Serial.print(' '); | |||
} | |||
Serial.print(array[i][j]); | |||
} | |||
Serial.println(); | |||
} | |||
Serial.println("Done"); | |||
file.close(); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void loop() { | |||
} | |||
@@ -0,0 +1,103 @@ | |||
// Function to read a CSV text file one field at a time. | |||
// | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#define CS_PIN 10 | |||
SdFat SD; | |||
File file; | |||
/* | |||
* Read a file one field at a time. | |||
* | |||
* file - File to read. | |||
* | |||
* str - Character array for the field. | |||
* | |||
* size - Size of str array. | |||
* | |||
* delim - String containing field delimiters. | |||
* | |||
* return - length of field including terminating delimiter. | |||
* | |||
* Note, the last character of str will not be a delimiter if | |||
* a read error occurs, the field is too long, or the file | |||
* does not end with a delimiter. Consider this an error | |||
* if not at end-of-file. | |||
* | |||
*/ | |||
size_t readField(File* file, char* str, size_t size, char* delim) { | |||
char ch; | |||
size_t n = 0; | |||
while ((n + 1) < size && file->read(&ch, 1) == 1) { | |||
// Delete CR. | |||
if (ch == '\r') { | |||
continue; | |||
} | |||
str[n++] = ch; | |||
if (strchr(delim, ch)) { | |||
break; | |||
} | |||
} | |||
str[n] = '\0'; | |||
return n; | |||
} | |||
//------------------------------------------------------------------------------ | |||
#define errorHalt(msg) {Serial.println(F(msg)); while(1);} | |||
//------------------------------------------------------------------------------ | |||
void setup() { | |||
Serial.begin(9600); | |||
// Initialize the SD. | |||
if (!SD.begin(CS_PIN)) errorHalt("begin failed"); | |||
// Create or open the file. | |||
file = SD.open("READTEST.TXT", FILE_WRITE); | |||
if (!file) errorHalt("open failed"); | |||
// Rewind file so test data is not appended. | |||
file.seek(0); | |||
// Write test data. | |||
file.print(F( | |||
"field_1_1,field_1_2,field_1_3\r\n" | |||
"field_2_1,field_2_2,field_2_3\r\n" | |||
"field_3_1,field_3_2\r\n" // missing a field | |||
"field_4_1,field_4_2,field_4_3\r\n" | |||
"field_5_1,field_5_2,field_5_3" // no delimiter | |||
)); | |||
// Rewind the file for read. | |||
file.seek(0); | |||
size_t n; // Length of returned field with delimiter. | |||
char str[20]; // Must hold longest field with delimiter and zero byte. | |||
// Read the file and print fields. | |||
while (true) { | |||
n = readField(&file, str, sizeof(str), ",\n"); | |||
// done if Error or at EOF. | |||
if (n == 0) break; | |||
// Print the type of delimiter. | |||
if (str[n-1] == ',' || str[n-1] == '\n') { | |||
Serial.print(str[n-1] == ',' ? F("comma: ") : F("endl: ")); | |||
// Remove the delimiter. | |||
str[n-1] = 0; | |||
} else { | |||
// At eof, too long, or read error. Too long is error. | |||
Serial.print(file.available() ? F("error: ") : F("eof: ")); | |||
} | |||
// Print the field. | |||
Serial.println(str); | |||
} | |||
file.close(); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void loop() { | |||
} | |||
@@ -20,7 +20,7 @@ | |||
#define SD_CS_PIN SS | |||
#include <SPI.h> | |||
//#include <SD.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
SdFat SD; | |||
File myFile; |
@@ -21,7 +21,7 @@ const int chipSelect = 4; | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
SdFat sd; | |||
SdFile myFile; | |||
@@ -14,9 +14,9 @@ | |||
// Print extra info for debug if DEBUG_PRINT is nonzero | |||
#define DEBUG_PRINT 0 | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
#if DEBUG_PRINT | |||
#include <FreeStack.h> | |||
#include "FreeStack.h" | |||
#endif // DEBUG_PRINT | |||
// | |||
// Change the value of chipSelect if your hardware does |
@@ -2,7 +2,7 @@ | |||
* This program attempts to initialize an SD card and analyze its structure. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
/* | |||
* SD chip select pin. Common values are: | |||
* | |||
@@ -139,7 +139,7 @@ void volDmp() { | |||
cout << F("dataStartBlock: ") << sd.vol()->dataStartBlock() << endl; | |||
if (sd.vol()->dataStartBlock() % eraseSize) { | |||
cout << F("Data area is not aligned on flash erase boundaries!\n"); | |||
cout << F("Download and use formatter from www.sdsd.card()->org/consumer!\n"); | |||
cout << F("Download and use formatter from www.sdcard.org!\n"); | |||
} | |||
} | |||
//------------------------------------------------------------------------------ | |||
@@ -150,7 +150,7 @@ void setup() { | |||
// use uppercase in hex and use 0X base prefix | |||
cout << uppercase << showbase << endl; | |||
// pstr stores strings in flash to save RAM | |||
// F stores strings in flash to save RAM | |||
cout << F("SdFat version: ") << SD_FAT_VERSION << endl; | |||
if (DISABLE_CHIP_SELECT < 0) { | |||
cout << F( | |||
@@ -170,7 +170,7 @@ void loop() { | |||
// read any existing Serial data | |||
while (Serial.read() >= 0) {} | |||
// pstr stores strings in flash to save RAM | |||
// F stores strings in flash to save RAM | |||
cout << F("\ntype any character to start\n"); | |||
while (Serial.read() <= 0) {} | |||
delay(400); // catch Due reset problem |
@@ -4,7 +4,7 @@ | |||
// This example will also run on an Uno and other boards using software SPI. | |||
// | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
#if SD_SPI_CONFIGURATION >= 3 // Must be set in SdFat/SdFatConfig.h | |||
// | |||
// Pin numbers in templates must be constants. |
@@ -1,6 +1,6 @@ | |||
// Benchmark comparing SdFile and StdioStream. | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// Define PRINT_FIELD nonzero to use printField. | |||
#define PRINT_FIELD 0 |
@@ -2,8 +2,8 @@ | |||
* Example use of three SD cards. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
#if SD_SPI_CONFIGURATION >= 3 // Must be set in SdFat/SdFatConfig.h | |||
// SD1 is a microSD on hardware SPI pins 50-52 |
@@ -3,7 +3,7 @@ | |||
* and the timestamp() function. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
SdFat sd; | |||
@@ -2,8 +2,8 @@ | |||
* Example use of two SD cards. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
SdFat sd1; | |||
const uint8_t SD1_CS = 10; // chip select for sd1 |
@@ -2,7 +2,7 @@ | |||
* This program demonstrates the freeClusterCount() call. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
/* | |||
* SD chip select pin. Common values are: | |||
* | |||
@@ -42,7 +42,7 @@ void setup() { | |||
cout << F("MAINTAIN_FREE_CLUSTER_COUNT nonzero for\n"); | |||
cout << F("maximum freeClusterCount() performance.\n\n"); | |||
} | |||
// pstr stores strings in flash to save RAM | |||
// F stores strings in flash to save RAM | |||
cout << F("Type any character to start\n"); | |||
while (Serial.read() <= 0) {} | |||
delay(400); // catch Due reset problem |
@@ -2,8 +2,8 @@ | |||
* This program is a simple binary write/read benchmark. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <FreeStack.h> | |||
#include "SdFat.h" | |||
#include "FreeStack.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -2,7 +2,7 @@ | |||
* Simple data logger. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin. Be sure to disable any other SPI devices such as Enet. | |||
const uint8_t chipSelect = SS; | |||
@@ -11,7 +11,7 @@ const uint8_t chipSelect = SS; | |||
// The interval must be greater than the maximum SD write latency plus the | |||
// time to acquire and write data to the SD to avoid overrun errors. | |||
// Run the bench example to check the quality of your SD card. | |||
const uint32_t SAMPLE_INTERVAL_MS = 200; | |||
const uint32_t SAMPLE_INTERVAL_MS = 1000; | |||
// Log file base name. Must be six characters or less. | |||
#define FILE_BASE_NAME "Data" |
@@ -1,13 +1,12 @@ | |||
/* | |||
* Example use of chdir(), ls(), mkdir(), and rmdir(). | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include <SPI.h> | |||
#include "SdFat.h" | |||
// SD card chip select pin. | |||
const uint8_t SD_CHIP_SELECT = SS; | |||
//------------------------------------------------------------------------------ | |||
// Permit SD to be wiped if ALLOW_WIPE is true. | |||
const bool ALLOW_WIPE = false; | |||
// File system object. | |||
SdFat sd; | |||
@@ -35,34 +34,34 @@ void setup() { | |||
cout << F("Type any character to start\n"); | |||
// Wait for input line and discard. | |||
cin.readline(); | |||
cout << endl; | |||
// Initialize the SD card at SPI_HALF_SPEED to avoid bus errors with | |||
// breadboards. use SPI_FULL_SPEED for better performance. | |||
if (!sd.begin(SD_CHIP_SELECT, SPI_HALF_SPEED)) { | |||
sd.initErrorHalt(); | |||
} | |||
if (sd.exists("Folder1") | |||
|| sd.exists("Folder1/file1.txt") | |||
|| sd.exists("Folder1/File2.txt")) { | |||
error("Please remove existing Folder1, file1.txt, and File2.txt"); | |||
} | |||
// Check for empty SD. | |||
if (file.openNext(sd.vwd(), O_READ)) { | |||
cout << F("Found files/folders in the root directory.\n"); | |||
if (!ALLOW_WIPE) { | |||
error("SD not empty, use a blank SD or set ALLOW_WIPE true."); | |||
} else { | |||
cout << F("Type: 'WIPE' to delete all SD files.\n"); | |||
char buf[10]; | |||
cin.readline(); | |||
cin.get(buf, sizeof(buf)); | |||
if (cin.fail() || strncmp(buf, "WIPE", 4) || buf[4] >= ' ') { | |||
error("Invalid WIPE input"); | |||
} | |||
file.close(); | |||
if (!sd.vwd()->rmRfStar()) { | |||
error("wipe failed"); | |||
} | |||
cout << F("***SD wiped clean.***\n\n"); | |||
int rootFileCount = 0; | |||
sd.vwd()->rewind(); | |||
while (file.openNext(sd.vwd(), O_READ)) { | |||
if (!file.isHidden()) { | |||
rootFileCount++; | |||
} | |||
file.close(); | |||
if (rootFileCount > 10) { | |||
error("Too many files in root. Please use an empty SD."); | |||
} | |||
} | |||
if (rootFileCount) { | |||
cout << F("\nPlease use an empty SD for best results.\n\n"); | |||
delay(1000); | |||
} | |||
// Create a new folder. | |||
if (!sd.mkdir("Folder1")) { | |||
error("Create Folder1 failed"); | |||
@@ -89,7 +88,7 @@ void setup() { | |||
file.close(); | |||
cout << F("Created File2.txt in current directory\n"); | |||
cout << F("List of files on the SD.\n"); | |||
cout << F("\nList of files on the SD.\n"); | |||
sd.ls("/", LS_R); | |||
// Remove files from current directory. | |||
@@ -103,7 +102,7 @@ void setup() { | |||
error("chdir to root failed.\n"); | |||
} | |||
cout << F("List of files on the SD.\n"); | |||
cout << F("\nList of files on the SD.\n"); | |||
sd.ls(LS_R); | |||
// Remove Folder1. | |||
@@ -111,7 +110,9 @@ void setup() { | |||
error("rmdir for Folder1 failed\n"); | |||
} | |||
cout << F("\nFolder1 removed, SD empty.\n"); | |||
cout << F("\nFolder1 removed.\n"); | |||
cout << F("\nList of files on the SD.\n"); | |||
sd.ls(LS_R); | |||
cout << F("Done!\n"); | |||
} | |||
//------------------------------------------------------------------------------ |
@@ -1,6 +1,6 @@ | |||
// Demo of fgets function to read lines from a file. | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -3,7 +3,7 @@ | |||
* Format dates | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// create Serial stream | |||
ArduinoOutStream cout(Serial); |
@@ -7,7 +7,7 @@ | |||
* may not the best way to read a file. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; | |||
@@ -56,7 +56,7 @@ void setup(void) { | |||
Serial.begin(9600); | |||
while (!Serial) {} // wait for Leonardo | |||
// pstr stores strings in flash to save RAM | |||
// F stores strings in flash to save RAM | |||
cout << F("Type any character to start\n"); | |||
while (Serial.read() <= 0) {} | |||
delay(400); // catch Due reset problem |
@@ -3,7 +3,7 @@ | |||
* Each line of the file has a label and three values, a long and two floats. | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -3,7 +3,7 @@ | |||
* and SdFat::rename(). | |||
*/ | |||
#include <SPI.h> | |||
#include <SdFat.h> | |||
#include "SdFat.h" | |||
// SD chip select pin | |||
const uint8_t chipSelect = SS; |
@@ -0,0 +1,32 @@ | |||
// Example to wipe all data from an already formatted SD. | |||
#include <SPI.h> | |||
#include "SdFat.h" | |||
const int chipSelect = SS; | |||
SdFat sd; | |||
void setup() { | |||
int c; | |||
Serial.begin(9600); | |||
while (!Serial) {} // wait for Leonardo | |||
Serial.println("Type 'Y' to wipe all data."); | |||
while ((c = Serial.read()) <= 0) {} | |||
if (c != 'Y') { | |||
sd.errorHalt("Quitting, you did not type 'Y'."); | |||
} | |||
if (!sd.begin(chipSelect)) { | |||
sd.initErrorHalt(); | |||
} | |||
// Use wipe() for no dot progress indicator. | |||
if (!sd.wipe(&Serial)) { | |||
sd.errorHalt("Wipe failed."); | |||
} | |||
// Must reinitialize after wipe. | |||
if (!sd.begin(chipSelect)) { | |||
sd.errorHalt("Second init failed."); | |||
} | |||
Serial.println("Done"); | |||
} | |||
void loop() { | |||
} |
@@ -1,71 +0,0 @@ | |||
/* Arduino SdFat Library | |||
* Copyright (C) 2012 by William Greiman | |||
* | |||
* This file is part of the Arduino SdFat Library | |||
* | |||
* This Library is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License as published by | |||
* the Free Software Foundation, either version 3 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This Library is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with the Arduino SdFat Library. If not, see | |||
* <http://www.gnu.org/licenses/>. | |||
*/ | |||
#ifndef SdVolume_h | |||
#include "SdSpiCard.h" | |||
#include "utility/FatLib.h" | |||
#define SdVolume_h | |||
#ifndef USE_SD_VOLUME | |||
#error SdVolume is deperacated. Remove this line to continue using this class. | |||
#endif // USE_SD_VOLUME | |||
//============================================================================== | |||
/** | |||
* \class SdVolume | |||
* \brief SdVolume Soon to be removed. | |||
*/ | |||
class SdVolume : public FatVolume { | |||
public: | |||
/** Initialize a FAT volume. Try partition one first then try super | |||
* floppy format. | |||
* | |||
* \param[in] dev The Sd2Card where the volume is located. | |||
* | |||
* \return true for success else false. | |||
*/ | |||
bool init(Sd2Card* dev) { | |||
return init(dev, 1) ? true : init(dev, 0); | |||
} | |||
/** Initialize a FAT volume. | |||
* | |||
* \param[in] dev The Sd2Card where the volume is located. | |||
* \param[in] part the partition to use. Zero for super floppy or 1-4. | |||
* \return true for success else false. | |||
*/ | |||
bool init(Sd2Card* dev, uint8_t part) { | |||
m_sdCard = dev; | |||
return FatVolume::init(part); | |||
} | |||
private: | |||
// friend class FatFile; | |||
bool readBlock(uint32_t block, uint8_t* dst) { | |||
return m_sdCard->readBlock(block, dst); | |||
} | |||
bool writeBlock(uint32_t block, const uint8_t* src) { | |||
return m_sdCard->writeBlock(block, src); | |||
} | |||
bool readBlocks(uint32_t block, uint8_t* dst, size_t n) { | |||
return m_sdCard->readBlocks(block, dst, n); | |||
} | |||
bool writeBlocks(uint32_t block, const uint8_t* src, size_t n) { | |||
return m_sdCard->writeBlocks(block, src, n); | |||
} | |||
Sd2Card* m_sdCard; // Sd2Card object for cache | |||
}; | |||
#endif // SdVolume_h |
@@ -25,7 +25,7 @@ | |||
*/ | |||
#include "FatLibConfig.h" | |||
#if ENABLE_ARDUINO_FEATURES | |||
#include <Arduino.h> | |||
#include "SystemInclude.h" | |||
#include "bufstream.h" | |||
//============================================================================== | |||
/** |
@@ -847,10 +847,6 @@ dir_t* FatFile::readDirCache(bool skipReadOk) { | |||
} | |||
goto fail; | |||
} | |||
// if (read(&b, 1) != 1) { | |||
// DBG_FAIL_MACRO; | |||
// goto fail; | |||
// } | |||
m_curPosition += 31; | |||
} else { | |||
m_curPosition += 32; | |||
@@ -1107,6 +1103,10 @@ bool FatFile::seekSet(uint32_t pos) { | |||
DBG_FAIL_MACRO; | |||
goto fail; | |||
} | |||
// Optimize O_APPEND writes. | |||
if (pos == m_curPosition) { | |||
return true; | |||
} | |||
if (pos == 0) { | |||
// set position to start of file | |||
m_curCluster = 0; |
@@ -37,10 +37,6 @@ class FatFileSystem; | |||
#ifdef __AVR__ | |||
#include <avr/pgmspace.h> | |||
#else // __AVR__ | |||
#ifndef PGM_P | |||
/** pointer to flash for ARM */ | |||
#define PGM_P const char* | |||
#endif // PGM_P | |||
#ifndef PSTR | |||
/** store literal string in flash for ARM */ | |||
#define PSTR(x) (x) | |||
@@ -55,7 +51,7 @@ class FatFileSystem; | |||
#endif // pgm_read_word | |||
#ifndef PROGMEM | |||
/** store in flash for ARM */ | |||
#define PROGMEM const | |||
#define PROGMEM | |||
#endif // PROGMEM | |||
#endif // __AVR__ | |||
//------------------------------------------------------------------------------ | |||
@@ -219,9 +215,6 @@ class FatFile { | |||
*/ | |||
bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); | |||
/** Create and open a new contiguous file of a specified size. | |||
* | |||
* \note This function only supports short DOS 8.3 names. | |||
* See open() for more information. | |||
* | |||
* \param[in] dirFile The directory where the file will be created. | |||
* \param[in] path A path with a valid DOS 8.3 file name. |
@@ -25,7 +25,7 @@ | |||
#define FatLibConfig_h | |||
#include <stdint.h> | |||
// Allow this file to override defaults. | |||
#include "../SdFatConfig.h" | |||
#include "SdFatConfig.h" | |||
#ifdef __AVR__ | |||
#include <avr/io.h> | |||
@@ -134,7 +134,7 @@ | |||
* Enable Extra features for Arduino. | |||
*/ | |||
#ifndef ENABLE_ARDUINO_FEATURES | |||
#if defined(ARDUINO) || defined(DOXYGEN) | |||
#if defined(ARDUINO) || defined(PLATFORM_ID) || defined(DOXYGEN) | |||
#define ENABLE_ARDUINO_FEATURES 1 | |||
#else // #if defined(ARDUINO) || defined(DOXYGEN) | |||
#define ENABLE_ARDUINO_FEATURES 0 |
@@ -120,6 +120,128 @@ struct masterBootRecord { | |||
/** Type name for masterBootRecord */ | |||
typedef struct masterBootRecord mbr_t; | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* \struct biosParmBlock | |||
* | |||
* \brief BIOS parameter block | |||
* | |||
* The BIOS parameter block describes the physical layout of a FAT volume. | |||
*/ | |||
struct biosParmBlock{ | |||
/** | |||
* Count of bytes per sector. This value may take on only the | |||
* following values: 512, 1024, 2048 or 4096 | |||
*/ | |||
uint16_t bytesPerSector; | |||
/** | |||
* Number of sectors per allocation unit. This value must be a | |||
* power of 2 that is greater than 0. The legal values are | |||
* 1, 2, 4, 8, 16, 32, 64, and 128. | |||
*/ | |||
uint8_t sectorsPerCluster; | |||
/** | |||
* Number of sectors before the first FAT. | |||
* This value must not be zero. | |||
*/ | |||
uint16_t reservedSectorCount; | |||
/** The count of FAT data structures on the volume. This field should | |||
* always contain the value 2 for any FAT volume of any type. | |||
*/ | |||
uint8_t fatCount; | |||
/** | |||
* For FAT12 and FAT16 volumes, this field contains the count of | |||
* 32-byte directory entries in the root directory. For FAT32 volumes, | |||
* this field must be set to 0. For FAT12 and FAT16 volumes, this | |||
* value should always specify a count that when multiplied by 32 | |||
* results in a multiple of bytesPerSector. FAT16 volumes should | |||
* use the value 512. | |||
*/ | |||
uint16_t rootDirEntryCount; | |||
/** | |||
* This field is the old 16-bit total count of sectors on the volume. | |||
* This count includes the count of all sectors in all four regions | |||
* of the volume. This field can be 0; if it is 0, then totalSectors32 | |||
* must be nonzero. For FAT32 volumes, this field must be 0. For | |||
* FAT12 and FAT16 volumes, this field contains the sector count, and | |||
* totalSectors32 is 0 if the total sector count fits | |||
* (is less than 0x10000). | |||
*/ | |||
uint16_t totalSectors16; | |||
/** | |||
* This dates back to the old MS-DOS 1.x media determination and is | |||
* no longer usually used for anything. 0xF8 is the standard value | |||
* for fixed (nonremovable) media. For removable media, 0xF0 is | |||
* frequently used. Legal values are 0xF0 or 0xF8-0xFF. | |||
*/ | |||
uint8_t mediaType; | |||
/** | |||
* Count of sectors occupied by one FAT on FAT12/FAT16 volumes. | |||
* On FAT32 volumes this field must be 0, and sectorsPerFat32 | |||
* contains the FAT size count. | |||
*/ | |||
uint16_t sectorsPerFat16; | |||
/** Sectors per track for interrupt 0x13. Not used otherwise. */ | |||
uint16_t sectorsPerTrtack; | |||
/** Number of heads for interrupt 0x13. Not used otherwise. */ | |||
uint16_t headCount; | |||
/** | |||
* Count of hidden sectors preceding the partition that contains this | |||
* FAT volume. This field is generally only relevant for media | |||
* visible on interrupt 0x13. | |||
*/ | |||
uint32_t hidddenSectors; | |||
/** | |||
* This field is the new 32-bit total count of sectors on the volume. | |||
* This count includes the count of all sectors in all four regions | |||
* of the volume. This field can be 0; if it is 0, then | |||
* totalSectors16 must be nonzero. | |||
*/ | |||
uint32_t totalSectors32; | |||
/** | |||
* Count of sectors occupied by one FAT on FAT32 volumes. | |||
*/ | |||
uint32_t sectorsPerFat32; | |||
/** | |||
* This field is only defined for FAT32 media and does not exist on | |||
* FAT12 and FAT16 media. | |||
* Bits 0-3 -- Zero-based number of active FAT. | |||
* Only valid if mirroring is disabled. | |||
* Bits 4-6 -- Reserved. | |||
* Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. | |||
* -- 1 means only one FAT is active; it is the one referenced in bits 0-3. | |||
* Bits 8-15 -- Reserved. | |||
*/ | |||
uint16_t fat32Flags; | |||
/** | |||
* FAT32 version. High byte is major revision number. | |||
* Low byte is minor revision number. Only 0.0 define. | |||
*/ | |||
uint16_t fat32Version; | |||
/** | |||
* Cluster number of the first cluster of the root directory for FAT32. | |||
* This usually 2 but not required to be 2. | |||
*/ | |||
uint32_t fat32RootCluster; | |||
/** | |||
* Sector number of FSINFO structure in the reserved area of the | |||
* FAT32 volume. Usually 1. | |||
*/ | |||
uint16_t fat32FSInfo; | |||
/** | |||
* If nonzero, indicates the sector number in the reserved area | |||
* of the volume of a copy of the boot record. Usually 6. | |||
* No value other than 6 is recommended. | |||
*/ | |||
uint16_t fat32BackBootBlock; | |||
/** | |||
* Reserved for future expansion. Code that formats FAT32 volumes | |||
* should always set all of the bytes of this field to 0. | |||
*/ | |||
uint8_t fat32Reserved[12]; | |||
} __attribute__((packed)); | |||
/** Type name for biosParmBlock */ | |||
typedef struct biosParmBlock bpb_t; | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* \struct fat_boot | |||
* |
@@ -24,6 +24,7 @@ | |||
* \brief FatVolume class | |||
*/ | |||
#include <stddef.h> | |||
#include "SystemInclude.h" | |||
#include "FatLibConfig.h" | |||
#include "FatStructs.h" | |||
//------------------------------------------------------------------------------ | |||
@@ -31,7 +32,6 @@ | |||
/** Macro for debug. */ | |||
#define DEBUG_MODE 0 | |||
#if DEBUG_MODE | |||
#include <Arduino.h> | |||
#define DBG_FAIL_MACRO Serial.print(F(__FILE__)); Serial.println(__LINE__) | |||
#define DBG_PRINT_IF(b) if (b) {Serial.println(F(#b)); DBG_FAIL_MACRO;} | |||
#define DBG_HALT_IF(b) if (b) {Serial.println(F(#b));\ | |||
@@ -44,12 +44,9 @@ | |||
#endif // DOXYGEN_SHOULD_SKIP_THIS | |||
//------------------------------------------------------------------------------ | |||
#if ENABLE_ARDUINO_FEATURES | |||
#include <Arduino.h> | |||
/** Use Print on Arduino */ | |||
/** Use Print for Arduino */ | |||
typedef Print print_t; | |||
#else // ENABLE_ARDUINO_FEATURES | |||
// Arduino type for flash string. | |||
class __FlashStringHelper; | |||
/** | |||
* \class CharWriter | |||
* \brief Character output - often serial port. |
@@ -149,16 +149,6 @@ int StdioStream::fputs(const char* str) { | |||
return fwrite(str, 1, len) == len ? len : EOF; | |||
} | |||
//------------------------------------------------------------------------------ | |||
int StdioStream::fputs_P(PGM_P str) { | |||
PGM_P bgn = str; | |||
for (char c; (c = pgm_read_byte(str)); str++) { | |||
if (putc(c) < 0) { | |||
return EOF; | |||
} | |||
} | |||
return str - bgn; | |||
} | |||
//------------------------------------------------------------------------------ | |||
size_t StdioStream::fread(void* ptr, size_t size, size_t count) { | |||
uint8_t* dst = reinterpret_cast<uint8_t*>(ptr); | |||
size_t total = size*count; | |||
@@ -281,8 +271,9 @@ int StdioStream::write(const void* buf, size_t count) { | |||
return count; | |||
} | |||
//------------------------------------------------------------------------------ | |||
#if (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) | |||
size_t StdioStream::print(const __FlashStringHelper *str) { | |||
const char *p = (const char PROGMEM *)str; | |||
const char *p = (const char*)str; | |||
uint8_t c; | |||
while ((c = pgm_read_byte(p))) { | |||
if (putc(c) < 0) { | |||
@@ -290,89 +281,14 @@ size_t StdioStream::print(const __FlashStringHelper *str) { | |||
} | |||
p++; | |||
} | |||
return p - (const char PROGMEM *)str; | |||
return p - (const char*)str; | |||
} | |||
#endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) | |||
//------------------------------------------------------------------------------ | |||
int StdioStream::printDec(float value, uint8_t prec) { | |||
#define FLOAT_NEW_WAY | |||
#ifdef FLOAT_NEW_WAY | |||
char buf[24]; | |||
char *ptr = fmtFloat(value, buf + sizeof(buf), prec); | |||
// return fputs(ptr); | |||
// uint8_t len = buf + sizeof(buf) - ptr; | |||
return write(ptr, buf + sizeof(buf) - ptr); | |||
#else | |||
char* ptr; | |||
uint8_t rtn = 0; | |||
uint8_t sign = 0; | |||
if (value < 0) { | |||
value = -value; | |||
sign = '-'; | |||
} | |||
// check for NaN INF OVF | |||
if (isnan(value)) { | |||
if (fputs_P(PSTR("nan")) < 0) { | |||
return -1; | |||
} | |||
rtn += 3; | |||
} else if (isinf(value)) { | |||
if (fputs_P(PSTR("inf")) < 0) { | |||
return -1; | |||
} | |||
rtn += 3; | |||
} else if (value > 4294967040.0) { | |||
if (fputs_P(PSTR("ovf")) < 0) { | |||
return -1; | |||
} | |||
rtn += 3; | |||
} else { | |||
if (sign) { | |||
if (putc(sign) < 0) { | |||
return -1; | |||
} | |||
rtn++; | |||
} | |||
if (prec > 9) { | |||
prec = 9; | |||
} | |||
/* | |||
uint32_t s = 1; | |||
for (uint8_t i = 0; i < prec; i++) { | |||
// s *= 10; | |||
s = ((s << 2) + s) << 1; | |||
} | |||
// round value | |||
value += 0.5/s; | |||
*/ | |||
value += scale10(0.5, -prec); | |||
uint32_t whole = value; | |||
int np; | |||
if ((np = printDec(whole)) < 0) { | |||
return -1; | |||
} | |||
rtn += np; | |||
if (prec) { | |||
if (putc('.') < 0) { | |||
return -1; | |||
} | |||
char* str = fmtSpace(prec); | |||
if (!str) { | |||
return -1; | |||
} | |||
char* tmp = str - prec; | |||
// uint32_t fraction = s*(value - whole); | |||
uint32_t fraction = scale10(value - whole, prec); | |||
ptr = fmtDec(fraction, str); | |||
while (ptr > tmp) { | |||
*--ptr = '0'; | |||
} | |||
rtn += prec + 1; | |||
} | |||
} | |||
return rtn; | |||
#endif | |||
} | |||
//------------------------------------------------------------------------------ | |||
int StdioStream::printDec(signed char n) { |
@@ -278,16 +278,6 @@ class StdioStream : private FatFile { | |||
*/ | |||
int fputs(const char* str); | |||
//---------------------------------------------------------------------------- | |||
/** Write a string stored in flash. | |||
* | |||
* \param[in] str string to be written. | |||
* | |||
* \return for success, fputs() returns a non-negative | |||
* number. Otherwise, it returns EOF and sets the error indicator for | |||
* the stream. | |||
*/ | |||
int fputs_P(PGM_P str); | |||
//---------------------------------------------------------------------------- | |||
/** Binary input. | |||
* | |||
* Reads an array of up to count elements, each one with a size of size | |||
@@ -414,6 +404,7 @@ class StdioStream : private FatFile { | |||
return n < 0 ? 0 : n; | |||
} | |||
//---------------------------------------------------------------------------- | |||
#if (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) | |||
/** Print a string stored in flash memory. | |||
* | |||
* \param[in] str the string to print. | |||
@@ -421,6 +412,7 @@ class StdioStream : private FatFile { | |||
* \return the number of bytes written. | |||
*/ | |||
size_t print(const __FlashStringHelper *str); | |||
#endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) | |||
//---------------------------------------------------------------------------- | |||
/** Print a floating point number. | |||
* |
@@ -71,8 +71,13 @@ void istream::getBool(bool *b) { | |||
getNumber(b); | |||
return; | |||
} | |||
#ifdef __AVR__ | |||
PGM_P truePtr = PSTR("true"); | |||
PGM_P falsePtr = PSTR("false"); | |||
#else // __AVR__ | |||
const char* truePtr = "true"; | |||
const char* falsePtr = "false"; | |||
#endif // __AVR | |||
const uint8_t true_len = 4; | |||
const uint8_t false_len = 5; | |||
bool trueOk = true; | |||
@@ -80,8 +85,13 @@ void istream::getBool(bool *b) { | |||
uint8_t i = 0; | |||
int c = readSkip(); | |||
while (1) { | |||
#ifdef __AVR__ | |||
falseOk = falseOk && c == pgm_read_byte(falsePtr + i); | |||
trueOk = trueOk && c == pgm_read_byte(truePtr + i); | |||
#else // __AVR__ | |||
falseOk = falseOk && c == falsePtr[i]; | |||
trueOk = trueOk && c == truePtr[i]; | |||
#endif // __AVR | |||
if (trueOk == false && falseOk == false) { | |||
break; | |||
} |
@@ -24,24 +24,6 @@ | |||
* \brief \ref ostream class | |||
*/ | |||
#include "ios.h" | |||
//------------------------------------------------------------------------------ | |||
/** macro for flash inserter */ | |||
#define pstr(str) pgm(PSTR(str)) | |||
/** \struct pgm | |||
* \brief type for string in flash | |||
*/ | |||
struct pgm { | |||
/** Pointer to flash string */ | |||
char *ptr; | |||
/** constructor | |||
* \param[in] str initializer for pointer. | |||
*/ | |||
explicit pgm(char* str) : ptr(str) {} | |||
/** constructor | |||
* \param[in] str initializer for pointer. | |||
*/ | |||
explicit pgm(const char *str) : ptr(const_cast<char*>(str)) {} | |||
}; | |||
//============================================================================== | |||
/** | |||
* \class ostream | |||
@@ -194,14 +176,7 @@ class ostream : public virtual ios { | |||
putNum(reinterpret_cast<uint32_t>(arg)); | |||
return *this; | |||
} | |||
/** Output a string from flash using the pstr() macro | |||
* \param[in] arg pgm struct pointing to string | |||
* \return the stream | |||
*/ | |||
ostream &operator<< (pgm arg) { | |||
putPgm(arg.ptr); | |||
return *this; | |||
} | |||
#if (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) | |||
/** Output a string from flash using the Arduino F() macro. | |||
* \param[in] arg pointing to flash string | |||
* \return the stream | |||
@@ -210,6 +185,7 @@ class ostream : public virtual ios { | |||
putPgm(reinterpret_cast<const char*>(arg)); | |||
return *this; | |||
} | |||
#endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) | |||
/** | |||
* Puts a character in a stream. | |||
* |
@@ -29,7 +29,7 @@ static int FreeStack() { | |||
char top; | |||
return &top - reinterpret_cast<char*>(sbrk(0)); | |||
} | |||
#else // __arm__ | |||
#elif __AVR__ // __arm__ | |||
/** boundary between stack and heap. */ | |||
extern char *__brkval; | |||
/** End of bss section.*/ | |||
@@ -41,5 +41,11 @@ static int FreeStack() { | |||
char top; | |||
return __brkval ? &top - __brkval : &top - &__bss_end; | |||
} | |||
#elif defined(PLATFORM_ID) // Particle board | |||
static int FreeStack() { | |||
return System.freeMemory(); | |||
} | |||
#else | |||
#warning FreeStack is not defined for this system. | |||
#endif // __arm | |||
#endif // FreeStack_h |
@@ -17,7 +17,7 @@ | |||
* along with the Arduino SdFat Library. If not, see | |||
* <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include <Arduino.h> | |||
#include "SystemInclude.h" | |||
#if defined(UDR0) || defined(DOXYGEN) | |||
#include "MinimumSerial.h" | |||
const uint16_t MIN_2X_BAUD = F_CPU/(4*(2*0XFFF + 1)) + 1; |
@@ -19,7 +19,7 @@ | |||
*/ | |||
#ifndef MinimumSerial_h | |||
#define MinimumSerial_h | |||
#include <Arduino.h> | |||
#include "SystemInclude.h" | |||
//============================================================================== | |||
/** | |||
* \class MinimumSerial |
@@ -29,11 +29,6 @@ void SdFatBase::errorHalt(Print* pr, char const* msg) { | |||
while (1) {} | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::errorHalt(Print* pr, const __FlashStringHelper* msg) { | |||
errorPrint(pr, msg); | |||
while (1) {} | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::errorPrint(Print* pr) { | |||
if (!cardErrorCode()) { | |||
return; | |||
@@ -50,12 +45,6 @@ void SdFatBase::errorPrint(Print* pr, char const* msg) { | |||
errorPrint(pr); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::errorPrint(Print* pr, const __FlashStringHelper* msg) { | |||
pr->print(F("error: ")); | |||
pr->println(msg); | |||
errorPrint(pr); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::initErrorHalt(Print* pr) { | |||
initErrorPrint(pr); | |||
while (1) {} | |||
@@ -66,11 +55,6 @@ void SdFatBase::initErrorHalt(Print* pr, char const *msg) { | |||
initErrorHalt(pr); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::initErrorHalt(Print* pr, const __FlashStringHelper* msg) { | |||
pr->println(msg); | |||
initErrorHalt(pr); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::initErrorPrint(Print* pr) { | |||
if (cardErrorCode()) { | |||
pr->println(F("Can't access SD card. Do not reformat.")); | |||
@@ -91,9 +75,26 @@ void SdFatBase::initErrorPrint(Print* pr, char const *msg) { | |||
pr->println(msg); | |||
initErrorPrint(pr); | |||
} | |||
#if defined(ARDUINO) || defined(DOXYGEN) | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::errorPrint(Print* pr, const __FlashStringHelper* msg) { | |||
pr->print(F("error: ")); | |||
pr->println(msg); | |||
errorPrint(pr); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::errorHalt(Print* pr, const __FlashStringHelper* msg) { | |||
errorPrint(pr, msg); | |||
while (1) {} | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::initErrorHalt(Print* pr, const __FlashStringHelper* msg) { | |||
pr->println(msg); | |||
initErrorHalt(pr); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatBase::initErrorPrint(Print* pr, const __FlashStringHelper* msg) { | |||
pr->println(msg); | |||
initErrorPrint(pr); | |||
} | |||
#endif // defined(ARDUINO) || defined(DOXYGEN) |
@@ -23,11 +23,16 @@ | |||
* \file | |||
* \brief SdFat class | |||
*/ | |||
#ifdef ARDUINO | |||
#include "SdSpiCard/SdSpiCard.h" | |||
#include "FatLib/FatLib.h" | |||
#else // ARDUINO | |||
#include "SdSpiCard.h" | |||
#include "FatLib.h" | |||
#endif // ARDUINO | |||
//------------------------------------------------------------------------------ | |||
/** SdFat version YYYYMMDD */ | |||
#define SD_FAT_VERSION 20150718 | |||
#define SD_FAT_VERSION 20160123 | |||
//============================================================================== | |||
/** | |||
* \class SdBaseFile | |||
@@ -51,7 +56,6 @@ class SdBaseFile : public FatFile { | |||
* \class SdFile | |||
* \brief Class for backward compatibility. | |||
*/ | |||
class SdFile : public PrintFile { | |||
public: | |||
SdFile() {} | |||
@@ -108,19 +112,7 @@ class SdFatBase : public FatFileSystem { | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorHalt(Print* pr, char const* msg); | |||
/** %Print msg, any SD error code, and halt. | |||
* | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorHalt(const __FlashStringHelper* msg) { | |||
errorHalt(&Serial, msg); | |||
} | |||
/** %Print msg, any SD error code, and halt. | |||
* | |||
* \param[in] pr Print destination. | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorHalt(Print* pr, const __FlashStringHelper* msg); | |||
/** %Print any SD error code to Serial */ | |||
void errorPrint() { | |||
errorPrint(&Serial); | |||
@@ -142,19 +134,7 @@ class SdFatBase : public FatFileSystem { | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorPrint(Print* pr, char const* msg); | |||
/** %Print msg, any SD error code. | |||
* | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorPrint(const __FlashStringHelper* msg) { | |||
errorPrint(&Serial, msg); | |||
} | |||
/** %Print msg, any SD error code. | |||
* | |||
* \param[in] pr Print destination. | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorPrint(Print* pr, const __FlashStringHelper* msg); | |||
/** Diagnostic call to initialize FatFileSystem - use for | |||
* diagnostic purposes only. | |||
* \return true for success else false. | |||
@@ -183,18 +163,7 @@ class SdFatBase : public FatFileSystem { | |||
* \param[in] msg Message to print. | |||
*/ | |||
void initErrorHalt(Print* pr, char const *msg); | |||
/**Print message, error details, and halt after SdFat::init() fails. | |||
* | |||
* \param[in] msg Message to print. | |||
*/ | |||
void initErrorHalt(const __FlashStringHelper* msg) { | |||
initErrorHalt(&Serial, msg); | |||
} | |||
/**Print message, error details, and halt after SdFatBase::init() fails. | |||
* \param[in] pr Print device for message. | |||
* \param[in] msg Message to print. | |||
*/ | |||
void initErrorHalt(Print* pr, const __FlashStringHelper* msg); | |||
/** Print error details after SdFat::init() fails. */ | |||
void initErrorPrint() { | |||
initErrorPrint(&Serial); | |||
@@ -217,6 +186,45 @@ class SdFatBase : public FatFileSystem { | |||
* \param[in] msg Message to print. | |||
*/ | |||
void initErrorPrint(Print* pr, char const *msg); | |||
#if defined(ARDUINO) || defined(DOXYGEN) | |||
/** %Print msg, any SD error code, and halt. | |||
* | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorHalt(const __FlashStringHelper* msg) { | |||
errorHalt(&Serial, msg); | |||
} | |||
/** %Print msg, any SD error code, and halt. | |||
* | |||
* \param[in] pr Print destination. | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorHalt(Print* pr, const __FlashStringHelper* msg); | |||
/** %Print msg, any SD error code. | |||
* | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorPrint(const __FlashStringHelper* msg) { | |||
errorPrint(&Serial, msg); | |||
} | |||
/** %Print msg, any SD error code. | |||
* | |||
* \param[in] pr Print destination. | |||
* \param[in] msg Message to print. | |||
*/ | |||
void errorPrint(Print* pr, const __FlashStringHelper* msg); | |||
/**Print message, error details, and halt after SdFat::init() fails. | |||
* | |||
* \param[in] msg Message to print. | |||
*/ | |||
void initErrorHalt(const __FlashStringHelper* msg) { | |||
initErrorHalt(&Serial, msg); | |||
} | |||
/**Print message, error details, and halt after SdFatBase::init() fails. | |||
* \param[in] pr Print device for message. | |||
* \param[in] msg Message to print. | |||
*/ | |||
void initErrorHalt(Print* pr, const __FlashStringHelper* msg); | |||
/**Print message and error details and halt after SdFat::init() fails. | |||
* | |||
* \param[in] msg Message to print. | |||
@@ -230,7 +238,8 @@ class SdFatBase : public FatFileSystem { | |||
* \param[in] msg Message to print. | |||
*/ | |||
void initErrorPrint(Print* pr, const __FlashStringHelper* msg); | |||
#endif //defined(ARDUINO) || defined(DOXYGEN) | |||
private: | |||
uint8_t cardErrorCode() { | |||
return m_sdCard.errorCode(); | |||
@@ -259,6 +268,15 @@ class SdFatBase : public FatFileSystem { | |||
*/ | |||
class SdFat : public SdFatBase { | |||
public: | |||
#if IMPLEMENT_SPI_INTERFACE_SELECTION | |||
SdFat() { | |||
m_spi.setSpiIf(0); | |||
} | |||
SdFat(uint8_t spiIf) { | |||
m_spi.setSpiIf(spiIf < SPI_INTERFACE_COUNT ? spiIf : 0); | |||
} | |||
#endif // IMPLEMENT_SPI_INTERFACE_SELECTION | |||
/** Initialize SD card and file system. | |||
* | |||
* \param[in] csPin SD card chip select pin. |
@@ -59,21 +59,6 @@ | |||
*/ | |||
#define ARDUINO_FILE_USES_STREAM 1 | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* Determine the default SPI configuration. | |||
*/ | |||
#if defined(__AVR__)\ | |||
|| defined(__SAM3X8E__) || defined(__SAM3X8H__)\ | |||
|| (defined(__arm__) && defined(CORE_TEENSY))\ | |||
|| defined(__STM32F1__)\ | |||
|| defined(DOXYGEN) | |||
// Use custom fast implementation. | |||
#define SD_HAS_CUSTOM_SPI 1 | |||
#else // SD_HAS_CUSTOM_SPI | |||
// Use standard SPI library. | |||
#define SD_HAS_CUSTOM_SPI 0 | |||
#endif // SD_HAS_CUSTOM_SPI | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* The symbol SD_SPI_CONFIGURATION defines SPI access to the SD card. | |||
* | |||
@@ -132,19 +117,6 @@ uint8_t const SOFT_SPI_SCK_PIN = 13; | |||
*/ | |||
#define ENABLE_SPI_TRANSACTIONS 0 | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* Set ENABLE_SPI_YIELD nonzero to enable release of the SPI bus during | |||
* SD card busy waits. | |||
* | |||
* This will allow interrupt routines to access the SPI bus if | |||
* ENABLE_SPI_TRANSACTIONS is nonzero. | |||
* | |||
* Setting ENABLE_SPI_YIELD will introduce some extra overhead and will | |||
* slightly slow transfer rates. A few older SD cards may fail when | |||
* ENABLE_SPI_YIELD is nonzero. | |||
*/ | |||
#define ENABLE_SPI_YIELD 0 | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* Set FAT12_SUPPORT nonzero to enable use if FAT12 volumes. | |||
* FAT12 has not been well tested and requires additional flash. | |||
@@ -208,4 +180,45 @@ const uint8_t SPI_SCK_INIT_DIVISOR = 128; | |||
#else // RAMEND | |||
#define USE_MULTI_BLOCK_IO 1 | |||
#endif // RAMEND | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* Determine the default SPI configuration. | |||
*/ | |||
#if defined(__AVR__)\ | |||
|| defined(__SAM3X8E__) || defined(__SAM3X8H__)\ | |||
|| (defined(__arm__) && defined(CORE_TEENSY))\ | |||
|| defined(__STM32F1__)\ | |||
|| defined(PLATFORM_ID)\ | |||
|| defined(DOXYGEN) | |||
// Use custom fast implementation. | |||
#define SD_HAS_CUSTOM_SPI 1 | |||
#else // SD_HAS_CUSTOM_SPI | |||
// Use standard SPI library. | |||
#define SD_HAS_CUSTOM_SPI 0 | |||
#endif // SD_HAS_CUSTOM_SPI | |||
//----------------------------------------------------------------------------- | |||
/** | |||
* Number of hardware interfaces. | |||
*/ | |||
#if defined(PLATFORM_ID) | |||
#if Wiring_SPI1 && Wiring_SPI2 | |||
#define SPI_INTERFACE_COUNT 3 | |||
#elif Wiring_SPI1 | |||
#define SPI_INTERFACE_COUNT 2 | |||
#endif // Wiring_SPI1 && Wiring_SPI2 | |||
#endif // defined(PLATFORM_ID) | |||
// default is one | |||
#ifndef SPI_INTERFACE_COUNT | |||
#define SPI_INTERFACE_COUNT 1 | |||
#endif // SPI_INTERFACE_COUNT | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* Check if API to select HW SPI interface is needed. | |||
*/ | |||
#if SPI_INTERFACE_COUNT > 1 && SD_HAS_CUSTOM_SPI\ | |||
&& SD_SPI_CONFIGURATION != 1 && SD_SPI_CONFIGURATION != 2 | |||
#define IMPLEMENT_SPI_INTERFACE_SELECTION 1 | |||
#else // SPI_INTERFACE_COUNT > 1 | |||
#define IMPLEMENT_SPI_INTERFACE_SELECTION 0 | |||
#endif // SPI_INTERFACE_COUNT > 1 | |||
#endif // SdFatConfig_h |
@@ -38,14 +38,4 @@ int SdFatUtil::FreeRam() { | |||
return __brkval ? &top - __brkval : &top - &__bss_end; | |||
} | |||
#endif // __arm | |||
//------------------------------------------------------------------------------ | |||
void SdFatUtil::print_P(Print* pr, PGM_P str) { | |||
for (uint8_t c; (c = pgm_read_byte(str)); str++) { | |||
pr->write(c); | |||
} | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdFatUtil::println_P(Print* pr, PGM_P str) { | |||
print_P(pr, str); | |||
pr->println(); | |||
} | |||
@@ -24,44 +24,12 @@ | |||
* \brief Useful utility functions. | |||
*/ | |||
#include "SdFat.h" | |||
/** Store and print a string in flash memory.*/ | |||
#define PgmPrint(x) SerialPrint_P(PSTR(x)) | |||
/** Store and print a string in flash memory followed by a CR/LF.*/ | |||
#define PgmPrintln(x) SerialPrintln_P(PSTR(x)) | |||
namespace SdFatUtil { | |||
/** Amount of free RAM | |||
* \return The number of free bytes. | |||
*/ | |||
int FreeRam(); | |||
/** %Print a string in flash memory. | |||
* | |||
* \param[in] pr Print object for output. | |||
* \param[in] str Pointer to string stored in flash memory. | |||
*/ | |||
void print_P(Print* pr, PGM_P str); | |||
/** %Print a string in flash memory followed by a CR/LF. | |||
* | |||
* \param[in] pr Print object for output. | |||
* \param[in] str Pointer to string stored in flash memory. | |||
*/ | |||
void println_P(Print* pr, PGM_P str); | |||
//---------------------------------------------------------------------------- | |||
/** %Print a string in flash memory to Serial. | |||
* | |||
* \param[in] str Pointer to string stored in flash memory. | |||
*/ | |||
inline void SerialPrint_P(PGM_P str) { | |||
print_P(&Serial, str); | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** %Print a string in flash memory to Serial followed by a CR/LF. | |||
* | |||
* \param[in] str Pointer to string stored in flash memory. | |||
*/ | |||
inline void SerialPrintln_P(PGM_P str) { | |||
println_P(&Serial, str); | |||
} | |||
} // namespace SdFatUtil | |||
using namespace SdFatUtil; // NOLINT | |||
#endif // #define SdFatUtil_h |
@@ -27,7 +27,7 @@ | |||
*/ | |||
#ifndef DigitalPin_h | |||
#define DigitalPin_h | |||
#include <Arduino.h> | |||
#include "SystemInclude.h" | |||
#ifdef __arm__ | |||
#ifdef CORE_TEENSY | |||
//------------------------------------------------------------------------------ | |||
@@ -46,20 +46,20 @@ bool fastDigitalRead(uint8_t pin) { | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastDigitalWrite(uint8_t pin, bool value) { | |||
if (value) { | |||
*portSetRegister(pin) = 1; | |||
} else { | |||
*portClearRegister(pin) = 1; | |||
} | |||
if (value) { | |||
*portSetRegister(pin) = 1; | |||
} else { | |||
*portClearRegister(pin) = 1; | |||
} | |||
} | |||
#elif defined(__SAM3X8E__) || defined(__SAM3X8H__) // CORE_TEENSY | |||
#else // CORE_TEENSY | |||
//------------------------------------------------------------------------------ | |||
/** read pin value | |||
* @param[in] pin Arduino pin number | |||
* @return value read | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
bool fastDigitalRead(uint8_t pin) { | |||
bool fastDigitalRead(uint8_t pin){ | |||
return g_APinDescription[pin].pPort->PIO_PDSR & g_APinDescription[pin].ulPin; | |||
} | |||
//------------------------------------------------------------------------------ | |||
@@ -68,544 +68,181 @@ bool fastDigitalRead(uint8_t pin) { | |||
* @param[in] level value to write | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastDigitalWrite(uint8_t pin, bool value) { | |||
if (value) { | |||
void fastDigitalWrite(uint8_t pin, bool value){ | |||
if(value) { | |||
g_APinDescription[pin].pPort->PIO_SODR = g_APinDescription[pin].ulPin; | |||
} else { | |||
g_APinDescription[pin].pPort->PIO_CODR = g_APinDescription[pin].ulPin; | |||
} | |||
} | |||
#else // CORE_TEENSY | |||
//------------------------------------------------------------------------------ | |||
/** read pin value | |||
* @param[in] pin Arduino pin number | |||
* @return value read | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
bool fastDigitalRead(uint8_t pin) { | |||
return digitalRead(pin); | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** Set pin value | |||
* @param[in] pin Arduino pin number | |||
* @param[in] level value to write | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastDigitalWrite(uint8_t pin, bool value) { | |||
digitalWrite(pin, value); | |||
} | |||
#endif // CORE_TEENSY | |||
//------------------------------------------------------------------------------ | |||
inline void fastDigitalToggle(uint8_t pin) { | |||
fastDigitalWrite(pin, !fastDigitalRead(pin)); | |||
} | |||
fastDigitalWrite(pin, !fastDigitalRead(pin)); | |||
} | |||
//------------------------------------------------------------------------------ | |||
inline void fastPinMode(uint8_t pin, bool mode) { | |||
pinMode(pin, mode); | |||
} | |||
inline void fastPinMode(uint8_t pin, uint8_t mode) {pinMode(pin, mode);} | |||
#else // __arm__ | |||
//============================================================================== | |||
#include <avr/io.h> | |||
#include <util/atomic.h> | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* @class pin_map_t | |||
* @brief struct for mapping digital pins | |||
*/ | |||
struct pin_map_t { | |||
/** GpioPinMap type */ | |||
struct GpioPinMap_t { | |||
volatile uint8_t* pin; /**< address of PIN for this pin */ | |||
volatile uint8_t* ddr; /**< address of DDR for this pin */ | |||
volatile uint8_t* pin; /**< address of PIN for this pin */ | |||
volatile uint8_t* port; /**< address of PORT for this pin */ | |||
uint8_t bit; /**< bit number for this pin */ | |||
}; | |||
//------------------------------------------------------------------------------ | |||
#if defined(__AVR_ATmega168__)\ | |||
||defined(__AVR_ATmega168P__)\ | |||
||defined(__AVR_ATmega328P__) | |||
// 168 and 328 Arduinos | |||
static const pin_map_t pinMap[] = { | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 0 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 1 | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 2 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 3 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 4 | |||
{&DDRD, &PIND, &PORTD, 5}, // D5 5 | |||
{&DDRD, &PIND, &PORTD, 6}, // D6 6 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 7 | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 8 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 9 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 10 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 11 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 12 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 13 | |||
{&DDRC, &PINC, &PORTC, 0}, // C0 14 | |||
{&DDRC, &PINC, &PORTC, 1}, // C1 15 | |||
{&DDRC, &PINC, &PORTC, 2}, // C2 16 | |||
{&DDRC, &PINC, &PORTC, 3}, // C3 17 | |||
{&DDRC, &PINC, &PORTC, 4}, // C4 18 | |||
{&DDRC, &PINC, &PORTC, 5} // C5 19 | |||
}; | |||
//------------------------------------------------------------------------------ | |||
#elif defined(__AVR_ATmega1280__)\ | |||
|| defined(__AVR_ATmega2560__) | |||
// Mega | |||
static const pin_map_t pinMap[] = { | |||
{&DDRE, &PINE, &PORTE, 0}, // E0 0 | |||
{&DDRE, &PINE, &PORTE, 1}, // E1 1 | |||
{&DDRE, &PINE, &PORTE, 4}, // E4 2 | |||
{&DDRE, &PINE, &PORTE, 5}, // E5 3 | |||
{&DDRG, &PING, &PORTG, 5}, // G5 4 | |||
{&DDRE, &PINE, &PORTE, 3}, // E3 5 | |||
{&DDRH, &PINH, &PORTH, 3}, // H3 6 | |||
{&DDRH, &PINH, &PORTH, 4}, // H4 7 | |||
{&DDRH, &PINH, &PORTH, 5}, // H5 8 | |||
{&DDRH, &PINH, &PORTH, 6}, // H6 9 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 10 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 11 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 12 | |||
{&DDRB, &PINB, &PORTB, 7}, // B7 13 | |||
{&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 | |||
{&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 | |||
{&DDRH, &PINH, &PORTH, 1}, // H1 16 | |||
{&DDRH, &PINH, &PORTH, 0}, // H0 17 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 18 | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 19 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 20 | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 21 | |||
{&DDRA, &PINA, &PORTA, 0}, // A0 22 | |||
{&DDRA, &PINA, &PORTA, 1}, // A1 23 | |||
{&DDRA, &PINA, &PORTA, 2}, // A2 24 | |||
{&DDRA, &PINA, &PORTA, 3}, // A3 25 | |||
{&DDRA, &PINA, &PORTA, 4}, // A4 26 | |||
{&DDRA, &PINA, &PORTA, 5}, // A5 27 | |||
{&DDRA, &PINA, &PORTA, 6}, // A6 28 | |||
{&DDRA, &PINA, &PORTA, 7}, // A7 29 | |||
{&DDRC, &PINC, &PORTC, 7}, // C7 30 | |||
{&DDRC, &PINC, &PORTC, 6}, // C6 31 | |||
{&DDRC, &PINC, &PORTC, 5}, // C5 32 | |||
{&DDRC, &PINC, &PORTC, 4}, // C4 33 | |||
{&DDRC, &PINC, &PORTC, 3}, // C3 34 | |||
{&DDRC, &PINC, &PORTC, 2}, // C2 35 | |||
{&DDRC, &PINC, &PORTC, 1}, // C1 36 | |||
{&DDRC, &PINC, &PORTC, 0}, // C0 37 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 38 | |||
{&DDRG, &PING, &PORTG, 2}, // G2 39 | |||
{&DDRG, &PING, &PORTG, 1}, // G1 40 | |||
{&DDRG, &PING, &PORTG, 0}, // G0 41 | |||
{&DDRL, &PINL, &PORTL, 7}, // L7 42 | |||
{&DDRL, &PINL, &PORTL, 6}, // L6 43 | |||
{&DDRL, &PINL, &PORTL, 5}, // L5 44 | |||
{&DDRL, &PINL, &PORTL, 4}, // L4 45 | |||
{&DDRL, &PINL, &PORTL, 3}, // L3 46 | |||
{&DDRL, &PINL, &PORTL, 2}, // L2 47 | |||
{&DDRL, &PINL, &PORTL, 1}, // L1 48 | |||
{&DDRL, &PINL, &PORTL, 0}, // L0 49 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 50 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 51 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 52 | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 53 | |||
{&DDRF, &PINF, &PORTF, 0}, // F0 54 | |||
{&DDRF, &PINF, &PORTF, 1}, // F1 55 | |||
{&DDRF, &PINF, &PORTF, 2}, // F2 56 | |||
{&DDRF, &PINF, &PORTF, 3}, // F3 57 | |||
{&DDRF, &PINF, &PORTF, 4}, // F4 58 | |||
{&DDRF, &PINF, &PORTF, 5}, // F5 59 | |||
{&DDRF, &PINF, &PORTF, 6}, // F6 60 | |||
{&DDRF, &PINF, &PORTF, 7}, // F7 61 | |||
{&DDRK, &PINK, &PORTK, 0}, // K0 62 | |||
{&DDRK, &PINK, &PORTK, 1}, // K1 63 | |||
{&DDRK, &PINK, &PORTK, 2}, // K2 64 | |||
{&DDRK, &PINK, &PORTK, 3}, // K3 65 | |||
{&DDRK, &PINK, &PORTK, 4}, // K4 66 | |||
{&DDRK, &PINK, &PORTK, 5}, // K5 67 | |||
{&DDRK, &PINK, &PORTK, 6}, // K6 68 | |||
{&DDRK, &PINK, &PORTK, 7} // K7 69 | |||
}; | |||
//------------------------------------------------------------------------------ | |||
#elif defined(__AVR_ATmega1284P__)\ | |||
|| defined(__AVR_ATmega1284__)\ | |||
|| defined(__AVR_ATmega644P__)\ | |||
|| defined(__AVR_ATmega644__)\ | |||
|| defined(__AVR_ATmega64__)\ | |||
|| defined(__AVR_ATmega32__)\ | |||
|| defined(__AVR_ATmega324__)\ | |||
|| defined(__AVR_ATmega16__) | |||
#ifdef PORT_D0 | |||
// Newer version of 1284P | |||
#define DPM(x) {PORT_TO_MODE(PORT_D##x), PORT_TO_INPUT(PORT_D##x), \ | |||
PORT_TO_OUTPUT(PORT_D##x), BIT_D##x} | |||
static const pin_map_t pinMap[] = { | |||
DPM(0), | |||
DPM(1), | |||
DPM(2), | |||
DPM(3), | |||
DPM(4), | |||
DPM(5), | |||
DPM(6), | |||
DPM(7), | |||
DPM(8), | |||
DPM(9), | |||
DPM(10), | |||
DPM(11), | |||
DPM(12), | |||
DPM(13), | |||
DPM(14), | |||
DPM(15), | |||
DPM(16), | |||
DPM(17), | |||
DPM(18), | |||
DPM(19), | |||
DPM(20), | |||
DPM(21), | |||
DPM(22), | |||
DPM(23), | |||
DPM(24), | |||
DPM(25), | |||
DPM(26), | |||
DPM(27), | |||
DPM(28), | |||
DPM(29), | |||
DPM(30), | |||
DPM(31) | |||
uint8_t mask; /**< bit mask for this pin */ | |||
}; | |||
#undef DPM | |||
/** Initializer macro. */ | |||
#define GPIO_PIN(reg, bit) {&PIN##reg, &DDR##reg, &PORT##reg, 1 << bit} | |||
#elif analogInputToDigitalPin(0) == 24 | |||
// Mighty Layout | |||
static const pin_map_t pinMap[] = { | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 0 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 1 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 2 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 3 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 4 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 5 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 6 | |||
{&DDRB, &PINB, &PORTB, 7}, // B7 7 | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 8 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 9 | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 10 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 11 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 12 | |||
{&DDRD, &PIND, &PORTD, 5}, // D5 13 | |||
{&DDRD, &PIND, &PORTD, 6}, // D6 14 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 15 | |||
{&DDRC, &PINC, &PORTC, 0}, // C0 16 | |||
{&DDRC, &PINC, &PORTC, 1}, // C1 17 | |||
{&DDRC, &PINC, &PORTC, 2}, // C2 18 | |||
{&DDRC, &PINC, &PORTC, 3}, // C3 19 | |||
{&DDRC, &PINC, &PORTC, 4}, // C4 20 | |||
{&DDRC, &PINC, &PORTC, 5}, // C5 21 | |||
{&DDRC, &PINC, &PORTC, 6}, // C6 22 | |||
{&DDRC, &PINC, &PORTC, 7}, // C7 23 | |||
{&DDRA, &PINA, &PORTA, 0}, // A0 24 | |||
{&DDRA, &PINA, &PORTA, 1}, // A1 25 | |||
{&DDRA, &PINA, &PORTA, 2}, // A2 26 | |||
{&DDRA, &PINA, &PORTA, 3}, // A3 27 | |||
{&DDRA, &PINA, &PORTA, 4}, // A4 28 | |||
{&DDRA, &PINA, &PORTA, 5}, // A5 29 | |||
{&DDRA, &PINA, &PORTA, 6}, // A6 30 | |||
{&DDRA, &PINA, &PORTA, 7} // A7 31 | |||
}; | |||
#elif analogInputToDigitalPin(0) == 21 | |||
// Bobuino Layout | |||
static const pin_map_t pinMap[] = { | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 0 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 1 | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 2 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 3 | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 4 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 5 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 6 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 7 | |||
{&DDRD, &PIND, &PORTD, 5}, // D5 8 | |||
{&DDRD, &PIND, &PORTD, 6}, // D6 9 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 10 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 11 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 12 | |||
{&DDRB, &PINB, &PORTB, 7}, // B7 13 | |||
{&DDRA, &PINA, &PORTA, 7}, // A7 14 | |||
{&DDRA, &PINA, &PORTA, 6}, // A6 15 | |||
{&DDRA, &PINA, &PORTA, 5}, // A5 16 | |||
{&DDRA, &PINA, &PORTA, 4}, // A4 17 | |||
{&DDRA, &PINA, &PORTA, 3}, // A3 18 | |||
{&DDRA, &PINA, &PORTA, 2}, // A2 19 | |||
{&DDRA, &PINA, &PORTA, 1}, // A1 20 | |||
{&DDRA, &PINA, &PORTA, 0}, // A0 21 | |||
{&DDRC, &PINC, &PORTC, 0}, // C0 22 | |||
{&DDRC, &PINC, &PORTC, 1}, // C1 23 | |||
{&DDRC, &PINC, &PORTC, 2}, // C2 24 | |||
{&DDRC, &PINC, &PORTC, 3}, // C3 25 | |||
{&DDRC, &PINC, &PORTC, 4}, // C4 26 | |||
{&DDRC, &PINC, &PORTC, 5}, // C5 27 | |||
{&DDRC, &PINC, &PORTC, 6}, // C6 28 | |||
{&DDRC, &PINC, &PORTC, 7}, // C7 29 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 30 | |||
{&DDRD, &PIND, &PORTD, 7} // D7 31 | |||
}; | |||
#elif analogInputToDigitalPin(0) == 31 | |||
// Standard Layout | |||
static const pin_map_t pinMap[] = { | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 0 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 1 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 2 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 3 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 4 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 5 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 6 | |||
{&DDRB, &PINB, &PORTB, 7}, // B7 7 | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 8 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 9 | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 10 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 11 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 12 | |||
{&DDRD, &PIND, &PORTD, 5}, // D5 13 | |||
{&DDRD, &PIND, &PORTD, 6}, // D6 14 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 15 | |||
{&DDRC, &PINC, &PORTC, 0}, // C0 16 | |||
{&DDRC, &PINC, &PORTC, 1}, // C1 17 | |||
{&DDRC, &PINC, &PORTC, 2}, // C2 18 | |||
{&DDRC, &PINC, &PORTC, 3}, // C3 19 | |||
{&DDRC, &PINC, &PORTC, 4}, // C4 20 | |||
{&DDRC, &PINC, &PORTC, 5}, // C5 21 | |||
{&DDRC, &PINC, &PORTC, 6}, // C6 22 | |||
{&DDRC, &PINC, &PORTC, 7}, // C7 23 | |||
{&DDRA, &PINA, &PORTA, 7}, // A7 24 | |||
{&DDRA, &PINA, &PORTA, 6}, // A6 25 | |||
{&DDRA, &PINA, &PORTA, 5}, // A5 26 | |||
{&DDRA, &PINA, &PORTA, 4}, // A4 27 | |||
{&DDRA, &PINA, &PORTA, 3}, // A3 28 | |||
{&DDRA, &PINA, &PORTA, 2}, // A2 29 | |||
{&DDRA, &PINA, &PORTA, 1}, // A1 30 | |||
{&DDRA, &PINA, &PORTA, 0} // A0 31 | |||
}; | |||
#else // VARIANT_MIGHTY | |||
#error Undefined variant 1284, 644, 324, 64, 32 | |||
#endif // VARIANT_MIGHTY | |||
//------------------------------------------------------------------------------ | |||
#elif defined(__AVR_ATmega32U4__) | |||
#ifdef CORE_TEENSY | |||
// Teensy 2.0 | |||
static const pin_map_t pinMap[] = { | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 0 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 1 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 2 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 3 | |||
{&DDRB, &PINB, &PORTB, 7}, // B7 4 | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 5 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 6 | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 7 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 8 | |||
{&DDRC, &PINC, &PORTC, 6}, // C6 9 | |||
{&DDRC, &PINC, &PORTC, 7}, // C7 10 | |||
{&DDRD, &PIND, &PORTD, 6}, // D6 11 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 12 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 13 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 14 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 15 | |||
{&DDRF, &PINF, &PORTF, 7}, // F7 16 | |||
{&DDRF, &PINF, &PORTF, 6}, // F6 17 | |||
{&DDRF, &PINF, &PORTF, 5}, // F5 18 | |||
{&DDRF, &PINF, &PORTF, 4}, // F4 19 | |||
{&DDRF, &PINF, &PORTF, 1}, // F1 20 | |||
{&DDRF, &PINF, &PORTF, 0}, // F0 21 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 22 | |||
{&DDRD, &PIND, &PORTD, 5}, // D5 23 | |||
{&DDRE, &PINE, &PORTE, 6} // E6 24 | |||
}; | |||
//------------------------------------------------------------------------------ | |||
#else // CORE_TEENSY | |||
// Leonardo | |||
static const pin_map_t pinMap[] = { | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 0 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 1 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 2 | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 3 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 4 | |||
{&DDRC, &PINC, &PORTC, 6}, // C6 5 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 6 | |||
{&DDRE, &PINE, &PORTE, 6}, // E6 7 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 8 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 9 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 10 | |||
{&DDRB, &PINB, &PORTB, 7}, // B7 11 | |||
{&DDRD, &PIND, &PORTD, 6}, // D6 12 | |||
{&DDRC, &PINC, &PORTC, 7}, // C7 13 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 14 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 15 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 16 | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 17 | |||
{&DDRF, &PINF, &PORTF, 7}, // F7 18 | |||
{&DDRF, &PINF, &PORTF, 6}, // F6 19 | |||
{&DDRF, &PINF, &PORTF, 5}, // F5 20 | |||
{&DDRF, &PINF, &PORTF, 4}, // F4 21 | |||
{&DDRF, &PINF, &PORTF, 1}, // F1 22 | |||
{&DDRF, &PINF, &PORTF, 0}, // F0 23 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 24 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 25 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 26 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 27 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 28 | |||
{&DDRD, &PIND, &PORTD, 6} // D6 29 | |||
}; | |||
#endif // CORE_TEENSY | |||
//------------------------------------------------------------------------------ | |||
#elif defined(__AVR_AT90USB646__)\ | |||
|| defined(__AVR_AT90USB1286__) | |||
// Teensy++ 1.0 & 2.0 | |||
static const pin_map_t pinMap[] = { | |||
{&DDRD, &PIND, &PORTD, 0}, // D0 0 | |||
{&DDRD, &PIND, &PORTD, 1}, // D1 1 | |||
{&DDRD, &PIND, &PORTD, 2}, // D2 2 | |||
{&DDRD, &PIND, &PORTD, 3}, // D3 3 | |||
{&DDRD, &PIND, &PORTD, 4}, // D4 4 | |||
{&DDRD, &PIND, &PORTD, 5}, // D5 5 | |||
{&DDRD, &PIND, &PORTD, 6}, // D6 6 | |||
{&DDRD, &PIND, &PORTD, 7}, // D7 7 | |||
{&DDRE, &PINE, &PORTE, 0}, // E0 8 | |||
{&DDRE, &PINE, &PORTE, 1}, // E1 9 | |||
{&DDRC, &PINC, &PORTC, 0}, // C0 10 | |||
{&DDRC, &PINC, &PORTC, 1}, // C1 11 | |||
{&DDRC, &PINC, &PORTC, 2}, // C2 12 | |||
{&DDRC, &PINC, &PORTC, 3}, // C3 13 | |||
{&DDRC, &PINC, &PORTC, 4}, // C4 14 | |||
{&DDRC, &PINC, &PORTC, 5}, // C5 15 | |||
{&DDRC, &PINC, &PORTC, 6}, // C6 16 | |||
{&DDRC, &PINC, &PORTC, 7}, // C7 17 | |||
{&DDRE, &PINE, &PORTE, 6}, // E6 18 | |||
{&DDRE, &PINE, &PORTE, 7}, // E7 19 | |||
{&DDRB, &PINB, &PORTB, 0}, // B0 20 | |||
{&DDRB, &PINB, &PORTB, 1}, // B1 21 | |||
{&DDRB, &PINB, &PORTB, 2}, // B2 22 | |||
{&DDRB, &PINB, &PORTB, 3}, // B3 23 | |||
{&DDRB, &PINB, &PORTB, 4}, // B4 24 | |||
{&DDRB, &PINB, &PORTB, 5}, // B5 25 | |||
{&DDRB, &PINB, &PORTB, 6}, // B6 26 | |||
{&DDRB, &PINB, &PORTB, 7}, // B7 27 | |||
{&DDRA, &PINA, &PORTA, 0}, // A0 28 | |||
{&DDRA, &PINA, &PORTA, 1}, // A1 29 | |||
{&DDRA, &PINA, &PORTA, 2}, // A2 30 | |||
{&DDRA, &PINA, &PORTA, 3}, // A3 31 | |||
{&DDRA, &PINA, &PORTA, 4}, // A4 32 | |||
{&DDRA, &PINA, &PORTA, 5}, // A5 33 | |||
{&DDRA, &PINA, &PORTA, 6}, // A6 34 | |||
{&DDRA, &PINA, &PORTA, 7}, // A7 35 | |||
{&DDRE, &PINE, &PORTE, 4}, // E4 36 | |||
{&DDRE, &PINE, &PORTE, 5}, // E5 37 | |||
{&DDRF, &PINF, &PORTF, 0}, // F0 38 | |||
{&DDRF, &PINF, &PORTF, 1}, // F1 39 | |||
{&DDRF, &PINF, &PORTF, 2}, // F2 40 | |||
{&DDRF, &PINF, &PORTF, 3}, // F3 41 | |||
{&DDRF, &PINF, &PORTF, 4}, // F4 42 | |||
{&DDRF, &PINF, &PORTF, 5}, // F5 43 | |||
{&DDRF, &PINF, &PORTF, 6}, // F6 44 | |||
{&DDRF, &PINF, &PORTF, 7} // F7 45 | |||
}; | |||
//------------------------------------------------------------------------------ | |||
#else // CPU type | |||
#error unknown CPU type | |||
#endif // CPU type | |||
// Include pin map for current board. | |||
#include "boards/GpioPinMap.h" | |||
//------------------------------------------------------------------------------ | |||
/** count of pins */ | |||
static const uint8_t digitalPinCount = sizeof(pinMap)/sizeof(pin_map_t); | |||
//============================================================================== | |||
/** generate bad pin number error */ | |||
void badPinNumber(void) | |||
__attribute__((error("Pin number is too large or not a constant"))); | |||
__attribute__((error("Pin number is too large or not a constant"))); | |||
//------------------------------------------------------------------------------ | |||
/** Check for valid pin number | |||
* @param[in] pin Number of pin to be checked. | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void badPinCheck(uint8_t pin) { | |||
if (!__builtin_constant_p(pin) || pin >= digitalPinCount) { | |||
badPinNumber(); | |||
if (!__builtin_constant_p(pin) || pin >= NUM_DIGITAL_PINS) { | |||
badPinNumber(); | |||
} | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** fast write helper | |||
/** DDR register address | |||
* @param[in] pin Arduino pin number | |||
* @return register address | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
volatile uint8_t* ddrReg(uint8_t pin) { | |||
badPinCheck(pin); | |||
return GpioPinMap[pin].ddr; | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** Bit mask for pin | |||
* @param[in] pin Arduino pin number | |||
* @return mask | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
uint8_t pinMask(uint8_t pin) { | |||
badPinCheck(pin); | |||
return GpioPinMap[pin].mask; | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** PIN register address | |||
* @param[in] pin Arduino pin number | |||
* @return register address | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
volatile uint8_t* pinReg(uint8_t pin) { | |||
badPinCheck(pin); | |||
return GpioPinMap[pin].pin; | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** PORT register address | |||
* @param[in] pin Arduino pin number | |||
* @return register address | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
volatile uint8_t* portReg(uint8_t pin) { | |||
badPinCheck(pin); | |||
return GpioPinMap[pin].port; | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** Fast write helper. | |||
* @param[in] address I/O register address | |||
* @param[in] bit bit number to write | |||
* @param[in] mask bit mask for pin | |||
* @param[in] level value for bit | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastBitWriteSafe(volatile uint8_t* address, uint8_t bit, bool level) { | |||
uint8_t oldSREG; | |||
if (address > reinterpret_cast<uint8_t*>(0X5F)) { | |||
oldSREG = SREG; | |||
void fastBitWriteSafe(volatile uint8_t* address, uint8_t mask, bool level) { | |||
uint8_t s; | |||
if (address > (uint8_t*)0X3F) { | |||
s = SREG; | |||
cli(); | |||
} | |||
if (level) { | |||
*address |= 1 << bit; | |||
*address |= mask; | |||
} else { | |||
*address &= ~(1 << bit); | |||
*address &= ~mask; | |||
} | |||
if (address > reinterpret_cast<uint8_t*>(0X5F)) { | |||
SREG = oldSREG; | |||
if (address > (uint8_t*)0X3F) { | |||
SREG = s; | |||
} | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** read pin value | |||
/** Read pin value. | |||
* @param[in] pin Arduino pin number | |||
* @return value read | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
bool fastDigitalRead(uint8_t pin) { | |||
badPinCheck(pin); | |||
return (*pinMap[pin].pin >> pinMap[pin].bit) & 1; | |||
return *pinReg(pin) & pinMask(pin); | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** toggle a pin | |||
/** Toggle a pin. | |||
* @param[in] pin Arduino pin number | |||
* | |||
* If the pin is in output mode toggle the pin level. | |||
* If the pin is in input mode toggle the state of the 20K pull-up. | |||
* If the pin is in input mode toggle the state of the 20K pullup. | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastDigitalToggle(uint8_t pin) { | |||
badPinCheck(pin); | |||
if (pinMap[pin].pin > reinterpret_cast<uint8_t*>(0X5F)) { | |||
// must write bit to high address port | |||
*pinMap[pin].pin = 1 << pinMap[pin].bit; | |||
} else { | |||
// will compile to sbi and PIN register will not be read. | |||
*pinMap[pin].pin |= 1 << pinMap[pin].bit; | |||
} | |||
if (pinReg(pin) > (uint8_t*)0X3F) { | |||
// must write bit to high address port | |||
*pinReg(pin) = pinMask(pin); | |||
} else { | |||
// will compile to sbi and PIN register will not be read. | |||
*pinReg(pin) |= pinMask(pin); | |||
} | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** Set pin value | |||
/** Set pin value. | |||
* @param[in] pin Arduino pin number | |||
* @param[in] level value to write | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastDigitalWrite(uint8_t pin, bool level) { | |||
badPinCheck(pin); | |||
fastBitWriteSafe(pinMap[pin].port, pinMap[pin].bit, level); | |||
fastBitWriteSafe(portReg(pin), pinMask(pin), level); | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** Write the DDR register. | |||
* @param[in] pin Arduino pin number | |||
* @param[in] level value to write | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastDdrWrite(uint8_t pin, bool level) { | |||
fastBitWriteSafe(ddrReg(pin), pinMask(pin), level); | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** set pin mode | |||
/** Set pin mode. | |||
* @param[in] pin Arduino pin number | |||
* @param[in] mode if true set output mode else input mode | |||
* @param[in] mode INPUT, OUTPUT, or INPUT_PULLUP. | |||
* | |||
* fastPinMode does not enable or disable the 20K pull-up for input mode. | |||
* The internal pullup resistors will be enabled if mode is INPUT_PULLUP | |||
* and disabled if the mode is INPUT. | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastPinMode(uint8_t pin, bool mode) { | |||
badPinCheck(pin); | |||
fastBitWriteSafe(pinMap[pin].ddr, pinMap[pin].bit, mode); | |||
void fastPinMode(uint8_t pin, uint8_t mode) { | |||
fastDdrWrite(pin, mode == OUTPUT); | |||
if (mode != OUTPUT) { | |||
fastDigitalWrite(pin, mode == INPUT_PULLUP); | |||
} | |||
} | |||
#endif // __arm__ | |||
//------------------------------------------------------------------------------ | |||
/** set pin configuration | |||
* @param[in] pin Arduino pin number | |||
* @param[in] mode If true set output mode else input mode | |||
* @param[in] mode mode INPUT or OUTPUT. | |||
* @param[in] level If mode is output, set level high/low. | |||
* If mode is input, enable or disable the pin's 20K pull-up. | |||
* If mode is input, enable or disable the pin's 20K pullup. | |||
*/ | |||
static inline __attribute__((always_inline)) | |||
void fastPinConfig(uint8_t pin, bool mode, bool level) { | |||
void fastPinConfig(uint8_t pin, uint8_t mode, bool level) { | |||
fastPinMode(pin, mode); | |||
fastDigitalWrite(pin, level); | |||
} | |||
@@ -621,23 +258,7 @@ class DigitalPin { | |||
/** Constructor */ | |||
DigitalPin() {} | |||
//---------------------------------------------------------------------------- | |||
/** Constructor | |||
* @param[in] pinMode if true set output mode else input mode. | |||
*/ | |||
explicit DigitalPin(bool pinMode) { | |||
mode(pinMode); | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** Constructor | |||
* @param[in] mode If true set output mode else input mode | |||
* @param[in] level If mode is output, set level high/low. | |||
* If mode is input, enable or disable the pin's 20K pull-up. | |||
*/ | |||
DigitalPin(bool mode, bool level) { | |||
config(mode, level); | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** Asignment operator | |||
/** Asignment operator. | |||
* @param[in] value If true set the pin's level high else set the | |||
* pin's level low. | |||
* | |||
@@ -648,60 +269,57 @@ class DigitalPin { | |||
return *this; | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** Parenthesis operator | |||
/** Parenthesis operator. | |||
* @return Pin's level | |||
*/ | |||
inline operator bool() const __attribute__((always_inline)) { | |||
inline operator bool () const __attribute__((always_inline)) { | |||
return read(); | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** set pin configuration | |||
* @param[in] mode If true set output mode else input mode | |||
* @param[in] level If mode is output, set level high/low. If mode | |||
* is input, enable or disable the pin's 20K pull-up. | |||
/** Set pin configuration. | |||
* @param[in] mode: INPUT or OUTPUT. | |||
* @param[in] level If mode is OUTPUT, set level high/low. | |||
* If mode is INPUT, enable or disable the pin's 20K pullup. | |||
*/ | |||
inline __attribute__((always_inline)) | |||
void config(bool mode, bool level) { | |||
void config(uint8_t mode, bool level) { | |||
fastPinConfig(PinNumber, mode, level); | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** | |||
* Set pin level high if output mode or enable 20K pull-up if input mode. | |||
* Set pin level high if output mode or enable 20K pullup if input mode. | |||
*/ | |||
inline __attribute__((always_inline)) | |||
void high() { | |||
write(true); | |||
} | |||
void high() {write(true);} | |||
//---------------------------------------------------------------------------- | |||
/** | |||
* Set pin level low if output mode or disable 20K pull-up if input mode. | |||
* Set pin level low if output mode or disable 20K pullup if input mode. | |||
*/ | |||
inline __attribute__((always_inline)) | |||
void low() { | |||
write(false); | |||
} | |||
void low() {write(false);} | |||
//---------------------------------------------------------------------------- | |||
/** | |||
* Set pin mode | |||
* @param[in] pinMode if true set output mode else input mode. | |||
* Set pin mode. | |||
* @param[in] mode: INPUT, OUTPUT, or INPUT_PULLUP. | |||
* | |||
* mode() does not enable or disable the 20K pull-up for input mode. | |||
* The internal pullup resistors will be enabled if mode is INPUT_PULLUP | |||
* and disabled if the mode is INPUT. | |||
*/ | |||
inline __attribute__((always_inline)) | |||
void mode(bool pinMode) { | |||
fastPinMode(PinNumber, pinMode); | |||
void mode(uint8_t mode) { | |||
fastPinMode(PinNumber, mode); | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** @return Pin's level */ | |||
/** @return Pin's level. */ | |||
inline __attribute__((always_inline)) | |||
bool read() const { | |||
return fastDigitalRead(PinNumber); | |||
} | |||
//---------------------------------------------------------------------------- | |||
/** toggle a pin | |||
/** Toggle a pin. | |||
* | |||
* If the pin is in output mode toggle the pin's level. | |||
* If the pin is in input mode toggle the state of the 20K pull-up. | |||
* If the pin is in input mode toggle the state of the 20K pullup. | |||
*/ | |||
inline __attribute__((always_inline)) | |||
void toggle() { | |||
@@ -718,4 +336,4 @@ class DigitalPin { | |||
} | |||
}; | |||
#endif // DigitalPin_h | |||
/** @} */ | |||
/** @} */ |
@@ -73,7 +73,7 @@ uint8_t const SD_CARD_ERROR_WRITE = 0X13; | |||
/** attempt to write protected block zero */ | |||
uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X14; // REMOVE - not used | |||
/** card did not go ready for a multiple block write */ | |||
uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X15; | |||
uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X15; // Not used | |||
/** card returned an error to a CMD13 status check after a write */ | |||
uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X16; | |||
/** timeout occurred during write programming */ |
@@ -23,10 +23,8 @@ | |||
*/ | |||
#ifndef SdSpi_h | |||
#define SdSpi_h | |||
#include <Arduino.h> | |||
#include <SPI.h> | |||
#include "SystemInclude.h" | |||
#include "SdFatConfig.h" | |||
//------------------------------------------------------------------------------ | |||
/** | |||
* \class SdSpiBase | |||
@@ -34,8 +32,11 @@ | |||
*/ | |||
class SdSpiBase { | |||
public: | |||
/** Initialize the SPI bus */ | |||
virtual void begin() = 0; | |||
/** Initialize the SPI bus. | |||
* | |||
* \param[in] chipSelectPin SD card chip select pin. | |||
*/ | |||
virtual void begin(uint8_t chipSelectPin) = 0; | |||
/** Set SPI options for access to SD/SDHC cards. | |||
* | |||
* \param[in] divisor SCK clock divider relative to the system clock. | |||
@@ -81,8 +82,11 @@ class SdSpi : public SdSpiBase { | |||
class SdSpi { | |||
#endif // SD_SPI_CONFIGURATION >= 3 | |||
public: | |||
/** Initialize the SPI bus */ | |||
void begin(); | |||
/** Initialize the SPI bus. | |||
* | |||
* \param[in] chipSelectPin SD card chip select pin. | |||
*/ | |||
void begin(uint8_t chipSelectPin); | |||
/** Set SPI options for access to SD/SDHC cards. | |||
* | |||
* \param[in] divisor SCK clock divider relative to the system clock. | |||
@@ -117,6 +121,13 @@ class SdSpi { | |||
*/ | |||
void send(const uint8_t* buf, size_t n); | |||
/** \return true - uses SPI transactions */ | |||
#if IMPLEMENT_SPI_INTERFACE_SELECTION | |||
void setSpiIf(uint8_t spiIf) { | |||
m_spiIf = spiIf; | |||
} | |||
private: | |||
uint8_t m_spiIf; | |||
#endif // IMPLEMENT_SPI_INTERFACE_SELECTION | |||
}; | |||
//------------------------------------------------------------------------------ | |||
/** | |||
@@ -130,10 +141,11 @@ class SdSpiLib : public SdSpiBase { | |||
class SdSpiLib { | |||
#endif // SD_SPI_CONFIGURATION >= 3 | |||
public: | |||
/** | |||
* Initialize SPI pins. | |||
/** Initialize the SPI bus. | |||
* | |||
* \param[in] chipSelectPin SD card chip select pin. | |||
*/ | |||
void begin() { | |||
void begin(uint8_t chipSelectPin) { | |||
SPI.begin(); | |||
} | |||
/** Set SPI options for access to SD/SDHC cards. | |||
@@ -192,12 +204,16 @@ class SdSpiLib { | |||
* | |||
* \return Zero for no error or nonzero error code. | |||
*/ | |||
#if defined(PLATFORM_ID) && USE_SPI_LIB_DMA | |||
uint8_t receive(uint8_t* buf, size_t n); | |||
#else // defined(PLATFORM_ID) && USE_SPI_LIB_DMA | |||
uint8_t receive(uint8_t* buf, size_t n) { | |||
for (size_t i = 0; i < n; i++) { | |||
buf[i] = SPI.transfer(0XFF); | |||
} | |||
return 0; | |||
} | |||
#endif // defined(PLATFORM_ID) && USE_SPI_LIB_DMA | |||
/** Send a byte. | |||
* | |||
* \param[in] b Byte to send | |||
@@ -210,15 +226,23 @@ class SdSpiLib { | |||
* \param[in] buf Buffer for data to be sent. | |||
* \param[in] n Number of bytes to send. | |||
*/ | |||
#if defined(PLATFORM_ID) && USE_SPI_LIB_DMA | |||
void send(const uint8_t* buf , size_t n); | |||
#else // defined(PLATFORM_ID) && USE_SPI_LIB_DMA | |||
void send(const uint8_t* buf , size_t n) { | |||
for (size_t i = 0; i < n; i++) { | |||
SPI.transfer(buf[i]); | |||
} | |||
} | |||
#endif // defined(PLATFORM_ID) && USE_SPI_LIB_DMA | |||
}; | |||
//------------------------------------------------------------------------------ | |||
#if SD_SPI_CONFIGURATION > 1 || defined(DOXYGEN) | |||
#ifdef ARDUINO | |||
#include "SoftSPI.h" | |||
#elif defined(PLATFORM_ID) //Only defined if a Particle device | |||
#include "SoftSPIParticle.h" | |||
#endif // ARDUINO | |||
/** | |||
* \class SdSpiSoft | |||
* \brief Software SPI class for access to SD and SDHC flash memory cards. | |||
@@ -226,10 +250,13 @@ class SdSpiLib { | |||
template<uint8_t MisoPin, uint8_t MosiPin, uint8_t SckPin> | |||
class SdSpiSoft : public SdSpiBase { | |||
public: | |||
/** | |||
* initialize SPI pins | |||
/** Initialize the SPI bus. | |||
* | |||
* \param[in] chipSelectPin SD card chip select pin. | |||
*/ | |||
void begin() { | |||
void begin(uint8_t chipSelectPin) { | |||
pinMode(chipSelectPin, OUTPUT); | |||
digitalWrite(chipSelectPin, HIGH); | |||
m_spi.begin(); | |||
} | |||
/** | |||
@@ -299,7 +326,7 @@ typedef SdSpi SpiDefault_t; | |||
// Use of in-line for AVR to save flash. | |||
#ifdef __AVR__ | |||
//------------------------------------------------------------------------------ | |||
inline void SdSpi::begin() { | |||
inline void SdSpi::begin(uint8_t chipSelectPin) { | |||
#ifdef __AVR_ATmega328P__ | |||
// Save a few bytes for 328 CPU - gcc optimizes single bit '|' to sbi. | |||
PORTB |= 1 << 2; // SS high | |||
@@ -316,6 +343,8 @@ inline void SdSpi::begin() { | |||
pinMode(MOSI, OUTPUT); | |||
pinMode(SCK, OUTPUT); | |||
#endif // __AVR_ATmega328P__ | |||
pinMode(chipSelectPin, OUTPUT); | |||
digitalWrite(chipSelectPin, HIGH); | |||
} | |||
//------------------------------------------------------------------------------ | |||
inline void SdSpi::beginTransaction(uint8_t divisor) { |
@@ -22,6 +22,8 @@ | |||
// debug trace macro | |||
#define SD_TRACE(m, b) | |||
// #define SD_TRACE(m, b) Serial.print(m);Serial.println(b); | |||
#define SD_CS_DBG(m) | |||
// #define SD_CS_DBG(m) Serial.println(F(m)); | |||
//============================================================================== | |||
#if USE_SD_CRC | |||
// CRC functions | |||
@@ -118,14 +120,13 @@ bool SdSpiCard::begin(m_spi_t* spi, uint8_t chipSelectPin, uint8_t sckDivisor) { | |||
m_spi = spi; | |||
m_chipSelectPin = chipSelectPin; | |||
// 16-bit init start time allows over a minute | |||
uint16_t t0 = (uint16_t)millis(); | |||
unsigned t0 = (unsigned)millis(); | |||
uint32_t arg; | |||
pinMode(m_chipSelectPin, OUTPUT); | |||
digitalWrite(m_chipSelectPin, HIGH); | |||
spiBegin(); | |||
// initialize SPI bus and chip select pin. | |||
spiBegin(m_chipSelectPin); | |||
// set SCK rate for initialization commands | |||
// set SCK rate for initialization commands. | |||
m_sckDivisor = SPI_SCK_INIT_DIVISOR; | |||
spiBeginTransaction(m_sckDivisor); | |||
@@ -136,7 +137,7 @@ bool SdSpiCard::begin(m_spi_t* spi, uint8_t chipSelectPin, uint8_t sckDivisor) { | |||
spiEndTransaction(); | |||
// command to go idle in SPI mode | |||
while (cardCommand(CMD0, 0) != R1_IDLE_STATE) { | |||
if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { | |||
if (((unsigned)millis() - t0) > SD_INIT_TIMEOUT) { | |||
error(SD_CARD_ERROR_CMD0); | |||
goto fail; | |||
} | |||
@@ -160,7 +161,7 @@ bool SdSpiCard::begin(m_spi_t* spi, uint8_t chipSelectPin, uint8_t sckDivisor) { | |||
type(SD_CARD_TYPE_SD2); | |||
break; | |||
} | |||
if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { | |||
if (((unsigned)millis() - t0) > SD_INIT_TIMEOUT) { | |||
error(SD_CARD_ERROR_CMD8); | |||
goto fail; | |||
} | |||
@@ -170,7 +171,7 @@ bool SdSpiCard::begin(m_spi_t* spi, uint8_t chipSelectPin, uint8_t sckDivisor) { | |||
while (cardAcmd(ACMD41, arg) != R1_READY_STATE) { | |||
// check for timeout | |||
if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { | |||
if (((unsigned)millis() - t0) > SD_INIT_TIMEOUT) { | |||
error(SD_CARD_ERROR_ACMD41); | |||
goto fail; | |||
} | |||
@@ -201,8 +202,9 @@ fail: | |||
// send command and return error code. Return zero for OK | |||
uint8_t SdSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { | |||
// select card | |||
chipSelectLow(); | |||
if (!m_selected) { | |||
chipSelectLow(); | |||
} | |||
// wait if busy | |||
waitNotBusy(SD_WRITE_TIMEOUT); | |||
@@ -210,8 +212,9 @@ uint8_t SdSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { | |||
#if USE_SD_CRC | |||
// form message | |||
uint8_t d[6] = {cmd | 0X40, pa[3], pa[2], pa[1], pa[0]}; | |||
uint8_t d[6] = {cmd , pa[3], pa[2], pa[1], pa[0]}; | |||
d[0] |= 0X40; | |||
// add crc | |||
d[5] = CRC7(d, 5); | |||
@@ -265,23 +268,26 @@ uint32_t SdSpiCard::cardSize() { | |||
} | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpiCard::spiYield() { | |||
#if ENABLE_SPI_TRANSACTIONS && ENABLE_SPI_YIELD | |||
chipSelectHigh(); | |||
chipSelectLow(); | |||
#endif // ENABLE_SPI_TRANSACTIONS && ENABLE_SPI_YIELD | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpiCard::chipSelectHigh() { | |||
if (!m_selected) { | |||
SD_CS_DBG("chipSelectHigh error"); | |||
return; | |||
} | |||
digitalWrite(m_chipSelectPin, HIGH); | |||
// insure MISO goes high impedance | |||
spiSend(0XFF); | |||
spiEndTransaction(); | |||
m_selected = false; | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpiCard::chipSelectLow() { | |||
if (m_selected) { | |||
SD_CS_DBG("chipSelectLow error"); | |||
return; | |||
} | |||
spiBeginTransaction(m_sckDivisor); | |||
digitalWrite(m_chipSelectPin, LOW); | |||
m_selected = true; | |||
} | |||
//------------------------------------------------------------------------------ | |||
bool SdSpiCard::erase(uint32_t firstBlock, uint32_t lastBlock) { | |||
@@ -327,16 +333,12 @@ bool SdSpiCard::eraseSingleBlockEnable() { | |||
} | |||
//------------------------------------------------------------------------------ | |||
bool SdSpiCard::isBusy() { | |||
bool rtn; | |||
chipSelectLow(); | |||
for (uint8_t i = 0; i < 8; i++) { | |||
rtn = spiReceive() != 0XFF; | |||
if (!rtn) { | |||
break; | |||
if (0XFF == spiReceive()) { | |||
return false; | |||
} | |||
} | |||
chipSelectHigh(); | |||
return rtn; | |||
return true; | |||
} | |||
//------------------------------------------------------------------------------ | |||
bool SdSpiCard::readBlock(uint32_t blockNumber, uint8_t* dst) { | |||
@@ -349,7 +351,11 @@ bool SdSpiCard::readBlock(uint32_t blockNumber, uint8_t* dst) { | |||
error(SD_CARD_ERROR_CMD17); | |||
goto fail; | |||
} | |||
return readData(dst, 512); | |||
if (!readData(dst, 512)) { | |||
goto fail; | |||
} | |||
chipSelectHigh(); | |||
return true; | |||
fail: | |||
chipSelectHigh(); | |||
@@ -369,7 +375,6 @@ bool SdSpiCard::readBlocks(uint32_t block, uint8_t* dst, size_t count) { | |||
} | |||
//------------------------------------------------------------------------------ | |||
bool SdSpiCard::readData(uint8_t *dst) { | |||
chipSelectLow(); | |||
return readData(dst, 512); | |||
} | |||
//------------------------------------------------------------------------------ | |||
@@ -378,9 +383,9 @@ bool SdSpiCard::readData(uint8_t* dst, size_t count) { | |||
uint16_t crc; | |||
#endif // USE_SD_CRC | |||
// wait for start block token | |||
uint16_t t0 = millis(); | |||
unsigned t0 = millis(); | |||
while ((m_status = spiReceive()) == 0XFF) { | |||
if (((uint16_t)millis() - t0) > SD_READ_TIMEOUT) { | |||
if (((unsigned)millis() - t0) > SD_READ_TIMEOUT) { | |||
error(SD_CARD_ERROR_READ_TIMEOUT); | |||
goto fail; | |||
} | |||
@@ -407,7 +412,6 @@ bool SdSpiCard::readData(uint8_t* dst, size_t count) { | |||
spiReceive(); | |||
spiReceive(); | |||
#endif // USE_SD_CRC | |||
chipSelectHigh(); | |||
return true; | |||
fail: | |||
@@ -456,7 +460,6 @@ bool SdSpiCard::readStart(uint32_t blockNumber) { | |||
error(SD_CARD_ERROR_CMD18); | |||
goto fail; | |||
} | |||
chipSelectHigh(); | |||
return true; | |||
fail: | |||
@@ -479,12 +482,11 @@ fail: | |||
//------------------------------------------------------------------------------ | |||
// wait for card to go not busy | |||
bool SdSpiCard::waitNotBusy(uint16_t timeoutMillis) { | |||
uint16_t t0 = millis(); | |||
unsigned t0 = millis(); | |||
while (spiReceive() != 0XFF) { | |||
if (((uint16_t)millis() - t0) >= timeoutMillis) { | |||
if (((unsigned)millis() - t0) >= timeoutMillis) { | |||
goto fail; | |||
} | |||
spiYield(); | |||
} | |||
return true; | |||
@@ -530,30 +532,32 @@ fail: | |||
//------------------------------------------------------------------------------ | |||
bool SdSpiCard::writeBlocks(uint32_t block, const uint8_t* src, size_t count) { | |||
if (!writeStart(block, count)) { | |||
return false; | |||
goto fail; | |||
} | |||
for (size_t b = 0; b < count; b++, src += 512) { | |||
if (!writeData(src)) { | |||
return false; | |||
goto fail; | |||
} | |||
} | |||
return writeStop(); | |||
fail: | |||
chipSelectHigh(); | |||
return false; | |||
} | |||
//------------------------------------------------------------------------------ | |||
bool SdSpiCard::writeData(const uint8_t* src) { | |||
chipSelectLow(); | |||
// wait for previous write to finish | |||
if (!waitNotBusy(SD_WRITE_TIMEOUT)) { | |||
error(SD_CARD_ERROR_WRITE_TIMEOUT); | |||
goto fail; | |||
} | |||
if (!writeData(WRITE_MULTIPLE_TOKEN, src)) { | |||
goto fail; | |||
} | |||
chipSelectHigh(); | |||
return true; | |||
fail: | |||
error(SD_CARD_ERROR_WRITE_MULTIPLE); | |||
chipSelectHigh(); | |||
return false; | |||
} | |||
@@ -597,7 +601,6 @@ bool SdSpiCard::writeStart(uint32_t blockNumber, uint32_t eraseCount) { | |||
error(SD_CARD_ERROR_CMD25); | |||
goto fail; | |||
} | |||
chipSelectHigh(); | |||
return true; | |||
fail: | |||
@@ -606,7 +609,6 @@ fail: | |||
} | |||
//------------------------------------------------------------------------------ | |||
bool SdSpiCard::writeStop() { | |||
chipSelectLow(); | |||
if (!waitNotBusy(SD_WRITE_TIMEOUT)) { | |||
goto fail; | |||
} |
@@ -23,7 +23,7 @@ | |||
* \file | |||
* \brief SdSpiCard class for V2 SD/SDHC cards | |||
*/ | |||
#include <Arduino.h> | |||
#include "SystemInclude.h" | |||
#include "SdFatConfig.h" | |||
#include "SdInfo.h" | |||
#include "SdSpi.h" | |||
@@ -41,7 +41,7 @@ class SdSpiCard { | |||
typedef SdSpiBase m_spi_t; | |||
#endif // SD_SPI_CONFIGURATION < 3 | |||
/** Construct an instance of SdSpiCard. */ | |||
SdSpiCard() : m_errorCode(SD_CARD_ERROR_INIT_NOT_CALLED), m_type(0) {} | |||
SdSpiCard() : m_selected(false), m_errorCode(SD_CARD_ERROR_INIT_NOT_CALLED), m_type(0) {} | |||
/** Initialize the SD card. | |||
* \param[in] spi SPI object. | |||
* \param[in] chipSelectPin SD chip select pin. | |||
@@ -57,6 +57,16 @@ class SdSpiCard { | |||
* or zero if an error occurs. | |||
*/ | |||
uint32_t cardSize(); | |||
/** Set the SD chip select pin high, send a dummy byte, and call SPI endTransaction. | |||
* | |||
* This function should only be called by programs doing raw I/O to the SD. | |||
*/ | |||
void chipSelectHigh(); | |||
/** Set the SD chip select pin low and call SPI beginTransaction. | |||
* | |||
* This function should only be called by programs doing raw I/O to the SD. | |||
*/ | |||
void chipSelectLow(); | |||
/** Erase a range of blocks. | |||
* | |||
* \param[in] firstBlock The address of the first block in the range. | |||
@@ -180,6 +190,8 @@ class SdSpiCard { | |||
uint8_t sckDivisor() { | |||
return m_sckDivisor; | |||
} | |||
/** \return the SD chip select status, true if slected else false. */ | |||
bool selected() {return m_selected;} | |||
/** Return the card type: SD V1, SD V2 or SDHC | |||
* \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. | |||
*/ | |||
@@ -239,16 +251,13 @@ class SdSpiCard { | |||
uint8_t cardCommand(uint8_t cmd, uint32_t arg); | |||
bool readData(uint8_t* dst, size_t count); | |||
bool readRegister(uint8_t cmd, void* buf); | |||
void chipSelectHigh(); | |||
void chipSelectLow(); | |||
void spiYield(); | |||
void type(uint8_t value) { | |||
m_type = value; | |||
} | |||
bool waitNotBusy(uint16_t timeoutMillis); | |||
bool writeData(uint8_t token, const uint8_t* src); | |||
void spiBegin() { | |||
m_spi->begin(); | |||
void spiBegin(uint8_t chipSelectPin) { | |||
m_spi->begin(chipSelectPin); | |||
} | |||
void spiBeginTransaction(uint8_t spiDivisor) { | |||
m_spi->beginTransaction(spiDivisor); | |||
@@ -269,6 +278,7 @@ class SdSpiCard { | |||
m_spi->send(buf, n); | |||
} | |||
m_spi_t* m_spi; | |||
bool m_selected; | |||
uint8_t m_chipSelectPin; | |||
uint8_t m_errorCode; | |||
uint8_t m_sckDivisor; |
@@ -0,0 +1,107 @@ | |||
/* Arduino SdFat Library | |||
* Copyright (C) 2012 by William Greiman | |||
* | |||
* This file is part of the Arduino SdFat Library | |||
* | |||
* This Library is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License as published by | |||
* the Free Software Foundation, either version 3 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This Library is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with the Arduino SdFat Library. If not, see | |||
* <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include "SdSpi.h" | |||
#if defined(PLATFORM_ID) | |||
static uint32_t bugDelay = 0; // fix for SPI DMA bug. | |||
static volatile bool SPI_DMA_TransferCompleted = false; | |||
//static uint8_t m_spiIf = 1; | |||
static SPIClass* const spiPtr[] = { | |||
&SPI | |||
#if Wiring_SPI1 | |||
,&SPI1 | |||
#if Wiring_SPI2 | |||
,&SPI2 | |||
#endif // Wiring_SPI2 | |||
#endif // Wiring_SPI1 | |||
}; | |||
#if SPI_INTERFACE_COUNT == 1 | |||
const uint8_t m_spiIf = 0; | |||
#endif | |||
//----------------------------------------------------------------------------- | |||
void SD_SPI_DMA_TransferComplete_Callback(void) { | |||
SPI_DMA_TransferCompleted = true; | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpi::begin(uint8_t chipSelectPin) { | |||
spiPtr[m_spiIf]->begin(chipSelectPin); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpi::beginTransaction(uint8_t divisor) { | |||
spiPtr[m_spiIf]->setBitOrder(MSBFIRST); | |||
spiPtr[m_spiIf]->setDataMode(SPI_MODE0); | |||
#ifndef SPI_CLOCK_DIV128 | |||
spiPtr[m_spiIf]->setClockDivider(divisor); | |||
#else // SPI_CLOCK_DIV128 | |||
int v; | |||
if (divisor <= 2) { | |||
v = SPI_CLOCK_DIV2; | |||
} else if (divisor <= 4) { | |||
v = SPI_CLOCK_DIV4; | |||
} else if (divisor <= 8) { | |||
v = SPI_CLOCK_DIV8; | |||
} else if (divisor <= 16) { | |||
v = SPI_CLOCK_DIV16; | |||
} else if (divisor <= 32) { | |||
v = SPI_CLOCK_DIV32; | |||
} else if (divisor <= 64) { | |||
v = SPI_CLOCK_DIV64; | |||
} else { | |||
v = SPI_CLOCK_DIV128; | |||
} | |||
spiPtr[m_spiIf]->setClockDivider(v); | |||
#endif // SPI_CLOCK_DIV128 | |||
// delay for SPI transfer done callback too soon bug. | |||
bugDelay = 24*divisor*(1 + m_spiIf)/60; | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpi::endTransaction() { | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** SPI receive a byte */ | |||
uint8_t SdSpi::receive() { | |||
return spiPtr[m_spiIf]->transfer(0xFF); | |||
} | |||
//----------------------------------------------------------------------------- | |||
uint8_t SdSpi::receive(uint8_t* buf, size_t n) { | |||
SPI_DMA_TransferCompleted = false; | |||
spiPtr[m_spiIf]->transfer(0, buf, n, SD_SPI_DMA_TransferComplete_Callback); | |||
while(!SPI_DMA_TransferCompleted); | |||
if (bugDelay) { | |||
delayMicroseconds(bugDelay); | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------------------------------------ | |||
/** SPI send a byte */ | |||
void SdSpi::send(uint8_t b) { | |||
spiPtr[m_spiIf]->transfer(b); | |||
} | |||
//----------------------------------------------------------------------------- | |||
void SdSpi::send(const uint8_t* buf , size_t n) { | |||
SPI_DMA_TransferCompleted = false; | |||
spiPtr[m_spiIf]->transfer((void *)buf, 0, n, SD_SPI_DMA_TransferComplete_Callback); | |||
while(!SPI_DMA_TransferCompleted); | |||
if (bugDelay) { | |||
delayMicroseconds(bugDelay); | |||
} | |||
} | |||
#endif //defined(PLATFORM_ID) |
@@ -57,7 +57,9 @@ static bool dmac_channel_transfer_done(uint32_t ul_num) { | |||
return (DMAC->DMAC_CHSR & (DMAC_CHSR_ENA0 << ul_num)) ? false : true; | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpi::begin() { | |||
void SdSpi::begin(uint8_t chipSelectPin) { | |||
pinMode(chipSelectPin, OUTPUT); | |||
digitalWrite(chipSelectPin, HIGH); | |||
PIO_Configure( | |||
g_APinDescription[PIN_SPI_MOSI].pPort, | |||
g_APinDescription[PIN_SPI_MOSI].ulPinType, |
@@ -56,7 +56,9 @@ static void dmac_channel_enable(dma_channel ul_num) { | |||
dma_enable(DMA1, ul_num); | |||
} | |||
//------------------------------------------------------------------------------ | |||
void SdSpi::begin() { | |||
void SdSpi::begin(uint8_t chipSelectPin) { | |||
pinMode(chipSelectPin, OUTPUT); | |||
digitalWrite(chipSelectPin, HIGH); | |||
SPI.begin(); | |||
} | |||
//------------------------------------------------------------------------------ |
@@ -40,7 +40,9 @@ | |||
/** | |||
* initialize SPI pins | |||
*/ | |||
void SdSpi::begin() { | |||
void SdSpi::begin(uint8_t chipSelectPin) { | |||
pinMode(chipSelectPin, OUTPUT); | |||
digitalWrite(chipSelectPin, HIGH); | |||
SIM_SCGC6 |= SIM_SCGC6_SPI0; | |||
} | |||
//------------------------------------------------------------------------------ | |||
@@ -229,7 +231,7 @@ void SdSpi::send(const uint8_t* buf , size_t n) { | |||
/** | |||
* Initialize SPI pins. | |||
*/ | |||
void SdSpi::begin() { | |||
void SdSpi::begin(uint8_t chipSelectPin) { | |||
SPI.begin(); | |||
} | |||
/** Set SPI options for access to SD/SDHC cards. |
@@ -18,7 +18,7 @@ | |||
* <http://www.gnu.org/licenses/>. | |||
*/ | |||
/** | |||
* @file | |||
* @file | |||
* @brief Software SPI. | |||
* | |||
* @defgroup softSPI Software SPI | |||
@@ -110,13 +110,9 @@ class SoftSPI { | |||
private: | |||
//---------------------------------------------------------------------------- | |||
inline __attribute__((always_inline)) | |||
bool MODE_CPHA(uint8_t mode) { | |||
return (mode & 1) != 0; | |||
} | |||
bool MODE_CPHA(uint8_t mode) {return (mode & 1) != 0;} | |||
inline __attribute__((always_inline)) | |||
bool MODE_CPOL(uint8_t mode) { | |||
return (mode & 2) != 0; | |||
} | |||
bool MODE_CPOL(uint8_t mode) {return (mode & 2) != 0;} | |||
inline __attribute__((always_inline)) | |||
void receiveBit(uint8_t bit, uint8_t* data) { | |||
if (MODE_CPHA(Mode)) { | |||
@@ -125,10 +121,8 @@ class SoftSPI { | |||
nop; | |||
nop; | |||
fastDigitalWrite(SckPin, | |||
MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); | |||
if (fastDigitalRead(MisoPin)) { | |||
*data |= 1 << bit; | |||
} | |||
MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); | |||
if (fastDigitalRead(MisoPin)) *data |= 1 << bit; | |||
if (!MODE_CPHA(Mode)) { | |||
fastDigitalWrite(SckPin, MODE_CPOL(Mode)); | |||
} | |||
@@ -141,7 +135,7 @@ class SoftSPI { | |||
} | |||
fastDigitalWrite(MosiPin, data & (1 << bit)); | |||
fastDigitalWrite(SckPin, | |||
MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); | |||
MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); | |||
nop; | |||
nop; | |||
if (!MODE_CPHA(Mode)) { | |||
@@ -156,10 +150,8 @@ class SoftSPI { | |||
} | |||
fastDigitalWrite(MosiPin, txData & (1 << bit)); | |||
fastDigitalWrite(SckPin, | |||
MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); | |||
if (fastDigitalRead(MisoPin)) { | |||
*rxData |= 1 << bit; | |||
} | |||
MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); | |||
if (fastDigitalRead(MisoPin)) *rxData |= 1 << bit; | |||
if (!MODE_CPHA(Mode)) { | |||
fastDigitalWrite(SckPin, MODE_CPOL(Mode)); | |||
} |
@@ -0,0 +1,37 @@ | |||
#ifndef AvrDevelopersGpioPinMap_h | |||
#define AvrDevelopersGpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(B, 0), // D0 | |||
GPIO_PIN(B, 1), // D1 | |||
GPIO_PIN(B, 2), // D2 | |||
GPIO_PIN(B, 3), // D3 | |||
GPIO_PIN(B, 4), // D4 | |||
GPIO_PIN(B, 5), // D5 | |||
GPIO_PIN(B, 6), // D6 | |||
GPIO_PIN(B, 7), // D7 | |||
GPIO_PIN(D, 0), // D8 | |||
GPIO_PIN(D, 1), // D9 | |||
GPIO_PIN(D, 2), // D10 | |||
GPIO_PIN(D, 3), // D11 | |||
GPIO_PIN(D, 4), // D12 | |||
GPIO_PIN(D, 5), // D13 | |||
GPIO_PIN(D, 6), // D14 | |||
GPIO_PIN(D, 7), // D15 | |||
GPIO_PIN(C, 0), // D16 | |||
GPIO_PIN(C, 1), // D17 | |||
GPIO_PIN(C, 2), // D18 | |||
GPIO_PIN(C, 3), // D19 | |||
GPIO_PIN(C, 4), // D20 | |||
GPIO_PIN(C, 5), // D21 | |||
GPIO_PIN(C, 6), // D22 | |||
GPIO_PIN(C, 7), // D23 | |||
GPIO_PIN(A, 7), // D24 | |||
GPIO_PIN(A, 6), // D25 | |||
GPIO_PIN(A, 5), // D26 | |||
GPIO_PIN(A, 4), // D27 | |||
GPIO_PIN(A, 3), // D28 | |||
GPIO_PIN(A, 2), // D29 | |||
GPIO_PIN(A, 1), // D30 | |||
GPIO_PIN(A, 0) // D31 | |||
}; | |||
#endif // AvrDevelopersGpioPinMap_h |
@@ -0,0 +1,37 @@ | |||
#ifndef BobuinoGpioPinMap_h | |||
#define BobuinoGpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(B, 0), // D0 | |||
GPIO_PIN(B, 1), // D1 | |||
GPIO_PIN(B, 2), // D2 | |||
GPIO_PIN(B, 3), // D3 | |||
GPIO_PIN(B, 4), // D4 | |||
GPIO_PIN(B, 5), // D5 | |||
GPIO_PIN(B, 6), // D6 | |||
GPIO_PIN(B, 7), // D7 | |||
GPIO_PIN(D, 0), // D8 | |||
GPIO_PIN(D, 1), // D9 | |||
GPIO_PIN(D, 2), // D10 | |||
GPIO_PIN(D, 3), // D11 | |||
GPIO_PIN(D, 4), // D12 | |||
GPIO_PIN(D, 5), // D13 | |||
GPIO_PIN(D, 6), // D14 | |||
GPIO_PIN(D, 7), // D15 | |||
GPIO_PIN(C, 0), // D16 | |||
GPIO_PIN(C, 1), // D17 | |||
GPIO_PIN(C, 2), // D18 | |||
GPIO_PIN(C, 3), // D19 | |||
GPIO_PIN(C, 4), // D20 | |||
GPIO_PIN(C, 5), // D21 | |||
GPIO_PIN(C, 6), // D22 | |||
GPIO_PIN(C, 7), // D23 | |||
GPIO_PIN(A, 0), // D24 | |||
GPIO_PIN(A, 1), // D25 | |||
GPIO_PIN(A, 2), // D26 | |||
GPIO_PIN(A, 3), // D27 | |||
GPIO_PIN(A, 4), // D28 | |||
GPIO_PIN(A, 5), // D29 | |||
GPIO_PIN(A, 6), // D30 | |||
GPIO_PIN(A, 7) // D31 | |||
}; | |||
#endif // BobuinoGpioPinMap_h |
@@ -0,0 +1,45 @@ | |||
#ifndef GpioPinMap_h | |||
#define GpioPinMap_h | |||
#if defined(__AVR_ATmega168__)\ | |||
||defined(__AVR_ATmega168P__)\ | |||
||defined(__AVR_ATmega328P__) | |||
// 168 and 328 Arduinos | |||
#include "UnoGpioPinMap.h" | |||
#elif defined(__AVR_ATmega1280__)\ | |||
|| defined(__AVR_ATmega2560__) | |||
// Mega ADK | |||
#include "MegaGpioPinMap.h" | |||
#elif defined(__AVR_ATmega32U4__) | |||
#ifdef CORE_TEENSY | |||
#include "Teensy2GpioPinMap.h" | |||
#else // CORE_TEENSY | |||
// Leonardo or Yun | |||
#include "LeonardoGpioPinMap.h" | |||
#endif // CORE_TEENSY | |||
#elif defined(__AVR_AT90USB646__)\ | |||
|| defined(__AVR_AT90USB1286__) | |||
// Teensy++ 1.0 & 2.0 | |||
#include "Teensy2ppGpioPinMap.h" | |||
#elif defined(__AVR_ATmega1284P__)\ | |||
|| defined(__AVR_ATmega1284__)\ | |||
|| defined(__AVR_ATmega644P__)\ | |||
|| defined(__AVR_ATmega644__)\ | |||
|| defined(__AVR_ATmega64__)\ | |||
|| defined(__AVR_ATmega32__)\ | |||
|| defined(__AVR_ATmega324__)\ | |||
|| defined(__AVR_ATmega16__) | |||
#ifdef ARDUINO_1284P_AVR_DEVELOPERS | |||
#include "AvrDevelopersGpioPinMap.h" | |||
#elif defined(ARDUINO_1284P_BOBUINO) | |||
#include "BobuinoGpioPinMap.h" | |||
#elif defined(ARDUINO_1284P_SLEEPINGBEAUTY) | |||
#include "SleepingBeautyGpioPinMap.h" | |||
#elif defined(ARDUINO_1284P_STANDARD) | |||
#include "Standard1284GpioPinMap.h" | |||
#else // ARDUINO_1284P_SLEEPINGBEAUTY | |||
#error Undefined variant 1284, 644, 324 | |||
#endif // ARDUINO_1284P_SLEEPINGBEAUTY | |||
#else // 1284P, 1284, 644 | |||
#error Unknown board type. | |||
#endif // end all boards | |||
#endif // GpioPinMap_h |
@@ -0,0 +1,35 @@ | |||
#ifndef LeonardoGpioPinMap_h | |||
#define LeonardoGpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(D, 2), // D0 | |||
GPIO_PIN(D, 3), // D1 | |||
GPIO_PIN(D, 1), // D2 | |||
GPIO_PIN(D, 0), // D3 | |||
GPIO_PIN(D, 4), // D4 | |||
GPIO_PIN(C, 6), // D5 | |||
GPIO_PIN(D, 7), // D6 | |||
GPIO_PIN(E, 6), // D7 | |||
GPIO_PIN(B, 4), // D8 | |||
GPIO_PIN(B, 5), // D9 | |||
GPIO_PIN(B, 6), // D10 | |||
GPIO_PIN(B, 7), // D11 | |||
GPIO_PIN(D, 6), // D12 | |||
GPIO_PIN(C, 7), // D13 | |||
GPIO_PIN(B, 3), // D14 | |||
GPIO_PIN(B, 1), // D15 | |||
GPIO_PIN(B, 2), // D16 | |||
GPIO_PIN(B, 0), // D17 | |||
GPIO_PIN(F, 7), // D18 | |||
GPIO_PIN(F, 6), // D19 | |||
GPIO_PIN(F, 5), // D20 | |||
GPIO_PIN(F, 4), // D21 | |||
GPIO_PIN(F, 1), // D22 | |||
GPIO_PIN(F, 0), // D23 | |||
GPIO_PIN(D, 4), // D24 | |||
GPIO_PIN(D, 7), // D25 | |||
GPIO_PIN(B, 4), // D26 | |||
GPIO_PIN(B, 5), // D27 | |||
GPIO_PIN(B, 6), // D28 | |||
GPIO_PIN(D, 6) // D29 | |||
}; | |||
#endif // LeonardoGpioPinMap_h |
@@ -0,0 +1,75 @@ | |||
#ifndef MegaGpioPinMap_h | |||
#define MegaGpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(E, 0), // D0 | |||
GPIO_PIN(E, 1), // D1 | |||
GPIO_PIN(E, 4), // D2 | |||
GPIO_PIN(E, 5), // D3 | |||
GPIO_PIN(G, 5), // D4 | |||
GPIO_PIN(E, 3), // D5 | |||
GPIO_PIN(H, 3), // D6 | |||
GPIO_PIN(H, 4), // D7 | |||
GPIO_PIN(H, 5), // D8 | |||
GPIO_PIN(H, 6), // D9 | |||
GPIO_PIN(B, 4), // D10 | |||
GPIO_PIN(B, 5), // D11 | |||
GPIO_PIN(B, 6), // D12 | |||
GPIO_PIN(B, 7), // D13 | |||
GPIO_PIN(J, 1), // D14 | |||
GPIO_PIN(J, 0), // D15 | |||
GPIO_PIN(H, 1), // D16 | |||
GPIO_PIN(H, 0), // D17 | |||
GPIO_PIN(D, 3), // D18 | |||
GPIO_PIN(D, 2), // D19 | |||
GPIO_PIN(D, 1), // D20 | |||
GPIO_PIN(D, 0), // D21 | |||
GPIO_PIN(A, 0), // D22 | |||
GPIO_PIN(A, 1), // D23 | |||
GPIO_PIN(A, 2), // D24 | |||
GPIO_PIN(A, 3), // D25 | |||
GPIO_PIN(A, 4), // D26 | |||
GPIO_PIN(A, 5), // D27 | |||
GPIO_PIN(A, 6), // D28 | |||
GPIO_PIN(A, 7), // D29 | |||
GPIO_PIN(C, 7), // D30 | |||
GPIO_PIN(C, 6), // D31 | |||
GPIO_PIN(C, 5), // D32 | |||
GPIO_PIN(C, 4), // D33 | |||
GPIO_PIN(C, 3), // D34 | |||
GPIO_PIN(C, 2), // D35 | |||
GPIO_PIN(C, 1), // D36 | |||
GPIO_PIN(C, 0), // D37 | |||
GPIO_PIN(D, 7), // D38 | |||
GPIO_PIN(G, 2), // D39 | |||
GPIO_PIN(G, 1), // D40 | |||
GPIO_PIN(G, 0), // D41 | |||
GPIO_PIN(L, 7), // D42 | |||
GPIO_PIN(L, 6), // D43 | |||
GPIO_PIN(L, 5), // D44 | |||
GPIO_PIN(L, 4), // D45 | |||
GPIO_PIN(L, 3), // D46 | |||
GPIO_PIN(L, 2), // D47 | |||
GPIO_PIN(L, 1), // D48 | |||
GPIO_PIN(L, 0), // D49 | |||
GPIO_PIN(B, 3), // D50 | |||
GPIO_PIN(B, 2), // D51 | |||
GPIO_PIN(B, 1), // D52 | |||
GPIO_PIN(B, 0), // D53 | |||
GPIO_PIN(F, 0), // D54 | |||
GPIO_PIN(F, 1), // D55 | |||
GPIO_PIN(F, 2), // D56 | |||
GPIO_PIN(F, 3), // D57 | |||
GPIO_PIN(F, 4), // D58 | |||
GPIO_PIN(F, 5), // D59 | |||
GPIO_PIN(F, 6), // D60 | |||
GPIO_PIN(F, 7), // D61 | |||
GPIO_PIN(K, 0), // D62 | |||
GPIO_PIN(K, 1), // D63 | |||
GPIO_PIN(K, 2), // D64 | |||
GPIO_PIN(K, 3), // D65 | |||
GPIO_PIN(K, 4), // D66 | |||
GPIO_PIN(K, 5), // D67 | |||
GPIO_PIN(K, 6), // D68 | |||
GPIO_PIN(K, 7) // D69 | |||
}; | |||
#endif // MegaGpioPinMap_h |
@@ -0,0 +1,37 @@ | |||
#ifndef SleepingBeautyGpioPinMap_h | |||
#define SleepingBeautyGpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(D, 0), // D0 | |||
GPIO_PIN(D, 1), // D1 | |||
GPIO_PIN(D, 2), // D2 | |||
GPIO_PIN(D, 3), // D3 | |||
GPIO_PIN(B, 0), // D4 | |||
GPIO_PIN(B, 1), // D5 | |||
GPIO_PIN(B, 2), // D6 | |||
GPIO_PIN(B, 3), // D7 | |||
GPIO_PIN(D, 6), // D8 | |||
GPIO_PIN(D, 5), // D9 | |||
GPIO_PIN(B, 4), // D10 | |||
GPIO_PIN(B, 5), // D11 | |||
GPIO_PIN(B, 6), // D12 | |||
GPIO_PIN(B, 7), // D13 | |||
GPIO_PIN(C, 7), // D14 | |||
GPIO_PIN(C, 6), // D15 | |||
GPIO_PIN(A, 5), // D16 | |||
GPIO_PIN(A, 4), // D17 | |||
GPIO_PIN(A, 3), // D18 | |||
GPIO_PIN(A, 2), // D19 | |||
GPIO_PIN(A, 1), // D20 | |||
GPIO_PIN(A, 0), // D21 | |||
GPIO_PIN(D, 4), // D22 | |||
GPIO_PIN(D, 7), // D23 | |||
GPIO_PIN(C, 2), // D24 | |||
GPIO_PIN(C, 3), // D25 | |||
GPIO_PIN(C, 4), // D26 | |||
GPIO_PIN(C, 5), // D27 | |||
GPIO_PIN(C, 1), // D28 | |||
GPIO_PIN(C, 0), // D29 | |||
GPIO_PIN(A, 6), // D30 | |||
GPIO_PIN(A, 7) // D31 | |||
}; | |||
#endif // SleepingBeautyGpioPinMap_h |
@@ -0,0 +1,37 @@ | |||
#ifndef Standard1284GpioPinMap_h | |||
#define Standard1284GpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(B, 0), // D0 | |||
GPIO_PIN(B, 1), // D1 | |||
GPIO_PIN(B, 2), // D2 | |||
GPIO_PIN(B, 3), // D3 | |||
GPIO_PIN(B, 4), // D4 | |||
GPIO_PIN(B, 5), // D5 | |||
GPIO_PIN(B, 6), // D6 | |||
GPIO_PIN(B, 7), // D7 | |||
GPIO_PIN(D, 0), // D8 | |||
GPIO_PIN(D, 1), // D9 | |||
GPIO_PIN(D, 2), // D10 | |||
GPIO_PIN(D, 3), // D11 | |||
GPIO_PIN(D, 4), // D12 | |||
GPIO_PIN(D, 5), // D13 | |||
GPIO_PIN(D, 6), // D14 | |||
GPIO_PIN(D, 7), // D15 | |||
GPIO_PIN(C, 0), // D16 | |||
GPIO_PIN(C, 1), // D17 | |||
GPIO_PIN(C, 2), // D18 | |||
GPIO_PIN(C, 3), // D19 | |||
GPIO_PIN(C, 4), // D20 | |||
GPIO_PIN(C, 5), // D21 | |||
GPIO_PIN(C, 6), // D22 | |||
GPIO_PIN(C, 7), // D23 | |||
GPIO_PIN(A, 0), // D24 | |||
GPIO_PIN(A, 1), // D25 | |||
GPIO_PIN(A, 2), // D26 | |||
GPIO_PIN(A, 3), // D27 | |||
GPIO_PIN(A, 4), // D28 | |||
GPIO_PIN(A, 5), // D29 | |||
GPIO_PIN(A, 6), // D30 | |||
GPIO_PIN(A, 7) // D31 | |||
}; | |||
#endif // Standard1284GpioPinMap_h |
@@ -0,0 +1,30 @@ | |||
#ifndef Teensy2GpioPinMap_h | |||
#define Teensy2GpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(B, 0), // D0 | |||
GPIO_PIN(B, 1), // D1 | |||
GPIO_PIN(B, 2), // D2 | |||
GPIO_PIN(B, 3), // D3 | |||
GPIO_PIN(B, 7), // D4 | |||
GPIO_PIN(D, 0), // D5 | |||
GPIO_PIN(D, 1), // D6 | |||
GPIO_PIN(D, 2), // D7 | |||
GPIO_PIN(D, 3), // D8 | |||
GPIO_PIN(C, 6), // D9 | |||
GPIO_PIN(C, 7), // D10 | |||
GPIO_PIN(D, 6), // D11 | |||
GPIO_PIN(D, 7), // D12 | |||
GPIO_PIN(B, 4), // D13 | |||
GPIO_PIN(B, 5), // D14 | |||
GPIO_PIN(B, 6), // D15 | |||
GPIO_PIN(F, 7), // D16 | |||
GPIO_PIN(F, 6), // D17 | |||
GPIO_PIN(F, 5), // D18 | |||
GPIO_PIN(F, 4), // D19 | |||
GPIO_PIN(F, 1), // D20 | |||
GPIO_PIN(F, 0), // D21 | |||
GPIO_PIN(D, 4), // D22 | |||
GPIO_PIN(D, 5), // D23 | |||
GPIO_PIN(E, 6), // D24 | |||
}; | |||
#endif // Teensy2GpioPinMap_h |
@@ -0,0 +1,51 @@ | |||
#ifndef Teensypp2GpioPinMap_h | |||
#define Teensypp2GpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(D, 0), // D0 | |||
GPIO_PIN(D, 1), // D1 | |||
GPIO_PIN(D, 2), // D2 | |||
GPIO_PIN(D, 3), // D3 | |||
GPIO_PIN(D, 4), // D4 | |||
GPIO_PIN(D, 5), // D5 | |||
GPIO_PIN(D, 6), // D6 | |||
GPIO_PIN(D, 7), // D7 | |||
GPIO_PIN(E, 0), // D8 | |||
GPIO_PIN(E, 1), // D9 | |||
GPIO_PIN(C, 0), // D10 | |||
GPIO_PIN(C, 1), // D11 | |||
GPIO_PIN(C, 2), // D12 | |||
GPIO_PIN(C, 3), // D13 | |||
GPIO_PIN(C, 4), // D14 | |||
GPIO_PIN(C, 5), // D15 | |||
GPIO_PIN(C, 6), // D16 | |||
GPIO_PIN(C, 7), // D17 | |||
GPIO_PIN(E, 6), // D18 | |||
GPIO_PIN(E, 7), // D19 | |||
GPIO_PIN(B, 0), // D20 | |||
GPIO_PIN(B, 1), // D21 | |||
GPIO_PIN(B, 2), // D22 | |||
GPIO_PIN(B, 3), // D23 | |||
GPIO_PIN(B, 4), // D24 | |||
GPIO_PIN(B, 5), // D25 | |||
GPIO_PIN(B, 6), // D26 | |||
GPIO_PIN(B, 7), // D27 | |||
GPIO_PIN(A, 0), // D28 | |||
GPIO_PIN(A, 1), // D29 | |||
GPIO_PIN(A, 2), // D30 | |||
GPIO_PIN(A, 3), // D31 | |||
GPIO_PIN(A, 4), // D32 | |||
GPIO_PIN(A, 5), // D33 | |||
GPIO_PIN(A, 6), // D34 | |||
GPIO_PIN(A, 7), // D35 | |||
GPIO_PIN(E, 4), // D36 | |||
GPIO_PIN(E, 5), // D37 | |||
GPIO_PIN(F, 0), // D38 | |||
GPIO_PIN(F, 1), // D39 | |||
GPIO_PIN(F, 2), // D40 | |||
GPIO_PIN(F, 3), // D41 | |||
GPIO_PIN(F, 4), // D42 | |||
GPIO_PIN(F, 5), // D43 | |||
GPIO_PIN(F, 6), // D44 | |||
GPIO_PIN(F, 7), // D45 | |||
}; | |||
#endif // Teensypp2GpioPinMap_h |
@@ -0,0 +1,25 @@ | |||
#ifndef UnoGpioPinMap_h | |||
#define UnoGpioPinMap_h | |||
static const GpioPinMap_t GpioPinMap[] = { | |||
GPIO_PIN(D, 0), // D0 | |||
GPIO_PIN(D, 1), // D1 | |||
GPIO_PIN(D, 2), // D2 | |||
GPIO_PIN(D, 3), // D3 | |||
GPIO_PIN(D, 4), // D4 | |||
GPIO_PIN(D, 5), // D5 | |||
GPIO_PIN(D, 6), // D6 | |||
GPIO_PIN(D, 7), // D7 | |||
GPIO_PIN(B, 0), // D8 | |||
GPIO_PIN(B, 1), // D9 | |||
GPIO_PIN(B, 2), // D10 | |||
GPIO_PIN(B, 3), // D11 | |||
GPIO_PIN(B, 4), // D12 | |||
GPIO_PIN(B, 5), // D13 | |||
GPIO_PIN(C, 0), // D14 | |||
GPIO_PIN(C, 1), // D15 | |||
GPIO_PIN(C, 2), // D16 | |||
GPIO_PIN(C, 3), // D17 | |||
GPIO_PIN(C, 4), // D18 | |||
GPIO_PIN(C, 5) // D19 | |||
}; | |||
#endif // UnoGpioPinMap_h |
@@ -0,0 +1,14 @@ | |||
#ifndef SystemInclude_h | |||
#define SystemInclude_h | |||
#if defined(ARDUINO) | |||
#include <Arduino.h> | |||
#include <SPI.h> | |||
#elif defined(PLATFORM_ID) //Only defined if a Particle device | |||
#include "application.h" | |||
#else // | |||
#error "Unknown system" | |||
#endif // defined(ARDUINO) | |||
#ifndef F | |||
#define F(str) (str) | |||
#endif // F | |||
#endif // SystemInclude_h |
@@ -32,7 +32,7 @@ void testBegin() { | |||
Serial.begin(9600); | |||
while (!Serial) {} // wait for leonardo | |||
testOut = &Serial; | |||
SerialPrintln_P(PSTR("Type any character to begin.")); | |||
Serial.println(F("Type any character to begin.")); | |||
while (Serial.read() <= 0) {} | |||
delay(200); // Catch Due reset problem | |||
@@ -150,8 +150,8 @@ void ostreamStr() { | |||
const signed char* csc = (const signed char*)"CSC"; | |||
unsigned char *uc = (unsigned char *)"uc"; | |||
const unsigned char *cuc = (const unsigned char *)"CUC"; | |||
ob << "lit" << c << cc << sc << csc << uc << cuc << pstr("pstr") << F("F"); | |||
testVerifyStr(buf, "litcCCscCSCucCUCpstrF"); | |||
ob << "lit" << c << cc << sc << csc << uc << cuc << F("F"); | |||
testVerifyStr(buf, "litcCCscCSCucCUCF"); | |||
ob.init(buf, sizeof(buf)); | |||
ob << setfill('*') << "s" << setw(8) << "right"; |
@@ -1,3 +1,11 @@ | |||
23 Jan 2016 | |||
New Examples. | |||
New SPI structure for ports to boards like the Particle Photon/Electron. | |||
Several bug fixes. | |||
19 Jul 2015 | |||
Converted to 1.5x library format. |
@@ -3,15 +3,16 @@ | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | |||
<meta http-equiv="X-UA-Compatible" content="IE=9"/> | |||
<meta name="generator" content="Doxygen 1.8.8"/> | |||
<meta name="generator" content="Doxygen 1.8.10"/> | |||
<title>SdFat: Arduino/libraries/SdFat/src/FatLib/ArduinoFiles.h File Reference</title> | |||
<link href="tabs.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="jquery.js"></script> | |||
<script type="text/javascript" src="dynsections.js"></script> | |||
<link href="search/search.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="search/searchdata.js"></script> | |||
<script type="text/javascript" src="search/search.js"></script> | |||
<script type="text/javascript"> | |||
$(document).ready(function() { searchBox.OnSelectItem(0); }); | |||
$(document).ready(function() { init_search(); }); | |||
</script> | |||
<link href="doxygen.css" rel="stylesheet" type="text/css" /> | |||
</head> | |||
@@ -21,7 +22,7 @@ | |||
<table cellspacing="0" cellpadding="0"> | |||
<tbody> | |||
<tr style="height: 56px;"> | |||
<td style="padding-left: 0.5em;"> | |||
<td id="projectalign" style="padding-left: 0.5em;"> | |||
<div id="projectname">SdFat | |||
</div> | |||
</td> | |||
@@ -30,7 +31,7 @@ | |||
</table> | |||
</div> | |||
<!-- end header part --> | |||
<!-- Generated by Doxygen 1.8.8 --> | |||
<!-- Generated by Doxygen 1.8.10 --> | |||
<script type="text/javascript"> | |||
var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
</script> | |||
@@ -69,7 +70,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
onmouseover="return searchBox.OnSearchSelectShow()" | |||
onmouseout="return searchBox.OnSearchSelectHide()" | |||
onkeydown="return searchBox.OnSearchSelectKey(event)"> | |||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Modules</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Pages</a></div> | |||
</div> | |||
<!-- iframe showing the search results (closed by default) --> | |||
<div id="MSearchResultsWindow"> | |||
@@ -102,14 +103,20 @@ Include dependency graph for ArduinoFiles.h:</div> | |||
<div class="dyncontent"> | |||
<div class="center"><img src="_arduino_files_8h__incl.png" border="0" usemap="#_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_files_8h" alt=""/></div> | |||
<map name="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_files_8h" id="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_files_8h"> | |||
<area shape="rect" id="node3" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="323,245,428,272"/> <area shape="rect" id="node10" href="_fat_file_8h.html" title="FatFile class. " alt="" coords="211,96,284,123"/> <area shape="rect" id="node7" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="366,320,481,347"/> <area shape="rect" id="node19" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="102,245,196,272"/> <area shape="rect" id="node21" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="200,171,296,197"/> </map> | |||
<area shape="rect" id="node2" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="264,244,369,271"/> | |||
<area shape="rect" id="node5" href="_fat_file_8h.html" title="FatFile class. " alt="" coords="195,95,268,121"/> | |||
<area shape="rect" id="node4" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="310,319,414,345"/> | |||
<area shape="rect" id="node9" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="5,244,100,271"/> | |||
<area shape="rect" id="node10" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="183,169,279,196"/> | |||
</map> | |||
</div> | |||
</div><div class="textblock"><div class="dynheader"> | |||
This graph shows which files directly or indirectly include this file:</div> | |||
<div class="dyncontent"> | |||
<div class="center"><img src="_arduino_files_8h__dep__incl.png" border="0" usemap="#_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_files_8hdep" alt=""/></div> | |||
<map name="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_files_8hdep" id="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_files_8hdep"> | |||
<area shape="rect" id="node3" href="_fat_file_system_8h.html" title="FatFileSystem class. " alt="" coords="5,97,189,138"/> </map> | |||
<area shape="rect" id="node2" href="_fat_file_system_8h.html" title="FatFileSystem class. " alt="" coords="5,95,189,136"/> | |||
</map> | |||
</div> | |||
</div><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> | |||
@@ -160,9 +167,9 @@ Macros</h2></td></tr> | |||
</div><!-- contents --> | |||
<!-- start footer part --> | |||
<hr class="footer"/><address class="footer"><small> | |||
Generated on Sun Jul 19 2015 10:15:53 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
Generated on Sat Jan 23 2016 13:44:27 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||
</a> 1.8.8 | |||
</a> 1.8.10 | |||
</small></address> | |||
</body> | |||
</html> |
@@ -3,15 +3,16 @@ | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | |||
<meta http-equiv="X-UA-Compatible" content="IE=9"/> | |||
<meta name="generator" content="Doxygen 1.8.8"/> | |||
<meta name="generator" content="Doxygen 1.8.10"/> | |||
<title>SdFat: Arduino/libraries/SdFat/src/FatLib/ArduinoStream.h File Reference</title> | |||
<link href="tabs.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="jquery.js"></script> | |||
<script type="text/javascript" src="dynsections.js"></script> | |||
<link href="search/search.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="search/searchdata.js"></script> | |||
<script type="text/javascript" src="search/search.js"></script> | |||
<script type="text/javascript"> | |||
$(document).ready(function() { searchBox.OnSelectItem(0); }); | |||
$(document).ready(function() { init_search(); }); | |||
</script> | |||
<link href="doxygen.css" rel="stylesheet" type="text/css" /> | |||
</head> | |||
@@ -21,7 +22,7 @@ | |||
<table cellspacing="0" cellpadding="0"> | |||
<tbody> | |||
<tr style="height: 56px;"> | |||
<td style="padding-left: 0.5em;"> | |||
<td id="projectalign" style="padding-left: 0.5em;"> | |||
<div id="projectname">SdFat | |||
</div> | |||
</td> | |||
@@ -30,7 +31,7 @@ | |||
</table> | |||
</div> | |||
<!-- end header part --> | |||
<!-- Generated by Doxygen 1.8.8 --> | |||
<!-- Generated by Doxygen 1.8.10 --> | |||
<script type="text/javascript"> | |||
var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
</script> | |||
@@ -69,7 +70,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
onmouseover="return searchBox.OnSearchSelectShow()" | |||
onmouseout="return searchBox.OnSearchSelectHide()" | |||
onkeydown="return searchBox.OnSearchSelectKey(event)"> | |||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Modules</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Pages</a></div> | |||
</div> | |||
<!-- iframe showing the search results (closed by default) --> | |||
<div id="MSearchResultsWindow"> | |||
@@ -94,14 +95,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
<p><a class="el" href="class_arduino_in_stream.html" title="Input stream for Arduino Stream objects. ">ArduinoInStream</a> and <a class="el" href="class_arduino_out_stream.html" title="Output stream for Arduino Print objects. ">ArduinoOutStream</a> classes. | |||
<a href="#details">More...</a></p> | |||
<div class="textblock"><code>#include "<a class="el" href="_fat_lib_config_8h.html">FatLibConfig.h</a>"</code><br /> | |||
<code>#include <Arduino.h></code><br /> | |||
<code>#include "SystemInclude.h"</code><br /> | |||
<code>#include "<a class="el" href="bufstream_8h.html">bufstream.h</a>"</code><br /> | |||
</div><div class="textblock"><div class="dynheader"> | |||
Include dependency graph for ArduinoStream.h:</div> | |||
<div class="dyncontent"> | |||
<div class="center"><img src="_arduino_stream_8h__incl.png" border="0" usemap="#_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_stream_8h" alt=""/></div> | |||
<map name="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_stream_8h" id="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_arduino_stream_8h"> | |||
<area shape="rect" id="node3" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="5,544,109,571"/> <area shape="rect" id="node12" href="bufstream_8h.html" title="ibufstream and obufstream classes " alt="" coords="347,96,437,123"/> <area shape="rect" id="node7" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="47,619,163,645"/> <area shape="rect" id="node16" href="iostream_8h.html" title="iostream class " alt="" coords="317,171,400,197"/> <area shape="rect" id="node18" href="istream_8h.html" title="istream class " alt="" coords="219,245,295,272"/> <area shape="rect" id="node38" href="ostream_8h.html" title="ostream class " alt="" coords="320,245,400,272"/> <area shape="rect" id="node20" href="ios_8h.html" title="ios_base and ios classes " alt="" coords="244,320,295,347"/> <area shape="rect" id="node22" href="_fat_file_8h.html" title="FatFile class. " alt="" coords="233,395,305,421"/> <area shape="rect" id="node30" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="263,544,357,571"/> <area shape="rect" id="node32" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="233,469,329,496"/> </map> | |||
<area shape="rect" id="node2" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="365,543,471,569"/> | |||
<area shape="rect" id="node5" href="bufstream_8h.html" title="ibufstream and obufstream classes " alt="" coords="178,95,269,121"/> | |||
<area shape="rect" id="node4" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="411,617,515,644"/> | |||
<area shape="rect" id="node7" href="iostream_8h.html" title="iostream class " alt="" coords="182,169,265,196"/> | |||
<area shape="rect" id="node8" href="istream_8h.html" title="istream class " alt="" coords="133,244,209,271"/> | |||
<area shape="rect" id="node15" href="ostream_8h.html" title="ostream class " alt="" coords="234,244,314,271"/> | |||
<area shape="rect" id="node9" href="ios_8h.html" title="ios_base and ios classes " alt="" coords="197,319,247,345"/> | |||
<area shape="rect" id="node10" href="_fat_file_8h.html" title="FatFile class. " alt="" coords="185,393,259,420"/> | |||
<area shape="rect" id="node13" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="151,543,245,569"/> | |||
<area shape="rect" id="node14" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="285,468,381,495"/> | |||
</map> | |||
</div> | |||
</div><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> | |||
@@ -118,9 +129,9 @@ Classes</h2></td></tr> | |||
</div></div><!-- contents --> | |||
<!-- start footer part --> | |||
<hr class="footer"/><address class="footer"><small> | |||
Generated on Sun Jul 19 2015 10:15:53 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
Generated on Sat Jan 23 2016 13:44:27 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||
</a> 1.8.8 | |||
</a> 1.8.10 | |||
</small></address> | |||
</body> | |||
</html> |
@@ -3,15 +3,16 @@ | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | |||
<meta http-equiv="X-UA-Compatible" content="IE=9"/> | |||
<meta name="generator" content="Doxygen 1.8.8"/> | |||
<meta name="generator" content="Doxygen 1.8.10"/> | |||
<title>SdFat: Arduino/libraries/SdFat/src/SdSpiCard/DigitalPin.h File Reference</title> | |||
<link href="tabs.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="jquery.js"></script> | |||
<script type="text/javascript" src="dynsections.js"></script> | |||
<link href="search/search.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="search/searchdata.js"></script> | |||
<script type="text/javascript" src="search/search.js"></script> | |||
<script type="text/javascript"> | |||
$(document).ready(function() { searchBox.OnSelectItem(0); }); | |||
$(document).ready(function() { init_search(); }); | |||
</script> | |||
<link href="doxygen.css" rel="stylesheet" type="text/css" /> | |||
</head> | |||
@@ -21,7 +22,7 @@ | |||
<table cellspacing="0" cellpadding="0"> | |||
<tbody> | |||
<tr style="height: 56px;"> | |||
<td style="padding-left: 0.5em;"> | |||
<td id="projectalign" style="padding-left: 0.5em;"> | |||
<div id="projectname">SdFat | |||
</div> | |||
</td> | |||
@@ -30,7 +31,7 @@ | |||
</table> | |||
</div> | |||
<!-- end header part --> | |||
<!-- Generated by Doxygen 1.8.8 --> | |||
<!-- Generated by Doxygen 1.8.10 --> | |||
<script type="text/javascript"> | |||
var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
</script> | |||
@@ -69,7 +70,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
onmouseover="return searchBox.OnSearchSelectShow()" | |||
onmouseout="return searchBox.OnSearchSelectHide()" | |||
onkeydown="return searchBox.OnSearchSelectKey(event)"> | |||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Modules</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Pages</a></div> | |||
</div> | |||
<!-- iframe showing the search results (closed by default) --> | |||
<div id="MSearchResultsWindow"> | |||
@@ -86,8 +87,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
<div class="header"> | |||
<div class="summary"> | |||
<a href="#nested-classes">Classes</a> | | |||
<a href="#func-members">Functions</a> | | |||
<a href="#var-members">Variables</a> </div> | |||
<a href="#define-members">Macros</a> | | |||
<a href="#func-members">Functions</a> </div> | |||
<div class="headertitle"> | |||
<div class="title">DigitalPin.h File Reference</div> </div> | |||
</div><!--header--> | |||
@@ -95,9 +96,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
<p>Fast Digital Pin functions. | |||
<a href="#details">More...</a></p> | |||
<div class="textblock"><code>#include <Arduino.h></code><br /> | |||
<div class="textblock"><code>#include "SystemInclude.h"</code><br /> | |||
<code>#include <avr/io.h></code><br /> | |||
<code>#include <util/atomic.h></code><br /> | |||
<code>#include "boards/GpioPinMap.h"</code><br /> | |||
</div><div class="textblock"><div class="dynheader"> | |||
Include dependency graph for DigitalPin.h:</div> | |||
<div class="dyncontent"> | |||
@@ -110,7 +111,8 @@ This graph shows which files directly or indirectly include this file:</div> | |||
<div class="dyncontent"> | |||
<div class="center"><img src="_digital_pin_8h__dep__incl.png" border="0" usemap="#_arduino_2libraries_2_sd_fat_2src_2_sd_spi_card_2_digital_pin_8hdep" alt=""/></div> | |||
<map name="_arduino_2libraries_2_sd_fat_2src_2_sd_spi_card_2_digital_pin_8hdep" id="_arduino_2libraries_2_sd_fat_2src_2_sd_spi_card_2_digital_pin_8hdep"> | |||
<area shape="rect" id="node3" href="_soft_s_p_i_8h.html" title="Software SPI. " alt="" coords="14,97,183,138"/> <area shape="rect" id="node5" href="_sd_spi_8h.html" title="SdSpi class for V2 SD/SDHC cards. " alt="" coords="19,187,179,229"/> <area shape="rect" id="node7" href="_sd_spi_card_8h.html" title="SdSpiCard class for V2 SD/SDHC cards. " alt="" coords="5,278,192,319"/> <area shape="rect" id="node9" href="_sd_fat_8h.html" title="SdFat class. " alt="" coords="21,369,176,410"/> <area shape="rect" id="node11" href="_sd_fat_util_8h.html" title="Useful utility functions. " alt="" coords="21,459,176,501"/> </map> | |||
<area shape="rect" id="node2" href="_soft_s_p_i_8h.html" title="Software SPI. " alt="" coords="11,95,180,136"/> | |||
</map> | |||
</div> | |||
</div><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> | |||
@@ -118,42 +120,51 @@ Classes</h2></td></tr> | |||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_digital_pin.html">DigitalPin< PinNumber ></a></td></tr> | |||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Fast digital port I/O. <a href="class_digital_pin.html#details">More...</a><br /></td></tr> | |||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structpin__map__t.html">pin_map_t</a></td></tr> | |||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">struct for mapping digital pins <a href="structpin__map__t.html#details">More...</a><br /></td></tr> | |||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_gpio_pin_map__t.html">GpioPinMap_t</a></td></tr> | |||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> | |||
</table><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> | |||
Macros</h2></td></tr> | |||
<tr class="memitem:gacf92f370944e233db04f7423bde1c164"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gacf92f370944e233db04f7423bde1c164">GPIO_PIN</a>(reg, bit)   {&PIN##reg, &DDR##reg, &PORT##reg, 1 << bit}</td></tr> | |||
<tr class="separator:gacf92f370944e233db04f7423bde1c164"><td class="memSeparator" colspan="2"> </td></tr> | |||
</table><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> | |||
Functions</h2></td></tr> | |||
<tr class="memitem:ga107992311bca47c7ebee5afdedc280e0"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga107992311bca47c7ebee5afdedc280e0">badPinCheck</a> (uint8_t pin)</td></tr> | |||
<tr class="separator:ga107992311bca47c7ebee5afdedc280e0"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga2a50c39692fdc6a7be0f614f6d730bfe"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga2a50c39692fdc6a7be0f614f6d730bfe">badPinNumber</a> (void)</td></tr> | |||
<tr class="separator:ga2a50c39692fdc6a7be0f614f6d730bfe"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:gac074e589cd04dca057b403dd3781ee45"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gac074e589cd04dca057b403dd3781ee45">fastBitWriteSafe</a> (volatile uint8_t *address, uint8_t bit, bool level)</td></tr> | |||
<tr class="separator:gac074e589cd04dca057b403dd3781ee45"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:gaa28ed1bee40bd072ba33554ac6d36ed8"><td class="memItemLeft" align="right" valign="top">static volatile uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gaa28ed1bee40bd072ba33554ac6d36ed8">ddrReg</a> (uint8_t pin)</td></tr> | |||
<tr class="separator:gaa28ed1bee40bd072ba33554ac6d36ed8"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:gaff40f792e0b2aefb3ef6f11f32bae3dd"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gaff40f792e0b2aefb3ef6f11f32bae3dd">fastBitWriteSafe</a> (volatile uint8_t *address, uint8_t mask, bool level)</td></tr> | |||
<tr class="separator:gaff40f792e0b2aefb3ef6f11f32bae3dd"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:gada03ef0d2522fe5639f5239991993409"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gada03ef0d2522fe5639f5239991993409">fastDdrWrite</a> (uint8_t pin, bool level)</td></tr> | |||
<tr class="separator:gada03ef0d2522fe5639f5239991993409"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga618a9ee1c3d1b9fc5c8a2c6a43014b08"><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga618a9ee1c3d1b9fc5c8a2c6a43014b08">fastDigitalRead</a> (uint8_t pin)</td></tr> | |||
<tr class="separator:ga618a9ee1c3d1b9fc5c8a2c6a43014b08"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga5314f1aaede89a4090b44779c8c551f1"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga5314f1aaede89a4090b44779c8c551f1">fastDigitalToggle</a> (uint8_t pin)</td></tr> | |||
<tr class="separator:ga5314f1aaede89a4090b44779c8c551f1"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:gac4f52b5038c366dd4ac081b18709f19c"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gac4f52b5038c366dd4ac081b18709f19c">fastDigitalWrite</a> (uint8_t pin, bool level)</td></tr> | |||
<tr class="separator:gac4f52b5038c366dd4ac081b18709f19c"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga6d022f02ed0a7d69d56521346bb81457"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga6d022f02ed0a7d69d56521346bb81457">fastPinConfig</a> (uint8_t pin, bool mode, bool level)</td></tr> | |||
<tr class="separator:ga6d022f02ed0a7d69d56521346bb81457"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:gac66bd0bc3332b7a08f257058034cdba8"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gac66bd0bc3332b7a08f257058034cdba8">fastPinMode</a> (uint8_t pin, bool mode)</td></tr> | |||
<tr class="separator:gac66bd0bc3332b7a08f257058034cdba8"><td class="memSeparator" colspan="2"> </td></tr> | |||
</table><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> | |||
Variables</h2></td></tr> | |||
<tr class="memitem:ga3ba5f4d8ff10e60ec2d424722dd9fe92"><td class="memItemLeft" align="right" valign="top">static const uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga3ba5f4d8ff10e60ec2d424722dd9fe92">digitalPinCount</a> = sizeof(pinMap)/sizeof(<a class="el" href="structpin__map__t.html">pin_map_t</a>)</td></tr> | |||
<tr class="separator:ga3ba5f4d8ff10e60ec2d424722dd9fe92"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:gab5243728ddd84498e4eb59247f58e55d"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#gab5243728ddd84498e4eb59247f58e55d">fastPinConfig</a> (uint8_t pin, uint8_t mode, bool level)</td></tr> | |||
<tr class="separator:gab5243728ddd84498e4eb59247f58e55d"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga5b9c17432f07f0eb39283c8b23665fe7"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga5b9c17432f07f0eb39283c8b23665fe7">fastPinMode</a> (uint8_t pin, uint8_t mode)</td></tr> | |||
<tr class="separator:ga5b9c17432f07f0eb39283c8b23665fe7"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga99fe9f7aeaaae3764a7b7c40d9d9837b"><td class="memItemLeft" align="right" valign="top">static uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga99fe9f7aeaaae3764a7b7c40d9d9837b">pinMask</a> (uint8_t pin)</td></tr> | |||
<tr class="separator:ga99fe9f7aeaaae3764a7b7c40d9d9837b"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga213b72ce9a61eddce1e85fa057e9e3b6"><td class="memItemLeft" align="right" valign="top">static volatile uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga213b72ce9a61eddce1e85fa057e9e3b6">pinReg</a> (uint8_t pin)</td></tr> | |||
<tr class="separator:ga213b72ce9a61eddce1e85fa057e9e3b6"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:ga1e2ef44778ccf79ac2c02afe0633ef88"><td class="memItemLeft" align="right" valign="top">static volatile uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__digital_pin.html#ga1e2ef44778ccf79ac2c02afe0633ef88">portReg</a> (uint8_t pin)</td></tr> | |||
<tr class="separator:ga1e2ef44778ccf79ac2c02afe0633ef88"><td class="memSeparator" colspan="2"> </td></tr> | |||
</table> | |||
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> | |||
<div class="textblock"><p>Fast Digital Pin functions. </p> | |||
</div></div><!-- contents --> | |||
<!-- start footer part --> | |||
<hr class="footer"/><address class="footer"><small> | |||
Generated on Sun Jul 19 2015 10:15:53 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
Generated on Sat Jan 23 2016 13:44:27 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||
</a> 1.8.8 | |||
</a> 1.8.10 | |||
</small></address> | |||
</body> | |||
</html> |
@@ -3,15 +3,16 @@ | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | |||
<meta http-equiv="X-UA-Compatible" content="IE=9"/> | |||
<meta name="generator" content="Doxygen 1.8.8"/> | |||
<meta name="generator" content="Doxygen 1.8.10"/> | |||
<title>SdFat: Arduino/libraries/SdFat/src/FatLib/FatFile.h File Reference</title> | |||
<link href="tabs.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="jquery.js"></script> | |||
<script type="text/javascript" src="dynsections.js"></script> | |||
<link href="search/search.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="search/searchdata.js"></script> | |||
<script type="text/javascript" src="search/search.js"></script> | |||
<script type="text/javascript"> | |||
$(document).ready(function() { searchBox.OnSelectItem(0); }); | |||
$(document).ready(function() { init_search(); }); | |||
</script> | |||
<link href="doxygen.css" rel="stylesheet" type="text/css" /> | |||
</head> | |||
@@ -21,7 +22,7 @@ | |||
<table cellspacing="0" cellpadding="0"> | |||
<tbody> | |||
<tr style="height: 56px;"> | |||
<td style="padding-left: 0.5em;"> | |||
<td id="projectalign" style="padding-left: 0.5em;"> | |||
<div id="projectname">SdFat | |||
</div> | |||
</td> | |||
@@ -30,7 +31,7 @@ | |||
</table> | |||
</div> | |||
<!-- end header part --> | |||
<!-- Generated by Doxygen 1.8.8 --> | |||
<!-- Generated by Doxygen 1.8.10 --> | |||
<script type="text/javascript"> | |||
var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
</script> | |||
@@ -69,7 +70,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
onmouseover="return searchBox.OnSearchSelectShow()" | |||
onmouseout="return searchBox.OnSearchSelectHide()" | |||
onkeydown="return searchBox.OnSearchSelectKey(event)"> | |||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Modules</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Pages</a></div> | |||
</div> | |||
<!-- iframe showing the search results (closed by default) --> | |||
<div id="MSearchResultsWindow"> | |||
@@ -107,14 +108,28 @@ Include dependency graph for FatFile.h:</div> | |||
<div class="dyncontent"> | |||
<div class="center"><img src="_fat_file_8h__incl.png" border="0" usemap="#_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_8h" alt=""/></div> | |||
<map name="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_8h" id="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_8h"> | |||
<area shape="rect" id="node9" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="106,171,211,197"/> <area shape="rect" id="node16" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="338,171,432,197"/> <area shape="rect" id="node18" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="196,96,292,123"/> <area shape="rect" id="node13" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="149,245,264,272"/> </map> | |||
<area shape="rect" id="node5" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="160,169,265,196"/> | |||
<area shape="rect" id="node8" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="289,169,384,196"/> | |||
<area shape="rect" id="node9" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="146,95,242,121"/> | |||
<area shape="rect" id="node7" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="205,244,309,271"/> | |||
</map> | |||
</div> | |||
</div><div class="textblock"><div class="dynheader"> | |||
This graph shows which files directly or indirectly include this file:</div> | |||
<div class="dyncontent"> | |||
<div class="center"><img src="_fat_file_8h__dep__incl.png" border="0" usemap="#_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_8hdep" alt=""/></div> | |||
<map name="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_8hdep" id="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_8hdep"> | |||
<area shape="rect" id="node3" href="_arduino_files_8h.html" title="PrintFile class. " alt="" coords="29,97,200,138"/> <area shape="rect" id="node5" href="_fat_file_system_8h.html" title="FatFileSystem class. " alt="" coords="5,187,189,229"/> <area shape="rect" id="node7" href="ios_8h.html" title="ios_base and ios classes " alt="" coords="375,97,529,138"/> <area shape="rect" id="node17" href="fstream_8h.html" title="fstream, ifstream, and ofstream classes " alt="" coords="507,369,661,410"/> <area shape="rect" id="node23" href="_stdio_stream_8h.html" title="StdioStream class. " alt="" coords="621,97,792,138"/> <area shape="rect" id="node9" href="istream_8h.html" title="istream class " alt="" coords="213,187,368,229"/> <area shape="rect" id="node19" href="ostream_8h.html" title="ostream class " alt="" coords="392,187,547,229"/> <area shape="rect" id="node11" href="iostream_8h.html" title="iostream class " alt="" coords="359,278,513,319"/> <area shape="rect" id="node13" href="bufstream_8h.html" title="ibufstream and obufstream classes " alt="" coords="326,369,481,410"/> <area shape="rect" id="node15" href="_arduino_stream_8h.html" title="ArduinoInStream and ArduinoOutStream classes. " alt="" coords="311,459,496,501"/> </map> | |||
<area shape="rect" id="node2" href="_arduino_files_8h.html" title="PrintFile class. " alt="" coords="29,95,200,136"/> | |||
<area shape="rect" id="node3" href="_fat_file_system_8h.html" title="FatFileSystem class. " alt="" coords="5,184,189,225"/> | |||
<area shape="rect" id="node4" href="ios_8h.html" title="ios_base and ios classes " alt="" coords="375,95,529,136"/> | |||
<area shape="rect" id="node9" href="fstream_8h.html" title="fstream, ifstream, and ofstream classes " alt="" coords="507,363,661,404"/> | |||
<area shape="rect" id="node11" href="_stdio_stream_8h.html" title="StdioStream class. " alt="" coords="621,95,792,136"/> | |||
<area shape="rect" id="node5" href="istream_8h.html" title="istream class " alt="" coords="213,184,368,225"/> | |||
<area shape="rect" id="node10" href="ostream_8h.html" title="ostream class " alt="" coords="392,184,547,225"/> | |||
<area shape="rect" id="node6" href="iostream_8h.html" title="iostream class " alt="" coords="359,273,513,315"/> | |||
<area shape="rect" id="node7" href="bufstream_8h.html" title="ibufstream and obufstream classes " alt="" coords="326,363,482,404"/> | |||
<area shape="rect" id="node8" href="_arduino_stream_8h.html" title="ArduinoInStream and ArduinoOutStream classes. " alt="" coords="311,452,497,493"/> | |||
</map> | |||
</div> | |||
</div><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> | |||
@@ -133,13 +148,11 @@ Classes</h2></td></tr> | |||
Macros</h2></td></tr> | |||
<tr class="memitem:a9f85580ad6f1dfc86fff09a58ff0a1c0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="_fat_file_8h.html#a9f85580ad6f1dfc86fff09a58ff0a1c0">isDirSeparator</a>(c)   ((c) == '/')</td></tr> | |||
<tr class="separator:a9f85580ad6f1dfc86fff09a58ff0a1c0"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:a963f816fc88a5d8479c285ed4c630229"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="_fat_file_8h.html#a963f816fc88a5d8479c285ed4c630229">PGM_P</a>   const char*</td></tr> | |||
<tr class="separator:a963f816fc88a5d8479c285ed4c630229"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:a48c60b057902adf805797f183286728d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="_fat_file_8h.html#a48c60b057902adf805797f183286728d">pgm_read_byte</a>(addr)   (*(const unsigned char*)(addr))</td></tr> | |||
<tr class="separator:a48c60b057902adf805797f183286728d"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:a910fb5f01313d339d3b835d45e1e5ad0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="_fat_file_8h.html#a910fb5f01313d339d3b835d45e1e5ad0">pgm_read_word</a>(addr)   (*(const uint16_t*)(addr))</td></tr> | |||
<tr class="separator:a910fb5f01313d339d3b835d45e1e5ad0"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:a75acaba9e781937468d0911423bc0c35"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="_fat_file_8h.html#a75acaba9e781937468d0911423bc0c35">PROGMEM</a>   const</td></tr> | |||
<tr class="memitem:a75acaba9e781937468d0911423bc0c35"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="_fat_file_8h.html#a75acaba9e781937468d0911423bc0c35">PROGMEM</a></td></tr> | |||
<tr class="separator:a75acaba9e781937468d0911423bc0c35"><td class="memSeparator" colspan="2"> </td></tr> | |||
<tr class="memitem:a9c00057fd19e916cc1aa0a5949336beb"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="_fat_file_8h.html#a9c00057fd19e916cc1aa0a5949336beb">PSTR</a>(x)   (x)</td></tr> | |||
<tr class="separator:a9c00057fd19e916cc1aa0a5949336beb"><td class="memSeparator" colspan="2"> </td></tr> | |||
@@ -175,19 +188,6 @@ Variables</h2></td></tr> | |||
</div><div class="memdoc"> | |||
<p>Expression for path name separator. </p> | |||
</div> | |||
</div> | |||
<a class="anchor" id="a963f816fc88a5d8479c285ed4c630229"></a> | |||
<div class="memitem"> | |||
<div class="memproto"> | |||
<table class="memname"> | |||
<tr> | |||
<td class="memname">#define PGM_P   const char*</td> | |||
</tr> | |||
</table> | |||
</div><div class="memdoc"> | |||
<p>pointer to flash for ARM </p> | |||
</div> | |||
</div> | |||
<a class="anchor" id="a48c60b057902adf805797f183286728d"></a> | |||
@@ -229,7 +229,7 @@ Variables</h2></td></tr> | |||
<div class="memproto"> | |||
<table class="memname"> | |||
<tr> | |||
<td class="memname">#define PROGMEM   const</td> | |||
<td class="memname">#define PROGMEM</td> | |||
</tr> | |||
</table> | |||
</div><div class="memdoc"> | |||
@@ -318,8 +318,8 @@ Variables</h2></td></tr> | |||
</div><div class="memdoc"> | |||
<b>Initial value:</b><div class="fragment"><div class="line">=</div> | |||
<div class="line"> <a class="code" href="_fat_file_8h.html#acd45286b7dfc5ba68be18c8c3a9d298d">FNAME_FLAG_LOST_CHARS</a> | <a class="code" href="_fat_file_8h.html#a63994c21f3b723a55247f063a1b01c9c">FNAME_FLAG_MIXED_CASE</a></div> | |||
<div class="ttc" id="_fat_file_8h_html_a63994c21f3b723a55247f063a1b01c9c"><div class="ttname"><a href="_fat_file_8h.html#a63994c21f3b723a55247f063a1b01c9c">FNAME_FLAG_MIXED_CASE</a></div><div class="ttdeci">const uint8_t FNAME_FLAG_MIXED_CASE</div><div class="ttdef"><b>Definition:</b> FatFile.h:96</div></div> | |||
<div class="ttc" id="_fat_file_8h_html_acd45286b7dfc5ba68be18c8c3a9d298d"><div class="ttname"><a href="_fat_file_8h.html#acd45286b7dfc5ba68be18c8c3a9d298d">FNAME_FLAG_LOST_CHARS</a></div><div class="ttdeci">const uint8_t FNAME_FLAG_LOST_CHARS</div><div class="ttdef"><b>Definition:</b> FatFile.h:94</div></div> | |||
<div class="ttc" id="_fat_file_8h_html_a63994c21f3b723a55247f063a1b01c9c"><div class="ttname"><a href="_fat_file_8h.html#a63994c21f3b723a55247f063a1b01c9c">FNAME_FLAG_MIXED_CASE</a></div><div class="ttdeci">const uint8_t FNAME_FLAG_MIXED_CASE</div><div class="ttdef"><b>Definition:</b> FatFile.h:92</div></div> | |||
<div class="ttc" id="_fat_file_8h_html_acd45286b7dfc5ba68be18c8c3a9d298d"><div class="ttname"><a href="_fat_file_8h.html#acd45286b7dfc5ba68be18c8c3a9d298d">FNAME_FLAG_LOST_CHARS</a></div><div class="ttdeci">const uint8_t FNAME_FLAG_LOST_CHARS</div><div class="ttdef"><b>Definition:</b> FatFile.h:90</div></div> | |||
</div><!-- fragment --><p>LFN entries are required for file name. </p> | |||
</div> | |||
@@ -327,9 +327,9 @@ Variables</h2></td></tr> | |||
</div><!-- contents --> | |||
<!-- start footer part --> | |||
<hr class="footer"/><address class="footer"><small> | |||
Generated on Sun Jul 19 2015 10:15:53 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
Generated on Sat Jan 23 2016 13:44:27 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||
</a> 1.8.8 | |||
</a> 1.8.10 | |||
</small></address> | |||
</body> | |||
</html> |
@@ -3,15 +3,16 @@ | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | |||
<meta http-equiv="X-UA-Compatible" content="IE=9"/> | |||
<meta name="generator" content="Doxygen 1.8.8"/> | |||
<meta name="generator" content="Doxygen 1.8.10"/> | |||
<title>SdFat: Arduino/libraries/SdFat/src/FatLib/FatFileSystem.h File Reference</title> | |||
<link href="tabs.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="jquery.js"></script> | |||
<script type="text/javascript" src="dynsections.js"></script> | |||
<link href="search/search.css" rel="stylesheet" type="text/css"/> | |||
<script type="text/javascript" src="search/searchdata.js"></script> | |||
<script type="text/javascript" src="search/search.js"></script> | |||
<script type="text/javascript"> | |||
$(document).ready(function() { searchBox.OnSelectItem(0); }); | |||
$(document).ready(function() { init_search(); }); | |||
</script> | |||
<link href="doxygen.css" rel="stylesheet" type="text/css" /> | |||
</head> | |||
@@ -21,7 +22,7 @@ | |||
<table cellspacing="0" cellpadding="0"> | |||
<tbody> | |||
<tr style="height: 56px;"> | |||
<td style="padding-left: 0.5em;"> | |||
<td id="projectalign" style="padding-left: 0.5em;"> | |||
<div id="projectname">SdFat | |||
</div> | |||
</td> | |||
@@ -30,7 +31,7 @@ | |||
</table> | |||
</div> | |||
<!-- end header part --> | |||
<!-- Generated by Doxygen 1.8.8 --> | |||
<!-- Generated by Doxygen 1.8.10 --> | |||
<script type="text/javascript"> | |||
var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
</script> | |||
@@ -69,7 +70,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); | |||
onmouseover="return searchBox.OnSearchSelectShow()" | |||
onmouseout="return searchBox.OnSearchSelectHide()" | |||
onkeydown="return searchBox.OnSearchSelectKey(event)"> | |||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Modules</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Pages</a></div> | |||
</div> | |||
<!-- iframe showing the search results (closed by default) --> | |||
<div id="MSearchResultsWindow"> | |||
@@ -101,7 +102,13 @@ Include dependency graph for FatFileSystem.h:</div> | |||
<div class="dyncontent"> | |||
<div class="center"><img src="_fat_file_system_8h__incl.png" border="0" usemap="#_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_system_8h" alt=""/></div> | |||
<map name="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_system_8h" id="_arduino_2libraries_2_sd_fat_2src_2_fat_lib_2_fat_file_system_8h"> | |||
<area shape="rect" id="node3" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="115,245,211,272"/> <area shape="rect" id="node18" href="_fat_file_8h.html" title="FatFile class. " alt="" coords="282,171,355,197"/> <area shape="rect" id="node28" href="_arduino_files_8h.html" title="PrintFile class. " alt="" coords="381,96,485,123"/> <area shape="rect" id="node7" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="337,320,441,347"/> <area shape="rect" id="node14" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="5,320,99,347"/> <area shape="rect" id="node11" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="379,395,495,421"/> </map> | |||
<area shape="rect" id="node2" href="_fat_volume_8h.html" title="FatVolume class. " alt="" coords="89,244,185,271"/> | |||
<area shape="rect" id="node8" href="_fat_file_8h.html" title="FatFile class. " alt="" coords="236,169,309,196"/> | |||
<area shape="rect" id="node11" href="_arduino_files_8h.html" title="PrintFile class. " alt="" coords="345,95,451,121"/> | |||
<area shape="rect" id="node4" href="_fat_lib_config_8h.html" title="configuration definitions " alt="" coords="220,319,325,345"/> | |||
<area shape="rect" id="node7" href="_fat_structs_8h.html" title="FAT file structures. " alt="" coords="5,319,100,345"/> | |||
<area shape="rect" id="node6" href="_sd_fat_config_8h.html" title="configuration definitions " alt="" coords="266,393,370,420"/> | |||
</map> | |||
</div> | |||
</div><table class="memberdecls"> | |||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> | |||
@@ -115,9 +122,9 @@ Classes</h2></td></tr> | |||
</div></div><!-- contents --> | |||
<!-- start footer part --> | |||
<hr class="footer"/><address class="footer"><small> | |||
Generated on Sun Jul 19 2015 10:15:53 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
Generated on Sat Jan 23 2016 13:44:27 for SdFat by  <a href="http://www.doxygen.org/index.html"> | |||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||
</a> 1.8.8 | |||
</a> 1.8.10 | |||
</small></address> | |||
</body> | |||
</html> |