+++ /dev/null
-/*
-FAT16 ReadFile Example
-SparkFun Electronics
-Written by Ryan Owens
-3/16/2010
-
-Code Description: Uses an Arduino Duemillanove or Arduino Pro to read the file contents of each file on an SD card.
-
-Circuit Description: Uses the SparkFun microSD shield. (http://www.sparkfun.com/commerce/product_info.php?products_id=9520)
-
-Attributions: Special thanks to Roland Riegel for providing an open source FAT library
-for AVR microcontrollers. See more of his projects here:
-http://www.roland-riegel.de/
-
-This code is provided under the Creative Commons Attribution License. More information can be found here:
-http://creativecommons.org/licenses/by/3.0/
-
-(Use our code freely! Please just remember to give us credit where it's due. Thanks!)
-*/
-
-//Add libraries to support FAT16 on the SD Card.
-//(Note: If you already have these libraries installed in the directory, they'll have to remove in order to compile this.)
-#include <byteordering.h>
-#include <fat.h>
-#include <fat_config.h>
-#include <partition.h>
-#include <partition_config.h>
-#include <sd-reader_config.h>
-#include <sd_raw.h>
-#include <sd_raw_config.h>
-
-//Define the pin numbers
-#define CS 8
-#define MOSI 11
-#define MISO 12
-#define SCK 13
-
-//This is the amount of data to be fetched from the SD card for each read.
-#define BUFFERSIZE 256
-
-#include "WProgram.h"
-void setup();
-void loop();
-uint8_t find_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name, struct fat_dir_entry_struct* dir_entry);
-struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name);
-char init_filesystem(void);
-char get_next_filename(struct fat_dir_struct* cur_dir, char * new_file);
-unsigned char buffer[BUFFERSIZE];
-char file_name[30];
-
-struct fat_dir_struct* dd; //FAT16 directory
-struct fat_dir_entry_struct dir_entry; //FAT16 directory entry (A.K.A. a file)
-
-struct fat_fs_struct* fs; //FAT16 File System
-struct partition_struct* partition; //FAT16 Partition
-
-struct fat_file_struct * file_handle; //FAT16 File Handle
-
-void setup()
-{
- //Set up the pins for the Serial communication
- pinMode(0, INPUT);
- pinMode(1, OUTPUT);
- Serial.begin(9600);
-
- //Set up the pins for the microSD shield
- pinMode(CS, OUTPUT);
- pinMode(MOSI, OUTPUT);
- pinMode(MISO, INPUT);
- pinMode(SCK, OUTPUT);
- pinMode(10, OUTPUT);
-}
-
-void loop()
-{
- int bytes_read=0; //Keeps track of how many bytes are read when accessing a file on the SD card.
-
- init_filesystem(); //Initialize the FAT16 file system on the SD card.
-
- //Get the next file in the directory
- while(get_next_filename(dd, file_name)){
- //Open the file
- file_handle=open_file_in_dir(fs, dd, file_name);
- //Read up to 512 bytes from the file
- bytes_read = fat_read_file(file_handle, buffer, BUFFERSIZE);
- //Print whatever we just got from the file
- Serial.println((const char *)buffer);
- //Keep reading from the file until we reach the end (nothing more is read from the file)
- while(bytes_read > 0){
- //If there's more to be read from the file, go get it.
- bytes_read = fat_read_file(file_handle, buffer, BUFFERSIZE);
- //Print the contents that have been read
- Serial.println((const char *)buffer);
- }
- //Close the file before moving on to the next one.
- fat_close_file(file_handle);
- delay(1000);
- Serial.println("Next File...");
- }
- while(1);
-}
-
-uint8_t find_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name, struct fat_dir_entry_struct* dir_entry)
-{
- fat_reset_dir(dd); //Make sure to start from the beginning of the directory!
- while(fat_read_dir(dd, dir_entry))
- {
- if(strcmp(dir_entry->long_name, name) == 0)
- {
- //fat_reset_dir(dd);
- return 1;
- }
- }
-
- return 0;
-}
-
-struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name)
-{
- struct fat_dir_entry_struct file_entry;
- if(!find_file_in_dir(fs, dd, name, &file_entry))
- return 0;
-
- return fat_open_file(fs, &file_entry);
-}
-
-char init_filesystem(void)
-{
- //setup sd card slot
- if(!sd_raw_init())
- {
- return 0;
- }
-
- //open first partition
- partition = partition_open(sd_raw_read,
- sd_raw_read_interval,
-#if SD_RAW_WRITE_SUPPORT
- sd_raw_write,
- sd_raw_write_interval,
-#else
- 0,
- 0,
-#endif
- 0
- );
-
- if(!partition)
- {
- //If the partition did not open, assume the storage device
- //is a "superfloppy", i.e. has no MBR.
- partition = partition_open(sd_raw_read,
- sd_raw_read_interval,
-#if SD_RAW_WRITE_SUPPORT
- sd_raw_write,
- sd_raw_write_interval,
-#else
- 0,
- 0,
-#endif
- -1
- );
- if(!partition)
- {
- return 0;
- }
- }
-
- //Open file system
- fs = fat_open(partition);
- if(!fs)
- {
- return 0;
- }
-
- //Open root directory
- fat_get_dir_entry_of_path(fs, "/", &dir_entry);
- dd=fat_open_dir(fs, &dir_entry);
-
- if(!dd)
- {
- return 0;
- }
- return 1;
-}
-
-char get_next_filename(struct fat_dir_struct* cur_dir, char * new_file)
-{
- //'dir_entry' is a global variable of type directory_entry_struct
-
- //Get the next file from the root directory
- if(fat_read_dir(cur_dir, &dir_entry))
- {
- sprintf(new_file, "%s", dir_entry.long_name);
- Serial.println((const char *)new_file);
- return 1;
- }
- //If another file isn't found, return 0
- return 0;
-}
-
-
-
-int main(void)
-{
- init();
-
- setup();
-
- for (;;)
- loop();
-
- return 0;
-}
-