Imported SD card library

This commit is contained in:
David Lenfesty 2019-10-30 15:43:20 -06:00
parent 985484179b
commit 93137fdf09
81 changed files with 17339 additions and 16 deletions

View File

@ -1,16 +0,0 @@
#include <avr/io.h>
// Set up GPIO here
void pin_setup() {
}
int main() {
pin_setup()
while (1) {
}
}

View File

@ -0,0 +1,124 @@
2012-06-12 sd-reader
* fix capacity readout from csd register depending on format version
* fix gcc strict-aliasing warnings (also somewhat enlarges code size)
2011-04-23 sd-reader
* fix FAT access for cluster numbers beyond 2^15 (for FAT16) and 2^30 (for FAT32) (thanks to Darwin Engwer for testing)
* correctly return disk-full condition from fat_write_file() on certain conditions
* use byteorder memory access functions for fat_fs_get_free()
* be more specific on the return value of fat_write_file()
2011-02-05 sd-reader
* implement renaming a file or directory
* rewrite byteorder handling to fix unaligned memory accesses on 32-bit and probably 16-bit architectures
* make fat_create_file() not return failure if the file already exists
* make the "cat" output respect the count of bytes actually read
* document how to use fat_seek_file() for retrieving the file position
2010-10-10 sd-reader
* Fix equal file names when reading two successive 8.3 directory entries.
* Fix calculation of cluster positions beyond 4GB (32 bit integer overflow).
* Fix endless looping of directory listing (occured with valid entry at end of last cluster).
2010-01-10 sd-reader
* Make LFN support configurable.
* Ignore LFN directory entries without 8.3 name.
* Ignore LFN directory entries which do not match the 8.3 name's checksum.
* Implement delayed directory entry updates (disabled by default) (thanks to Adam Mayer).
* Speedup search for free cluster.
* Fix memory leak when using the "init" command (thanks to Tibor Vilhan).
* Fix ATmega328P-specific pin mappings.
* Add some of the picoPower MCU variants.
2009-03-30 sd-reader
* Make 8.3 basename and/or extension lowercase when told by Windows NT and later.
* Add ATmega328 pin configuration.
* Fix MMC/SD/SDHC distinction.
* Fix raw block read/write buffering (thanks to Kurt Sterckx).
* Fix fat size calculation for FAT16 when configured with FAT32.
* Fix compilation for read-only configurations.
* Fix card lock detection.
* Make it easier to link with a C++ application (thanks to Jérôme Despatis).
2008-11-21 sd-reader
* Support for SDHC cards (disabled by default).
* Support for FAT32 (disabled by default).
2008-06-08 sd-reader
* New "init" command to allow reinitialization of memory card.
* Fix searching through multi-cluster directories.
* Fix reading directory entries spanning a cluster border (backport from mega-eth).
* Do not abort the whole lfn entry when the file name is too long, just drop single characters (backport from mega-eth).
* Change fat16_get_dir_entry_of_path() to ignore a slash at the end (backport from mega-eth).
* Make listing a directory's content much faster (backport from mega-eth).
* Shrink code size by centralizing cluster offset calculation (backport from mega-eth).
* Some other small fixes and optimizations.
2007-12-13 sd-reader
* Dual-license the major implementation modules under GPL and LGPL.
2007-06-03 sd-reader
* Fix reading beyond cached block (by Benjamin Meier).
* Implement support for reading and writing file modification dates/times.
(Thanks to Torsten Seeboth for testing.)
2007-03-01 sd-reader
* Avoid LFN directory entries for the "." and ".." directory references.
This prevented Windows from deleting directories.
* Handle special case where the 8.3 filename begins with 0xe5.
* Fix return value of fat16_delete_file() when deleting empty files.
* Fix fat16_clear_cluster() which was zeroing only 16 of every 32 bytes.
2007-01-20 sd-reader
* Fix directory creation.
- Correctly create "." and ".." directory entries (8.3 <-> lfn versions).
- Correctly clear cluster containing the directory entries for new directory.
2006-11-01 sd-reader
* Implement creation and deletion of directories.
* Clear the directory entries of new directory clusters.
* Prevent linkage against printf().
* Make the use of malloc()/free() optional.
2006-09-01 sd-reader
* Fix shortening files.
* Fix free disk space calculation.
2006-08-24 sd-reader
* Improve sleep handling.
* Display extended card information on boot and
when executing the "disk" shell command.
* Correctly determine FAT type by cluster count.
* Fix cluster allocation beyond card capacity.
2006-08-16 sd-reader
* Provide FAT16 capacity and usage information.
* Implement the backspace key in the mini shell.
* Enter idle mode when waiting for uart activity.
* Make the Card Select pin MCU dependent as well.
* Add mini shell commands to documentation.
2006-08-08 sd-reader
* Thanks go to Torsten Seeboth for his ongoing efforts
to test changes, fix regressions and give suggestions.
Many of the changes below were initiated by him.
* Much more reliable card initialization.
* Highly improved performance
- optional write buffering
- better cluster handling
- remove unneeded SPI access when reading from buffered block
- use highest spi frequency after card initialization
* Add superfloppy support.
* Better checks when opening a FAT16 filesystem.
* Provide SPI pin mappings for commonly used ATmegas.
* Fix resizing files, hangs could occur.
* Fix overflow when creating files with names longer than 31 characters.
* Fix numerous other small things.
2006-03-19 sd-reader
* Fix speed regressions.
2006-03-16 sd-reader
* Initial release.

File diff suppressed because it is too large Load Diff

124
final_project/sd_reader/FAQ Normal file
View File

@ -0,0 +1,124 @@
Frequently Asked Questions for sd-reader
========================================
General
-------
Q: Which cards are supported?
A: All MMC/SD/SDHC/miniSD/microSD/microSDHC should work, although not all variants have been tested.
Some very old (low capacity) cards might be broken as well. Cards with a capacity of 16 MB or
less are usually formatted with FAT12, so these are supported in raw mode only, if at all.
Q: What data rates can I expect?
A: See the benchmark page on the homepage.
http://www.roland-riegel.de/sd-reader/benchmarks/
Q: Are there boards available for purchase?
A: No.
Hardware
--------
Q: Where can I find the schematic?
A: Get it on the homepage.
http://www.roland-riegel.de/sd-reader/sd-reader_circuit_latest.zip
Q: What if my card socket has no Card-Detect and/or Card-Lock switches?
A: Change sd_raw_config.h such that it looks like
#define configure_pin_available() /* nothing */
#define configure_pin_locked() /* nothing */
#define get_pin_available() 0
#define get_pin_locked() 1
Q: All attempts to write to the card fail, although reading works. What's the problem?
A: Enable write support within sd_raw_config.h. And probably, your card socket has no Card-lock
detection (see question above).
Q: The card initialization fails. What can I do?
A: Usually this is some kind of hardware problem.
* Check the physical connections.
* Keep the signal lines to the card as short as possible.
* Do not use diodes to derive the card's supply voltage. Use a 3.3V voltage regulator instead.
* Have a stable, buffered power supply and use capacitors for correct voltage regulator
operation (see the schematics linked above).
* Use extra capacitors of 50uF and 100nF as close to the card as possible.
* When using an integrated level shifter or no level shifting at all (see the next question),
try adding a pullup of 50k from the data-out line of the card to 3.3V.
* Make sure the limiting frequency of the level shifter is not exceeded. Have a look into its
datasheet!
* Check the signals with a scope.
Q: What alternatives to resistor level shifting exist?
A: If you want to use additional devices with SPI or the resistor solution appears too ugly, there
are two possibilities. Either operate the whole circuit with a single 3.3V supply and no level
shifting at all or use a level shifting IC which interfaces the memory card to the AVR.
Depending on your requirements, adequate devices could include MAX3378E, MAX3392E, MAX3395E,
74LVC245 and 74HCT4050 (optionally together with 74HCT125). Please check the datasheets for the
required DC/AC characteristics!
Software
--------
Q: What's the software license?
A: GPLv2 or (for most parts) LGPLv2.1. Before using a file, read its license terms included at the
beginning of the file.
Q: What's the programming language used?
A: It's C, in compliance with the ISO C99 standard.
Q: What are these .patch-files provided?
A: Those record the source code differences between the old and new release. If you edited your
private sd-reader version, it might be easier to apply the patch files using the "patch" utility
common on Unix-like systems, rather than manually inserting the changes by hand. For Windows
users, the GnuWin32 project provides a port of "patch".
Q: Where can I learn more about the library interface and how to use it?
A: Look into the HTML documentation provided online or within each source distribution. Also take
the provided main.c as an example application and as a starting point.
Q: How do I adapt it to an ATmegaXYZ and my circuit in particular?
A: Add your MCU-specific pin configuration to sd_raw_config.h. Some commonly used ones are already
included.
Q: How do I adapt it to a different MCU clock?
A: Change the MCU_FREQ variable within the Makefile.
Q: How do I adapt it to some different MCU architecture?
A: Change sd_raw_init(), sd_raw_send_byte(), sd_raw_rec_byte() within sd_raw.c and the pin
definitions within sd_raw_config.h appropriately.
Q: Can the library be used with Arduino?
A: Yes. I do not have any experience with Arduino myself, but people report that it works with some
minor modifications to the library code needed due to some different compiler settings. Please
search the web for details.
Q: Can I use software SPI?
A: Yes, but the code is not prepared for it.
Q: My application crashes somewhere in the lib. Is there some bug hidden?
A: There might be a bug. Much more likely, however, is that you experience memory problems,
especially heap/stack collisions. The crashes can appear everywhere, but typically this is not
the place where the real problem is. Try to minimize the size of structures and other memory
blocks your application uses. Sum up the amount of memory your application allocates with global
and local variables and the memory you allocate dynamically with malloc(). The avr-nm utility
also helps a lot here. When called with the "--print-size --size-sort" parameters, it lists all
symbols and their code/memory size within the given file. See the avr-libc FAQ and the nm manual
for further information.
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_ramoverlap
http://sourceware.org/binutils/docs/binutils/nm.html
Q: Opening the FAT filesystem fails. What can I do?
A: Make sure there is a FAT16 or FAT32 filesystem on the card. This usually isn't possible for old
cards with 16 MB or less. For larger ones, format the cards using the OS utilities, like the
Windows Explorer, the Unix/Linux mkdosfs command or special SD card format tools.
http://panasonic.jp/support/global/cs/sd/download/sd_formatter.html
http://www.sdcard.org/consumers/formatter/
Q: Writing to the card returns no failure, but when checking the file's content the data is not
there. What happens?
A: For performance reasons, writing to the card is always buffered. Before pulling the card out of
its socket (or issuing a reset of the MCU), make sure sd_raw_sync() gets called such that all
buffered data is written out to permanent card storage.

View File

@ -0,0 +1,52 @@
NAME := sd-reader
HEX := $(NAME).hex
OUT := $(NAME).out
MAP := $(NAME).map
SOURCES := $(wildcard *.c)
HEADERS := $(wildcard *.h)
OBJECTS := $(patsubst %.c,%.o,$(SOURCES))
MCU := atmega168
MCU_AVRDUDE := m168
MCU_FREQ := 16000000UL
CC := avr-gcc
OBJCOPY := avr-objcopy
SIZE := avr-size -A
DOXYGEN := doxygen
CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=$(MCU_FREQ)
all: $(HEX)
clean:
rm -f $(HEX) $(OUT) $(MAP) $(OBJECTS)
rm -rf doc/html
flash: $(HEX)
avrdude -y -c avr910 -p $(MCU_AVRDUDE) -U flash:w:$(HEX)
$(HEX): $(OUT)
$(OBJCOPY) -R .eeprom -O ihex $< $@
$(OUT): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^
@echo
@$(SIZE) $@
@echo
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $@ $<
%.pp: %.c
$(CC) $(CFLAGS) -E -o $@ $<
%.ppo: %.c
$(CC) $(CFLAGS) -E $<
doc: $(HEADERS) $(SOURCES) Doxyfile
$(DOXYGEN) Doxyfile
.PHONY: all clean flash doc

View File

@ -0,0 +1,110 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#include "byteordering.h"
/**
* \addtogroup byteordering
*
* Architecture-dependent handling of byte-ordering.
*
* @{
*/
/**
* \file
* Byte-order handling implementation (license: GPLv2 or LGPLv2.1)
*
* \author Roland Riegel
*/
#if DOXYGEN || SWAP_NEEDED
/**
* \internal
* Swaps the bytes of a 16-bit integer.
*
* \param[in] i A 16-bit integer which to swap.
* \returns The swapped 16-bit integer.
*/
uint16_t swap16(uint16_t i)
{
return SWAP16(i);
}
/**
* \internal
* Swaps the bytes of a 32-bit integer.
*
* \param[in] i A 32-bit integer which to swap.
* \returns The swapped 32-bit integer.
*/
uint32_t swap32(uint32_t i)
{
return SWAP32(i);
}
#endif
/**
* Reads a 16-bit integer from memory in little-endian byte order.
*
* \param[in] p Pointer from where to read the integer.
* \returns The 16-bit integer read from memory.
*/
uint16_t read16(const uint8_t* p)
{
return (((uint16_t) p[1]) << 8) |
(((uint16_t) p[0]) << 0);
}
/**
* Reads a 32-bit integer from memory in little-endian byte order.
*
* \param[in] p Pointer from where to read the integer.
* \returns The 32-bit integer read from memory.
*/
uint32_t read32(const uint8_t* p)
{
return (((uint32_t) p[3]) << 24) |
(((uint32_t) p[2]) << 16) |
(((uint32_t) p[1]) << 8) |
(((uint32_t) p[0]) << 0);
}
/**
* Writes a 16-bit integer into memory in little-endian byte order.
*
* \param[in] p Pointer where to write the integer to.
* \param[in] i The 16-bit integer to write.
*/
void write16(uint8_t* p, uint16_t i)
{
p[1] = (uint8_t) ((i & 0xff00) >> 8);
p[0] = (uint8_t) ((i & 0x00ff) >> 0);
}
/**
* Writes a 32-bit integer into memory in little-endian byte order.
*
* \param[in] p Pointer where to write the integer to.
* \param[in] i The 32-bit integer to write.
*/
void write32(uint8_t* p, uint32_t i)
{
p[3] = (uint8_t) ((i & 0xff000000) >> 24);
p[2] = (uint8_t) ((i & 0x00ff0000) >> 16);
p[1] = (uint8_t) ((i & 0x0000ff00) >> 8);
p[0] = (uint8_t) ((i & 0x000000ff) >> 0);
}
/**
* @}
*/

View File

@ -0,0 +1,188 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef BYTEORDERING_H
#define BYTEORDERING_H
#include <stdint.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup byteordering
*
* @{
*/
/**
* \file
* Byte-order handling header (license: GPLv2 or LGPLv2.1)
*
* \author Roland Riegel
*/
#define SWAP16(val) ((((uint16_t) (val)) << 8) | \
(((uint16_t) (val)) >> 8) \
)
#define SWAP32(val) (((((uint32_t) (val)) & 0x000000ff) << 24) | \
((((uint32_t) (val)) & 0x0000ff00) << 8) | \
((((uint32_t) (val)) & 0x00ff0000) >> 8) | \
((((uint32_t) (val)) & 0xff000000) >> 24) \
)
#if LITTLE_ENDIAN || __AVR__
#define SWAP_NEEDED 0
#elif BIG_ENDIAN
#define SWAP_NEEDED 1
#else
#error "Endianess undefined! Please define LITTLE_ENDIAN=1 or BIG_ENDIAN=1."
#endif
/**
* \def HTOL16(val)
*
* Converts a 16-bit integer from host byte order to little-endian byte order.
*
* Use this macro for compile time constants only. For variable values
* use the function htol16() instead. This saves code size.
*
* \param[in] val A 16-bit integer in host byte order.
* \returns The given 16-bit integer converted to little-endian byte order.
*/
/**
* \def HTOL32(val)
*
* Converts a 32-bit integer from host byte order to little-endian byte order.
*
* Use this macro for compile time constants only. For variable values
* use the function htol32() instead. This saves code size.
*
* \param[in] val A 32-bit integer in host byte order.
* \returns The given 32-bit integer converted to little-endian byte order.
*/
/**
* \def LTOH16(val)
*
* Converts a 16-bit integer from little-endian byte order to host byte order.
*
* Use this macro for compile time constants only. For variable values
* use the function ltoh16() instead. This saves code size.
*
* \param[in] val A 16-bit integer in little-endian byte order.
* \returns The given 16-bit integer converted to host byte order.
*/
/**
* \def LTOH32(val)
*
* Converts a 32-bit integer from little-endian byte order to host byte order.
*
* Use this macro for compile time constants only. For variable values
* use the function ltoh32() instead. This saves code size.
*
* \param[in] val A 32-bit integer in little-endian byte order.
* \returns The given 32-bit integer converted to host byte order.
*/
#if SWAP_NEEDED
#define HTOL16(val) SWAP16(val)
#define HTOL32(val) SWAP32(val)
#define LTOH16(val) SWAP16(val)
#define LTOH32(val) SWAP32(val)
#else
#define HTOL16(val) (val)
#define HTOL32(val) (val)
#define LTOH16(val) (val)
#define LTOH32(val) (val)
#endif
#if DOXYGEN
/**
* Converts a 16-bit integer from host byte order to little-endian byte order.
*
* Use this function on variable values instead of the
* macro HTOL16(). This saves code size.
*
* \param[in] h A 16-bit integer in host byte order.
* \returns The given 16-bit integer converted to little-endian byte order.
*/
uint16_t htol16(uint16_t h);
/**
* Converts a 32-bit integer from host byte order to little-endian byte order.
*
* Use this function on variable values instead of the
* macro HTOL32(). This saves code size.
*
* \param[in] h A 32-bit integer in host byte order.
* \returns The given 32-bit integer converted to little-endian byte order.
*/
uint32_t htol32(uint32_t h);
/**
* Converts a 16-bit integer from little-endian byte order to host byte order.
*
* Use this function on variable values instead of the
* macro LTOH16(). This saves code size.
*
* \param[in] l A 16-bit integer in little-endian byte order.
* \returns The given 16-bit integer converted to host byte order.
*/
uint16_t ltoh16(uint16_t l);
/**
* Converts a 32-bit integer from little-endian byte order to host byte order.
*
* Use this function on variable values instead of the
* macro LTOH32(). This saves code size.
*
* \param[in] l A 32-bit integer in little-endian byte order.
* \returns The given 32-bit integer converted to host byte order.
*/
uint32_t ltoh32(uint32_t l);
#elif SWAP_NEEDED
#define htol16(h) swap16(h)
#define htol32(h) swap32(h)
#define ltoh16(l) swap16(l)
#define ltoh32(l) swap32(l)
#else
#define htol16(h) (h)
#define htol32(h) (h)
#define ltoh16(l) (l)
#define ltoh32(l) (l)
#endif
uint16_t read16(const uint8_t* p);
uint32_t read32(const uint8_t* p);
void write16(uint8_t* p, uint16_t i);
void write32(uint8_t* p, uint32_t i);
/**
* @}
*/
#if SWAP_NEEDED
uint16_t swap16(uint16_t i);
uint32_t swap32(uint32_t i);
#endif
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.

View File

@ -0,0 +1,74 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Data Structures</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Data Structures</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here are the data structures with brief descriptions:</div><table>
<tr><td class="indexkey"><a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a></td><td class="indexvalue">Describes a directory entry </td></tr>
<tr><td class="indexkey"><a class="el" href="structpartition__struct.html">partition_struct</a></td><td class="indexvalue">Describes a partition </td></tr>
<tr><td class="indexkey"><a class="el" href="structsd__raw__info.html">sd_raw_info</a></td><td class="indexvalue">This struct is used by <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79" title="Reads informational data from the card.">sd_raw_get_info()</a> to return manufacturing and status information of the card </td></tr>
</table>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

View File

@ -0,0 +1,89 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: byteordering.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">byteordering.c File Reference<div class="ingroups"><a class="el" href="group__byteordering.html">Byteordering</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Byte-order handling implementation (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8">read16</a> (const uint8_t *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads a 16-bit integer from memory in little-endian byte order. <a href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887">read32</a> (const uint8_t *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads a 32-bit integer from memory in little-endian byte order. <a href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd">write16</a> (uint8_t *p, uint16_t i)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a 16-bit integer into memory in little-endian byte order. <a href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86">write32</a> (uint8_t *p, uint32_t i)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a 32-bit integer into memory in little-endian byte order. <a href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Byte-order handling implementation (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,108 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: byteordering.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">byteordering.h File Reference<div class="ingroups"><a class="el" href="group__byteordering.html">Byteordering</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Byte-order handling header (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gafe6b840e18479649f2f279510841b725">HTOL16</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from host byte order to little-endian byte order. <a href="group__byteordering.html#gafe6b840e18479649f2f279510841b725"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga4721d1b0a8ce813e569f1f50e28cbd49">HTOL32</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from host byte order to little-endian byte order. <a href="group__byteordering.html#ga4721d1b0a8ce813e569f1f50e28cbd49"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga5c0de5da892f4416d2e6a08a4313dd43">LTOH16</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from little-endian byte order to host byte order. <a href="group__byteordering.html#ga5c0de5da892f4416d2e6a08a4313dd43"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gad6a95c92a285d197c78cd0c680266682">LTOH32</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from little-endian byte order to host byte order. <a href="group__byteordering.html#gad6a95c92a285d197c78cd0c680266682"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gab0e4bd12631fd8f1c1566b53cc5d701b">htol16</a> (uint16_t h)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from host byte order to little-endian byte order. <a href="group__byteordering.html#gab0e4bd12631fd8f1c1566b53cc5d701b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gad99f704c5d785948044d1a0a81ffdd78">htol32</a> (uint32_t h)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from host byte order to little-endian byte order. <a href="group__byteordering.html#gad99f704c5d785948044d1a0a81ffdd78"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga956619f7d735460ad335c33399a5bfd0">ltoh16</a> (uint16_t l)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from little-endian byte order to host byte order. <a href="group__byteordering.html#ga956619f7d735460ad335c33399a5bfd0"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gaa6a3e9e41e5a7fa0c61a9b7355135977">ltoh32</a> (uint32_t l)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from little-endian byte order to host byte order. <a href="group__byteordering.html#gaa6a3e9e41e5a7fa0c61a9b7355135977"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8">read16</a> (const uint8_t *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads a 16-bit integer from memory in little-endian byte order. <a href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887">read32</a> (const uint8_t *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads a 32-bit integer from memory in little-endian byte order. <a href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd">write16</a> (uint8_t *p, uint16_t i)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a 16-bit integer into memory in little-endian byte order. <a href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86">write32</a> (uint8_t *p, uint32_t i)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a 32-bit integer into memory in little-endian byte order. <a href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Byte-order handling header (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,80 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Data Structure Index</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Data Structure Index</div> </div>
</div><!--header-->
<div class="contents">
<div class="qindex"><a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a></div>
<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
<tr><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;F&#160;&#160;</div></td></tr></table>
</td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;P&#160;&#160;</div></td></tr></table>
</td><td rowspan="2" valign="bottom"><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;S&#160;&#160;</div></td></tr></table>
</td><td></td></tr>
<tr><td></td></tr>
<tr><td valign="top"><a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structpartition__struct.html">partition_struct</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsd__raw__info.html">sd_raw_info</a>&#160;&#160;&#160;</td><td></td></tr>
<tr><td></td><td></td><td></td><td></td></tr>
</table>
<div class="qindex"><a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a></div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

View File

@ -0,0 +1,949 @@
/* The standard CSS for doxygen */
body, table, div, p, dl {
font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
font-size: 13px;
line-height: 1.3;
}
/* @group Heading Levels */
h1 {
font-size: 150%;
}
.title {
font-size: 150%;
font-weight: bold;
margin: 10px 2px;
}
h2 {
font-size: 120%;
}
h3 {
font-size: 100%;
}
dt {
font-weight: bold;
}
div.multicol {
-moz-column-gap: 1em;
-webkit-column-gap: 1em;
-moz-column-count: 3;
-webkit-column-count: 3;
}
p.startli, p.startdd, p.starttd {
margin-top: 2px;
}
p.endli {
margin-bottom: 0px;
}
p.enddd {
margin-bottom: 4px;
}
p.endtd {
margin-bottom: 2px;
}
/* @end */
caption {
font-weight: bold;
}
span.legend {
font-size: 70%;
text-align: center;
}
h3.version {
font-size: 90%;
text-align: center;
}
div.qindex, div.navtab{
background-color: #EBEFF6;
border: 1px solid #A3B4D7;
text-align: center;
}
div.qindex, div.navpath {
width: 100%;
line-height: 140%;
}
div.navtab {
margin-right: 15px;
}
/* @group Link Styling */
a {
color: #3D578C;
font-weight: normal;
text-decoration: none;
}
.contents a:visited {
color: #4665A2;
}
a:hover {
text-decoration: underline;
}
a.qindex {
font-weight: bold;
}
a.qindexHL {
font-weight: bold;
background-color: #9CAFD4;
color: #ffffff;
border: 1px double #869DCA;
}
.contents a.qindexHL:visited {
color: #ffffff;
}
a.el {
font-weight: bold;
}
a.elRef {
}
a.code, a.code:visited {
color: #4665A2;
}
a.codeRef, a.codeRef:visited {
color: #4665A2;
}
/* @end */
dl.el {
margin-left: -1cm;
}
.fragment {
font-family: monospace, fixed;
font-size: 105%;
}
pre.fragment {
border: 1px solid #C4CFE5;
background-color: #FBFCFD;
padding: 4px 6px;
margin: 4px 8px 4px 2px;
overflow: auto;
word-wrap: break-word;
font-size: 9pt;
line-height: 125%;
}
div.ah {
background-color: black;
font-weight: bold;
color: #ffffff;
margin-bottom: 3px;
margin-top: 3px;
padding: 0.2em;
border: solid thin #333;
border-radius: 0.5em;
-webkit-border-radius: .5em;
-moz-border-radius: .5em;
box-shadow: 2px 2px 3px #999;
-webkit-box-shadow: 2px 2px 3px #999;
-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
}
div.groupHeader {
margin-left: 16px;
margin-top: 12px;
font-weight: bold;
}
div.groupText {
margin-left: 16px;
font-style: italic;
}
body {
background-color: white;
color: black;
margin: 0;
}
div.contents {
margin-top: 10px;
margin-left: 8px;
margin-right: 8px;
}
td.indexkey {
background-color: #EBEFF6;
font-weight: bold;
border: 1px solid #C4CFE5;
margin: 2px 0px 2px 0;
padding: 2px 10px;
white-space: nowrap;
vertical-align: top;
}
td.indexvalue {
background-color: #EBEFF6;
border: 1px solid #C4CFE5;
padding: 2px 10px;
margin: 2px 0px;
}
tr.memlist {
background-color: #EEF1F7;
}
p.formulaDsp {
text-align: center;
}
img.formulaDsp {
}
img.formulaInl {
vertical-align: middle;
}
div.center {
text-align: center;
margin-top: 0px;
margin-bottom: 0px;
padding: 0px;
}
div.center img {
border: 0px;
}
address.footer {
text-align: right;
padding-right: 12px;
}
img.footer {
border: 0px;
vertical-align: middle;
}
/* @group Code Colorization */
span.keyword {
color: #008000
}
span.keywordtype {
color: #604020
}
span.keywordflow {
color: #e08000
}
span.comment {
color: #800000
}
span.preprocessor {
color: #806020
}
span.stringliteral {
color: #002080
}
span.charliteral {
color: #008080
}
span.vhdldigit {
color: #ff00ff
}
span.vhdlchar {
color: #000000
}
span.vhdlkeyword {
color: #700070
}
span.vhdllogic {
color: #ff0000
}
/* @end */
/*
.search {
color: #003399;
font-weight: bold;
}
form.search {
margin-bottom: 0px;
margin-top: 0px;
}
input.search {
font-size: 75%;
color: #000080;
font-weight: normal;
background-color: #e8eef2;
}
*/
td.tiny {
font-size: 75%;
}
.dirtab {
padding: 4px;
border-collapse: collapse;
border: 1px solid #A3B4D7;
}
th.dirtab {
background: #EBEFF6;
font-weight: bold;
}
hr {
height: 0px;
border: none;
border-top: 1px solid #4A6AAA;
}
hr.footer {
height: 1px;
}
/* @group Member Descriptions */
table.memberdecls {
border-spacing: 0px;
padding: 0px;
}
.mdescLeft, .mdescRight,
.memItemLeft, .memItemRight,
.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
background-color: #F9FAFC;
border: none;
margin: 4px;
padding: 1px 0 0 8px;
}
.mdescLeft, .mdescRight {
padding: 0px 8px 4px 8px;
color: #555;
}
.memItemLeft, .memItemRight, .memTemplParams {
border-top: 1px solid #C4CFE5;
}
.memItemLeft, .memTemplItemLeft {
white-space: nowrap;
}
.memItemRight {
width: 100%;
}
.memTemplParams {
color: #4665A2;
white-space: nowrap;
}
/* @end */
/* @group Member Details */
/* Styles for detailed member documentation */
.memtemplate {
font-size: 80%;
color: #4665A2;
font-weight: normal;
margin-left: 9px;
}
.memnav {
background-color: #EBEFF6;
border: 1px solid #A3B4D7;
text-align: center;
margin: 2px;
margin-right: 15px;
padding: 2px;
}
.mempage {
width: 100%;
}
.memitem {
padding: 0;
margin-bottom: 10px;
margin-right: 5px;
}
.memname {
white-space: nowrap;
font-weight: bold;
margin-left: 6px;
}
.memproto, dl.reflist dt {
border-top: 1px solid #A8B8D9;
border-left: 1px solid #A8B8D9;
border-right: 1px solid #A8B8D9;
padding: 6px 0px 6px 0px;
color: #253555;
font-weight: bold;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
/* opera specific markup */
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
border-top-right-radius: 8px;
border-top-left-radius: 8px;
/* firefox specific markup */
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
-moz-border-radius-topright: 8px;
-moz-border-radius-topleft: 8px;
/* webkit specific markup */
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
-webkit-border-top-right-radius: 8px;
-webkit-border-top-left-radius: 8px;
background-image:url('nav_f.png');
background-repeat:repeat-x;
background-color: #E2E8F2;
}
.memdoc, dl.reflist dd {
border-bottom: 1px solid #A8B8D9;
border-left: 1px solid #A8B8D9;
border-right: 1px solid #A8B8D9;
padding: 2px 5px;
background-color: #FBFCFD;
border-top-width: 0;
/* opera specific markup */
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
/* firefox specific markup */
-moz-border-radius-bottomleft: 8px;
-moz-border-radius-bottomright: 8px;
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
/* webkit specific markup */
-webkit-border-bottom-left-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
}
dl.reflist dt {
padding: 5px;
}
dl.reflist dd {
margin: 0px 0px 10px 0px;
padding: 5px;
}
.paramkey {
text-align: right;
}
.paramtype {
white-space: nowrap;
}
.paramname {
color: #602020;
white-space: nowrap;
}
.paramname em {
font-style: normal;
}
.params, .retval, .exception, .tparams {
border-spacing: 6px 2px;
}
.params .paramname, .retval .paramname {
font-weight: bold;
vertical-align: top;
}
.params .paramtype {
font-style: italic;
vertical-align: top;
}
.params .paramdir {
font-family: "courier new",courier,monospace;
vertical-align: top;
}
/* @end */
/* @group Directory (tree) */
/* for the tree view */
.ftvtree {
font-family: sans-serif;
margin: 0px;
}
/* these are for tree view when used as main index */
.directory {
font-size: 9pt;
font-weight: bold;
margin: 5px;
}
.directory h3 {
margin: 0px;
margin-top: 1em;
font-size: 11pt;
}
/*
The following two styles can be used to replace the root node title
with an image of your choice. Simply uncomment the next two styles,
specify the name of your image and be sure to set 'height' to the
proper pixel height of your image.
*/
/*
.directory h3.swap {
height: 61px;
background-repeat: no-repeat;
background-image: url("yourimage.gif");
}
.directory h3.swap span {
display: none;
}
*/
.directory > h3 {
margin-top: 0;
}
.directory p {
margin: 0px;
white-space: nowrap;
}
.directory div {
display: none;
margin: 0px;
}
.directory img {
vertical-align: -30%;
}
/* these are for tree view when not used as main index */
.directory-alt {
font-size: 100%;
font-weight: bold;
}
.directory-alt h3 {
margin: 0px;
margin-top: 1em;
font-size: 11pt;
}
.directory-alt > h3 {
margin-top: 0;
}
.directory-alt p {
margin: 0px;
white-space: nowrap;
}
.directory-alt div {
display: none;
margin: 0px;
}
.directory-alt img {
vertical-align: -30%;
}
/* @end */
div.dynheader {
margin-top: 8px;
}
address {
font-style: normal;
color: #2A3D61;
}
table.doxtable {
border-collapse:collapse;
}
table.doxtable td, table.doxtable th {
border: 1px solid #2D4068;
padding: 3px 7px 2px;
}
table.doxtable th {
background-color: #374F7F;
color: #FFFFFF;
font-size: 110%;
padding-bottom: 4px;
padding-top: 5px;
text-align:left;
}
table.fieldtable {
width: 100%;
margin-bottom: 10px;
border: 1px solid #A8B8D9;
border-spacing: 0px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
-webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
}
.fieldtable td, .fieldtable th {
padding: 3px 7px 2px;
}
.fieldtable td.fieldtype, .fieldtable td.fieldname {
white-space: nowrap;
border-right: 1px solid #A8B8D9;
border-bottom: 1px solid #A8B8D9;
vertical-align: top;
}
.fieldtable td.fielddoc {
border-bottom: 1px solid #A8B8D9;
width: 100%;
}
.fieldtable tr:last-child td {
border-bottom: none;
}
.fieldtable th {
background-image:url('nav_f.png');
background-repeat:repeat-x;
background-color: #E2E8F2;
font-size: 90%;
color: #253555;
padding-bottom: 4px;
padding-top: 5px;
text-align:left;
-moz-border-radius-topleft: 4px;
-moz-border-radius-topright: 4px;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom: 1px solid #A8B8D9;
}
.tabsearch {
top: 0px;
left: 10px;
height: 36px;
background-image: url('tab_b.png');
z-index: 101;
overflow: hidden;
font-size: 13px;
}
.navpath ul
{
font-size: 11px;
background-image:url('tab_b.png');
background-repeat:repeat-x;
height:30px;
line-height:30px;
color:#8AA0CC;
border:solid 1px #C2CDE4;
overflow:hidden;
margin:0px;
padding:0px;
}
.navpath li
{
list-style-type:none;
float:left;
padding-left:10px;
padding-right:15px;
background-image:url('bc_s.png');
background-repeat:no-repeat;
background-position:right;
color:#364D7C;
}
.navpath li.navelem a
{
height:32px;
display:block;
text-decoration: none;
outline: none;
}
.navpath li.navelem a:hover
{
color:#6884BD;
}
.navpath li.footer
{
list-style-type:none;
float:right;
padding-left:10px;
padding-right:15px;
background-image:none;
background-repeat:no-repeat;
background-position:right;
color:#364D7C;
font-size: 8pt;
}
div.summary
{
float: right;
font-size: 8pt;
padding-right: 5px;
width: 50%;
text-align: right;
}
div.summary a
{
white-space: nowrap;
}
div.ingroups
{
margin-left: 5px;
font-size: 8pt;
padding-left: 5px;
width: 50%;
text-align: left;
}
div.ingroups a
{
white-space: nowrap;
}
div.header
{
background-image:url('nav_h.png');
background-repeat:repeat-x;
background-color: #F9FAFC;
margin: 0px;
border-bottom: 1px solid #C4CFE5;
}
div.headertitle
{
padding: 5px 5px 5px 7px;
}
dl
{
padding: 0 0 0 10px;
}
dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug
{
border-left:4px solid;
padding: 0 0 0 6px;
}
dl.note
{
border-color: #D0C000;
}
dl.warning, dl.attention
{
border-color: #FF0000;
}
dl.pre, dl.post, dl.invariant
{
border-color: #00D000;
}
dl.deprecated
{
border-color: #505050;
}
dl.todo
{
border-color: #00C0E0;
}
dl.test
{
border-color: #3030E0;
}
dl.bug
{
border-color: #C08050;
}
#projectlogo
{
text-align: center;
vertical-align: bottom;
border-collapse: separate;
}
#projectlogo img
{
border: 0px none;
}
#projectname
{
font: 300% Tahoma, Arial,sans-serif;
margin: 0px;
padding: 2px 0px;
}
#projectbrief
{
font: 120% Tahoma, Arial,sans-serif;
margin: 0px;
padding: 0px;
}
#projectnumber
{
font: 50% Tahoma, Arial,sans-serif;
margin: 0px;
padding: 0px;
}
#titlearea
{
padding: 0px;
margin: 0px;
width: 100%;
border-bottom: 1px solid #5373B4;
}
.image
{
text-align: center;
}
.dotgraph
{
text-align: center;
}
.mscgraph
{
text-align: center;
}
.caption
{
font-weight: bold;
}
div.zoom
{
border: 1px solid #90A5CE;
}
dl.citelist {
margin-bottom:50px;
}
dl.citelist dt {
color:#334975;
float:left;
font-weight:bold;
margin-right:10px;
padding:5px;
}
dl.citelist dd {
margin:2px 0;
padding:5px 0;
}
@media print
{
#top { display: none; }
#side-nav { display: none; }
#nav-path { display: none; }
body { overflow:visible; }
h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
.summary { display: none; }
.memitem { page-break-inside: avoid; }
#doc-content
{
margin-left:0 !important;
height:auto !important;
width:auto !important;
overflow:inherit;
display:inline;
}
pre.fragment
{
overflow: visible;
text-wrap: unrestricted;
white-space: -moz-pre-wrap; /* Moz */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
white-space: pre-wrap; /* CSS3 */
word-wrap: break-word; /* IE 5.5+ */
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,134 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: fat.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">fat.c File Reference<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>FAT implementation (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_fs_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#ga5d726bac328b49abc2e6fb022d97092a">fat_open</a> (struct <a class="el" href="structpartition__struct.html">partition_struct</a> *partition)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a FAT filesystem. <a href="group__fat__fs.html#ga5d726bac328b49abc2e6fb022d97092a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#ga057612824886e115b88bf5affcf76829">fat_close</a> (struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a FAT filesystem. <a href="group__fat__fs.html#ga057612824886e115b88bf5affcf76829"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga033743a7d8878712e0add6d57b750525">fat_get_dir_entry_of_path</a> (struct fat_fs_struct *fs, const char *path, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves the directory entry of a path. <a href="group__fat__file.html#ga033743a7d8878712e0add6d57b750525"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_file_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga76a0b06949525b578db04a56d67fbfc4">fat_open_file</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a file on a FAT filesystem. <a href="group__fat__file.html#ga76a0b06949525b578db04a56d67fbfc4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga70b082abb4ebc8d4e9956886901b55fc">fat_close_file</a> (struct fat_file_struct *fd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a file. <a href="group__fat__file.html#ga70b082abb4ebc8d4e9956886901b55fc"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga48e17b173bede64cb08cef05b88fd0ca">fat_read_file</a> (struct fat_file_struct *fd, uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads data from a file. <a href="group__fat__file.html#ga48e17b173bede64cb08cef05b88fd0ca"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat_write_file</a> (struct fat_file_struct *fd, const uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes data to a file. <a href="group__fat__file.html#ga6782ff80eb6fba9b6ed1a66f33dae60a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gad4c305cf004bae9bea48730ed20c87ec">fat_seek_file</a> (struct fat_file_struct *fd, int32_t *offset, uint8_t whence)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Repositions the read/write file offset. <a href="group__fat__file.html#gad4c305cf004bae9bea48730ed20c87ec"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gace4858e7a145684f6c8cd14debe14255">fat_resize_file</a> (struct fat_file_struct *fd, uint32_t size)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes a file to have a specific size. <a href="group__fat__file.html#gace4858e7a145684f6c8cd14debe14255"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_dir_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat_open_dir</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a directory. <a href="group__fat__dir.html#gac7a5b4ad0b972759a965e1afd5bbc87c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#ga2fed74d916370428e3dcf278e7050111">fat_close_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a directory descriptor. <a href="group__fat__dir.html#ga2fed74d916370428e3dcf278e7050111"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat_read_dir</a> (struct fat_dir_struct *dd, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads the next directory entry contained within a parent directory. <a href="group__fat__dir.html#gab4bc79452dbf5ac2a2f3e1fccafd9534"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#ga2d74af47cb9fd44f7c974834f810225f">fat_reset_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resets a directory handle. <a href="group__fat__dir.html#ga2d74af47cb9fd44f7c974834f810225f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f">fat_create_file</a> (struct fat_dir_struct *parent, const char *file, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a file. <a href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga46055219b942eb8d57ffae9dc6447e7c">fat_delete_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a file or directory. <a href="group__fat__file.html#ga46055219b942eb8d57ffae9dc6447e7c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat_move_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, struct fat_dir_struct *parent_new, const char *file_new)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves or renames a file. <a href="group__fat__file.html#gaba4d2c80ccd8f1aebcecf7072dc37510"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gaff3b524066c9a937fae32771c80e7603">fat_create_dir</a> (struct fat_dir_struct *parent, const char *dir, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a directory. <a href="group__fat__dir.html#gaff3b524066c9a937fae32771c80e7603"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772">fat_delete_dir</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a directory. <a href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9">fat_move_dir</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, struct fat_dir_struct *parent_new, const char *dir_new)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves or renames a directory. <a href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat_get_file_modification_date</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint16_t *year, uint8_t *month, uint8_t *day)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification date of a file. <a href="group__fat__file.html#ga24763fd73cbeb580ae5d19e975bde0d8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga74f840c317556b7dae766e199d87a6ef">fat_get_file_modification_time</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint8_t *hour, uint8_t *min, uint8_t *sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification time of a file. <a href="group__fat__file.html#ga74f840c317556b7dae766e199d87a6ef"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga02c969e994a556534c92906db5bb04fd">fat_set_file_modification_date</a> (struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint16_t year, uint8_t month, uint8_t day)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the modification time of a date. <a href="group__fat__file.html#ga02c969e994a556534c92906db5bb04fd"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gab514f14ce35a38bff3f16270dfdc033b">fat_set_file_modification_time</a> (struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint8_t hour, uint8_t min, uint8_t sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the modification time of a file. <a href="group__fat__file.html#gab514f14ce35a38bff3f16270dfdc033b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#gaab7768ca45847d5c4033a91984d65f1a">fat_get_fs_size</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of total storage capacity of the filesystem in bytes. <a href="group__fat__fs.html#gaab7768ca45847d5c4033a91984d65f1a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#gacc43179721b97d82fefafaf5625350bb">fat_get_fs_free</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of free storage capacity on the filesystem in bytes. <a href="group__fat__fs.html#gacc43179721b97d82fefafaf5625350bb"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gafee6ea130655af67845e1cebe9a96bfc"></a><!-- doxytag: member="fat.c::fat_get_fs_free_32_callback" ref="gafee6ea130655af67845e1cebe9a96bfc" args="(uint8_t *buffer, offset_t offset, void *p)" -->
uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#gafee6ea130655af67845e1cebe9a96bfc">fat_get_fs_free_32_callback</a> (uint8_t *buffer, offset_t offset, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function used for counting free clusters in a FAT32. <br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>FAT implementation (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,149 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: fat.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">fat.h File Reference<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>FAT header (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes a directory entry. <a href="structfat__dir__entry__struct.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gac404d1380dbf00e8a1d6145e035ef10b">FAT_ATTRIB_READONLY</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is read-only. <a href="group__fat__file.html#gac404d1380dbf00e8a1d6145e035ef10b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gaaf88f01d19ef4ca777c9c683f458f45f">FAT_ATTRIB_HIDDEN</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is hidden. <a href="group__fat__file.html#gaaf88f01d19ef4ca777c9c683f458f45f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gae5aa3610233e87e4ca36b2afe3c3854c">FAT_ATTRIB_SYSTEM</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is a system file. <a href="group__fat__file.html#gae5aa3610233e87e4ca36b2afe3c3854c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga86f9c93dd409d11813361d48517ccbce">FAT_ATTRIB_VOLUME</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is empty and has the volume label as its name. <a href="group__fat__file.html#ga86f9c93dd409d11813361d48517ccbce"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gacd38dccfabf884611c62aebc90e5adc7">FAT_ATTRIB_DIR</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is a directory. <a href="group__fat__file.html#gacd38dccfabf884611c62aebc90e5adc7"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga18ef7ecd9adce93d49a571882e145c99">FAT_ATTRIB_ARCHIVE</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file has to be archived. <a href="group__fat__file.html#ga18ef7ecd9adce93d49a571882e145c99"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gab870215439192f82ed358e2c7e94ba09">FAT_SEEK_SET</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The given offset is relative to the beginning of the file. <a href="group__fat__file.html#gab870215439192f82ed358e2c7e94ba09"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2">FAT_SEEK_CUR</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The given offset is relative to the current read/write position. <a href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gab34d95851ea8b28646ce25c0e0039bc2">FAT_SEEK_END</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The given offset is relative to the end of the file. <a href="group__fat__file.html#gab34d95851ea8b28646ce25c0e0039bc2"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_fs_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a">fat_open</a> (struct <a class="el" href="structpartition__struct.html">partition_struct</a> *partition)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a FAT filesystem. <a href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829">fat_close</a> (struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a FAT filesystem. <a href="group__fat.html#ga057612824886e115b88bf5affcf76829"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_file_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4">fat_open_file</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a file on a FAT filesystem. <a href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc">fat_close_file</a> (struct fat_file_struct *fd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a file. <a href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca">fat_read_file</a> (struct fat_file_struct *fd, uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads data from a file. <a href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat_write_file</a> (struct fat_file_struct *fd, const uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes data to a file. <a href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gad4c305cf004bae9bea48730ed20c87ec">fat_seek_file</a> (struct fat_file_struct *fd, int32_t *offset, uint8_t whence)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Repositions the read/write file offset. <a href="group__fat.html#gad4c305cf004bae9bea48730ed20c87ec"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gace4858e7a145684f6c8cd14debe14255">fat_resize_file</a> (struct fat_file_struct *fd, uint32_t size)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes a file to have a specific size. <a href="group__fat.html#gace4858e7a145684f6c8cd14debe14255"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_dir_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat_open_dir</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a directory. <a href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111">fat_close_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a directory descriptor. <a href="group__fat.html#ga2fed74d916370428e3dcf278e7050111"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat_read_dir</a> (struct fat_dir_struct *dd, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads the next directory entry contained within a parent directory. <a href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f">fat_reset_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resets a directory handle. <a href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f">fat_create_file</a> (struct fat_dir_struct *parent, const char *file, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a file. <a href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c">fat_delete_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a file or directory. <a href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat_move_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, struct fat_dir_struct *parent_new, const char *file_new)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves or renames a file. <a href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603">fat_create_dir</a> (struct fat_dir_struct *parent, const char *dir, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a directory. <a href="group__fat.html#gaff3b524066c9a937fae32771c80e7603"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat_get_file_modification_date</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint16_t *year, uint8_t *month, uint8_t *day)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification date of a file. <a href="group__fat.html#ga24763fd73cbeb580ae5d19e975bde0d8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga74f840c317556b7dae766e199d87a6ef">fat_get_file_modification_time</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint8_t *hour, uint8_t *min, uint8_t *sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification time of a file. <a href="group__fat.html#ga74f840c317556b7dae766e199d87a6ef"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga033743a7d8878712e0add6d57b750525">fat_get_dir_entry_of_path</a> (struct fat_fs_struct *fs, const char *path, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves the directory entry of a path. <a href="group__fat.html#ga033743a7d8878712e0add6d57b750525"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gaab7768ca45847d5c4033a91984d65f1a">fat_get_fs_size</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of total storage capacity of the filesystem in bytes. <a href="group__fat.html#gaab7768ca45847d5c4033a91984d65f1a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gacc43179721b97d82fefafaf5625350bb">fat_get_fs_free</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of free storage capacity on the filesystem in bytes. <a href="group__fat.html#gacc43179721b97d82fefafaf5625350bb"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>FAT header (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,101 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: fat_config.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">fat_config.h File Reference<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>FAT configuration (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#gace70b11f85eb1b4e15220a65e9bd047d">FAT_WRITE_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT write support. <a href="group__fat__config.html#gace70b11f85eb1b4e15220a65e9bd047d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga37b51677b33d2e74bec670f52c201a51">FAT_LFN_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT long filename (LFN) support. <a href="group__fat__config.html#ga37b51677b33d2e74bec670f52c201a51"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga80fa068db7d09fb267b36741d773eadf">FAT_DATETIME_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT date and time support. <a href="group__fat__config.html#ga80fa068db7d09fb267b36741d773eadf"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga73fdc6edf277eee1551985c3eb9602a3">FAT_FAT32_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT32 support. <a href="group__fat__config.html#ga73fdc6edf277eee1551985c3eb9602a3"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga13f632eadee5b7d768b14bf279e843fd">FAT_DELAY_DIRENTRY_UPDATE</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls updates of directory entries. <a href="group__fat__config.html#ga13f632eadee5b7d768b14bf279e843fd"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#gafeacb265671562dc1c4a863991163bb4">fat_get_datetime</a>(year, month, day, hour, min, sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines the function used for retrieving current date and time. <a href="group__fat__config.html#gafeacb265671562dc1c4a863991163bb4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3d9b70f2a51fd6413f30f6a17e4480bd"></a><!-- doxytag: member="fat_config.h::FAT_FS_COUNT" ref="ga3d9b70f2a51fd6413f30f6a17e4480bd" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga3d9b70f2a51fd6413f30f6a17e4480bd">FAT_FS_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of filesystem handles. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gae165b9e014e6213eb4429ebda300b6e8"></a><!-- doxytag: member="fat_config.h::FAT_FILE_COUNT" ref="gae165b9e014e6213eb4429ebda300b6e8" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#gae165b9e014e6213eb4429ebda300b6e8">FAT_FILE_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of file handles. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga8309de7e60311102cb90f9bca6b7d2f8"></a><!-- doxytag: member="fat_config.h::FAT_DIR_COUNT" ref="ga8309de7e60311102cb90f9bca6b7d2f8" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga8309de7e60311102cb90f9bca6b7d2f8">FAT_DIR_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of directory handles. <br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>FAT configuration (license: GPLv2 or LGPLv2.1) </p>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,83 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: File List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li class="current"><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">File List</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here is a list of all documented files with brief descriptions:</div><table>
<tr><td class="indexkey"><a class="el" href="byteordering_8c.html">byteordering.c</a></td><td class="indexvalue">Byte-order handling implementation (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="byteordering_8h.html">byteordering.h</a></td><td class="indexvalue">Byte-order handling header (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="fat_8c.html">fat.c</a></td><td class="indexvalue">FAT implementation (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="fat_8h.html">fat.h</a></td><td class="indexvalue">FAT header (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="fat__config_8h.html">fat_config.h</a></td><td class="indexvalue">FAT configuration (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="partition_8c.html">partition.c</a></td><td class="indexvalue">Partition table implementation (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="partition_8h.html">partition.h</a></td><td class="indexvalue">Partition table header (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="partition__config_8h.html">partition_config.h</a></td><td class="indexvalue">Partition configuration (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="sd-reader__config_8h.html">sd-reader_config.h</a></td><td class="indexvalue">Common sd-reader configuration used by all modules (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="sd__raw_8c.html">sd_raw.c</a></td><td class="indexvalue">MMC/SD/SDHC raw access implementation (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="sd__raw_8h.html">sd_raw.h</a></td><td class="indexvalue">MMC/SD/SDHC raw access header (license: GPLv2 or LGPLv2.1) </td></tr>
<tr><td class="indexkey"><a class="el" href="sd__raw__config_8h.html">sd_raw_config.h</a></td><td class="indexvalue">MMC/SD support configuration (license: GPLv2 or LGPLv2.1) </td></tr>
</table>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,145 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Data Fields</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="functions.html"><span>All</span></a></li>
<li><a href="functions_vars.html"><span>Variables</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div><ul>
<li>attributes
: <a class="el" href="structfat__dir__entry__struct.html#a96bb7fbc6037217acccbeb22b718bc1a">fat_dir_entry_struct</a>
</li>
<li>capacity
: <a class="el" href="structsd__raw__info.html#af0443b0eb7316378025763674a5bf9b0">sd_raw_info</a>
</li>
<li>cluster
: <a class="el" href="structfat__dir__entry__struct.html#a33ff89147834319be295ce273eac0d16">fat_dir_entry_struct</a>
</li>
<li>device_read
: <a class="el" href="structpartition__struct.html#a9d82319d1b4f052c165a806069f49afa">partition_struct</a>
</li>
<li>device_read_interval
: <a class="el" href="structpartition__struct.html#a23ef90827c177f8f3385582416ff3ea3">partition_struct</a>
</li>
<li>device_write
: <a class="el" href="structpartition__struct.html#ac16e2eedf75a5e472ed93a92c30e0dad">partition_struct</a>
</li>
<li>device_write_interval
: <a class="el" href="structpartition__struct.html#a91923c55ba1c3a2dad435124964d91aa">partition_struct</a>
</li>
<li>entry_offset
: <a class="el" href="structfat__dir__entry__struct.html#acf491ee03bd21f230aecc449cac2c429">fat_dir_entry_struct</a>
</li>
<li>file_size
: <a class="el" href="structfat__dir__entry__struct.html#ac8821140df86bef96d2e4c9b177f386e">fat_dir_entry_struct</a>
</li>
<li>flag_copy
: <a class="el" href="structsd__raw__info.html#af23fccda0fa6740558d71c530576961b">sd_raw_info</a>
</li>
<li>flag_write_protect
: <a class="el" href="structsd__raw__info.html#a55f4daed5bef3289878fc0521ca191b1">sd_raw_info</a>
</li>
<li>flag_write_protect_temp
: <a class="el" href="structsd__raw__info.html#af3815572d323acafa8e3eabf19b154d5">sd_raw_info</a>
</li>
<li>format
: <a class="el" href="structsd__raw__info.html#a10d485029641a4fc1aadccad5e9eaa03">sd_raw_info</a>
</li>
<li>length
: <a class="el" href="structpartition__struct.html#a416da0cd540916a03a536c4fc5970635">partition_struct</a>
</li>
<li>long_name
: <a class="el" href="structfat__dir__entry__struct.html#a55d4698f86eecb6b49987a7c5f37566c">fat_dir_entry_struct</a>
</li>
<li>manufacturer
: <a class="el" href="structsd__raw__info.html#ad543253184afa50a8e4cb51b6dd5bf67">sd_raw_info</a>
</li>
<li>manufacturing_month
: <a class="el" href="structsd__raw__info.html#a80b3393a84f9c7f0a648cb8a9fd9c8b7">sd_raw_info</a>
</li>
<li>manufacturing_year
: <a class="el" href="structsd__raw__info.html#ae8a5dd6ae2039058100800f6bb85997a">sd_raw_info</a>
</li>
<li>oem
: <a class="el" href="structsd__raw__info.html#a8ec2f9a6cdc4ac26cd695321bd9b3057">sd_raw_info</a>
</li>
<li>offset
: <a class="el" href="structpartition__struct.html#ad9d6f2b7a40168d2960e28a151ef1808">partition_struct</a>
</li>
<li>product
: <a class="el" href="structsd__raw__info.html#a8d781e7a0ec7e752b340a72ba87fc40f">sd_raw_info</a>
</li>
<li>revision
: <a class="el" href="structsd__raw__info.html#a0eb79353f9b63b1e719f8babad77c87e">sd_raw_info</a>
</li>
<li>serial
: <a class="el" href="structsd__raw__info.html#a22771967744cca36595278b52686a69f">sd_raw_info</a>
</li>
<li>type
: <a class="el" href="structpartition__struct.html#a6923f9a2463495b35df8b73750e5d959">partition_struct</a>
</li>
</ul>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,145 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Data Fields - Variables</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li><a href="functions.html"><span>All</span></a></li>
<li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
</ul>
</div>
</div>
<div class="contents">
&#160;<ul>
<li>attributes
: <a class="el" href="structfat__dir__entry__struct.html#a96bb7fbc6037217acccbeb22b718bc1a">fat_dir_entry_struct</a>
</li>
<li>capacity
: <a class="el" href="structsd__raw__info.html#af0443b0eb7316378025763674a5bf9b0">sd_raw_info</a>
</li>
<li>cluster
: <a class="el" href="structfat__dir__entry__struct.html#a33ff89147834319be295ce273eac0d16">fat_dir_entry_struct</a>
</li>
<li>device_read
: <a class="el" href="structpartition__struct.html#a9d82319d1b4f052c165a806069f49afa">partition_struct</a>
</li>
<li>device_read_interval
: <a class="el" href="structpartition__struct.html#a23ef90827c177f8f3385582416ff3ea3">partition_struct</a>
</li>
<li>device_write
: <a class="el" href="structpartition__struct.html#ac16e2eedf75a5e472ed93a92c30e0dad">partition_struct</a>
</li>
<li>device_write_interval
: <a class="el" href="structpartition__struct.html#a91923c55ba1c3a2dad435124964d91aa">partition_struct</a>
</li>
<li>entry_offset
: <a class="el" href="structfat__dir__entry__struct.html#acf491ee03bd21f230aecc449cac2c429">fat_dir_entry_struct</a>
</li>
<li>file_size
: <a class="el" href="structfat__dir__entry__struct.html#ac8821140df86bef96d2e4c9b177f386e">fat_dir_entry_struct</a>
</li>
<li>flag_copy
: <a class="el" href="structsd__raw__info.html#af23fccda0fa6740558d71c530576961b">sd_raw_info</a>
</li>
<li>flag_write_protect
: <a class="el" href="structsd__raw__info.html#a55f4daed5bef3289878fc0521ca191b1">sd_raw_info</a>
</li>
<li>flag_write_protect_temp
: <a class="el" href="structsd__raw__info.html#af3815572d323acafa8e3eabf19b154d5">sd_raw_info</a>
</li>
<li>format
: <a class="el" href="structsd__raw__info.html#a10d485029641a4fc1aadccad5e9eaa03">sd_raw_info</a>
</li>
<li>length
: <a class="el" href="structpartition__struct.html#a416da0cd540916a03a536c4fc5970635">partition_struct</a>
</li>
<li>long_name
: <a class="el" href="structfat__dir__entry__struct.html#a55d4698f86eecb6b49987a7c5f37566c">fat_dir_entry_struct</a>
</li>
<li>manufacturer
: <a class="el" href="structsd__raw__info.html#ad543253184afa50a8e4cb51b6dd5bf67">sd_raw_info</a>
</li>
<li>manufacturing_month
: <a class="el" href="structsd__raw__info.html#a80b3393a84f9c7f0a648cb8a9fd9c8b7">sd_raw_info</a>
</li>
<li>manufacturing_year
: <a class="el" href="structsd__raw__info.html#ae8a5dd6ae2039058100800f6bb85997a">sd_raw_info</a>
</li>
<li>oem
: <a class="el" href="structsd__raw__info.html#a8ec2f9a6cdc4ac26cd695321bd9b3057">sd_raw_info</a>
</li>
<li>offset
: <a class="el" href="structpartition__struct.html#ad9d6f2b7a40168d2960e28a151ef1808">partition_struct</a>
</li>
<li>product
: <a class="el" href="structsd__raw__info.html#a8d781e7a0ec7e752b340a72ba87fc40f">sd_raw_info</a>
</li>
<li>revision
: <a class="el" href="structsd__raw__info.html#a0eb79353f9b63b1e719f8babad77c87e">sd_raw_info</a>
</li>
<li>serial
: <a class="el" href="structsd__raw__info.html#a22771967744cca36595278b52686a69f">sd_raw_info</a>
</li>
<li>type
: <a class="el" href="structpartition__struct.html#a6923f9a2463495b35df8b73750e5d959">partition_struct</a>
</li>
</ul>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,422 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="#index_d"><span>d</span></a></li>
<li><a href="#index_f"><span>f</span></a></li>
<li><a href="#index_h"><span>h</span></a></li>
<li><a href="#index_l"><span>l</span></a></li>
<li><a href="#index_p"><span>p</span></a></li>
<li><a href="#index_r"><span>r</span></a></li>
<li><a href="#index_s"><span>s</span></a></li>
<li><a href="#index_u"><span>u</span></a></li>
<li><a href="#index_w"><span>w</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
<li>device_read_callback_t
: <a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">partition.h</a>
</li>
<li>device_read_interval_t
: <a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">partition.h</a>
</li>
<li>device_read_t
: <a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">partition.h</a>
</li>
<li>device_write_callback_t
: <a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">partition.h</a>
</li>
<li>device_write_interval_t
: <a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">partition.h</a>
</li>
<li>device_write_t
: <a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">partition.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
<li>FAT_ATTRIB_ARCHIVE
: <a class="el" href="group__fat__file.html#ga18ef7ecd9adce93d49a571882e145c99">fat.h</a>
</li>
<li>FAT_ATTRIB_DIR
: <a class="el" href="group__fat__file.html#gacd38dccfabf884611c62aebc90e5adc7">fat.h</a>
</li>
<li>FAT_ATTRIB_HIDDEN
: <a class="el" href="group__fat__file.html#gaaf88f01d19ef4ca777c9c683f458f45f">fat.h</a>
</li>
<li>FAT_ATTRIB_READONLY
: <a class="el" href="group__fat__file.html#gac404d1380dbf00e8a1d6145e035ef10b">fat.h</a>
</li>
<li>FAT_ATTRIB_SYSTEM
: <a class="el" href="group__fat__file.html#gae5aa3610233e87e4ca36b2afe3c3854c">fat.h</a>
</li>
<li>FAT_ATTRIB_VOLUME
: <a class="el" href="group__fat__file.html#ga86f9c93dd409d11813361d48517ccbce">fat.h</a>
</li>
<li>fat_close()
: <a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829">fat.h</a>
, <a class="el" href="group__fat__fs.html#ga057612824886e115b88bf5affcf76829">fat.c</a>
</li>
<li>fat_close_dir()
: <a class="el" href="group__fat__dir.html#ga2fed74d916370428e3dcf278e7050111">fat.c</a>
, <a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111">fat.h</a>
</li>
<li>fat_close_file()
: <a class="el" href="group__fat__file.html#ga70b082abb4ebc8d4e9956886901b55fc">fat.c</a>
, <a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc">fat.h</a>
</li>
<li>fat_create_dir()
: <a class="el" href="group__fat__dir.html#gaff3b524066c9a937fae32771c80e7603">fat.c</a>
, <a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603">fat.h</a>
</li>
<li>fat_create_file()
: <a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f">fat.h</a>
, <a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f">fat.c</a>
</li>
<li>FAT_DATETIME_SUPPORT
: <a class="el" href="group__fat__config.html#ga80fa068db7d09fb267b36741d773eadf">fat_config.h</a>
</li>
<li>FAT_DELAY_DIRENTRY_UPDATE
: <a class="el" href="group__fat__config.html#ga13f632eadee5b7d768b14bf279e843fd">fat_config.h</a>
</li>
<li>fat_delete_dir()
: <a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772">fat.c</a>
</li>
<li>fat_delete_file()
: <a class="el" href="group__fat__file.html#ga46055219b942eb8d57ffae9dc6447e7c">fat.c</a>
, <a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c">fat.h</a>
</li>
<li>FAT_DIR_COUNT
: <a class="el" href="group__fat__config.html#ga8309de7e60311102cb90f9bca6b7d2f8">fat_config.h</a>
</li>
<li>FAT_FAT32_SUPPORT
: <a class="el" href="group__fat__config.html#ga73fdc6edf277eee1551985c3eb9602a3">fat_config.h</a>
</li>
<li>FAT_FILE_COUNT
: <a class="el" href="group__fat__config.html#gae165b9e014e6213eb4429ebda300b6e8">fat_config.h</a>
</li>
<li>FAT_FS_COUNT
: <a class="el" href="group__fat__config.html#ga3d9b70f2a51fd6413f30f6a17e4480bd">fat_config.h</a>
</li>
<li>fat_get_datetime
: <a class="el" href="group__fat__config.html#gafeacb265671562dc1c4a863991163bb4">fat_config.h</a>
</li>
<li>fat_get_dir_entry_of_path()
: <a class="el" href="group__fat__file.html#ga033743a7d8878712e0add6d57b750525">fat.c</a>
, <a class="el" href="group__fat.html#ga033743a7d8878712e0add6d57b750525">fat.h</a>
</li>
<li>fat_get_file_modification_date()
: <a class="el" href="group__fat__file.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat.c</a>
, <a class="el" href="group__fat.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat.h</a>
</li>
<li>fat_get_file_modification_time()
: <a class="el" href="group__fat.html#ga74f840c317556b7dae766e199d87a6ef">fat.h</a>
, <a class="el" href="group__fat__file.html#ga74f840c317556b7dae766e199d87a6ef">fat.c</a>
</li>
<li>fat_get_fs_free()
: <a class="el" href="group__fat__fs.html#gacc43179721b97d82fefafaf5625350bb">fat.c</a>
, <a class="el" href="group__fat.html#gacc43179721b97d82fefafaf5625350bb">fat.h</a>
</li>
<li>fat_get_fs_free_32_callback()
: <a class="el" href="group__fat__fs.html#gafee6ea130655af67845e1cebe9a96bfc">fat.c</a>
</li>
<li>fat_get_fs_size()
: <a class="el" href="group__fat__fs.html#gaab7768ca45847d5c4033a91984d65f1a">fat.c</a>
, <a class="el" href="group__fat.html#gaab7768ca45847d5c4033a91984d65f1a">fat.h</a>
</li>
<li>FAT_LFN_SUPPORT
: <a class="el" href="group__fat__config.html#ga37b51677b33d2e74bec670f52c201a51">fat_config.h</a>
</li>
<li>fat_move_dir()
: <a class="el" href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9">fat.c</a>
</li>
<li>fat_move_file()
: <a class="el" href="group__fat__file.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat.c</a>
, <a class="el" href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat.h</a>
</li>
<li>fat_open()
: <a class="el" href="group__fat__fs.html#ga5d726bac328b49abc2e6fb022d97092a">fat.c</a>
, <a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a">fat.h</a>
</li>
<li>fat_open_dir()
: <a class="el" href="group__fat__dir.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat.c</a>
, <a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat.h</a>
</li>
<li>fat_open_file()
: <a class="el" href="group__fat__file.html#ga76a0b06949525b578db04a56d67fbfc4">fat.c</a>
, <a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4">fat.h</a>
</li>
<li>fat_read_dir()
: <a class="el" href="group__fat__dir.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat.c</a>
, <a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat.h</a>
</li>
<li>fat_read_file()
: <a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca">fat.h</a>
, <a class="el" href="group__fat__file.html#ga48e17b173bede64cb08cef05b88fd0ca">fat.c</a>
</li>
<li>fat_reset_dir()
: <a class="el" href="group__fat__dir.html#ga2d74af47cb9fd44f7c974834f810225f">fat.c</a>
, <a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f">fat.h</a>
</li>
<li>fat_resize_file()
: <a class="el" href="group__fat__file.html#gace4858e7a145684f6c8cd14debe14255">fat.c</a>
, <a class="el" href="group__fat.html#gace4858e7a145684f6c8cd14debe14255">fat.h</a>
</li>
<li>FAT_SEEK_CUR
: <a class="el" href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2">fat.h</a>
</li>
<li>FAT_SEEK_END
: <a class="el" href="group__fat__file.html#gab34d95851ea8b28646ce25c0e0039bc2">fat.h</a>
</li>
<li>fat_seek_file()
: <a class="el" href="group__fat__file.html#gad4c305cf004bae9bea48730ed20c87ec">fat.c</a>
, <a class="el" href="group__fat.html#gad4c305cf004bae9bea48730ed20c87ec">fat.h</a>
</li>
<li>FAT_SEEK_SET
: <a class="el" href="group__fat__file.html#gab870215439192f82ed358e2c7e94ba09">fat.h</a>
</li>
<li>fat_set_file_modification_date()
: <a class="el" href="group__fat__file.html#ga02c969e994a556534c92906db5bb04fd">fat.c</a>
</li>
<li>fat_set_file_modification_time()
: <a class="el" href="group__fat__file.html#gab514f14ce35a38bff3f16270dfdc033b">fat.c</a>
</li>
<li>fat_write_file()
: <a class="el" href="group__fat__file.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat.c</a>
, <a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat.h</a>
</li>
<li>FAT_WRITE_SUPPORT
: <a class="el" href="group__fat__config.html#gace70b11f85eb1b4e15220a65e9bd047d">fat_config.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
<li>htol16()
: <a class="el" href="group__byteordering.html#gab0e4bd12631fd8f1c1566b53cc5d701b">byteordering.h</a>
</li>
<li>HTOL16
: <a class="el" href="group__byteordering.html#gafe6b840e18479649f2f279510841b725">byteordering.h</a>
</li>
<li>HTOL32
: <a class="el" href="group__byteordering.html#ga4721d1b0a8ce813e569f1f50e28cbd49">byteordering.h</a>
</li>
<li>htol32()
: <a class="el" href="group__byteordering.html#gad99f704c5d785948044d1a0a81ffdd78">byteordering.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
<li>ltoh16()
: <a class="el" href="group__byteordering.html#ga956619f7d735460ad335c33399a5bfd0">byteordering.h</a>
</li>
<li>LTOH16
: <a class="el" href="group__byteordering.html#ga5c0de5da892f4416d2e6a08a4313dd43">byteordering.h</a>
</li>
<li>LTOH32
: <a class="el" href="group__byteordering.html#gad6a95c92a285d197c78cd0c680266682">byteordering.h</a>
</li>
<li>ltoh32()
: <a class="el" href="group__byteordering.html#gaa6a3e9e41e5a7fa0c61a9b7355135977">byteordering.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
<li>partition_close()
: <a class="el" href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2">partition.c</a>
</li>
<li>PARTITION_COUNT
: <a class="el" href="group__partition__config.html#gad3d3ffd91206adf249d3318930f024af">partition_config.h</a>
</li>
<li>partition_open()
: <a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68">partition.c</a>
</li>
<li>PARTITION_TYPE_EXTENDED
: <a class="el" href="group__partition.html#gaceaa1bf17d4e8961726834e53ed79732">partition.h</a>
</li>
<li>PARTITION_TYPE_EXTENDED_LBA
: <a class="el" href="group__partition.html#ga1c9a00e3b09b488ce7f3b2ef2904400b">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT12
: <a class="el" href="group__partition.html#gaa92b6c552d2411e093204cd3ed4cffa3">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT16
: <a class="el" href="group__partition.html#gada7e1b4d950c7a3f42f559ab99f5fe43">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT16_32MB
: <a class="el" href="group__partition.html#gaf7296b4a29c1f7e5c39e28372648b2cd">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT16_LBA
: <a class="el" href="group__partition.html#ga52b69fda008ca19d75304a2385cc4900">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT32
: <a class="el" href="group__partition.html#ga2f6a6c30cc239ae13ea287ff901c95f4">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT32_LBA
: <a class="el" href="group__partition.html#gaa2e0c8e8b4ec10f7b342c0d554b5f6d8">partition.h</a>
</li>
<li>PARTITION_TYPE_FREE
: <a class="el" href="group__partition.html#gaab5ffe2ef6119a6815c505e3103a2714">partition.h</a>
</li>
<li>PARTITION_TYPE_UNKNOWN
: <a class="el" href="group__partition.html#gacdc50585fe8130f0a4faee13caade86f">partition.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
<li>read16()
: <a class="el" href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8">byteordering.c</a>
</li>
<li>read32()
: <a class="el" href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887">byteordering.c</a>
</li>
</ul>
<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
<li>sd_raw_available()
: <a class="el" href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab">sd_raw.c</a>
</li>
<li>SD_RAW_FORMAT_HARDDISK
: <a class="el" href="group__sd__raw.html#ga2507a78d61385c9dbc1d06b8a03ef58a">sd_raw.h</a>
</li>
<li>SD_RAW_FORMAT_SUPERFLOPPY
: <a class="el" href="group__sd__raw.html#ga4caede5500f4d1035ceb9951a831c224">sd_raw.h</a>
</li>
<li>SD_RAW_FORMAT_UNIVERSAL
: <a class="el" href="group__sd__raw.html#gad070d05f762410f57870549a0fcd5f43">sd_raw.h</a>
</li>
<li>SD_RAW_FORMAT_UNKNOWN
: <a class="el" href="group__sd__raw.html#ga7e87231437f32335a25930ec1b85a9c9">sd_raw.h</a>
</li>
<li>sd_raw_get_info()
: <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79">sd_raw.c</a>
</li>
<li>sd_raw_init()
: <a class="el" href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5">sd_raw.c</a>
</li>
<li>sd_raw_locked()
: <a class="el" href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b">sd_raw.c</a>
</li>
<li>sd_raw_read()
: <a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774">sd_raw.c</a>
</li>
<li>sd_raw_read_interval()
: <a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9">sd_raw.c</a>
</li>
<li>SD_RAW_SAVE_RAM
: <a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">sd_raw_config.h</a>
</li>
<li>SD_RAW_SDHC
: <a class="el" href="group__sd__raw__config.html#ga03cccc1544f7cd6c23d66967a1bbc0f7">sd_raw_config.h</a>
</li>
<li>sd_raw_sync()
: <a class="el" href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735">sd_raw.c</a>
</li>
<li>sd_raw_write()
: <a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577">sd_raw.c</a>
</li>
<li>SD_RAW_WRITE_BUFFERING
: <a class="el" href="group__sd__raw__config.html#gaa749d88c077a812f5c518e3172c96f9e">sd_raw_config.h</a>
</li>
<li>sd_raw_write_interval()
: <a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68">sd_raw.c</a>
</li>
<li>SD_RAW_WRITE_SUPPORT
: <a class="el" href="group__sd__raw__config.html#ga5f2253a3c408671f91f9aebefeef7472">sd_raw_config.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
<li>USE_DYNAMIC_MEMORY
: <a class="el" href="group__config.html#ga59a630bfc97e8a00e2ad0a0ad4b2f8a7">sd-reader_config.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
<li>write16()
: <a class="el" href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd">byteordering.c</a>
</li>
<li>write32()
: <a class="el" href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86">byteordering.c</a>
</li>
</ul>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,233 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li class="current"><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="#index_f"><span>f</span></a></li>
<li><a href="#index_h"><span>h</span></a></li>
<li><a href="#index_l"><span>l</span></a></li>
<li><a href="#index_p"><span>p</span></a></li>
<li><a href="#index_s"><span>s</span></a></li>
<li><a href="#index_u"><span>u</span></a></li>
</ul>
</div>
</div>
<div class="contents">
&#160;
<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
<li>FAT_ATTRIB_ARCHIVE
: <a class="el" href="group__fat__file.html#ga18ef7ecd9adce93d49a571882e145c99">fat.h</a>
</li>
<li>FAT_ATTRIB_DIR
: <a class="el" href="group__fat__file.html#gacd38dccfabf884611c62aebc90e5adc7">fat.h</a>
</li>
<li>FAT_ATTRIB_HIDDEN
: <a class="el" href="group__fat__file.html#gaaf88f01d19ef4ca777c9c683f458f45f">fat.h</a>
</li>
<li>FAT_ATTRIB_READONLY
: <a class="el" href="group__fat__file.html#gac404d1380dbf00e8a1d6145e035ef10b">fat.h</a>
</li>
<li>FAT_ATTRIB_SYSTEM
: <a class="el" href="group__fat__file.html#gae5aa3610233e87e4ca36b2afe3c3854c">fat.h</a>
</li>
<li>FAT_ATTRIB_VOLUME
: <a class="el" href="group__fat__file.html#ga86f9c93dd409d11813361d48517ccbce">fat.h</a>
</li>
<li>FAT_DATETIME_SUPPORT
: <a class="el" href="group__fat__config.html#ga80fa068db7d09fb267b36741d773eadf">fat_config.h</a>
</li>
<li>FAT_DELAY_DIRENTRY_UPDATE
: <a class="el" href="group__fat__config.html#ga13f632eadee5b7d768b14bf279e843fd">fat_config.h</a>
</li>
<li>FAT_DIR_COUNT
: <a class="el" href="group__fat__config.html#ga8309de7e60311102cb90f9bca6b7d2f8">fat_config.h</a>
</li>
<li>FAT_FAT32_SUPPORT
: <a class="el" href="group__fat__config.html#ga73fdc6edf277eee1551985c3eb9602a3">fat_config.h</a>
</li>
<li>FAT_FILE_COUNT
: <a class="el" href="group__fat__config.html#gae165b9e014e6213eb4429ebda300b6e8">fat_config.h</a>
</li>
<li>FAT_FS_COUNT
: <a class="el" href="group__fat__config.html#ga3d9b70f2a51fd6413f30f6a17e4480bd">fat_config.h</a>
</li>
<li>fat_get_datetime
: <a class="el" href="group__fat__config.html#gafeacb265671562dc1c4a863991163bb4">fat_config.h</a>
</li>
<li>FAT_LFN_SUPPORT
: <a class="el" href="group__fat__config.html#ga37b51677b33d2e74bec670f52c201a51">fat_config.h</a>
</li>
<li>FAT_SEEK_CUR
: <a class="el" href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2">fat.h</a>
</li>
<li>FAT_SEEK_END
: <a class="el" href="group__fat__file.html#gab34d95851ea8b28646ce25c0e0039bc2">fat.h</a>
</li>
<li>FAT_SEEK_SET
: <a class="el" href="group__fat__file.html#gab870215439192f82ed358e2c7e94ba09">fat.h</a>
</li>
<li>FAT_WRITE_SUPPORT
: <a class="el" href="group__fat__config.html#gace70b11f85eb1b4e15220a65e9bd047d">fat_config.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
<li>HTOL16
: <a class="el" href="group__byteordering.html#gafe6b840e18479649f2f279510841b725">byteordering.h</a>
</li>
<li>HTOL32
: <a class="el" href="group__byteordering.html#ga4721d1b0a8ce813e569f1f50e28cbd49">byteordering.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
<li>LTOH16
: <a class="el" href="group__byteordering.html#ga5c0de5da892f4416d2e6a08a4313dd43">byteordering.h</a>
</li>
<li>LTOH32
: <a class="el" href="group__byteordering.html#gad6a95c92a285d197c78cd0c680266682">byteordering.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
<li>PARTITION_COUNT
: <a class="el" href="group__partition__config.html#gad3d3ffd91206adf249d3318930f024af">partition_config.h</a>
</li>
<li>PARTITION_TYPE_EXTENDED
: <a class="el" href="group__partition.html#gaceaa1bf17d4e8961726834e53ed79732">partition.h</a>
</li>
<li>PARTITION_TYPE_EXTENDED_LBA
: <a class="el" href="group__partition.html#ga1c9a00e3b09b488ce7f3b2ef2904400b">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT12
: <a class="el" href="group__partition.html#gaa92b6c552d2411e093204cd3ed4cffa3">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT16
: <a class="el" href="group__partition.html#gada7e1b4d950c7a3f42f559ab99f5fe43">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT16_32MB
: <a class="el" href="group__partition.html#gaf7296b4a29c1f7e5c39e28372648b2cd">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT16_LBA
: <a class="el" href="group__partition.html#ga52b69fda008ca19d75304a2385cc4900">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT32
: <a class="el" href="group__partition.html#ga2f6a6c30cc239ae13ea287ff901c95f4">partition.h</a>
</li>
<li>PARTITION_TYPE_FAT32_LBA
: <a class="el" href="group__partition.html#gaa2e0c8e8b4ec10f7b342c0d554b5f6d8">partition.h</a>
</li>
<li>PARTITION_TYPE_FREE
: <a class="el" href="group__partition.html#gaab5ffe2ef6119a6815c505e3103a2714">partition.h</a>
</li>
<li>PARTITION_TYPE_UNKNOWN
: <a class="el" href="group__partition.html#gacdc50585fe8130f0a4faee13caade86f">partition.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
<li>SD_RAW_FORMAT_HARDDISK
: <a class="el" href="group__sd__raw.html#ga2507a78d61385c9dbc1d06b8a03ef58a">sd_raw.h</a>
</li>
<li>SD_RAW_FORMAT_SUPERFLOPPY
: <a class="el" href="group__sd__raw.html#ga4caede5500f4d1035ceb9951a831c224">sd_raw.h</a>
</li>
<li>SD_RAW_FORMAT_UNIVERSAL
: <a class="el" href="group__sd__raw.html#gad070d05f762410f57870549a0fcd5f43">sd_raw.h</a>
</li>
<li>SD_RAW_FORMAT_UNKNOWN
: <a class="el" href="group__sd__raw.html#ga7e87231437f32335a25930ec1b85a9c9">sd_raw.h</a>
</li>
<li>SD_RAW_SAVE_RAM
: <a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">sd_raw_config.h</a>
</li>
<li>SD_RAW_SDHC
: <a class="el" href="group__sd__raw__config.html#ga03cccc1544f7cd6c23d66967a1bbc0f7">sd_raw_config.h</a>
</li>
<li>SD_RAW_WRITE_BUFFERING
: <a class="el" href="group__sd__raw__config.html#gaa749d88c077a812f5c518e3172c96f9e">sd_raw_config.h</a>
</li>
<li>SD_RAW_WRITE_SUPPORT
: <a class="el" href="group__sd__raw__config.html#ga5f2253a3c408671f91f9aebefeef7472">sd_raw_config.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
<li>USE_DYNAMIC_MEMORY
: <a class="el" href="group__config.html#ga59a630bfc97e8a00e2ad0a0ad4b2f8a7">sd-reader_config.h</a>
</li>
</ul>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,268 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li><a href="globals.html"><span>All</span></a></li>
<li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="#index_f"><span>f</span></a></li>
<li><a href="#index_h"><span>h</span></a></li>
<li><a href="#index_l"><span>l</span></a></li>
<li><a href="#index_p"><span>p</span></a></li>
<li><a href="#index_r"><span>r</span></a></li>
<li><a href="#index_s"><span>s</span></a></li>
<li><a href="#index_w"><span>w</span></a></li>
</ul>
</div>
</div>
<div class="contents">
&#160;
<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
<li>fat_close()
: <a class="el" href="group__fat__fs.html#ga057612824886e115b88bf5affcf76829">fat.c</a>
, <a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829">fat.h</a>
</li>
<li>fat_close_dir()
: <a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111">fat.h</a>
, <a class="el" href="group__fat__dir.html#ga2fed74d916370428e3dcf278e7050111">fat.c</a>
</li>
<li>fat_close_file()
: <a class="el" href="group__fat__file.html#ga70b082abb4ebc8d4e9956886901b55fc">fat.c</a>
, <a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc">fat.h</a>
</li>
<li>fat_create_dir()
: <a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603">fat.h</a>
, <a class="el" href="group__fat__dir.html#gaff3b524066c9a937fae32771c80e7603">fat.c</a>
</li>
<li>fat_create_file()
: <a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f">fat.c</a>
, <a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f">fat.h</a>
</li>
<li>fat_delete_dir()
: <a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772">fat.c</a>
</li>
<li>fat_delete_file()
: <a class="el" href="group__fat__file.html#ga46055219b942eb8d57ffae9dc6447e7c">fat.c</a>
, <a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c">fat.h</a>
</li>
<li>fat_get_dir_entry_of_path()
: <a class="el" href="group__fat__file.html#ga033743a7d8878712e0add6d57b750525">fat.c</a>
, <a class="el" href="group__fat.html#ga033743a7d8878712e0add6d57b750525">fat.h</a>
</li>
<li>fat_get_file_modification_date()
: <a class="el" href="group__fat__file.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat.c</a>
, <a class="el" href="group__fat.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat.h</a>
</li>
<li>fat_get_file_modification_time()
: <a class="el" href="group__fat__file.html#ga74f840c317556b7dae766e199d87a6ef">fat.c</a>
, <a class="el" href="group__fat.html#ga74f840c317556b7dae766e199d87a6ef">fat.h</a>
</li>
<li>fat_get_fs_free()
: <a class="el" href="group__fat__fs.html#gacc43179721b97d82fefafaf5625350bb">fat.c</a>
, <a class="el" href="group__fat.html#gacc43179721b97d82fefafaf5625350bb">fat.h</a>
</li>
<li>fat_get_fs_free_32_callback()
: <a class="el" href="group__fat__fs.html#gafee6ea130655af67845e1cebe9a96bfc">fat.c</a>
</li>
<li>fat_get_fs_size()
: <a class="el" href="group__fat__fs.html#gaab7768ca45847d5c4033a91984d65f1a">fat.c</a>
, <a class="el" href="group__fat.html#gaab7768ca45847d5c4033a91984d65f1a">fat.h</a>
</li>
<li>fat_move_dir()
: <a class="el" href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9">fat.c</a>
</li>
<li>fat_move_file()
: <a class="el" href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat.h</a>
, <a class="el" href="group__fat__file.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat.c</a>
</li>
<li>fat_open()
: <a class="el" href="group__fat__fs.html#ga5d726bac328b49abc2e6fb022d97092a">fat.c</a>
, <a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a">fat.h</a>
</li>
<li>fat_open_dir()
: <a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat.h</a>
, <a class="el" href="group__fat__dir.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat.c</a>
</li>
<li>fat_open_file()
: <a class="el" href="group__fat__file.html#ga76a0b06949525b578db04a56d67fbfc4">fat.c</a>
, <a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4">fat.h</a>
</li>
<li>fat_read_dir()
: <a class="el" href="group__fat__dir.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat.c</a>
, <a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat.h</a>
</li>
<li>fat_read_file()
: <a class="el" href="group__fat__file.html#ga48e17b173bede64cb08cef05b88fd0ca">fat.c</a>
, <a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca">fat.h</a>
</li>
<li>fat_reset_dir()
: <a class="el" href="group__fat__dir.html#ga2d74af47cb9fd44f7c974834f810225f">fat.c</a>
, <a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f">fat.h</a>
</li>
<li>fat_resize_file()
: <a class="el" href="group__fat.html#gace4858e7a145684f6c8cd14debe14255">fat.h</a>
, <a class="el" href="group__fat__file.html#gace4858e7a145684f6c8cd14debe14255">fat.c</a>
</li>
<li>fat_seek_file()
: <a class="el" href="group__fat.html#gad4c305cf004bae9bea48730ed20c87ec">fat.h</a>
, <a class="el" href="group__fat__file.html#gad4c305cf004bae9bea48730ed20c87ec">fat.c</a>
</li>
<li>fat_set_file_modification_date()
: <a class="el" href="group__fat__file.html#ga02c969e994a556534c92906db5bb04fd">fat.c</a>
</li>
<li>fat_set_file_modification_time()
: <a class="el" href="group__fat__file.html#gab514f14ce35a38bff3f16270dfdc033b">fat.c</a>
</li>
<li>fat_write_file()
: <a class="el" href="group__fat__file.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat.c</a>
, <a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
<li>htol16()
: <a class="el" href="group__byteordering.html#gab0e4bd12631fd8f1c1566b53cc5d701b">byteordering.h</a>
</li>
<li>htol32()
: <a class="el" href="group__byteordering.html#gad99f704c5d785948044d1a0a81ffdd78">byteordering.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
<li>ltoh16()
: <a class="el" href="group__byteordering.html#ga956619f7d735460ad335c33399a5bfd0">byteordering.h</a>
</li>
<li>ltoh32()
: <a class="el" href="group__byteordering.html#gaa6a3e9e41e5a7fa0c61a9b7355135977">byteordering.h</a>
</li>
</ul>
<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
<li>partition_close()
: <a class="el" href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2">partition.c</a>
</li>
<li>partition_open()
: <a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68">partition.c</a>
</li>
</ul>
<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
<li>read16()
: <a class="el" href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8">byteordering.c</a>
</li>
<li>read32()
: <a class="el" href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887">byteordering.c</a>
</li>
</ul>
<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
<li>sd_raw_available()
: <a class="el" href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab">sd_raw.c</a>
</li>
<li>sd_raw_get_info()
: <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79">sd_raw.c</a>
</li>
<li>sd_raw_init()
: <a class="el" href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5">sd_raw.c</a>
</li>
<li>sd_raw_locked()
: <a class="el" href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b">sd_raw.c</a>
</li>
<li>sd_raw_read()
: <a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774">sd_raw.c</a>
</li>
<li>sd_raw_read_interval()
: <a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9">sd_raw.c</a>
</li>
<li>sd_raw_sync()
: <a class="el" href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735">sd_raw.c</a>
</li>
<li>sd_raw_write()
: <a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577">sd_raw.c</a>
</li>
<li>sd_raw_write_interval()
: <a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68">sd_raw.c</a>
</li>
</ul>
<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
<li>write16()
: <a class="el" href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd">byteordering.c</a>
</li>
<li>write32()
: <a class="el" href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86">byteordering.c</a>
</li>
</ul>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,93 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
</div>
<div class="contents">
&#160;<ul>
<li>device_read_callback_t
: <a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">partition.h</a>
</li>
<li>device_read_interval_t
: <a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">partition.h</a>
</li>
<li>device_read_t
: <a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">partition.h</a>
</li>
<li>device_write_callback_t
: <a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">partition.h</a>
</li>
<li>device_write_interval_t
: <a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">partition.h</a>
</li>
<li>device_write_t
: <a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">partition.h</a>
</li>
</ul>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,452 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Byteordering</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#files">Files</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">Byteordering</div> </div>
</div><!--header-->
<div class="contents">
<p>Architecture-dependent handling of byte-ordering.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="files"></a>
Files</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="byteordering_8c.html">byteordering.c</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Byte-order handling implementation (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="byteordering_8h.html">byteordering.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Byte-order handling header (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gafe6b840e18479649f2f279510841b725">HTOL16</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from host byte order to little-endian byte order. <a href="#gafe6b840e18479649f2f279510841b725"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga4721d1b0a8ce813e569f1f50e28cbd49">HTOL32</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from host byte order to little-endian byte order. <a href="#ga4721d1b0a8ce813e569f1f50e28cbd49"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga5c0de5da892f4416d2e6a08a4313dd43">LTOH16</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from little-endian byte order to host byte order. <a href="#ga5c0de5da892f4416d2e6a08a4313dd43"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gad6a95c92a285d197c78cd0c680266682">LTOH32</a>(val)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from little-endian byte order to host byte order. <a href="#gad6a95c92a285d197c78cd0c680266682"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8">read16</a> (const uint8_t *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads a 16-bit integer from memory in little-endian byte order. <a href="#ga093e2aa18385b96e30198e9ec902c3a8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887">read32</a> (const uint8_t *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads a 32-bit integer from memory in little-endian byte order. <a href="#gab7db40b834553f07d18076ac05c85887"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd">write16</a> (uint8_t *p, uint16_t i)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a 16-bit integer into memory in little-endian byte order. <a href="#ga101b4c983b1af68a4886bc4d1cce7cfd"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86">write32</a> (uint8_t *p, uint32_t i)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a 32-bit integer into memory in little-endian byte order. <a href="#gae4a413d089ca0706b9d0a66c19163e86"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gab0e4bd12631fd8f1c1566b53cc5d701b">htol16</a> (uint16_t h)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from host byte order to little-endian byte order. <a href="#gab0e4bd12631fd8f1c1566b53cc5d701b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gad99f704c5d785948044d1a0a81ffdd78">htol32</a> (uint32_t h)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from host byte order to little-endian byte order. <a href="#gad99f704c5d785948044d1a0a81ffdd78"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#ga956619f7d735460ad335c33399a5bfd0">ltoh16</a> (uint16_t l)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 16-bit integer from little-endian byte order to host byte order. <a href="#ga956619f7d735460ad335c33399a5bfd0"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__byteordering.html#gaa6a3e9e41e5a7fa0c61a9b7355135977">ltoh32</a> (uint32_t l)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 32-bit integer from little-endian byte order to host byte order. <a href="#gaa6a3e9e41e5a7fa0c61a9b7355135977"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Architecture-dependent handling of byte-ordering. </p>
<hr/><h2>Define Documentation</h2>
<a class="anchor" id="gafe6b840e18479649f2f279510841b725"></a><!-- doxytag: member="byteordering.h::HTOL16" ref="gafe6b840e18479649f2f279510841b725" args="(val)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__byteordering.html#gafe6b840e18479649f2f279510841b725">HTOL16</a></td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">val</td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 16-bit integer from host byte order to little-endian byte order. </p>
<p>Use this macro for compile time constants only. For variable values use the function <a class="el" href="group__byteordering.html#gab0e4bd12631fd8f1c1566b53cc5d701b" title="Converts a 16-bit integer from host byte order to little-endian byte order.">htol16()</a> instead. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>A 16-bit integer in host byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 16-bit integer converted to little-endian byte order. </dd></dl>
</div>
</div>
<a class="anchor" id="ga4721d1b0a8ce813e569f1f50e28cbd49"></a><!-- doxytag: member="byteordering.h::HTOL32" ref="ga4721d1b0a8ce813e569f1f50e28cbd49" args="(val)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__byteordering.html#ga4721d1b0a8ce813e569f1f50e28cbd49">HTOL32</a></td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">val</td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 32-bit integer from host byte order to little-endian byte order. </p>
<p>Use this macro for compile time constants only. For variable values use the function <a class="el" href="group__byteordering.html#gad99f704c5d785948044d1a0a81ffdd78" title="Converts a 32-bit integer from host byte order to little-endian byte order.">htol32()</a> instead. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>A 32-bit integer in host byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 32-bit integer converted to little-endian byte order. </dd></dl>
</div>
</div>
<a class="anchor" id="ga5c0de5da892f4416d2e6a08a4313dd43"></a><!-- doxytag: member="byteordering.h::LTOH16" ref="ga5c0de5da892f4416d2e6a08a4313dd43" args="(val)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__byteordering.html#ga5c0de5da892f4416d2e6a08a4313dd43">LTOH16</a></td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">val</td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 16-bit integer from little-endian byte order to host byte order. </p>
<p>Use this macro for compile time constants only. For variable values use the function <a class="el" href="group__byteordering.html#ga956619f7d735460ad335c33399a5bfd0" title="Converts a 16-bit integer from little-endian byte order to host byte order.">ltoh16()</a> instead. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>A 16-bit integer in little-endian byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 16-bit integer converted to host byte order. </dd></dl>
</div>
</div>
<a class="anchor" id="gad6a95c92a285d197c78cd0c680266682"></a><!-- doxytag: member="byteordering.h::LTOH32" ref="gad6a95c92a285d197c78cd0c680266682" args="(val)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__byteordering.html#gad6a95c92a285d197c78cd0c680266682">LTOH32</a></td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">val</td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 32-bit integer from little-endian byte order to host byte order. </p>
<p>Use this macro for compile time constants only. For variable values use the function <a class="el" href="group__byteordering.html#gaa6a3e9e41e5a7fa0c61a9b7355135977" title="Converts a 32-bit integer from little-endian byte order to host byte order.">ltoh32()</a> instead. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>A 32-bit integer in little-endian byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 32-bit integer converted to host byte order. </dd></dl>
</div>
</div>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="gab0e4bd12631fd8f1c1566b53cc5d701b"></a><!-- doxytag: member="byteordering.h::htol16" ref="gab0e4bd12631fd8f1c1566b53cc5d701b" args="(uint16_t h)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint16_t <a class="el" href="group__byteordering.html#gab0e4bd12631fd8f1c1566b53cc5d701b">htol16</a> </td>
<td>(</td>
<td class="paramtype">uint16_t&#160;</td>
<td class="paramname"><em>h</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 16-bit integer from host byte order to little-endian byte order. </p>
<p>Use this function on variable values instead of the macro <a class="el" href="group__byteordering.html#gafe6b840e18479649f2f279510841b725" title="Converts a 16-bit integer from host byte order to little-endian byte order.">HTOL16()</a>. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">h</td><td>A 16-bit integer in host byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 16-bit integer converted to little-endian byte order. </dd></dl>
</div>
</div>
<a class="anchor" id="gad99f704c5d785948044d1a0a81ffdd78"></a><!-- doxytag: member="byteordering.h::htol32" ref="gad99f704c5d785948044d1a0a81ffdd78" args="(uint32_t h)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint32_t <a class="el" href="group__byteordering.html#gad99f704c5d785948044d1a0a81ffdd78">htol32</a> </td>
<td>(</td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>h</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 32-bit integer from host byte order to little-endian byte order. </p>
<p>Use this function on variable values instead of the macro <a class="el" href="group__byteordering.html#ga4721d1b0a8ce813e569f1f50e28cbd49" title="Converts a 32-bit integer from host byte order to little-endian byte order.">HTOL32()</a>. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">h</td><td>A 32-bit integer in host byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 32-bit integer converted to little-endian byte order. </dd></dl>
</div>
</div>
<a class="anchor" id="ga956619f7d735460ad335c33399a5bfd0"></a><!-- doxytag: member="byteordering.h::ltoh16" ref="ga956619f7d735460ad335c33399a5bfd0" args="(uint16_t l)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint16_t <a class="el" href="group__byteordering.html#ga956619f7d735460ad335c33399a5bfd0">ltoh16</a> </td>
<td>(</td>
<td class="paramtype">uint16_t&#160;</td>
<td class="paramname"><em>l</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 16-bit integer from little-endian byte order to host byte order. </p>
<p>Use this function on variable values instead of the macro <a class="el" href="group__byteordering.html#ga5c0de5da892f4416d2e6a08a4313dd43" title="Converts a 16-bit integer from little-endian byte order to host byte order.">LTOH16()</a>. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">l</td><td>A 16-bit integer in little-endian byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 16-bit integer converted to host byte order. </dd></dl>
</div>
</div>
<a class="anchor" id="gaa6a3e9e41e5a7fa0c61a9b7355135977"></a><!-- doxytag: member="byteordering.h::ltoh32" ref="gaa6a3e9e41e5a7fa0c61a9b7355135977" args="(uint32_t l)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint32_t <a class="el" href="group__byteordering.html#gaa6a3e9e41e5a7fa0c61a9b7355135977">ltoh32</a> </td>
<td>(</td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>l</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Converts a 32-bit integer from little-endian byte order to host byte order. </p>
<p>Use this function on variable values instead of the macro <a class="el" href="group__byteordering.html#gad6a95c92a285d197c78cd0c680266682" title="Converts a 32-bit integer from little-endian byte order to host byte order.">LTOH32()</a>. This saves code size.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">l</td><td>A 32-bit integer in little-endian byte order. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The given 32-bit integer converted to host byte order. </dd></dl>
</div>
</div>
<a class="anchor" id="ga093e2aa18385b96e30198e9ec902c3a8"></a><!-- doxytag: member="byteordering.c::read16" ref="ga093e2aa18385b96e30198e9ec902c3a8" args="(const uint8_t *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint16_t <a class="el" href="group__byteordering.html#ga093e2aa18385b96e30198e9ec902c3a8">read16</a> </td>
<td>(</td>
<td class="paramtype">const uint8_t *&#160;</td>
<td class="paramname"><em>p</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads a 16-bit integer from memory in little-endian byte order. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>Pointer from where to read the integer. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The 16-bit integer read from memory. </dd></dl>
</div>
</div>
<a class="anchor" id="gab7db40b834553f07d18076ac05c85887"></a><!-- doxytag: member="byteordering.c::read32" ref="gab7db40b834553f07d18076ac05c85887" args="(const uint8_t *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint32_t <a class="el" href="group__byteordering.html#gab7db40b834553f07d18076ac05c85887">read32</a> </td>
<td>(</td>
<td class="paramtype">const uint8_t *&#160;</td>
<td class="paramname"><em>p</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads a 32-bit integer from memory in little-endian byte order. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>Pointer from where to read the integer. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The 32-bit integer read from memory. </dd></dl>
</div>
</div>
<a class="anchor" id="ga101b4c983b1af68a4886bc4d1cce7cfd"></a><!-- doxytag: member="byteordering.c::write16" ref="ga101b4c983b1af68a4886bc4d1cce7cfd" args="(uint8_t *p, uint16_t i)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__byteordering.html#ga101b4c983b1af68a4886bc4d1cce7cfd">write16</a> </td>
<td>(</td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>p</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t&#160;</td>
<td class="paramname"><em>i</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Writes a 16-bit integer into memory in little-endian byte order. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>Pointer where to write the integer to. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">i</td><td>The 16-bit integer to write. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="gae4a413d089ca0706b9d0a66c19163e86"></a><!-- doxytag: member="byteordering.c::write32" ref="gae4a413d089ca0706b9d0a66c19163e86" args="(uint8_t *p, uint32_t i)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__byteordering.html#gae4a413d089ca0706b9d0a66c19163e86">write32</a> </td>
<td>(</td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>p</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>i</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Writes a 32-bit integer into memory in little-endian byte order. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>Pointer where to write the integer to. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">i</td><td>The 32-bit integer to write. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,94 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Sd-reader configuration</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#files">Files</a> &#124;
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">Sd-reader configuration</div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="files"></a>
Files</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sd-reader__config_8h.html">sd-reader_config.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Common sd-reader configuration used by all modules (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__config.html#ga59a630bfc97e8a00e2ad0a0ad4b2f8a7">USE_DYNAMIC_MEMORY</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls allocation of memory. <a href="#ga59a630bfc97e8a00e2ad0a0ad4b2f8a7"></a><br/></td></tr>
</table>
<hr/><h2>Define Documentation</h2>
<a class="anchor" id="ga59a630bfc97e8a00e2ad0a0ad4b2f8a7"></a><!-- doxytag: member="sd&#45;reader_config.h::USE_DYNAMIC_MEMORY" ref="ga59a630bfc97e8a00e2ad0a0ad4b2f8a7" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__config.html#ga59a630bfc97e8a00e2ad0a0ad4b2f8a7">USE_DYNAMIC_MEMORY</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls allocation of memory. </p>
<p>Set to 1 to use malloc()/free() for allocation of structures like file and directory handles, set to 0 to use pre-allocated fixed-size handle arrays. </p>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,989 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: FAT support</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#groups">Modules</a> &#124;
<a href="#files">Files</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">FAT support</div> </div>
</div><!--header-->
<div class="contents">
<p>This module implements FAT16/FAT32 read and write access.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes a directory entry. <a href="structfat__dir__entry__struct.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="groups"></a>
Modules</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html">FAT configuration</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Preprocessor defines to configure the FAT implementation. </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html">FAT access</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Basic functions for handling a FAT filesystem. </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html">FAT file functions</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Functions for managing files. </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html">FAT directory functions</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Functions for managing directories. </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="files"></a>
Files</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fat_8c.html">fat.c</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>FAT implementation (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fat_8h.html">fat.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>FAT header (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fat__config_8h.html">fat_config.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>FAT configuration (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_fs_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a">fat_open</a> (struct <a class="el" href="structpartition__struct.html">partition_struct</a> *partition)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a FAT filesystem. <a href="#ga5d726bac328b49abc2e6fb022d97092a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829">fat_close</a> (struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a FAT filesystem. <a href="#ga057612824886e115b88bf5affcf76829"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_file_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4">fat_open_file</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a file on a FAT filesystem. <a href="#ga76a0b06949525b578db04a56d67fbfc4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc">fat_close_file</a> (struct fat_file_struct *fd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a file. <a href="#ga70b082abb4ebc8d4e9956886901b55fc"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca">fat_read_file</a> (struct fat_file_struct *fd, uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads data from a file. <a href="#ga48e17b173bede64cb08cef05b88fd0ca"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat_write_file</a> (struct fat_file_struct *fd, const uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes data to a file. <a href="#ga6782ff80eb6fba9b6ed1a66f33dae60a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gad4c305cf004bae9bea48730ed20c87ec">fat_seek_file</a> (struct fat_file_struct *fd, int32_t *offset, uint8_t whence)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Repositions the read/write file offset. <a href="#gad4c305cf004bae9bea48730ed20c87ec"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gace4858e7a145684f6c8cd14debe14255">fat_resize_file</a> (struct fat_file_struct *fd, uint32_t size)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes a file to have a specific size. <a href="#gace4858e7a145684f6c8cd14debe14255"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_dir_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat_open_dir</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a directory. <a href="#gac7a5b4ad0b972759a965e1afd5bbc87c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111">fat_close_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a directory descriptor. <a href="#ga2fed74d916370428e3dcf278e7050111"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat_read_dir</a> (struct fat_dir_struct *dd, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads the next directory entry contained within a parent directory. <a href="#gab4bc79452dbf5ac2a2f3e1fccafd9534"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f">fat_reset_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resets a directory handle. <a href="#ga2d74af47cb9fd44f7c974834f810225f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f">fat_create_file</a> (struct fat_dir_struct *parent, const char *file, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a file. <a href="#ga9d17d09125359dfb440fc57eede40b4f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c">fat_delete_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a file or directory. <a href="#ga46055219b942eb8d57ffae9dc6447e7c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat_move_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, struct fat_dir_struct *parent_new, const char *file_new)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves or renames a file. <a href="#gaba4d2c80ccd8f1aebcecf7072dc37510"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603">fat_create_dir</a> (struct fat_dir_struct *parent, const char *dir, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a directory. <a href="#gaff3b524066c9a937fae32771c80e7603"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat_get_file_modification_date</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint16_t *year, uint8_t *month, uint8_t *day)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification date of a file. <a href="#ga24763fd73cbeb580ae5d19e975bde0d8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga74f840c317556b7dae766e199d87a6ef">fat_get_file_modification_time</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint8_t *hour, uint8_t *min, uint8_t *sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification time of a file. <a href="#ga74f840c317556b7dae766e199d87a6ef"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#ga033743a7d8878712e0add6d57b750525">fat_get_dir_entry_of_path</a> (struct fat_fs_struct *fs, const char *path, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves the directory entry of a path. <a href="#ga033743a7d8878712e0add6d57b750525"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gaab7768ca45847d5c4033a91984d65f1a">fat_get_fs_size</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of total storage capacity of the filesystem in bytes. <a href="#gaab7768ca45847d5c4033a91984d65f1a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat.html#gacc43179721b97d82fefafaf5625350bb">fat_get_fs_free</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of free storage capacity on the filesystem in bytes. <a href="#gacc43179721b97d82fefafaf5625350bb"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>This module implements FAT16/FAT32 read and write access. </p>
<p>The following features are supported:</p>
<ul>
<li>File names up to 31 characters long.</li>
<li>Unlimited depth of subdirectories.</li>
<li>Short 8.3 and long filenames.</li>
<li>Creating and deleting files.</li>
<li>Reading and writing from and to files.</li>
<li>File resizing.</li>
<li>File sizes of up to 4 gigabytes. </li>
</ul>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ga057612824886e115b88bf5affcf76829"></a><!-- doxytag: member="fat.h::fat_close" ref="ga057612824886e115b88bf5affcf76829" args="(struct fat_fs_struct *fs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829">fat_close</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Closes a FAT filesystem. </p>
<p>When this function returns, the given filesystem descriptor will be invalid.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem to close. </td></tr>
</table>
</dd>
</dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a" title="Opens a FAT filesystem.">fat_open</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga2fed74d916370428e3dcf278e7050111"></a><!-- doxytag: member="fat.h::fat_close_dir" ref="ga2fed74d916370428e3dcf278e7050111" args="(struct fat_dir_struct *dd)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111">fat_close_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>dd</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Closes a directory descriptor. </p>
<p>This function destroys a directory descriptor which was previously obtained by calling <a class="el" href="group__fat__dir.html#gac7a5b4ad0b972759a965e1afd5bbc87c" title="Opens a directory.">fat_open_dir()</a>. When this function returns, the given descriptor will be invalid.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dd</td><td>The directory descriptor to close. </td></tr>
</table>
</dd>
</dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c" title="Opens a directory.">fat_open_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga70b082abb4ebc8d4e9956886901b55fc"></a><!-- doxytag: member="fat.h::fat_close_file" ref="ga70b082abb4ebc8d4e9956886901b55fc" args="(struct fat_file_struct *fd)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc">fat_close_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Closes a file. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file handle of the file to close. </td></tr>
</table>
</dd>
</dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4" title="Opens a file on a FAT filesystem.">fat_open_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gaff3b524066c9a937fae32771c80e7603"></a><!-- doxytag: member="fat.h::fat_create_dir" ref="gaff3b524066c9a937fae32771c80e7603" args="(struct fat_dir_struct *parent, const char *dir, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603">fat_create_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>parent</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>dir</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Creates a directory. </p>
<p>Creates a directory and obtains its directory entry. If the directory to create already exists, its directory entry will be returned within the dir_entry parameter.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>The notes which apply to <a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file()</a> also apply to this function.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">parent</td><td>The handle of the parent directory of the new directory. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir</td><td>The name of the directory to create. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>The directory entry to fill for the new directory. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772" title="Deletes a directory.">fat_delete_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga9d17d09125359dfb440fc57eede40b4f"></a><!-- doxytag: member="fat.h::fat_create_file" ref="ga9d17d09125359dfb440fc57eede40b4f" args="(struct fat_dir_struct *parent, const char *file, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f">fat_create_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>parent</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>file</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Creates a file. </p>
<p>Creates a file and obtains the directory entry of the new file. If the file to create already exists, the directory entry of the existing file will be returned within the dir_entry parameter.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>The file name is not checked for invalid characters.</dd>
<dd>
The generation of the short 8.3 file name is quite simple. The first eight characters are used for the filename. The extension, if any, is made up of the first three characters following the last dot within the long filename. If the filename (without the extension) is longer than eight characters, the lower byte of the cluster number replaces the last two characters to avoid name clashes. In any other case, it is your responsibility to avoid name clashes.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">parent</td><td>The handle of the directory in which to create the file. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">file</td><td>The name of the file to create. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>The directory entry to fill for the new (or existing) file. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success, 2 if the file already existed. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c" title="Deletes a file or directory.">fat_delete_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga46055219b942eb8d57ffae9dc6447e7c"></a><!-- doxytag: member="fat.h::fat_delete_file" ref="ga46055219b942eb8d57ffae9dc6447e7c" args="(struct fat_fs_struct *fs, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c">fat_delete_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deletes a file or directory. </p>
<p>If a directory is deleted without first deleting its subdirectories and files, disk space occupied by these files will get wasted as there is no chance to release it and mark it as free.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of the file to delete. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga033743a7d8878712e0add6d57b750525"></a><!-- doxytag: member="fat.h::fat_get_dir_entry_of_path" ref="ga033743a7d8878712e0add6d57b750525" args="(struct fat_fs_struct *fs, const char *path, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga033743a7d8878712e0add6d57b750525">fat_get_dir_entry_of_path</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>path</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Retrieves the directory entry of a path. </p>
<p>The given path may both describe a file or a directory.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The FAT filesystem on which to search. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">path</td><td>The path of which to read the directory entry. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>The directory entry to fill. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534" title="Reads the next directory entry contained within a parent directory.">fat_read_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga24763fd73cbeb580ae5d19e975bde0d8"></a><!-- doxytag: member="fat.h::fat_get_file_modification_date" ref="ga24763fd73cbeb580ae5d19e975bde0d8" args="(const struct fat_dir_entry_struct *dir_entry, uint16_t *year, uint8_t *month, uint8_t *day)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat_get_file_modification_date</a> </td>
<td>(</td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t *&#160;</td>
<td class="paramname"><em>year</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>month</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>day</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the modification date of a file. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of which to return the modification date. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">year</td><td>The year the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">month</td><td>The month the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">day</td><td>The day the file was last modified. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="ga74f840c317556b7dae766e199d87a6ef"></a><!-- doxytag: member="fat.h::fat_get_file_modification_time" ref="ga74f840c317556b7dae766e199d87a6ef" args="(const struct fat_dir_entry_struct *dir_entry, uint8_t *hour, uint8_t *min, uint8_t *sec)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga74f840c317556b7dae766e199d87a6ef">fat_get_file_modification_time</a> </td>
<td>(</td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>hour</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>sec</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the modification time of a file. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of which to return the modification time. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">hour</td><td>The hour the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">min</td><td>The min the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">sec</td><td>The sec the file was last modified. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="gacc43179721b97d82fefafaf5625350bb"></a><!-- doxytag: member="fat.h::fat_get_fs_free" ref="gacc43179721b97d82fefafaf5625350bb" args="(const struct fat_fs_struct *fs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">offset_t <a class="el" href="group__fat.html#gacc43179721b97d82fefafaf5625350bb">fat_get_fs_free</a> </td>
<td>(</td>
<td class="paramtype">const struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the amount of free storage capacity on the filesystem in bytes. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>As the FAT filesystem is cluster based, this function does not return continuous values but multiples of the cluster size.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, the free filesystem space in bytes otherwise. </dd></dl>
</div>
</div>
<a class="anchor" id="gaab7768ca45847d5c4033a91984d65f1a"></a><!-- doxytag: member="fat.h::fat_get_fs_size" ref="gaab7768ca45847d5c4033a91984d65f1a" args="(const struct fat_fs_struct *fs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">offset_t <a class="el" href="group__fat.html#gaab7768ca45847d5c4033a91984d65f1a">fat_get_fs_size</a> </td>
<td>(</td>
<td class="paramtype">const struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the amount of total storage capacity of the filesystem in bytes. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, the filesystem size in bytes otherwise. </dd></dl>
</div>
</div>
<a class="anchor" id="gaba4d2c80ccd8f1aebcecf7072dc37510"></a><!-- doxytag: member="fat.h::fat_move_file" ref="gaba4d2c80ccd8f1aebcecf7072dc37510" args="(struct fat_fs_struct *fs, struct fat_dir_entry_struct *dir_entry, struct fat_dir_struct *parent_new, const char *file_new)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat_move_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>parent_new</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>file_new</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Moves or renames a file. </p>
<p>Changes a file's name, optionally moving it into another directory as well. Before calling this function, the target file name must not exist. Moving a file to a different filesystem (i.e. <em>parent_new</em> doesn't lie on <em>fs</em>) is not supported.</p>
<p>After successfully renaming (and moving) the file, the given directory entry is updated such that it points to the file's new location.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>The notes which apply to <a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file()</a> also apply to this function.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">dir_entry</td><td>The directory entry of the file to move. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">parent_new</td><td>The handle of the new parent directory of the file. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">file_new</td><td>The file's new name. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file</a>, <a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c" title="Deletes a file or directory.">fat_delete_file</a>, <a class="el" href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9" title="Moves or renames a directory.">fat_move_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga5d726bac328b49abc2e6fb022d97092a"></a><!-- doxytag: member="fat.h::fat_open" ref="ga5d726bac328b49abc2e6fb022d97092a" args="(struct partition_struct *partition)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">struct fat_fs_struct* <a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a">fat_open</a> </td>
<td>(</td>
<td class="paramtype">struct <a class="el" href="structpartition__struct.html">partition_struct</a> *&#160;</td>
<td class="paramname"><em>partition</em></td><td>)</td>
<td><code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Opens a FAT filesystem. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">partition</td><td>Discriptor of partition on which the filesystem resides. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on error, a FAT filesystem descriptor on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829" title="Closes a FAT filesystem.">fat_close</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gac7a5b4ad0b972759a965e1afd5bbc87c"></a><!-- doxytag: member="fat.h::fat_open_dir" ref="gac7a5b4ad0b972759a965e1afd5bbc87c" args="(struct fat_fs_struct *fs, const struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">struct fat_dir_struct* <a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat_open_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td><code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Opens a directory. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which the directory to open resides. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry which stands for the directory to open. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>An opaque directory descriptor on success, 0 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111" title="Closes a directory descriptor.">fat_close_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga76a0b06949525b578db04a56d67fbfc4"></a><!-- doxytag: member="fat.h::fat_open_file" ref="ga76a0b06949525b578db04a56d67fbfc4" args="(struct fat_fs_struct *fs, const struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">struct fat_file_struct* <a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4">fat_open_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td><code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Opens a file on a FAT filesystem. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which the file to open lies. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of the file to open. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The file handle, or 0 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc" title="Closes a file.">fat_close_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gab4bc79452dbf5ac2a2f3e1fccafd9534"></a><!-- doxytag: member="fat.h::fat_read_dir" ref="gab4bc79452dbf5ac2a2f3e1fccafd9534" args="(struct fat_dir_struct *dd, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat_read_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>dd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads the next directory entry contained within a parent directory. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dd</td><td>The descriptor of the parent directory from which to read the entry. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>Pointer to a buffer into which to write the directory entry information. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f" title="Resets a directory handle.">fat_reset_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga48e17b173bede64cb08cef05b88fd0ca"></a><!-- doxytag: member="fat.h::fat_read_file" ref="ga48e17b173bede64cb08cef05b88fd0ca" args="(struct fat_file_struct *fd, uint8_t *buffer, uintptr_t buffer_len)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">intptr_t <a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca">fat_read_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>buffer_len</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads data from a file. </p>
<p>The data requested is read from the current file location.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file handle of the file from which to read. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer into which to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer_len</td><td>The amount of data to read. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The number of bytes read, 0 on end of file, or -1 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a" title="Writes data to a file.">fat_write_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga2d74af47cb9fd44f7c974834f810225f"></a><!-- doxytag: member="fat.h::fat_reset_dir" ref="ga2d74af47cb9fd44f7c974834f810225f" args="(struct fat_dir_struct *dd)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f">fat_reset_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>dd</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Resets a directory handle. </p>
<p>Resets the directory handle such that reading restarts with the first directory entry.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dd</td><td>The directory handle to reset. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534" title="Reads the next directory entry contained within a parent directory.">fat_read_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gace4858e7a145684f6c8cd14debe14255"></a><!-- doxytag: member="fat.h::fat_resize_file" ref="gace4858e7a145684f6c8cd14debe14255" args="(struct fat_file_struct *fd, uint32_t size)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gace4858e7a145684f6c8cd14debe14255">fat_resize_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>size</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Resizes a file to have a specific size. </p>
<p>Enlarges or shrinks the file pointed to by the file descriptor to have exactly the specified size.</p>
<p>If the file is truncated, all bytes having an equal or larger offset than the given size are lost. If the file is expanded, the additional bytes are allocated.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>Please be aware that this function just allocates or deallocates disk space, it does not explicitely clear it. To avoid data leakage, this must be done manually.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file decriptor of the file which to resize. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>The new size of the file. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
</div>
</div>
<a class="anchor" id="gad4c305cf004bae9bea48730ed20c87ec"></a><!-- doxytag: member="fat.h::fat_seek_file" ref="gad4c305cf004bae9bea48730ed20c87ec" args="(struct fat_file_struct *fd, int32_t *offset, uint8_t whence)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gad4c305cf004bae9bea48730ed20c87ec">fat_seek_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int32_t *&#160;</td>
<td class="paramname"><em>offset</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>whence</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Repositions the read/write file offset. </p>
<p>Changes the file offset where the next call to <a class="el" href="group__fat__file.html#ga48e17b173bede64cb08cef05b88fd0ca" title="Reads data from a file.">fat_read_file()</a> or <a class="el" href="group__fat__file.html#ga6782ff80eb6fba9b6ed1a66f33dae60a" title="Writes data to a file.">fat_write_file()</a> starts reading/writing.</p>
<p>If the new offset is beyond the end of the file, <a class="el" href="group__fat__file.html#gace4858e7a145684f6c8cd14debe14255" title="Resizes a file to have a specific size.">fat_resize_file()</a> is implicitly called, i.e. the file is expanded.</p>
<p>The new offset can be given in different ways determined by the <code>whence</code> parameter:</p>
<ul>
<li><b>FAT_SEEK_SET:</b> <code>*offset</code> is relative to the beginning of the file.</li>
<li><b>FAT_SEEK_CUR:</b> <code>*offset</code> is relative to the current file position.</li>
<li><b>FAT_SEEK_END:</b> <code>*offset</code> is relative to the end of the file.</li>
</ul>
<p>The resulting absolute offset is written to the location the <code>offset</code> parameter points to.</p>
<p>Calling this function can also be used to retrieve the current file position: </p>
<div class="fragment"><pre class="fragment"> int32_t file_pos = 0;
<span class="keywordflow">if</span>(!<a class="code" href="group__fat__file.html#gad4c305cf004bae9bea48730ed20c87ec" title="Repositions the read/write file offset.">fat_seek_file</a>(fd, &amp;file_pos, <a class="code" href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2" title="The given offset is relative to the current read/write position.">FAT_SEEK_CUR</a>))
{
<span class="comment">// error</span>
}
<span class="comment">// file_pos now contains the absolute file position</span>
</pre></div><dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file decriptor of the file on which to seek. </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">offset</td><td>A pointer to the new offset, as affected by the <code>whence</code> parameter. The function writes the new absolute offset to this location before it returns. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">whence</td><td>Affects the way <code>offset</code> is interpreted, see above. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
</div>
</div>
<a class="anchor" id="ga6782ff80eb6fba9b6ed1a66f33dae60a"></a><!-- doxytag: member="fat.h::fat_write_file" ref="ga6782ff80eb6fba9b6ed1a66f33dae60a" args="(struct fat_file_struct *fd, const uint8_t *buffer, uintptr_t buffer_len)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">intptr_t <a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat_write_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>buffer_len</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Writes data to a file. </p>
<p>The data is written to the current file location.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file handle of the file to which to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer from which to read the data to be written. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer_len</td><td>The amount of data to write. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The number of bytes written (0 or something less than <code>buffer_len</code> on disk full) or -1 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca" title="Reads data from a file.">fat_read_file</a> </dd></dl>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,242 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: FAT configuration</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">FAT configuration</div> </div>
<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a></div></div><!--header-->
<div class="contents">
<p>Preprocessor defines to configure the FAT implementation.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#gace70b11f85eb1b4e15220a65e9bd047d">FAT_WRITE_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT write support. <a href="#gace70b11f85eb1b4e15220a65e9bd047d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga37b51677b33d2e74bec670f52c201a51">FAT_LFN_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT long filename (LFN) support. <a href="#ga37b51677b33d2e74bec670f52c201a51"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga80fa068db7d09fb267b36741d773eadf">FAT_DATETIME_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT date and time support. <a href="#ga80fa068db7d09fb267b36741d773eadf"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga73fdc6edf277eee1551985c3eb9602a3">FAT_FAT32_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls FAT32 support. <a href="#ga73fdc6edf277eee1551985c3eb9602a3"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga13f632eadee5b7d768b14bf279e843fd">FAT_DELAY_DIRENTRY_UPDATE</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls updates of directory entries. <a href="#ga13f632eadee5b7d768b14bf279e843fd"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#gafeacb265671562dc1c4a863991163bb4">fat_get_datetime</a>(year, month, day, hour, min, sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines the function used for retrieving current date and time. <a href="#gafeacb265671562dc1c4a863991163bb4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3d9b70f2a51fd6413f30f6a17e4480bd"></a><!-- doxytag: member="fat_config::FAT_FS_COUNT" ref="ga3d9b70f2a51fd6413f30f6a17e4480bd" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga3d9b70f2a51fd6413f30f6a17e4480bd">FAT_FS_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of filesystem handles. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gae165b9e014e6213eb4429ebda300b6e8"></a><!-- doxytag: member="fat_config::FAT_FILE_COUNT" ref="gae165b9e014e6213eb4429ebda300b6e8" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#gae165b9e014e6213eb4429ebda300b6e8">FAT_FILE_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of file handles. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga8309de7e60311102cb90f9bca6b7d2f8"></a><!-- doxytag: member="fat_config::FAT_DIR_COUNT" ref="ga8309de7e60311102cb90f9bca6b7d2f8" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__config.html#ga8309de7e60311102cb90f9bca6b7d2f8">FAT_DIR_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of directory handles. <br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Preprocessor defines to configure the FAT implementation. </p>
<hr/><h2>Define Documentation</h2>
<a class="anchor" id="ga80fa068db7d09fb267b36741d773eadf"></a><!-- doxytag: member="fat_config.h::FAT_DATETIME_SUPPORT" ref="ga80fa068db7d09fb267b36741d773eadf" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__config.html#ga80fa068db7d09fb267b36741d773eadf">FAT_DATETIME_SUPPORT</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls FAT date and time support. </p>
<p>Set to 1 to enable FAT date and time stamping support. </p>
</div>
</div>
<a class="anchor" id="ga13f632eadee5b7d768b14bf279e843fd"></a><!-- doxytag: member="fat_config.h::FAT_DELAY_DIRENTRY_UPDATE" ref="ga13f632eadee5b7d768b14bf279e843fd" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__config.html#ga13f632eadee5b7d768b14bf279e843fd">FAT_DELAY_DIRENTRY_UPDATE</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls updates of directory entries. </p>
<p>Set to 1 to delay directory entry updates until the file is closed. This can boost performance significantly, but may cause data loss if the file is not properly closed. </p>
</div>
</div>
<a class="anchor" id="ga73fdc6edf277eee1551985c3eb9602a3"></a><!-- doxytag: member="fat_config.h::FAT_FAT32_SUPPORT" ref="ga73fdc6edf277eee1551985c3eb9602a3" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__config.html#ga73fdc6edf277eee1551985c3eb9602a3">FAT_FAT32_SUPPORT</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls FAT32 support. </p>
<p>Set to 1 to enable FAT32 support. </p>
</div>
</div>
<a class="anchor" id="gafeacb265671562dc1c4a863991163bb4"></a><!-- doxytag: member="fat_config.h::fat_get_datetime" ref="gafeacb265671562dc1c4a863991163bb4" args="(year, month, day, hour, min, sec)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__config.html#gafeacb265671562dc1c4a863991163bb4">fat_get_datetime</a></td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">year, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">month, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">day, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">hour, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">min, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">sec&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Determines the function used for retrieving current date and time. </p>
<p>Define this to the function call which shall be used to retrieve current date and time.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>Used only when FAT_DATETIME_SUPPORT is 1.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">year</td><td>Pointer to a <code>uint16_t</code> which receives the current year. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">month</td><td>Pointer to a <code>uint8_t</code> which receives the current month. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">day</td><td>Pointer to a <code>uint8_t</code> which receives the current day. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">hour</td><td>Pointer to a <code>uint8_t</code> which receives the current hour. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">min</td><td>Pointer to a <code>uint8_t</code> which receives the current minute. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">sec</td><td>Pointer to a <code>uint8_t</code> which receives the current sec. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="ga37b51677b33d2e74bec670f52c201a51"></a><!-- doxytag: member="fat_config.h::FAT_LFN_SUPPORT" ref="ga37b51677b33d2e74bec670f52c201a51" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__config.html#ga37b51677b33d2e74bec670f52c201a51">FAT_LFN_SUPPORT</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls FAT long filename (LFN) support. </p>
<p>Set to 1 to enable LFN support, set to 0 to disable it. </p>
</div>
</div>
<a class="anchor" id="gace70b11f85eb1b4e15220a65e9bd047d"></a><!-- doxytag: member="fat_config.h::FAT_WRITE_SUPPORT" ref="gace70b11f85eb1b4e15220a65e9bd047d" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__config.html#gace70b11f85eb1b4e15220a65e9bd047d">FAT_WRITE_SUPPORT</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls FAT write support. </p>
<p>Set to 1 to enable FAT write support, set to 0 to disable it. </p>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,359 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: FAT directory functions</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">FAT directory functions</div> </div>
<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a></div></div><!--header-->
<div class="contents">
<p>Functions for managing directories.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_dir_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat_open_dir</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a directory. <a href="#gac7a5b4ad0b972759a965e1afd5bbc87c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#ga2fed74d916370428e3dcf278e7050111">fat_close_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a directory descriptor. <a href="#ga2fed74d916370428e3dcf278e7050111"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat_read_dir</a> (struct fat_dir_struct *dd, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads the next directory entry contained within a parent directory. <a href="#gab4bc79452dbf5ac2a2f3e1fccafd9534"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#ga2d74af47cb9fd44f7c974834f810225f">fat_reset_dir</a> (struct fat_dir_struct *dd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resets a directory handle. <a href="#ga2d74af47cb9fd44f7c974834f810225f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gaff3b524066c9a937fae32771c80e7603">fat_create_dir</a> (struct fat_dir_struct *parent, const char *dir, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a directory. <a href="#gaff3b524066c9a937fae32771c80e7603"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772">fat_delete_dir</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a directory. <a href="#gac0b6889e84a48b2d69fd681e5ac2e772"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9">fat_move_dir</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, struct fat_dir_struct *parent_new, const char *dir_new)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves or renames a directory. <a href="#ga8c448f10b372823ce01b39fefb0679b9"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Functions for managing directories. </p>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ga2fed74d916370428e3dcf278e7050111"></a><!-- doxytag: member="fat.c::fat_close_dir" ref="ga2fed74d916370428e3dcf278e7050111" args="(struct fat_dir_struct *dd)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111">fat_close_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>dd</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Closes a directory descriptor. </p>
<p>This function destroys a directory descriptor which was previously obtained by calling <a class="el" href="group__fat__dir.html#gac7a5b4ad0b972759a965e1afd5bbc87c" title="Opens a directory.">fat_open_dir()</a>. When this function returns, the given descriptor will be invalid.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dd</td><td>The directory descriptor to close. </td></tr>
</table>
</dd>
</dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c" title="Opens a directory.">fat_open_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gaff3b524066c9a937fae32771c80e7603"></a><!-- doxytag: member="fat.c::fat_create_dir" ref="gaff3b524066c9a937fae32771c80e7603" args="(struct fat_dir_struct *parent, const char *dir, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603">fat_create_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>parent</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>dir</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Creates a directory. </p>
<p>Creates a directory and obtains its directory entry. If the directory to create already exists, its directory entry will be returned within the dir_entry parameter.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>The notes which apply to <a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file()</a> also apply to this function.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">parent</td><td>The handle of the parent directory of the new directory. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir</td><td>The name of the directory to create. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>The directory entry to fill for the new directory. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772" title="Deletes a directory.">fat_delete_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gac0b6889e84a48b2d69fd681e5ac2e772"></a><!-- doxytag: member="fat.c::fat_delete_dir" ref="gac0b6889e84a48b2d69fd681e5ac2e772" args="(struct fat_fs_struct *fs, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772">fat_delete_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deletes a directory. </p>
<p>This is just a synonym for <a class="el" href="group__fat__file.html#ga46055219b942eb8d57ffae9dc6447e7c" title="Deletes a file or directory.">fat_delete_file()</a>. If a directory is deleted without first deleting its subdirectories and files, disk space occupied by these files will get wasted as there is no chance to release it and mark it as free.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of the directory to delete. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603" title="Creates a directory.">fat_create_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga8c448f10b372823ce01b39fefb0679b9"></a><!-- doxytag: member="fat.c::fat_move_dir" ref="ga8c448f10b372823ce01b39fefb0679b9" args="(struct fat_fs_struct *fs, struct fat_dir_entry_struct *dir_entry, struct fat_dir_struct *parent_new, const char *dir_new)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9">fat_move_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>parent_new</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>dir_new</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Moves or renames a directory. </p>
<p>This is just a synonym for <a class="el" href="group__fat__file.html#gaba4d2c80ccd8f1aebcecf7072dc37510" title="Moves or renames a file.">fat_move_file()</a>.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">dir_entry</td><td>The directory entry of the directory to move. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">parent_new</td><td>The handle of the new parent directory. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_new</td><td>The directory's new name. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gaff3b524066c9a937fae32771c80e7603" title="Creates a directory.">fat_create_dir</a>, <a class="el" href="group__fat__dir.html#gac0b6889e84a48b2d69fd681e5ac2e772" title="Deletes a directory.">fat_delete_dir</a>, <a class="el" href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510" title="Moves or renames a file.">fat_move_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gac7a5b4ad0b972759a965e1afd5bbc87c"></a><!-- doxytag: member="fat.c::fat_open_dir" ref="gac7a5b4ad0b972759a965e1afd5bbc87c" args="(struct fat_fs_struct *fs, const struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">struct fat_dir_struct* <a class="el" href="group__fat.html#gac7a5b4ad0b972759a965e1afd5bbc87c">fat_open_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td><code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Opens a directory. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which the directory to open resides. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry which stands for the directory to open. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>An opaque directory descriptor on success, 0 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga2fed74d916370428e3dcf278e7050111" title="Closes a directory descriptor.">fat_close_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gab4bc79452dbf5ac2a2f3e1fccafd9534"></a><!-- doxytag: member="fat.c::fat_read_dir" ref="gab4bc79452dbf5ac2a2f3e1fccafd9534" args="(struct fat_dir_struct *dd, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534">fat_read_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>dd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads the next directory entry contained within a parent directory. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dd</td><td>The descriptor of the parent directory from which to read the entry. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>Pointer to a buffer into which to write the directory entry information. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f" title="Resets a directory handle.">fat_reset_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga2d74af47cb9fd44f7c974834f810225f"></a><!-- doxytag: member="fat.c::fat_reset_dir" ref="ga2d74af47cb9fd44f7c974834f810225f" args="(struct fat_dir_struct *dd)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga2d74af47cb9fd44f7c974834f810225f">fat_reset_dir</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>dd</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Resets a directory handle. </p>
<p>Resets the directory handle such that reading restarts with the first directory entry.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dd</td><td>The directory handle to reset. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534" title="Reads the next directory entry contained within a parent directory.">fat_read_dir</a> </dd></dl>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,910 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: FAT file functions</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">FAT file functions</div> </div>
<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a></div></div><!--header-->
<div class="contents">
<p>Functions for managing files.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes a directory entry. <a href="structfat__dir__entry__struct.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gac404d1380dbf00e8a1d6145e035ef10b">FAT_ATTRIB_READONLY</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is read-only. <a href="#gac404d1380dbf00e8a1d6145e035ef10b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gaaf88f01d19ef4ca777c9c683f458f45f">FAT_ATTRIB_HIDDEN</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is hidden. <a href="#gaaf88f01d19ef4ca777c9c683f458f45f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gae5aa3610233e87e4ca36b2afe3c3854c">FAT_ATTRIB_SYSTEM</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is a system file. <a href="#gae5aa3610233e87e4ca36b2afe3c3854c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga86f9c93dd409d11813361d48517ccbce">FAT_ATTRIB_VOLUME</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is empty and has the volume label as its name. <a href="#ga86f9c93dd409d11813361d48517ccbce"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gacd38dccfabf884611c62aebc90e5adc7">FAT_ATTRIB_DIR</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file is a directory. <a href="#gacd38dccfabf884611c62aebc90e5adc7"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga18ef7ecd9adce93d49a571882e145c99">FAT_ATTRIB_ARCHIVE</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file has to be archived. <a href="#ga18ef7ecd9adce93d49a571882e145c99"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gab870215439192f82ed358e2c7e94ba09">FAT_SEEK_SET</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The given offset is relative to the beginning of the file. <a href="#gab870215439192f82ed358e2c7e94ba09"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2">FAT_SEEK_CUR</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The given offset is relative to the current read/write position. <a href="#gadba54c574b9a738c8b766ea3b40eeef2"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gab34d95851ea8b28646ce25c0e0039bc2">FAT_SEEK_END</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The given offset is relative to the end of the file. <a href="#gab34d95851ea8b28646ce25c0e0039bc2"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga033743a7d8878712e0add6d57b750525">fat_get_dir_entry_of_path</a> (struct fat_fs_struct *fs, const char *path, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves the directory entry of a path. <a href="#ga033743a7d8878712e0add6d57b750525"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_file_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga76a0b06949525b578db04a56d67fbfc4">fat_open_file</a> (struct fat_fs_struct *fs, const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a file on a FAT filesystem. <a href="#ga76a0b06949525b578db04a56d67fbfc4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga70b082abb4ebc8d4e9956886901b55fc">fat_close_file</a> (struct fat_file_struct *fd)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a file. <a href="#ga70b082abb4ebc8d4e9956886901b55fc"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga48e17b173bede64cb08cef05b88fd0ca">fat_read_file</a> (struct fat_file_struct *fd, uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads data from a file. <a href="#ga48e17b173bede64cb08cef05b88fd0ca"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat_write_file</a> (struct fat_file_struct *fd, const uint8_t *buffer, uintptr_t buffer_len)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes data to a file. <a href="#ga6782ff80eb6fba9b6ed1a66f33dae60a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gad4c305cf004bae9bea48730ed20c87ec">fat_seek_file</a> (struct fat_file_struct *fd, int32_t *offset, uint8_t whence)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Repositions the read/write file offset. <a href="#gad4c305cf004bae9bea48730ed20c87ec"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gace4858e7a145684f6c8cd14debe14255">fat_resize_file</a> (struct fat_file_struct *fd, uint32_t size)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes a file to have a specific size. <a href="#gace4858e7a145684f6c8cd14debe14255"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f">fat_create_file</a> (struct fat_dir_struct *parent, const char *file, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a file. <a href="#ga9d17d09125359dfb440fc57eede40b4f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga46055219b942eb8d57ffae9dc6447e7c">fat_delete_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a file or directory. <a href="#ga46055219b942eb8d57ffae9dc6447e7c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat_move_file</a> (struct fat_fs_struct *fs, struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, struct fat_dir_struct *parent_new, const char *file_new)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves or renames a file. <a href="#gaba4d2c80ccd8f1aebcecf7072dc37510"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat_get_file_modification_date</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint16_t *year, uint8_t *month, uint8_t *day)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification date of a file. <a href="#ga24763fd73cbeb580ae5d19e975bde0d8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga74f840c317556b7dae766e199d87a6ef">fat_get_file_modification_time</a> (const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint8_t *hour, uint8_t *min, uint8_t *sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the modification time of a file. <a href="#ga74f840c317556b7dae766e199d87a6ef"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#ga02c969e994a556534c92906db5bb04fd">fat_set_file_modification_date</a> (struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint16_t year, uint8_t month, uint8_t day)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the modification time of a date. <a href="#ga02c969e994a556534c92906db5bb04fd"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__file.html#gab514f14ce35a38bff3f16270dfdc033b">fat_set_file_modification_time</a> (struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *dir_entry, uint8_t hour, uint8_t min, uint8_t sec)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the modification time of a file. <a href="#gab514f14ce35a38bff3f16270dfdc033b"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Functions for managing files. </p>
<hr/><h2>Define Documentation</h2>
<a class="anchor" id="ga18ef7ecd9adce93d49a571882e145c99"></a><!-- doxytag: member="fat.h::FAT_ATTRIB_ARCHIVE" ref="ga18ef7ecd9adce93d49a571882e145c99" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#ga18ef7ecd9adce93d49a571882e145c99">FAT_ATTRIB_ARCHIVE</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file has to be archived. </p>
</div>
</div>
<a class="anchor" id="gacd38dccfabf884611c62aebc90e5adc7"></a><!-- doxytag: member="fat.h::FAT_ATTRIB_DIR" ref="gacd38dccfabf884611c62aebc90e5adc7" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#gacd38dccfabf884611c62aebc90e5adc7">FAT_ATTRIB_DIR</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file is a directory. </p>
</div>
</div>
<a class="anchor" id="gaaf88f01d19ef4ca777c9c683f458f45f"></a><!-- doxytag: member="fat.h::FAT_ATTRIB_HIDDEN" ref="gaaf88f01d19ef4ca777c9c683f458f45f" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#gaaf88f01d19ef4ca777c9c683f458f45f">FAT_ATTRIB_HIDDEN</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file is hidden. </p>
</div>
</div>
<a class="anchor" id="gac404d1380dbf00e8a1d6145e035ef10b"></a><!-- doxytag: member="fat.h::FAT_ATTRIB_READONLY" ref="gac404d1380dbf00e8a1d6145e035ef10b" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#gac404d1380dbf00e8a1d6145e035ef10b">FAT_ATTRIB_READONLY</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file is read-only. </p>
</div>
</div>
<a class="anchor" id="gae5aa3610233e87e4ca36b2afe3c3854c"></a><!-- doxytag: member="fat.h::FAT_ATTRIB_SYSTEM" ref="gae5aa3610233e87e4ca36b2afe3c3854c" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#gae5aa3610233e87e4ca36b2afe3c3854c">FAT_ATTRIB_SYSTEM</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file is a system file. </p>
</div>
</div>
<a class="anchor" id="ga86f9c93dd409d11813361d48517ccbce"></a><!-- doxytag: member="fat.h::FAT_ATTRIB_VOLUME" ref="ga86f9c93dd409d11813361d48517ccbce" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#ga86f9c93dd409d11813361d48517ccbce">FAT_ATTRIB_VOLUME</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file is empty and has the volume label as its name. </p>
</div>
</div>
<a class="anchor" id="gadba54c574b9a738c8b766ea3b40eeef2"></a><!-- doxytag: member="fat.h::FAT_SEEK_CUR" ref="gadba54c574b9a738c8b766ea3b40eeef2" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2">FAT_SEEK_CUR</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The given offset is relative to the current read/write position. </p>
</div>
</div>
<a class="anchor" id="gab34d95851ea8b28646ce25c0e0039bc2"></a><!-- doxytag: member="fat.h::FAT_SEEK_END" ref="gab34d95851ea8b28646ce25c0e0039bc2" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#gab34d95851ea8b28646ce25c0e0039bc2">FAT_SEEK_END</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The given offset is relative to the end of the file. </p>
</div>
</div>
<a class="anchor" id="gab870215439192f82ed358e2c7e94ba09"></a><!-- doxytag: member="fat.h::FAT_SEEK_SET" ref="gab870215439192f82ed358e2c7e94ba09" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__fat__file.html#gab870215439192f82ed358e2c7e94ba09">FAT_SEEK_SET</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The given offset is relative to the beginning of the file. </p>
</div>
</div>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ga70b082abb4ebc8d4e9956886901b55fc"></a><!-- doxytag: member="fat.c::fat_close_file" ref="ga70b082abb4ebc8d4e9956886901b55fc" args="(struct fat_file_struct *fd)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc">fat_close_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Closes a file. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file handle of the file to close. </td></tr>
</table>
</dd>
</dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4" title="Opens a file on a FAT filesystem.">fat_open_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga9d17d09125359dfb440fc57eede40b4f"></a><!-- doxytag: member="fat.c::fat_create_file" ref="ga9d17d09125359dfb440fc57eede40b4f" args="(struct fat_dir_struct *parent, const char *file, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f">fat_create_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>parent</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>file</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Creates a file. </p>
<p>Creates a file and obtains the directory entry of the new file. If the file to create already exists, the directory entry of the existing file will be returned within the dir_entry parameter.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>The file name is not checked for invalid characters.</dd>
<dd>
The generation of the short 8.3 file name is quite simple. The first eight characters are used for the filename. The extension, if any, is made up of the first three characters following the last dot within the long filename. If the filename (without the extension) is longer than eight characters, the lower byte of the cluster number replaces the last two characters to avoid name clashes. In any other case, it is your responsibility to avoid name clashes.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">parent</td><td>The handle of the directory in which to create the file. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">file</td><td>The name of the file to create. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>The directory entry to fill for the new (or existing) file. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success, 2 if the file already existed. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c" title="Deletes a file or directory.">fat_delete_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga46055219b942eb8d57ffae9dc6447e7c"></a><!-- doxytag: member="fat.c::fat_delete_file" ref="ga46055219b942eb8d57ffae9dc6447e7c" args="(struct fat_fs_struct *fs, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c">fat_delete_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deletes a file or directory. </p>
<p>If a directory is deleted without first deleting its subdirectories and files, disk space occupied by these files will get wasted as there is no chance to release it and mark it as free.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of the file to delete. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga033743a7d8878712e0add6d57b750525"></a><!-- doxytag: member="fat.c::fat_get_dir_entry_of_path" ref="ga033743a7d8878712e0add6d57b750525" args="(struct fat_fs_struct *fs, const char *path, struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#ga033743a7d8878712e0add6d57b750525">fat_get_dir_entry_of_path</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>path</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Retrieves the directory entry of a path. </p>
<p>The given path may both describe a file or a directory.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The FAT filesystem on which to search. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">path</td><td>The path of which to read the directory entry. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">dir_entry</td><td>The directory entry to fill. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#gab4bc79452dbf5ac2a2f3e1fccafd9534" title="Reads the next directory entry contained within a parent directory.">fat_read_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga24763fd73cbeb580ae5d19e975bde0d8"></a><!-- doxytag: member="fat.c::fat_get_file_modification_date" ref="ga24763fd73cbeb580ae5d19e975bde0d8" args="(const struct fat_dir_entry_struct *dir_entry, uint16_t *year, uint8_t *month, uint8_t *day)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga24763fd73cbeb580ae5d19e975bde0d8">fat_get_file_modification_date</a> </td>
<td>(</td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t *&#160;</td>
<td class="paramname"><em>year</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>month</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>day</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the modification date of a file. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of which to return the modification date. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">year</td><td>The year the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">month</td><td>The month the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">day</td><td>The day the file was last modified. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="ga74f840c317556b7dae766e199d87a6ef"></a><!-- doxytag: member="fat.c::fat_get_file_modification_time" ref="ga74f840c317556b7dae766e199d87a6ef" args="(const struct fat_dir_entry_struct *dir_entry, uint8_t *hour, uint8_t *min, uint8_t *sec)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga74f840c317556b7dae766e199d87a6ef">fat_get_file_modification_time</a> </td>
<td>(</td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>hour</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>sec</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the modification time of a file. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of which to return the modification time. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">hour</td><td>The hour the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">min</td><td>The min the file was last modified. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">sec</td><td>The sec the file was last modified. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="gaba4d2c80ccd8f1aebcecf7072dc37510"></a><!-- doxytag: member="fat.c::fat_move_file" ref="gaba4d2c80ccd8f1aebcecf7072dc37510" args="(struct fat_fs_struct *fs, struct fat_dir_entry_struct *dir_entry, struct fat_dir_struct *parent_new, const char *file_new)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gaba4d2c80ccd8f1aebcecf7072dc37510">fat_move_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">struct fat_dir_struct *&#160;</td>
<td class="paramname"><em>parent_new</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>file_new</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Moves or renames a file. </p>
<p>Changes a file's name, optionally moving it into another directory as well. Before calling this function, the target file name must not exist. Moving a file to a different filesystem (i.e. <em>parent_new</em> doesn't lie on <em>fs</em>) is not supported.</p>
<p>After successfully renaming (and moving) the file, the given directory entry is updated such that it points to the file's new location.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>The notes which apply to <a class="el" href="group__fat__file.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file()</a> also apply to this function.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">dir_entry</td><td>The directory entry of the file to move. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">parent_new</td><td>The handle of the new parent directory of the file. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">file_new</td><td>The file's new name. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga9d17d09125359dfb440fc57eede40b4f" title="Creates a file.">fat_create_file</a>, <a class="el" href="group__fat.html#ga46055219b942eb8d57ffae9dc6447e7c" title="Deletes a file or directory.">fat_delete_file</a>, <a class="el" href="group__fat__dir.html#ga8c448f10b372823ce01b39fefb0679b9" title="Moves or renames a directory.">fat_move_dir</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga76a0b06949525b578db04a56d67fbfc4"></a><!-- doxytag: member="fat.c::fat_open_file" ref="ga76a0b06949525b578db04a56d67fbfc4" args="(struct fat_fs_struct *fs, const struct fat_dir_entry_struct *dir_entry)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">struct fat_file_struct* <a class="el" href="group__fat.html#ga76a0b06949525b578db04a56d67fbfc4">fat_open_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td><code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Opens a file on a FAT filesystem. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which the file to open lies. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry of the file to open. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The file handle, or 0 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga70b082abb4ebc8d4e9956886901b55fc" title="Closes a file.">fat_close_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga48e17b173bede64cb08cef05b88fd0ca"></a><!-- doxytag: member="fat.c::fat_read_file" ref="ga48e17b173bede64cb08cef05b88fd0ca" args="(struct fat_file_struct *fd, uint8_t *buffer, uintptr_t buffer_len)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">intptr_t <a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca">fat_read_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>buffer_len</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads data from a file. </p>
<p>The data requested is read from the current file location.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file handle of the file from which to read. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer into which to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer_len</td><td>The amount of data to read. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The number of bytes read, 0 on end of file, or -1 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a" title="Writes data to a file.">fat_write_file</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gace4858e7a145684f6c8cd14debe14255"></a><!-- doxytag: member="fat.c::fat_resize_file" ref="gace4858e7a145684f6c8cd14debe14255" args="(struct fat_file_struct *fd, uint32_t size)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gace4858e7a145684f6c8cd14debe14255">fat_resize_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>size</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Resizes a file to have a specific size. </p>
<p>Enlarges or shrinks the file pointed to by the file descriptor to have exactly the specified size.</p>
<p>If the file is truncated, all bytes having an equal or larger offset than the given size are lost. If the file is expanded, the additional bytes are allocated.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>Please be aware that this function just allocates or deallocates disk space, it does not explicitely clear it. To avoid data leakage, this must be done manually.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file decriptor of the file which to resize. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>The new size of the file. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
</div>
</div>
<a class="anchor" id="gad4c305cf004bae9bea48730ed20c87ec"></a><!-- doxytag: member="fat.c::fat_seek_file" ref="gad4c305cf004bae9bea48730ed20c87ec" args="(struct fat_file_struct *fd, int32_t *offset, uint8_t whence)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__fat.html#gad4c305cf004bae9bea48730ed20c87ec">fat_seek_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int32_t *&#160;</td>
<td class="paramname"><em>offset</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>whence</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Repositions the read/write file offset. </p>
<p>Changes the file offset where the next call to <a class="el" href="group__fat__file.html#ga48e17b173bede64cb08cef05b88fd0ca" title="Reads data from a file.">fat_read_file()</a> or <a class="el" href="group__fat__file.html#ga6782ff80eb6fba9b6ed1a66f33dae60a" title="Writes data to a file.">fat_write_file()</a> starts reading/writing.</p>
<p>If the new offset is beyond the end of the file, <a class="el" href="group__fat__file.html#gace4858e7a145684f6c8cd14debe14255" title="Resizes a file to have a specific size.">fat_resize_file()</a> is implicitly called, i.e. the file is expanded.</p>
<p>The new offset can be given in different ways determined by the <code>whence</code> parameter:</p>
<ul>
<li><b>FAT_SEEK_SET:</b> <code>*offset</code> is relative to the beginning of the file.</li>
<li><b>FAT_SEEK_CUR:</b> <code>*offset</code> is relative to the current file position.</li>
<li><b>FAT_SEEK_END:</b> <code>*offset</code> is relative to the end of the file.</li>
</ul>
<p>The resulting absolute offset is written to the location the <code>offset</code> parameter points to.</p>
<p>Calling this function can also be used to retrieve the current file position: </p>
<div class="fragment"><pre class="fragment"> int32_t file_pos = 0;
<span class="keywordflow">if</span>(!<a class="code" href="group__fat__file.html#gad4c305cf004bae9bea48730ed20c87ec" title="Repositions the read/write file offset.">fat_seek_file</a>(fd, &amp;file_pos, <a class="code" href="group__fat__file.html#gadba54c574b9a738c8b766ea3b40eeef2" title="The given offset is relative to the current read/write position.">FAT_SEEK_CUR</a>))
{
<span class="comment">// error</span>
}
<span class="comment">// file_pos now contains the absolute file position</span>
</pre></div><dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file decriptor of the file on which to seek. </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">offset</td><td>A pointer to the new offset, as affected by the <code>whence</code> parameter. The function writes the new absolute offset to this location before it returns. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">whence</td><td>Affects the way <code>offset</code> is interpreted, see above. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
</div>
</div>
<a class="anchor" id="ga02c969e994a556534c92906db5bb04fd"></a><!-- doxytag: member="fat.c::fat_set_file_modification_date" ref="ga02c969e994a556534c92906db5bb04fd" args="(struct fat_dir_entry_struct *dir_entry, uint16_t year, uint8_t month, uint8_t day)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat__file.html#ga02c969e994a556534c92906db5bb04fd">fat_set_file_modification_date</a> </td>
<td>(</td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t&#160;</td>
<td class="paramname"><em>year</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>month</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>day</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Sets the modification time of a date. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry for which to set the modification date. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">year</td><td>The year the file was last modified. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">month</td><td>The month the file was last modified. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">day</td><td>The day the file was last modified. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="gab514f14ce35a38bff3f16270dfdc033b"></a><!-- doxytag: member="fat.c::fat_set_file_modification_time" ref="gab514f14ce35a38bff3f16270dfdc033b" args="(struct fat_dir_entry_struct *dir_entry, uint8_t hour, uint8_t min, uint8_t sec)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat__file.html#gab514f14ce35a38bff3f16270dfdc033b">fat_set_file_modification_time</a> </td>
<td>(</td>
<td class="paramtype">struct <a class="el" href="structfat__dir__entry__struct.html">fat_dir_entry_struct</a> *&#160;</td>
<td class="paramname"><em>dir_entry</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>hour</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>sec</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Sets the modification time of a file. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dir_entry</td><td>The directory entry for which to set the modification time. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">hour</td><td>The year the file was last modified. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">min</td><td>The month the file was last modified. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">sec</td><td>The day the file was last modified. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="ga6782ff80eb6fba9b6ed1a66f33dae60a"></a><!-- doxytag: member="fat.c::fat_write_file" ref="ga6782ff80eb6fba9b6ed1a66f33dae60a" args="(struct fat_file_struct *fd, const uint8_t *buffer, uintptr_t buffer_len)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">intptr_t <a class="el" href="group__fat.html#ga6782ff80eb6fba9b6ed1a66f33dae60a">fat_write_file</a> </td>
<td>(</td>
<td class="paramtype">struct fat_file_struct *&#160;</td>
<td class="paramname"><em>fd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>buffer_len</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Writes data to a file. </p>
<p>The data is written to the current file location.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fd</td><td>The file handle of the file to which to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer from which to read the data to be written. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer_len</td><td>The amount of data to write. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The number of bytes written (0 or something less than <code>buffer_len</code> on disk full) or -1 on failure. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga48e17b173bede64cb08cef05b88fd0ca" title="Reads data from a file.">fat_read_file</a> </dd></dl>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,193 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: FAT access</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">FAT access</div> </div>
<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a></div></div><!--header-->
<div class="contents">
<p>Basic functions for handling a FAT filesystem.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct fat_fs_struct *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#ga5d726bac328b49abc2e6fb022d97092a">fat_open</a> (struct <a class="el" href="structpartition__struct.html">partition_struct</a> *partition)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a FAT filesystem. <a href="#ga5d726bac328b49abc2e6fb022d97092a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#ga057612824886e115b88bf5affcf76829">fat_close</a> (struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a FAT filesystem. <a href="#ga057612824886e115b88bf5affcf76829"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#gaab7768ca45847d5c4033a91984d65f1a">fat_get_fs_size</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of total storage capacity of the filesystem in bytes. <a href="#gaab7768ca45847d5c4033a91984d65f1a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#gacc43179721b97d82fefafaf5625350bb">fat_get_fs_free</a> (const struct fat_fs_struct *fs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the amount of free storage capacity on the filesystem in bytes. <a href="#gacc43179721b97d82fefafaf5625350bb"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gafee6ea130655af67845e1cebe9a96bfc"></a><!-- doxytag: member="fat_fs::fat_get_fs_free_32_callback" ref="gafee6ea130655af67845e1cebe9a96bfc" args="(uint8_t *buffer, offset_t offset, void *p)" -->
uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__fat__fs.html#gafee6ea130655af67845e1cebe9a96bfc">fat_get_fs_free_32_callback</a> (uint8_t *buffer, offset_t offset, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function used for counting free clusters in a FAT32. <br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Basic functions for handling a FAT filesystem. </p>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ga057612824886e115b88bf5affcf76829"></a><!-- doxytag: member="fat.c::fat_close" ref="ga057612824886e115b88bf5affcf76829" args="(struct fat_fs_struct *fs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829">fat_close</a> </td>
<td>(</td>
<td class="paramtype">struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Closes a FAT filesystem. </p>
<p>When this function returns, the given filesystem descriptor will be invalid.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem to close. </td></tr>
</table>
</dd>
</dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a" title="Opens a FAT filesystem.">fat_open</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gacc43179721b97d82fefafaf5625350bb"></a><!-- doxytag: member="fat.c::fat_get_fs_free" ref="gacc43179721b97d82fefafaf5625350bb" args="(const struct fat_fs_struct *fs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">offset_t <a class="el" href="group__fat.html#gacc43179721b97d82fefafaf5625350bb">fat_get_fs_free</a> </td>
<td>(</td>
<td class="paramtype">const struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the amount of free storage capacity on the filesystem in bytes. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>As the FAT filesystem is cluster based, this function does not return continuous values but multiples of the cluster size.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, the free filesystem space in bytes otherwise. </dd></dl>
</div>
</div>
<a class="anchor" id="gaab7768ca45847d5c4033a91984d65f1a"></a><!-- doxytag: member="fat.c::fat_get_fs_size" ref="gaab7768ca45847d5c4033a91984d65f1a" args="(const struct fat_fs_struct *fs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">offset_t <a class="el" href="group__fat.html#gaab7768ca45847d5c4033a91984d65f1a">fat_get_fs_size</a> </td>
<td>(</td>
<td class="paramtype">const struct fat_fs_struct *&#160;</td>
<td class="paramname"><em>fs</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Returns the amount of total storage capacity of the filesystem in bytes. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fs</td><td>The filesystem on which to operate. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, the filesystem size in bytes otherwise. </dd></dl>
</div>
</div>
<a class="anchor" id="ga5d726bac328b49abc2e6fb022d97092a"></a><!-- doxytag: member="fat.c::fat_open" ref="ga5d726bac328b49abc2e6fb022d97092a" args="(struct partition_struct *partition)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">struct fat_fs_struct* <a class="el" href="group__fat.html#ga5d726bac328b49abc2e6fb022d97092a">fat_open</a> </td>
<td>(</td>
<td class="paramtype">struct <a class="el" href="structpartition__struct.html">partition_struct</a> *&#160;</td>
<td class="paramname"><em>partition</em></td><td>)</td>
<td><code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Opens a FAT filesystem. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">partition</td><td>Discriptor of partition on which the filesystem resides. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on error, a FAT filesystem descriptor on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__fat.html#ga057612824886e115b88bf5affcf76829" title="Closes a FAT filesystem.">fat_close</a> </dd></dl>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,394 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Partition table support</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#groups">Modules</a> &#124;
<a href="#files">Files</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">Partition table support</div> </div>
</div><!--header-->
<div class="contents">
<p>Support for reading partition tables and access to partitions.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html">partition_struct</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes a partition. <a href="structpartition__struct.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="groups"></a>
Modules</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition__config.html">Configuration of partition table support</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Preprocessor defines to configure the partition support. </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="files"></a>
Files</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="partition_8c.html">partition.c</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Partition table implementation (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="partition_8h.html">partition.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Partition table header (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="partition__config_8h.html">partition_config.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Partition configuration (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaab5ffe2ef6119a6815c505e3103a2714"></a><!-- doxytag: member="partition::PARTITION_TYPE_FREE" ref="gaab5ffe2ef6119a6815c505e3103a2714" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaab5ffe2ef6119a6815c505e3103a2714">PARTITION_TYPE_FREE</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition table entry is not used. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaa92b6c552d2411e093204cd3ed4cffa3"></a><!-- doxytag: member="partition::PARTITION_TYPE_FAT12" ref="gaa92b6c552d2411e093204cd3ed4cffa3" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaa92b6c552d2411e093204cd3ed4cffa3">PARTITION_TYPE_FAT12</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT12 filesystem. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaf7296b4a29c1f7e5c39e28372648b2cd"></a><!-- doxytag: member="partition::PARTITION_TYPE_FAT16_32MB" ref="gaf7296b4a29c1f7e5c39e28372648b2cd" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaf7296b4a29c1f7e5c39e28372648b2cd">PARTITION_TYPE_FAT16_32MB</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT16 filesystem with 32MB maximum. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaceaa1bf17d4e8961726834e53ed79732"></a><!-- doxytag: member="partition::PARTITION_TYPE_EXTENDED" ref="gaceaa1bf17d4e8961726834e53ed79732" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaceaa1bf17d4e8961726834e53ed79732">PARTITION_TYPE_EXTENDED</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition is an extended partition with its own partition table. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gada7e1b4d950c7a3f42f559ab99f5fe43"></a><!-- doxytag: member="partition::PARTITION_TYPE_FAT16" ref="gada7e1b4d950c7a3f42f559ab99f5fe43" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gada7e1b4d950c7a3f42f559ab99f5fe43">PARTITION_TYPE_FAT16</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT16 filesystem. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2f6a6c30cc239ae13ea287ff901c95f4"></a><!-- doxytag: member="partition::PARTITION_TYPE_FAT32" ref="ga2f6a6c30cc239ae13ea287ff901c95f4" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga2f6a6c30cc239ae13ea287ff901c95f4">PARTITION_TYPE_FAT32</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT32 filesystem. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaa2e0c8e8b4ec10f7b342c0d554b5f6d8"></a><!-- doxytag: member="partition::PARTITION_TYPE_FAT32_LBA" ref="gaa2e0c8e8b4ec10f7b342c0d554b5f6d8" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaa2e0c8e8b4ec10f7b342c0d554b5f6d8">PARTITION_TYPE_FAT32_LBA</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT32 filesystem with LBA. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga52b69fda008ca19d75304a2385cc4900"></a><!-- doxytag: member="partition::PARTITION_TYPE_FAT16_LBA" ref="ga52b69fda008ca19d75304a2385cc4900" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga52b69fda008ca19d75304a2385cc4900">PARTITION_TYPE_FAT16_LBA</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT16 filesystem with LBA. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga1c9a00e3b09b488ce7f3b2ef2904400b"></a><!-- doxytag: member="partition::PARTITION_TYPE_EXTENDED_LBA" ref="ga1c9a00e3b09b488ce7f3b2ef2904400b" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga1c9a00e3b09b488ce7f3b2ef2904400b">PARTITION_TYPE_EXTENDED_LBA</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition is an extended partition with LBA. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gacdc50585fe8130f0a4faee13caade86f"></a><!-- doxytag: member="partition::PARTITION_TYPE_UNKNOWN" ref="gacdc50585fe8130f0a4faee13caade86f" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gacdc50585fe8130f0a4faee13caade86f">PARTITION_TYPE_UNKNOWN</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition has an unknown type. <br/></td></tr>
<tr><td colspan="2"><h2><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a> )(offset_t offset, uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to read from the partition. <a href="#ga52bf225ef74664c7e596f23d8d807c85"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">device_read_callback_t</a> )(uint8_t *buffer, offset_t offset, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer passed to a <code>device_read_interval_t</code>. <a href="#ga23a54af15a8c9711925e8b2e3433a27d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a> )(offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, <a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">device_read_callback_t</a> callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to continuously read units of <code>interval</code> bytes and call a callback function. <a href="#gae89b7507ba9787aec1e8974c5f2b30a4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a> )(offset_t offset, const uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to write to the partition. <a href="#ga8d202a969ce237e5876b1f1f506df53f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uintptr_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">device_write_callback_t</a> )(uint8_t *buffer, offset_t offset, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer passed to a <code>device_write_interval_t</code>. <a href="#ga3199d1b591458c7c6664545fab7d32fe"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a> )(offset_t offset, uint8_t *buffer, uintptr_t length, <a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">device_write_callback_t</a> callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to continuously write a data stream obtained from a callback function. <a href="#ga032324dc0780bc62cd91a8856ffe0800"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structpartition__struct.html">partition_struct</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68">partition_open</a> (<a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a> device_read, <a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a> device_read_interval, <a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a> device_write, <a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a> device_write_interval, int8_t index)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a partition. <a href="#ga3125023db4e9d50adb8489c71fa1be68"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2">partition_close</a> (struct <a class="el" href="structpartition__struct.html">partition_struct</a> *partition)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a partition. <a href="#ga128f4363de35c81a9ff8026d4db289d2"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Support for reading partition tables and access to partitions. </p>
<hr/><h2>Typedef Documentation</h2>
<a class="anchor" id="ga23a54af15a8c9711925e8b2e3433a27d"></a><!-- doxytag: member="partition.h::device_read_callback_t" ref="ga23a54af15a8c9711925e8b2e3433a27d" args=")(uint8_t *buffer, offset_t offset, void *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef uint8_t(* <a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">device_read_callback_t</a>)(uint8_t *buffer, offset_t offset, void *p)</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>A function pointer passed to a <code>device_read_interval_t</code>. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer which contains the data just read. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset from which the data in <code>buffer</code> was read. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>An opaque pointer. </td></tr>
</table>
</dd>
</dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4" title="A function pointer used to continuously read units of interval bytes and call a callback function...">device_read_interval_t</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gae89b7507ba9787aec1e8974c5f2b30a4"></a><!-- doxytag: member="partition.h::device_read_interval_t" ref="gae89b7507ba9787aec1e8974c5f2b30a4" args=")(offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, device_read_callback_t callback, void *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef uint8_t(* <a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a>)(offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, <a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">device_read_callback_t</a> callback, void *p)</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>A function pointer used to continuously read units of <code>interval</code> bytes and call a callback function. </p>
<p>This function starts reading at the specified offset. Every <code>interval</code> bytes, it calls the callback function with the associated data buffer.</p>
<p>By returning zero, the callback may stop reading.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>Offset from which to start reading. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>Pointer to a buffer which is at least interval bytes in size. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">interval</td><td>Number of bytes to read before calling the callback function. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>Number of bytes to read altogether. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>The function to call every interval bytes. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>An opaque pointer directly passed to the callback function. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85" title="A function pointer used to read from the partition.">device_read_t</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga52bf225ef74664c7e596f23d8d807c85"></a><!-- doxytag: member="partition.h::device_read_t" ref="ga52bf225ef74664c7e596f23d8d807c85" args=")(offset_t offset, uint8_t *buffer, uintptr_t length)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef uint8_t(* <a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a>)(offset_t offset, uint8_t *buffer, uintptr_t length)</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>A function pointer used to read from the partition. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset on the device where to start reading. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer into which to place the data. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The count of bytes to read. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="ga3199d1b591458c7c6664545fab7d32fe"></a><!-- doxytag: member="partition.h::device_write_callback_t" ref="ga3199d1b591458c7c6664545fab7d32fe" args=")(uint8_t *buffer, offset_t offset, void *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef uintptr_t(* <a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">device_write_callback_t</a>)(uint8_t *buffer, offset_t offset, void *p)</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>A function pointer passed to a <code>device_write_interval_t</code>. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer which receives the data to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset to which the data in <code>buffer</code> will be written. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>An opaque pointer. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>The number of bytes put into <code>buffer</code> </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800" title="A function pointer used to continuously write a data stream obtained from a callback function...">device_write_interval_t</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga032324dc0780bc62cd91a8856ffe0800"></a><!-- doxytag: member="partition.h::device_write_interval_t" ref="ga032324dc0780bc62cd91a8856ffe0800" args=")(offset_t offset, uint8_t *buffer, uintptr_t length, device_write_callback_t callback, void *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef uint8_t(* <a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a>)(offset_t offset, uint8_t *buffer, uintptr_t length, <a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">device_write_callback_t</a> callback, void *p)</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>A function pointer used to continuously write a data stream obtained from a callback function. </p>
<p>This function starts writing at the specified offset. To obtain the next bytes to write, it calls the callback function. The callback fills the provided data buffer and returns the number of bytes it has put into the buffer.</p>
<p>By returning zero, the callback may stop writing.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>Offset where to start writing. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>Pointer to a buffer which is used for the callback function. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>Number of bytes to write in total. May be zero for endless writes. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>The function used to obtain the bytes to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>An opaque pointer directly passed to the callback function. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f" title="A function pointer used to write to the partition.">device_write_t</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga8d202a969ce237e5876b1f1f506df53f"></a><!-- doxytag: member="partition.h::device_write_t" ref="ga8d202a969ce237e5876b1f1f506df53f" args=")(offset_t offset, const uint8_t *buffer, uintptr_t length)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef uint8_t(* <a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a>)(offset_t offset, const uint8_t *buffer, uintptr_t length)</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>A function pointer used to write to the partition. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset on the device where to start writing. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer which to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The count of bytes to write. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ga128f4363de35c81a9ff8026d4db289d2"></a><!-- doxytag: member="partition.c::partition_close" ref="ga128f4363de35c81a9ff8026d4db289d2" args="(struct partition_struct *partition)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2">partition_close</a> </td>
<td>(</td>
<td class="paramtype">struct <a class="el" href="structpartition__struct.html">partition_struct</a> *&#160;</td>
<td class="paramname"><em>partition</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Closes a partition. </p>
<p>This function destroys a partition descriptor which was previously obtained from a call to <a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68" title="Opens a partition.">partition_open()</a>. When this function returns, the given descriptor will be invalid.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">partition</td><td>The partition descriptor to destroy. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68" title="Opens a partition.">partition_open</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga3125023db4e9d50adb8489c71fa1be68"></a><!-- doxytag: member="partition.c::partition_open" ref="ga3125023db4e9d50adb8489c71fa1be68" args="(device_read_t device_read, device_read_interval_t device_read_interval, device_write_t device_write, device_write_interval_t device_write_interval, int8_t index)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">struct <a class="el" href="structpartition__struct.html">partition_struct</a> * <a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68">partition_open</a> </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a>&#160;</td>
<td class="paramname"><em>device_read</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a>&#160;</td>
<td class="paramname"><em>device_read_interval</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a>&#160;</td>
<td class="paramname"><em>device_write</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a>&#160;</td>
<td class="paramname"><em>device_write_interval</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int8_t&#160;</td>
<td class="paramname"><em>index</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td><code> [read]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Opens a partition. </p>
<p>Opens a partition by its index number and returns a partition handle which describes the opened partition.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>This function does not support extended partitions.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">device_read</td><td>A function pointer which is used to read from the disk. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">device_read_interval</td><td>A function pointer which is used to read in constant intervals from the disk. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">device_write</td><td>A function pointer which is used to write to the disk. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">device_write_interval</td><td>A function pointer which is used to write a data stream to disk. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">index</td><td>The index of the partition which should be opened, range 0 to 3. A negative value is allowed as well. In this case, the partition opened is not checked for existance, begins at offset zero, has a length of zero and is of an unknown type. Use this in case you want to open the whole device as a single partition (e.g. for "super floppy" use). </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, a partition descriptor on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2" title="Closes a partition.">partition_close</a> </dd></dl>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,77 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Configuration of partition table support</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">Configuration of partition table support</div> </div>
<div class="ingroups"><a class="el" href="group__partition.html">Partition table support</a></div></div><!--header-->
<div class="contents">
<p>Preprocessor defines to configure the partition support.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gad3d3ffd91206adf249d3318930f024af"></a><!-- doxytag: member="partition_config::PARTITION_COUNT" ref="gad3d3ffd91206adf249d3318930f024af" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition__config.html#gad3d3ffd91206adf249d3318930f024af">PARTITION_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of partition handles. <br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Preprocessor defines to configure the partition support. </p>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,465 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: MMC/SD/SDHC card raw access</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#groups">Modules</a> &#124;
<a href="#files">Files</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">MMC/SD/SDHC card raw access</div> </div>
</div><!--header-->
<div class="contents">
<p>This module implements read and write access to MMC, SD and SDHC cards.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html">sd_raw_info</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">This struct is used by <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79" title="Reads informational data from the card.">sd_raw_get_info()</a> to return manufacturing and status information of the card. <a href="structsd__raw__info.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="groups"></a>
Modules</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html">MMC/SD configuration</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Preprocessor defines to configure the MMC/SD support. </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="files"></a>
Files</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sd__raw_8c.html">sd_raw.c</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>MMC/SD/SDHC raw access implementation (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sd__raw_8h.html">sd_raw.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>MMC/SD/SDHC raw access header (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sd__raw__config_8h.html">sd_raw_config.h</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>MMC/SD support configuration (license: GPLv2 or LGPLv2.1) </p>
<br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2507a78d61385c9dbc1d06b8a03ef58a"></a><!-- doxytag: member="sd_raw::SD_RAW_FORMAT_HARDDISK" ref="ga2507a78d61385c9dbc1d06b8a03ef58a" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga2507a78d61385c9dbc1d06b8a03ef58a">SD_RAW_FORMAT_HARDDISK</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's layout is harddisk-like, which means it contains a master boot record with a partition table. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4caede5500f4d1035ceb9951a831c224"></a><!-- doxytag: member="sd_raw::SD_RAW_FORMAT_SUPERFLOPPY" ref="ga4caede5500f4d1035ceb9951a831c224" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga4caede5500f4d1035ceb9951a831c224">SD_RAW_FORMAT_SUPERFLOPPY</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card contains a single filesystem and no partition table. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gad070d05f762410f57870549a0fcd5f43"></a><!-- doxytag: member="sd_raw::SD_RAW_FORMAT_UNIVERSAL" ref="gad070d05f762410f57870549a0fcd5f43" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gad070d05f762410f57870549a0fcd5f43">SD_RAW_FORMAT_UNIVERSAL</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's layout follows the Universal File Format. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga7e87231437f32335a25930ec1b85a9c9"></a><!-- doxytag: member="sd_raw::SD_RAW_FORMAT_UNKNOWN" ref="ga7e87231437f32335a25930ec1b85a9c9" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga7e87231437f32335a25930ec1b85a9c9">SD_RAW_FORMAT_UNKNOWN</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's layout is unknown. <br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5">sd_raw_init</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes memory card communication. <a href="#ga82e8599b2679451e491484fb0b19bfd5"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab">sd_raw_available</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks wether a memory card is located in the slot. <a href="#ga5e227f25ad4a18466e7cdd9ecdfce8ab"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b">sd_raw_locked</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks wether the memory card is locked for write access. <a href="#ga55f311428473cd5b85cf8f24ffba121b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774">sd_raw_read</a> (offset_t offset, uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads raw data from the card. <a href="#ga3da1870e406622511379a66370cdc774"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9">sd_raw_read_interval</a> (offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, sd_raw_read_interval_handler_t callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Continuously reads units of <code>interval</code> bytes and calls a callback function. <a href="#gaf7eb53b23a8a91aaae785379da1527c9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577">sd_raw_write</a> (offset_t offset, const uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes raw data to the card. <a href="#ga0e46673759c1aa9ba492c8d123a3c577"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68">sd_raw_write_interval</a> (offset_t offset, uint8_t *buffer, uintptr_t length, sd_raw_write_interval_handler_t callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a continuous data stream obtained from a callback function. <a href="#ga7c60c1314055991e0812b659fe4e6c68"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735">sd_raw_sync</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes the write buffer's content to the card. <a href="#gad4d9ff40a7ea50c65cfa47927b35b735"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79">sd_raw_get_info</a> (struct <a class="el" href="structsd__raw__info.html">sd_raw_info</a> *info)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads informational data from the card. <a href="#ga97c54e82834f87bcdd38e79822fe5a79"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>This module implements read and write access to MMC, SD and SDHC cards. </p>
<p>It serves as a low-level driver for the higher level modules such as partition and file system access. </p>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ga5e227f25ad4a18466e7cdd9ecdfce8ab"></a><!-- doxytag: member="sd_raw.c::sd_raw_available" ref="ga5e227f25ad4a18466e7cdd9ecdfce8ab" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab">sd_raw_available</a> </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Checks wether a memory card is located in the slot. </p>
<dl class="return"><dt><b>Returns:</b></dt><dd>1 if the card is available, 0 if it is not. </dd></dl>
</div>
</div>
<a class="anchor" id="ga97c54e82834f87bcdd38e79822fe5a79"></a><!-- doxytag: member="sd_raw.c::sd_raw_get_info" ref="ga97c54e82834f87bcdd38e79822fe5a79" args="(struct sd_raw_info *info)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79">sd_raw_get_info</a> </td>
<td>(</td>
<td class="paramtype">struct <a class="el" href="structsd__raw__info.html">sd_raw_info</a> *&#160;</td>
<td class="paramname"><em>info</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads informational data from the card. </p>
<p>This function reads and returns the card's registers containing manufacturing and status information.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>: The information retrieved by this function is not required in any way to operate on the card, but it might be nice to display some of the data to the user.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">info</td><td>A pointer to the structure into which to save the information. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
</div>
</div>
<a class="anchor" id="ga82e8599b2679451e491484fb0b19bfd5"></a><!-- doxytag: member="sd_raw.c::sd_raw_init" ref="ga82e8599b2679451e491484fb0b19bfd5" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5">sd_raw_init</a> </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Initializes memory card communication. </p>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
</div>
</div>
<a class="anchor" id="ga55f311428473cd5b85cf8f24ffba121b"></a><!-- doxytag: member="sd_raw.c::sd_raw_locked" ref="ga55f311428473cd5b85cf8f24ffba121b" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b">sd_raw_locked</a> </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Checks wether the memory card is locked for write access. </p>
<dl class="return"><dt><b>Returns:</b></dt><dd>1 if the card is locked, 0 if it is not. </dd></dl>
</div>
</div>
<a class="anchor" id="ga3da1870e406622511379a66370cdc774"></a><!-- doxytag: member="sd_raw.c::sd_raw_read" ref="ga3da1870e406622511379a66370cdc774" args="(offset_t offset, uint8_t *buffer, uintptr_t length)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774">sd_raw_read</a> </td>
<td>(</td>
<td class="paramtype">offset_t&#160;</td>
<td class="paramname"><em>offset</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>length</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Reads raw data from the card. </p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset from which to read. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer into which to write the data. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The number of bytes to read. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9" title="Continuously reads units of interval bytes and calls a callback function.">sd_raw_read_interval</a>, <a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577" title="Writes raw data to the card.">sd_raw_write</a>, <a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68" title="Writes a continuous data stream obtained from a callback function.">sd_raw_write_interval</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gaf7eb53b23a8a91aaae785379da1527c9"></a><!-- doxytag: member="sd_raw.c::sd_raw_read_interval" ref="gaf7eb53b23a8a91aaae785379da1527c9" args="(offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, sd_raw_read_interval_handler_t callback, void *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9">sd_raw_read_interval</a> </td>
<td>(</td>
<td class="paramtype">offset_t&#160;</td>
<td class="paramname"><em>offset</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>interval</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>length</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">sd_raw_read_interval_handler_t&#160;</td>
<td class="paramname"><em>callback</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>p</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Continuously reads units of <code>interval</code> bytes and calls a callback function. </p>
<p>This function starts reading at the specified offset. Every <code>interval</code> bytes, it calls the callback function with the associated data buffer.</p>
<p>By returning zero, the callback may stop reading.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>Within the callback function, you can not start another read or write operation. </dd>
<dd>
This function only works if the following conditions are met:<ul>
<li>(offset - (offset % 512)) % interval == 0</li>
<li>length % interval == 0</li>
</ul>
</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>Offset from which to start reading. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>Pointer to a buffer which is at least interval bytes in size. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">interval</td><td>Number of bytes to read before calling the callback function. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>Number of bytes to read altogether. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>The function to call every interval bytes. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>An opaque pointer directly passed to the callback function. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68" title="Writes a continuous data stream obtained from a callback function.">sd_raw_write_interval</a>, <a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774" title="Reads raw data from the card.">sd_raw_read</a>, <a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577" title="Writes raw data to the card.">sd_raw_write</a> </dd></dl>
</div>
</div>
<a class="anchor" id="gad4d9ff40a7ea50c65cfa47927b35b735"></a><!-- doxytag: member="sd_raw.c::sd_raw_sync" ref="gad4d9ff40a7ea50c65cfa47927b35b735" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735">sd_raw_sync</a> </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Writes the write buffer's content to the card. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>When write buffering is enabled, you should call this function before disconnecting the card to ensure all remaining data has been written.</dd></dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577" title="Writes raw data to the card.">sd_raw_write</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga0e46673759c1aa9ba492c8d123a3c577"></a><!-- doxytag: member="sd_raw.c::sd_raw_write" ref="ga0e46673759c1aa9ba492c8d123a3c577" args="(offset_t offset, const uint8_t *buffer, uintptr_t length)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577">sd_raw_write</a> </td>
<td>(</td>
<td class="paramtype">offset_t&#160;</td>
<td class="paramname"><em>offset</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>length</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Writes raw data to the card. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>If write buffering is enabled, you might have to call <a class="el" href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735" title="Writes the write buffer&#39;s content to the card.">sd_raw_sync()</a> before disconnecting the card to ensure all remaining data has been written.</dd></dl>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset where to start writing. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer containing the data to be written. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The number of bytes to write. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success. </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68" title="Writes a continuous data stream obtained from a callback function.">sd_raw_write_interval</a>, <a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774" title="Reads raw data from the card.">sd_raw_read</a>, <a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9" title="Continuously reads units of interval bytes and calls a callback function.">sd_raw_read_interval</a> </dd></dl>
</div>
</div>
<a class="anchor" id="ga7c60c1314055991e0812b659fe4e6c68"></a><!-- doxytag: member="sd_raw.c::sd_raw_write_interval" ref="ga7c60c1314055991e0812b659fe4e6c68" args="(offset_t offset, uint8_t *buffer, uintptr_t length, sd_raw_write_interval_handler_t callback, void *p)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68">sd_raw_write_interval</a> </td>
<td>(</td>
<td class="paramtype">offset_t&#160;</td>
<td class="paramname"><em>offset</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uintptr_t&#160;</td>
<td class="paramname"><em>length</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">sd_raw_write_interval_handler_t&#160;</td>
<td class="paramname"><em>callback</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>p</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Writes a continuous data stream obtained from a callback function. </p>
<p>This function starts writing at the specified offset. To obtain the next bytes to write, it calls the callback function. The callback fills the provided data buffer and returns the number of bytes it has put into the buffer.</p>
<p>By returning zero, the callback may stop writing.</p>
<dl class="params"><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>Offset where to start writing. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>Pointer to a buffer which is used for the callback function. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>Number of bytes to write in total. May be zero for endless writes. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>The function used to obtain the bytes to write. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p</td><td>An opaque pointer directly passed to the callback function. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on failure, 1 on success </dd></dl>
<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9" title="Continuously reads units of interval bytes and calls a callback function.">sd_raw_read_interval</a>, <a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577" title="Writes raw data to the card.">sd_raw_write</a>, <a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774" title="Reads raw data from the card.">sd_raw_read</a> </dd></dl>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,168 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: MMC/SD configuration</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">MMC/SD configuration</div> </div>
<div class="ingroups"><a class="el" href="group__sd__raw.html">MMC/SD/SDHC card raw access</a></div></div><!--header-->
<div class="contents">
<p>Preprocessor defines to configure the MMC/SD support.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga5f2253a3c408671f91f9aebefeef7472">SD_RAW_WRITE_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD write support. <a href="#ga5f2253a3c408671f91f9aebefeef7472"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#gaa749d88c077a812f5c518e3172c96f9e">SD_RAW_WRITE_BUFFERING</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD write buffering. <a href="#gaa749d88c077a812f5c518e3172c96f9e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">SD_RAW_SAVE_RAM</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD access buffering. <a href="#ga4b98be138e87b8ab807d3f266a0c5bb9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">SD_RAW_SAVE_RAM</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD access buffering. <a href="#ga4b98be138e87b8ab807d3f266a0c5bb9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga03cccc1544f7cd6c23d66967a1bbc0f7">SD_RAW_SDHC</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls support for SDHC cards. <a href="#ga03cccc1544f7cd6c23d66967a1bbc0f7"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>Preprocessor defines to configure the MMC/SD support. </p>
<hr/><h2>Define Documentation</h2>
<a class="anchor" id="ga4b98be138e87b8ab807d3f266a0c5bb9"></a><!-- doxytag: member="sd_raw_config.h::SD_RAW_SAVE_RAM" ref="ga4b98be138e87b8ab807d3f266a0c5bb9" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">SD_RAW_SAVE_RAM</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls MMC/SD access buffering. </p>
<p>Set to 1 to save static RAM, but be aware that you will lose performance.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>When SD_RAW_WRITE_SUPPORT is 1, SD_RAW_SAVE_RAM will be reset to 0. </dd></dl>
</div>
</div>
<a class="anchor" id="ga4b98be138e87b8ab807d3f266a0c5bb9"></a><!-- doxytag: member="sd_raw_config.h::SD_RAW_SAVE_RAM" ref="ga4b98be138e87b8ab807d3f266a0c5bb9" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">SD_RAW_SAVE_RAM</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls MMC/SD access buffering. </p>
<p>Set to 1 to save static RAM, but be aware that you will lose performance.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>When SD_RAW_WRITE_SUPPORT is 1, SD_RAW_SAVE_RAM will be reset to 0. </dd></dl>
</div>
</div>
<a class="anchor" id="ga03cccc1544f7cd6c23d66967a1bbc0f7"></a><!-- doxytag: member="sd_raw_config.h::SD_RAW_SDHC" ref="ga03cccc1544f7cd6c23d66967a1bbc0f7" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__sd__raw__config.html#ga03cccc1544f7cd6c23d66967a1bbc0f7">SD_RAW_SDHC</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls support for SDHC cards. </p>
<p>Set to 1 to support so-called SDHC memory cards, i.e. SD cards with more than 2 gigabytes of memory. </p>
</div>
</div>
<a class="anchor" id="gaa749d88c077a812f5c518e3172c96f9e"></a><!-- doxytag: member="sd_raw_config.h::SD_RAW_WRITE_BUFFERING" ref="gaa749d88c077a812f5c518e3172c96f9e" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__sd__raw__config.html#gaa749d88c077a812f5c518e3172c96f9e">SD_RAW_WRITE_BUFFERING</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls MMC/SD write buffering. </p>
<p>Set to 1 to buffer write accesses, set to 0 to disable it.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>This option has no effect when SD_RAW_WRITE_SUPPORT is 0. </dd></dl>
</div>
</div>
<a class="anchor" id="ga5f2253a3c408671f91f9aebefeef7472"></a><!-- doxytag: member="sd_raw_config.h::SD_RAW_WRITE_SUPPORT" ref="ga5f2253a3c408671f91f9aebefeef7472" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define <a class="el" href="group__sd__raw__config.html#ga5f2253a3c408671f91f9aebefeef7472">SD_RAW_WRITE_SUPPORT</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Controls MMC/SD write support. </p>
<p>Set to 1 to enable MMC/SD write support, set to 0 to disable it. </p>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,210 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: MMC/SD/SDHC card library</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li class="current"><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">MMC/SD/SDHC card library </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>This project provides a general purpose library which implements read and write support for MMC, SD and SDHC memory cards. It includes</p>
<ul>
<li>low-level <a class="el" href="group__sd__raw.html">MMC, SD and SDHC read/write routines </a></li>
<li><a class="el" href="group__partition.html">partition table support </a></li>
<li>a simple <a class="el" href="group__fat.html">FAT16/FAT32 read/write implementation </a></li>
</ul>
<h2><a class="anchor" id="circuit"></a>
The circuit</h2>
<p>The circuit which was mainly used during development consists of an Atmel AVR microcontroller with some passive components. It is quite simple and provides an easy test environment. The circuit which can be downloaded on the <a href="http://www.roland-riegel.de/sd-reader/">project homepage</a> has been improved with regard to operation stability.</p>
<p>I used different microcontrollers during development, the ATmega8 with 8kBytes of flash, and its pin-compatible alternative, the ATmega168 with 16kBytes flash. The first one is the one I started with, but when I implemented FAT16 write support, I ran out of flash space and switched to the ATmega168. For FAT32, an ATmega328 is required.</p>
<p>The circuit board is a self-made and self-soldered board consisting of a single copper layer and standard DIL components, except of the MMC/SD card connector.</p>
<p>The connector is soldered to the bottom side of the board. It has a simple eject button which, when a card is inserted, needs some space beyond the connector itself. As an additional feature the connector has two electrical switches to detect wether a card is inserted and wether this card is write-protected.</p>
<h2><a class="anchor" id="pictures"></a>
Pictures</h2>
<div class="image">
<img src="pic01.jpg" alt="pic01.jpg"/>
<div class="caption">
The circuit board used to implement and test this application.</div></div>
<div class="image">
<img src="pic02.jpg" alt="pic02.jpg"/>
<div class="caption">
The MMC/SD card connector on the soldering side of the circuit board.</div></div>
<h2><a class="anchor" id="software"></a>
The software</h2>
<p>The software is written in C (ISO C99). It might not be the smallest or the fastest one, but I think it is quite flexible. See the project's <a href="http://www.roland-riegel.de/sd-reader/benchmarks/">benchmark page</a> to get an idea of the possible data rates.</p>
<p>I implemented an example application providing a simple command prompt which is accessible via the UART at 9600 Baud. With commands similiar to the Unix shell you can browse different directories, read and write files, create new ones and delete them again. Not all commands are available in all software configurations.</p>
<ul>
<li><code>cat &lt;file&gt;</code><br/>
Writes a hexdump of &lt;file&gt; to the terminal.</li>
<li><code>cd &lt;directory&gt;</code><br/>
Changes current working directory to &lt;directory&gt;.</li>
<li><code>disk</code><br/>
Shows card manufacturer, status, filesystem capacity and free storage space.</li>
<li><code>init</code><br/>
Reinitializes and reopens the memory card.</li>
<li><code>ls</code><br/>
Shows the content of the current directory.</li>
<li><code>mkdir &lt;directory&gt;</code><br/>
Creates a directory called &lt;directory&gt;.</li>
<li><code>mv &lt;file&gt; &lt;file_new&gt;</code><br/>
Renames &lt;file&gt; to &lt;file_new&gt;.</li>
<li><code>rm &lt;file&gt;</code><br/>
Deletes &lt;file&gt;.</li>
<li><code>sync</code><br/>
Ensures all buffered data is written to the card.</li>
<li><code>touch &lt;file&gt;</code><br/>
Creates &lt;file&gt;.</li>
<li><code>write &lt;file&gt; &lt;offset&gt;</code><br/>
Writes text to &lt;file&gt;, starting from &lt;offset&gt;. The text is read from the UART, line by line. Finish with an empty line.</li>
</ul>
<p>
The following table shows some typical code sizes in bytes, using the 20090330 release with a
buffered read-write MMC/SD configuration, FAT16 and static memory allocation:
</p>
<table border="1" cellpadding="2">
<tr>
<th>layer</th>
<th>code size</th>
<th>static RAM usage</th>
</tr>
<tr>
<td>MMC/SD</td>
<td align="right">2410</td>
<td align="right">518</td>
</tr>
<tr>
<td>Partition</td>
<td align="right">456</td>
<td align="right">17</td>
</tr>
<tr>
<td>FAT16</td>
<td align="right">7928</td>
<td align="right">188</td>
</tr>
</table>
<p>
The static RAM is mostly used for buffering memory card access, which
improves performance and reduces implementation complexity.
</p>
<p>
Please note that the numbers above do not include the C library functions
used, e.g. some string functions. These will raise the numbers somewhat
if they are not already used in other program parts.
</p>
<p>
When opening a partition, filesystem, file or directory, a little amount
of RAM is used, as listed in the following table. Depending on the library
configuration, the memory is either allocated statically or dynamically.
</p>
<table border="1" cellpadding="2">
<tr>
<th>descriptor</th>
<th>dynamic/static RAM</th>
</tr>
<tr>
<td>partition</td>
<td align="right">17</td>
</tr>
<tr>
<td>filesystem</td>
<td align="right">26</td>
</tr>
<tr>
<td>file</td>
<td align="right">53</td>
</tr>
<tr>
<td>directory</td>
<td align="right">49</td>
</tr>
</table>
<h2><a class="anchor" id="adaptation"></a>
Adapting the software to your needs</h2>
<p>The only hardware dependent part is the communication layer talking to the memory card. The other parts like partition table and FAT support are completely independent, you could use them even for managing Compact Flash cards or standard ATAPI hard disks.</p>
<p>By changing the MCU* variables in the Makefile, you can use other Atmel microcontrollers or different clock speeds. You might also want to change the configuration defines in the files <a class="el" href="fat__config_8h.html" title="FAT configuration (license: GPLv2 or LGPLv2.1)">fat_config.h</a>, <a class="el" href="partition__config_8h.html" title="Partition configuration (license: GPLv2 or LGPLv2.1)">partition_config.h</a>, <a class="el" href="sd__raw__config_8h.html" title="MMC/SD support configuration (license: GPLv2 or LGPLv2.1)">sd_raw_config.h</a> and <a class="el" href="sd-reader__config_8h.html" title="Common sd-reader configuration used by all modules (license: GPLv2 or LGPLv2.1)">sd-reader_config.h</a>. For example, you could disable write support completely if you only need read support.</p>
<p>For further information, visit the project's <a href="http://www.roland-riegel.de/sd-reader/faq/">FAQ page</a>.</p>
<h2><a class="anchor" id="bugs"></a>
Bugs or comments?</h2>
<p>If you have comments or found a bug in the software - there might be some of them - you may contact me per mail at <a href="mailto:feedback@roland-riegel.de">feedback@roland-riegel.de</a>.</p>
<h2><a class="anchor" id="acknowledgements"></a>
Acknowledgements</h2>
<p>Thanks go to Ulrich Radig, who explained on his homepage how to interface MMC cards to the Atmel microcontroller (<a href="http://www.ulrichradig.de/">http://www.ulrichradig.de/</a>). I adapted his work for my circuit.</p>
<h2><a class="anchor" id="copyright"></a>
Copyright 2006-2012 by Roland Riegel</h2>
<p>This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation (<a href="http://www.gnu.org/copyleft/gpl.html">http://www.gnu.org/copyleft/gpl.html</a>). At your option, you can alternatively redistribute and/or modify the following files under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation (<a href="http://www.gnu.org/copyleft/lgpl.html">http://www.gnu.org/copyleft/lgpl.html</a>):</p>
<ul>
<li><a class="el" href="byteordering_8c.html" title="Byte-order handling implementation (license: GPLv2 or LGPLv2.1)">byteordering.c</a></li>
<li><a class="el" href="byteordering_8h.html" title="Byte-order handling header (license: GPLv2 or LGPLv2.1)">byteordering.h</a></li>
<li><a class="el" href="fat_8c.html" title="FAT implementation (license: GPLv2 or LGPLv2.1)">fat.c</a></li>
<li><a class="el" href="fat_8h.html" title="FAT header (license: GPLv2 or LGPLv2.1)">fat.h</a></li>
<li><a class="el" href="fat__config_8h.html" title="FAT configuration (license: GPLv2 or LGPLv2.1)">fat_config.h</a></li>
<li><a class="el" href="partition_8c.html" title="Partition table implementation (license: GPLv2 or LGPLv2.1)">partition.c</a></li>
<li><a class="el" href="partition_8h.html" title="Partition table header (license: GPLv2 or LGPLv2.1)">partition.h</a></li>
<li><a class="el" href="partition__config_8h.html" title="Partition configuration (license: GPLv2 or LGPLv2.1)">partition_config.h</a></li>
<li><a class="el" href="sd__raw_8c.html" title="MMC/SD/SDHC raw access implementation (license: GPLv2 or LGPLv2.1)">sd_raw.c</a></li>
<li><a class="el" href="sd__raw_8h.html" title="MMC/SD/SDHC raw access header (license: GPLv2 or LGPLv2.1)">sd_raw.h</a></li>
<li><a class="el" href="sd__raw__config_8h.html" title="MMC/SD support configuration (license: GPLv2 or LGPLv2.1)">sd_raw_config.h</a></li>
<li><a class="el" href="sd-reader__config_8h.html" title="Common sd-reader configuration used by all modules (license: GPLv2 or LGPLv2.1)">sd-reader_config.h</a> </li>
</ul>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,82 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: Modules</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Modules</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here is a list of all modules:</div><ul>
<li><a class="el" href="group__byteordering.html">Byteordering</a></li>
<li><a class="el" href="group__fat.html">FAT support</a><ul>
<li><a class="el" href="group__fat__config.html">FAT configuration</a></li>
<li><a class="el" href="group__fat__fs.html">FAT access</a></li>
<li><a class="el" href="group__fat__file.html">FAT file functions</a></li>
<li><a class="el" href="group__fat__dir.html">FAT directory functions</a></li>
</ul>
</li>
<li><a class="el" href="group__partition.html">Partition table support</a><ul>
<li><a class="el" href="group__partition__config.html">Configuration of partition table support</a></li>
</ul>
</li>
<li><a class="el" href="group__config.html">Sd-reader configuration</a></li>
<li><a class="el" href="group__sd__raw.html">MMC/SD/SDHC card raw access</a><ul>
<li><a class="el" href="group__sd__raw__config.html">MMC/SD configuration</a></li>
</ul>
</li>
</ul>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

View File

@ -0,0 +1,85 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: partition.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">partition.c File Reference<div class="ingroups"><a class="el" href="group__partition.html">Partition table support</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Partition table implementation (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structpartition__struct.html">partition_struct</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68">partition_open</a> (<a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a> device_read, <a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a> device_read_interval, <a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a> device_write, <a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a> device_write_interval, int8_t index)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a partition. <a href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2">partition_close</a> (struct <a class="el" href="structpartition__struct.html">partition_struct</a> *partition)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a partition. <a href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Partition table implementation (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,138 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: partition.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">partition.h File Reference<div class="ingroups"><a class="el" href="group__partition.html">Partition table support</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Partition table header (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html">partition_struct</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes a partition. <a href="structpartition__struct.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaab5ffe2ef6119a6815c505e3103a2714"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_FREE" ref="gaab5ffe2ef6119a6815c505e3103a2714" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaab5ffe2ef6119a6815c505e3103a2714">PARTITION_TYPE_FREE</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition table entry is not used. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaa92b6c552d2411e093204cd3ed4cffa3"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_FAT12" ref="gaa92b6c552d2411e093204cd3ed4cffa3" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaa92b6c552d2411e093204cd3ed4cffa3">PARTITION_TYPE_FAT12</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT12 filesystem. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaf7296b4a29c1f7e5c39e28372648b2cd"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_FAT16_32MB" ref="gaf7296b4a29c1f7e5c39e28372648b2cd" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaf7296b4a29c1f7e5c39e28372648b2cd">PARTITION_TYPE_FAT16_32MB</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT16 filesystem with 32MB maximum. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaceaa1bf17d4e8961726834e53ed79732"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_EXTENDED" ref="gaceaa1bf17d4e8961726834e53ed79732" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaceaa1bf17d4e8961726834e53ed79732">PARTITION_TYPE_EXTENDED</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition is an extended partition with its own partition table. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gada7e1b4d950c7a3f42f559ab99f5fe43"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_FAT16" ref="gada7e1b4d950c7a3f42f559ab99f5fe43" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gada7e1b4d950c7a3f42f559ab99f5fe43">PARTITION_TYPE_FAT16</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT16 filesystem. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2f6a6c30cc239ae13ea287ff901c95f4"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_FAT32" ref="ga2f6a6c30cc239ae13ea287ff901c95f4" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga2f6a6c30cc239ae13ea287ff901c95f4">PARTITION_TYPE_FAT32</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT32 filesystem. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaa2e0c8e8b4ec10f7b342c0d554b5f6d8"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_FAT32_LBA" ref="gaa2e0c8e8b4ec10f7b342c0d554b5f6d8" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gaa2e0c8e8b4ec10f7b342c0d554b5f6d8">PARTITION_TYPE_FAT32_LBA</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT32 filesystem with LBA. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga52b69fda008ca19d75304a2385cc4900"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_FAT16_LBA" ref="ga52b69fda008ca19d75304a2385cc4900" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga52b69fda008ca19d75304a2385cc4900">PARTITION_TYPE_FAT16_LBA</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition contains a FAT16 filesystem with LBA. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga1c9a00e3b09b488ce7f3b2ef2904400b"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_EXTENDED_LBA" ref="ga1c9a00e3b09b488ce7f3b2ef2904400b" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga1c9a00e3b09b488ce7f3b2ef2904400b">PARTITION_TYPE_EXTENDED_LBA</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition is an extended partition with LBA. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gacdc50585fe8130f0a4faee13caade86f"></a><!-- doxytag: member="partition.h::PARTITION_TYPE_UNKNOWN" ref="gacdc50585fe8130f0a4faee13caade86f" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gacdc50585fe8130f0a4faee13caade86f">PARTITION_TYPE_UNKNOWN</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The partition has an unknown type. <br/></td></tr>
<tr><td colspan="2"><h2><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a> )(offset_t offset, uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to read from the partition. <a href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">device_read_callback_t</a> )(uint8_t *buffer, offset_t offset, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer passed to a <code>device_read_interval_t</code>. <a href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a> )(offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, <a class="el" href="group__partition.html#ga23a54af15a8c9711925e8b2e3433a27d">device_read_callback_t</a> callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to continuously read units of <code>interval</code> bytes and call a callback function. <a href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a> )(offset_t offset, const uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to write to the partition. <a href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uintptr_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">device_write_callback_t</a> )(uint8_t *buffer, offset_t offset, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer passed to a <code>device_write_interval_t</code>. <a href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a> )(offset_t offset, uint8_t *buffer, uintptr_t length, <a class="el" href="group__partition.html#ga3199d1b591458c7c6664545fab7d32fe">device_write_callback_t</a> callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer used to continuously write a data stream obtained from a callback function. <a href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structpartition__struct.html">partition_struct</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68">partition_open</a> (<a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a> device_read, <a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a> device_read_interval, <a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a> device_write, <a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a> device_write_interval, int8_t index)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Opens a partition. <a href="group__partition.html#ga3125023db4e9d50adb8489c71fa1be68"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2">partition_close</a> (struct <a class="el" href="structpartition__struct.html">partition_struct</a> *partition)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes a partition. <a href="group__partition.html#ga128f4363de35c81a9ff8026d4db289d2"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Partition table header (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,83 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: partition_config.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">partition_config.h File Reference<div class="ingroups"><a class="el" href="group__partition.html">Partition table support</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Partition configuration (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gad3d3ffd91206adf249d3318930f024af"></a><!-- doxytag: member="partition_config.h::PARTITION_COUNT" ref="gad3d3ffd91206adf249d3318930f024af" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__partition__config.html#gad3d3ffd91206adf249d3318930f024af">PARTITION_COUNT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of partition handles. <br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Partition configuration (license: GPLv2 or LGPLv2.1) </p>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,83 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: sd-reader_config.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">sd-reader_config.h File Reference<div class="ingroups"><a class="el" href="group__config.html">Sd-reader configuration</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Common sd-reader configuration used by all modules (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__config.html#ga59a630bfc97e8a00e2ad0a0ad4b2f8a7">USE_DYNAMIC_MEMORY</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls allocation of memory. <a href="group__config.html#ga59a630bfc97e8a00e2ad0a0ad4b2f8a7"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Common sd-reader configuration used by all modules (license: GPLv2 or LGPLv2.1) </p>
<dl class="note"><dt><b>Note:</b></dt><dd>This file contains only configuration items relevant to all sd-reader implementation files. For module specific configuration options, please see the files <a class="el" href="fat__config_8h.html" title="FAT configuration (license: GPLv2 or LGPLv2.1)">fat_config.h</a>, <a class="el" href="partition__config_8h.html" title="Partition configuration (license: GPLv2 or LGPLv2.1)">partition_config.h</a> and <a class="el" href="sd__raw__config_8h.html" title="MMC/SD support configuration (license: GPLv2 or LGPLv2.1)">sd_raw_config.h</a>. </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,99 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: sd_raw.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">sd_raw.c File Reference<div class="ingroups"><a class="el" href="group__sd__raw.html">MMC/SD/SDHC card raw access</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>MMC/SD/SDHC raw access implementation (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5">sd_raw_init</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes memory card communication. <a href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab">sd_raw_available</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks wether a memory card is located in the slot. <a href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b">sd_raw_locked</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks wether the memory card is locked for write access. <a href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774">sd_raw_read</a> (offset_t offset, uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads raw data from the card. <a href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9">sd_raw_read_interval</a> (offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, sd_raw_read_interval_handler_t callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Continuously reads units of <code>interval</code> bytes and calls a callback function. <a href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577">sd_raw_write</a> (offset_t offset, const uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes raw data to the card. <a href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68">sd_raw_write_interval</a> (offset_t offset, uint8_t *buffer, uintptr_t length, sd_raw_write_interval_handler_t callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a continuous data stream obtained from a callback function. <a href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735">sd_raw_sync</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes the write buffer's content to the card. <a href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79">sd_raw_get_info</a> (struct <a class="el" href="structsd__raw__info.html">sd_raw_info</a> *info)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads informational data from the card. <a href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>MMC/SD/SDHC raw access implementation (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,119 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: sd_raw.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">sd_raw.h File Reference<div class="ingroups"><a class="el" href="group__sd__raw.html">MMC/SD/SDHC card raw access</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>MMC/SD/SDHC raw access header (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html">sd_raw_info</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">This struct is used by <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79" title="Reads informational data from the card.">sd_raw_get_info()</a> to return manufacturing and status information of the card. <a href="structsd__raw__info.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2507a78d61385c9dbc1d06b8a03ef58a"></a><!-- doxytag: member="sd_raw.h::SD_RAW_FORMAT_HARDDISK" ref="ga2507a78d61385c9dbc1d06b8a03ef58a" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga2507a78d61385c9dbc1d06b8a03ef58a">SD_RAW_FORMAT_HARDDISK</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's layout is harddisk-like, which means it contains a master boot record with a partition table. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4caede5500f4d1035ceb9951a831c224"></a><!-- doxytag: member="sd_raw.h::SD_RAW_FORMAT_SUPERFLOPPY" ref="ga4caede5500f4d1035ceb9951a831c224" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga4caede5500f4d1035ceb9951a831c224">SD_RAW_FORMAT_SUPERFLOPPY</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card contains a single filesystem and no partition table. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gad070d05f762410f57870549a0fcd5f43"></a><!-- doxytag: member="sd_raw.h::SD_RAW_FORMAT_UNIVERSAL" ref="gad070d05f762410f57870549a0fcd5f43" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gad070d05f762410f57870549a0fcd5f43">SD_RAW_FORMAT_UNIVERSAL</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's layout follows the Universal File Format. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga7e87231437f32335a25930ec1b85a9c9"></a><!-- doxytag: member="sd_raw.h::SD_RAW_FORMAT_UNKNOWN" ref="ga7e87231437f32335a25930ec1b85a9c9" args="" -->
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga7e87231437f32335a25930ec1b85a9c9">SD_RAW_FORMAT_UNKNOWN</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's layout is unknown. <br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5">sd_raw_init</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes memory card communication. <a href="group__sd__raw.html#ga82e8599b2679451e491484fb0b19bfd5"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab">sd_raw_available</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks wether a memory card is located in the slot. <a href="group__sd__raw.html#ga5e227f25ad4a18466e7cdd9ecdfce8ab"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b">sd_raw_locked</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks wether the memory card is locked for write access. <a href="group__sd__raw.html#ga55f311428473cd5b85cf8f24ffba121b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774">sd_raw_read</a> (offset_t offset, uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads raw data from the card. <a href="group__sd__raw.html#ga3da1870e406622511379a66370cdc774"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9">sd_raw_read_interval</a> (offset_t offset, uint8_t *buffer, uintptr_t interval, uintptr_t length, sd_raw_read_interval_handler_t callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Continuously reads units of <code>interval</code> bytes and calls a callback function. <a href="group__sd__raw.html#gaf7eb53b23a8a91aaae785379da1527c9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577">sd_raw_write</a> (offset_t offset, const uint8_t *buffer, uintptr_t length)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes raw data to the card. <a href="group__sd__raw.html#ga0e46673759c1aa9ba492c8d123a3c577"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68">sd_raw_write_interval</a> (offset_t offset, uint8_t *buffer, uintptr_t length, sd_raw_write_interval_handler_t callback, void *p)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a continuous data stream obtained from a callback function. <a href="group__sd__raw.html#ga7c60c1314055991e0812b659fe4e6c68"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735">sd_raw_sync</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes the write buffer's content to the card. <a href="group__sd__raw.html#gad4d9ff40a7ea50c65cfa47927b35b735"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79">sd_raw_get_info</a> (struct <a class="el" href="structsd__raw__info.html">sd_raw_info</a> *info)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads informational data from the card. <a href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>MMC/SD/SDHC raw access header (license: GPLv2 or LGPLv2.1) </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Roland Riegel </dd></dl>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,90 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: sd_raw_config.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#define-members">Defines</a> </div>
<div class="headertitle">
<div class="title">sd_raw_config.h File Reference<div class="ingroups"><a class="el" href="group__sd__raw.html">MMC/SD/SDHC card raw access</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>MMC/SD support configuration (license: GPLv2 or LGPLv2.1)
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga5f2253a3c408671f91f9aebefeef7472">SD_RAW_WRITE_SUPPORT</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD write support. <a href="group__sd__raw__config.html#ga5f2253a3c408671f91f9aebefeef7472"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#gaa749d88c077a812f5c518e3172c96f9e">SD_RAW_WRITE_BUFFERING</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD write buffering. <a href="group__sd__raw__config.html#gaa749d88c077a812f5c518e3172c96f9e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">SD_RAW_SAVE_RAM</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD access buffering. <a href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga03cccc1544f7cd6c23d66967a1bbc0f7">SD_RAW_SDHC</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls support for SDHC cards. <a href="group__sd__raw__config.html#ga03cccc1544f7cd6c23d66967a1bbc0f7"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9">SD_RAW_SAVE_RAM</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls MMC/SD access buffering. <a href="group__sd__raw__config.html#ga4b98be138e87b8ab807d3f266a0c5bb9"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>MMC/SD support configuration (license: GPLv2 or LGPLv2.1) </p>
</div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,167 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: fat_dir_entry_struct Struct Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-attribs">Data Fields</a> </div>
<div class="headertitle">
<div class="title">fat_dir_entry_struct Struct Reference<div class="ingroups"><a class="el" href="group__fat.html">FAT support</a> &#124; <a class="el" href="group__fat__file.html">FAT file functions</a></div></div> </div>
</div><!--header-->
<div class="contents">
<!-- doxytag: class="fat_dir_entry_struct" -->
<p>Describes a directory entry.
<a href="structfat__dir__entry__struct.html#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="pub-attribs"></a>
Data Fields</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html#a55d4698f86eecb6b49987a7c5f37566c">long_name</a> [32]</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file's name, truncated to 31 characters. <a href="#a55d4698f86eecb6b49987a7c5f37566c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html#a96bb7fbc6037217acccbeb22b718bc1a">attributes</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file's attributes. <a href="#a96bb7fbc6037217acccbeb22b718bc1a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">cluster_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html#a33ff89147834319be295ce273eac0d16">cluster</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The cluster in which the file's first byte resides. <a href="#a33ff89147834319be295ce273eac0d16"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html#ac8821140df86bef96d2e4c9b177f386e">file_size</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The file's size. <a href="#ac8821140df86bef96d2e4c9b177f386e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structfat__dir__entry__struct.html#acf491ee03bd21f230aecc449cac2c429">entry_offset</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The total disk offset of this directory entry. <a href="#acf491ee03bd21f230aecc449cac2c429"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Describes a directory entry. </p>
</div><hr/><h2>Field Documentation</h2>
<a class="anchor" id="a96bb7fbc6037217acccbeb22b718bc1a"></a><!-- doxytag: member="fat_dir_entry_struct::attributes" ref="a96bb7fbc6037217acccbeb22b718bc1a" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structfat__dir__entry__struct.html#a96bb7fbc6037217acccbeb22b718bc1a">fat_dir_entry_struct::attributes</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file's attributes. </p>
<p>Mask of the FAT_ATTRIB_* constants. </p>
</div>
</div>
<a class="anchor" id="a33ff89147834319be295ce273eac0d16"></a><!-- doxytag: member="fat_dir_entry_struct::cluster" ref="a33ff89147834319be295ce273eac0d16" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">cluster_t <a class="el" href="structfat__dir__entry__struct.html#a33ff89147834319be295ce273eac0d16">fat_dir_entry_struct::cluster</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The cluster in which the file's first byte resides. </p>
</div>
</div>
<a class="anchor" id="acf491ee03bd21f230aecc449cac2c429"></a><!-- doxytag: member="fat_dir_entry_struct::entry_offset" ref="acf491ee03bd21f230aecc449cac2c429" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">offset_t <a class="el" href="structfat__dir__entry__struct.html#acf491ee03bd21f230aecc449cac2c429">fat_dir_entry_struct::entry_offset</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The total disk offset of this directory entry. </p>
</div>
</div>
<a class="anchor" id="ac8821140df86bef96d2e4c9b177f386e"></a><!-- doxytag: member="fat_dir_entry_struct::file_size" ref="ac8821140df86bef96d2e4c9b177f386e" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint32_t <a class="el" href="structfat__dir__entry__struct.html#ac8821140df86bef96d2e4c9b177f386e">fat_dir_entry_struct::file_size</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file's size. </p>
</div>
</div>
<a class="anchor" id="a55d4698f86eecb6b49987a7c5f37566c"></a><!-- doxytag: member="fat_dir_entry_struct::long_name" ref="a55d4698f86eecb6b49987a7c5f37566c" args="[32]" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">char <a class="el" href="structfat__dir__entry__struct.html#a55d4698f86eecb6b49987a7c5f37566c">fat_dir_entry_struct::long_name</a>[32]</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The file's name, truncated to 31 characters. </p>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,177 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: partition_struct Struct Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-attribs">Data Fields</a> </div>
<div class="headertitle">
<div class="title">partition_struct Struct Reference<div class="ingroups"><a class="el" href="group__partition.html">Partition table support</a></div></div> </div>
</div><!--header-->
<div class="contents">
<!-- doxytag: class="partition_struct" -->
<p>Describes a partition.
<a href="structpartition__struct.html#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="pub-attribs"></a>
Data Fields</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html#a9d82319d1b4f052c165a806069f49afa">device_read</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The function which reads data from the partition. <a href="#a9d82319d1b4f052c165a806069f49afa"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html#a23ef90827c177f8f3385582416ff3ea3">device_read_interval</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The function which repeatedly reads a constant amount of data from the partition. <a href="#a23ef90827c177f8f3385582416ff3ea3"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html#ac16e2eedf75a5e472ed93a92c30e0dad">device_write</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The function which writes data to the partition. <a href="#ac16e2eedf75a5e472ed93a92c30e0dad"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html#a91923c55ba1c3a2dad435124964d91aa">device_write_interval</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The function which repeatedly writes data to the partition. <a href="#a91923c55ba1c3a2dad435124964d91aa"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html#a6923f9a2463495b35df8b73750e5d959">type</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The type of the partition. <a href="#a6923f9a2463495b35df8b73750e5d959"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad9d6f2b7a40168d2960e28a151ef1808"></a><!-- doxytag: member="partition_struct::offset" ref="ad9d6f2b7a40168d2960e28a151ef1808" args="" -->
uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html#ad9d6f2b7a40168d2960e28a151ef1808">offset</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The offset in blocks on the disk where this partition starts. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a416da0cd540916a03a536c4fc5970635"></a><!-- doxytag: member="partition_struct::length" ref="a416da0cd540916a03a536c4fc5970635" args="" -->
uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpartition__struct.html#a416da0cd540916a03a536c4fc5970635">length</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The length in blocks of this partition. <br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Describes a partition. </p>
</div><hr/><h2>Field Documentation</h2>
<a class="anchor" id="a9d82319d1b4f052c165a806069f49afa"></a><!-- doxytag: member="partition_struct::device_read" ref="a9d82319d1b4f052c165a806069f49afa" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__partition.html#ga52bf225ef74664c7e596f23d8d807c85">device_read_t</a> <a class="el" href="structpartition__struct.html#a9d82319d1b4f052c165a806069f49afa">partition_struct::device_read</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The function which reads data from the partition. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>The offset given to this function is relative to the whole disk, not to the start of the partition. </dd></dl>
</div>
</div>
<a class="anchor" id="a23ef90827c177f8f3385582416ff3ea3"></a><!-- doxytag: member="partition_struct::device_read_interval" ref="a23ef90827c177f8f3385582416ff3ea3" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__partition.html#gae89b7507ba9787aec1e8974c5f2b30a4">device_read_interval_t</a> <a class="el" href="structpartition__struct.html#a23ef90827c177f8f3385582416ff3ea3">partition_struct::device_read_interval</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The function which repeatedly reads a constant amount of data from the partition. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>The offset given to this function is relative to the whole disk, not to the start of the partition. </dd></dl>
</div>
</div>
<a class="anchor" id="ac16e2eedf75a5e472ed93a92c30e0dad"></a><!-- doxytag: member="partition_struct::device_write" ref="ac16e2eedf75a5e472ed93a92c30e0dad" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__partition.html#ga8d202a969ce237e5876b1f1f506df53f">device_write_t</a> <a class="el" href="structpartition__struct.html#ac16e2eedf75a5e472ed93a92c30e0dad">partition_struct::device_write</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The function which writes data to the partition. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>The offset given to this function is relative to the whole disk, not to the start of the partition. </dd></dl>
</div>
</div>
<a class="anchor" id="a91923c55ba1c3a2dad435124964d91aa"></a><!-- doxytag: member="partition_struct::device_write_interval" ref="a91923c55ba1c3a2dad435124964d91aa" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__partition.html#ga032324dc0780bc62cd91a8856ffe0800">device_write_interval_t</a> <a class="el" href="structpartition__struct.html#a91923c55ba1c3a2dad435124964d91aa">partition_struct::device_write_interval</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The function which repeatedly writes data to the partition. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>The offset given to this function is relative to the whole disk, not to the start of the partition. </dd></dl>
</div>
</div>
<a class="anchor" id="a6923f9a2463495b35df8b73750e5d959"></a><!-- doxytag: member="partition_struct::type" ref="a6923f9a2463495b35df8b73750e5d959" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structpartition__struct.html#a6923f9a2463495b35df8b73750e5d959">partition_struct::type</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The type of the partition. </p>
<p>Compare this value to the PARTITION_TYPE_* constants. </p>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

View File

@ -0,0 +1,208 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>sd-reader: sd_raw_info Struct Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">sd-reader
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-attribs">Data Fields</a> </div>
<div class="headertitle">
<div class="title">sd_raw_info Struct Reference<div class="ingroups"><a class="el" href="group__sd__raw.html">MMC/SD/SDHC card raw access</a></div></div> </div>
</div><!--header-->
<div class="contents">
<!-- doxytag: class="sd_raw_info" -->
<p>This struct is used by <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79" title="Reads informational data from the card.">sd_raw_get_info()</a> to return manufacturing and status information of the card.
<a href="structsd__raw__info.html#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="pub-attribs"></a>
Data Fields</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad543253184afa50a8e4cb51b6dd5bf67"></a><!-- doxytag: member="sd_raw_info::manufacturer" ref="ad543253184afa50a8e4cb51b6dd5bf67" args="" -->
uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#ad543253184afa50a8e4cb51b6dd5bf67">manufacturer</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A manufacturer code globally assigned by the SD card organization. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8ec2f9a6cdc4ac26cd695321bd9b3057"></a><!-- doxytag: member="sd_raw_info::oem" ref="a8ec2f9a6cdc4ac26cd695321bd9b3057" args="[3]" -->
uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#a8ec2f9a6cdc4ac26cd695321bd9b3057">oem</a> [3]</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A string describing the card's OEM or content, globally assigned by the SD card organization. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8d781e7a0ec7e752b340a72ba87fc40f"></a><!-- doxytag: member="sd_raw_info::product" ref="a8d781e7a0ec7e752b340a72ba87fc40f" args="[6]" -->
uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#a8d781e7a0ec7e752b340a72ba87fc40f">product</a> [6]</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A product name. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#a0eb79353f9b63b1e719f8babad77c87e">revision</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's revision, coded in packed BCD. <a href="#a0eb79353f9b63b1e719f8babad77c87e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a22771967744cca36595278b52686a69f"></a><!-- doxytag: member="sd_raw_info::serial" ref="a22771967744cca36595278b52686a69f" args="" -->
uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#a22771967744cca36595278b52686a69f">serial</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">A serial number assigned by the manufacturer. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#ae8a5dd6ae2039058100800f6bb85997a">manufacturing_year</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The year of manufacturing. <a href="#ae8a5dd6ae2039058100800f6bb85997a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a80b3393a84f9c7f0a648cb8a9fd9c8b7"></a><!-- doxytag: member="sd_raw_info::manufacturing_month" ref="a80b3393a84f9c7f0a648cb8a9fd9c8b7" args="" -->
uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#a80b3393a84f9c7f0a648cb8a9fd9c8b7">manufacturing_month</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The month of manufacturing. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af0443b0eb7316378025763674a5bf9b0"></a><!-- doxytag: member="sd_raw_info::capacity" ref="af0443b0eb7316378025763674a5bf9b0" args="" -->
offset_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#af0443b0eb7316378025763674a5bf9b0">capacity</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's total capacity in bytes. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#af23fccda0fa6740558d71c530576961b">flag_copy</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Defines wether the card's content is original or copied. <a href="#af23fccda0fa6740558d71c530576961b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#a55f4daed5bef3289878fc0521ca191b1">flag_write_protect</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Defines wether the card's content is write-protected. <a href="#a55f4daed5bef3289878fc0521ca191b1"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#af3815572d323acafa8e3eabf19b154d5">flag_write_protect_temp</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Defines wether the card's content is temporarily write-protected. <a href="#af3815572d323acafa8e3eabf19b154d5"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsd__raw__info.html#a10d485029641a4fc1aadccad5e9eaa03">format</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The card's data layout. <a href="#a10d485029641a4fc1aadccad5e9eaa03"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>This struct is used by <a class="el" href="group__sd__raw.html#ga97c54e82834f87bcdd38e79822fe5a79" title="Reads informational data from the card.">sd_raw_get_info()</a> to return manufacturing and status information of the card. </p>
</div><hr/><h2>Field Documentation</h2>
<a class="anchor" id="af23fccda0fa6740558d71c530576961b"></a><!-- doxytag: member="sd_raw_info::flag_copy" ref="af23fccda0fa6740558d71c530576961b" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structsd__raw__info.html#af23fccda0fa6740558d71c530576961b">sd_raw_info::flag_copy</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Defines wether the card's content is original or copied. </p>
<p>A value of <code>0</code> means original, <code>1</code> means copied. </p>
</div>
</div>
<a class="anchor" id="a55f4daed5bef3289878fc0521ca191b1"></a><!-- doxytag: member="sd_raw_info::flag_write_protect" ref="a55f4daed5bef3289878fc0521ca191b1" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structsd__raw__info.html#a55f4daed5bef3289878fc0521ca191b1">sd_raw_info::flag_write_protect</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Defines wether the card's content is write-protected. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>This is an internal flag and does not represent the state of the card's mechanical write-protect switch. </dd></dl>
</div>
</div>
<a class="anchor" id="af3815572d323acafa8e3eabf19b154d5"></a><!-- doxytag: member="sd_raw_info::flag_write_protect_temp" ref="af3815572d323acafa8e3eabf19b154d5" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structsd__raw__info.html#af3815572d323acafa8e3eabf19b154d5">sd_raw_info::flag_write_protect_temp</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Defines wether the card's content is temporarily write-protected. </p>
<dl class="note"><dt><b>Note:</b></dt><dd>This is an internal flag and does not represent the state of the card's mechanical write-protect switch. </dd></dl>
</div>
</div>
<a class="anchor" id="a10d485029641a4fc1aadccad5e9eaa03"></a><!-- doxytag: member="sd_raw_info::format" ref="a10d485029641a4fc1aadccad5e9eaa03" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structsd__raw__info.html#a10d485029641a4fc1aadccad5e9eaa03">sd_raw_info::format</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The card's data layout. </p>
<p>See the <code>SD_RAW_FORMAT_*</code> constants for details.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>This value is not guaranteed to match reality. </dd></dl>
</div>
</div>
<a class="anchor" id="ae8a5dd6ae2039058100800f6bb85997a"></a><!-- doxytag: member="sd_raw_info::manufacturing_year" ref="ae8a5dd6ae2039058100800f6bb85997a" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structsd__raw__info.html#ae8a5dd6ae2039058100800f6bb85997a">sd_raw_info::manufacturing_year</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The year of manufacturing. </p>
<p>A value of zero means year 2000. </p>
</div>
</div>
<a class="anchor" id="a0eb79353f9b63b1e719f8babad77c87e"></a><!-- doxytag: member="sd_raw_info::revision" ref="a0eb79353f9b63b1e719f8babad77c87e" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t <a class="el" href="structsd__raw__info.html#a0eb79353f9b63b1e719f8babad77c87e">sd_raw_info::revision</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>The card's revision, coded in packed BCD. </p>
<p>For example, the revision value <code>0x32</code> means "3.2". </p>
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 12 2012 20:06:45 for sd-reader by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

View File

@ -0,0 +1,59 @@
.tabs, .tabs2, .tabs3 {
background-image: url('tab_b.png');
width: 100%;
z-index: 101;
font-size: 13px;
}
.tabs2 {
font-size: 10px;
}
.tabs3 {
font-size: 9px;
}
.tablist {
margin: 0;
padding: 0;
display: table;
}
.tablist li {
float: left;
display: table-cell;
background-image: url('tab_b.png');
line-height: 36px;
list-style: none;
}
.tablist a {
display: block;
padding: 0 20px;
font-weight: bold;
background-image:url('tab_s.png');
background-repeat:no-repeat;
background-position:right;
color: #283A5D;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
text-decoration: none;
outline: none;
}
.tabs3 .tablist a {
padding: 0 10px;
}
.tablist a:hover {
background-image: url('tab_h.png');
background-repeat:repeat-x;
color: #fff;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
text-decoration: none;
}
.tablist li.current a {
background-image: url('tab_a.png');
background-repeat:repeat-x;
color: #fff;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,131 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef FAT_H
#define FAT_H
#include <stdint.h>
#include "fat_config.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup fat
*
* @{
*/
/**
* \file
* FAT header (license: GPLv2 or LGPLv2.1)
*
* \author Roland Riegel
*/
/**
* \addtogroup fat_file
* @{
*/
/** The file is read-only. */
#define FAT_ATTRIB_READONLY (1 << 0)
/** The file is hidden. */
#define FAT_ATTRIB_HIDDEN (1 << 1)
/** The file is a system file. */
#define FAT_ATTRIB_SYSTEM (1 << 2)
/** The file is empty and has the volume label as its name. */
#define FAT_ATTRIB_VOLUME (1 << 3)
/** The file is a directory. */
#define FAT_ATTRIB_DIR (1 << 4)
/** The file has to be archived. */
#define FAT_ATTRIB_ARCHIVE (1 << 5)
/** The given offset is relative to the beginning of the file. */
#define FAT_SEEK_SET 0
/** The given offset is relative to the current read/write position. */
#define FAT_SEEK_CUR 1
/** The given offset is relative to the end of the file. */
#define FAT_SEEK_END 2
/**
* @}
*/
struct partition_struct;
struct fat_fs_struct;
struct fat_file_struct;
struct fat_dir_struct;
/**
* \ingroup fat_file
* Describes a directory entry.
*/
struct fat_dir_entry_struct
{
/** The file's name, truncated to 31 characters. */
char long_name[32];
/** The file's attributes. Mask of the FAT_ATTRIB_* constants. */
uint8_t attributes;
#if FAT_DATETIME_SUPPORT
/** Compressed representation of modification time. */
uint16_t modification_time;
/** Compressed representation of modification date. */
uint16_t modification_date;
#endif
/** The cluster in which the file's first byte resides. */
cluster_t cluster;
/** The file's size. */
uint32_t file_size;
/** The total disk offset of this directory entry. */
offset_t entry_offset;
};
struct fat_fs_struct* fat_open(struct partition_struct* partition);
void fat_close(struct fat_fs_struct* fs);
struct fat_file_struct* fat_open_file(struct fat_fs_struct* fs, const struct fat_dir_entry_struct* dir_entry);
void fat_close_file(struct fat_file_struct* fd);
intptr_t fat_read_file(struct fat_file_struct* fd, uint8_t* buffer, uintptr_t buffer_len);
intptr_t fat_write_file(struct fat_file_struct* fd, const uint8_t* buffer, uintptr_t buffer_len);
uint8_t fat_seek_file(struct fat_file_struct* fd, int32_t* offset, uint8_t whence);
uint8_t fat_resize_file(struct fat_file_struct* fd, uint32_t size);
struct fat_dir_struct* fat_open_dir(struct fat_fs_struct* fs, const struct fat_dir_entry_struct* dir_entry);
void fat_close_dir(struct fat_dir_struct* dd);
uint8_t fat_read_dir(struct fat_dir_struct* dd, struct fat_dir_entry_struct* dir_entry);
uint8_t fat_reset_dir(struct fat_dir_struct* dd);
uint8_t fat_create_file(struct fat_dir_struct* parent, const char* file, struct fat_dir_entry_struct* dir_entry);
uint8_t fat_delete_file(struct fat_fs_struct* fs, struct fat_dir_entry_struct* dir_entry);
uint8_t fat_move_file(struct fat_fs_struct* fs, struct fat_dir_entry_struct* dir_entry, struct fat_dir_struct* parent_new, const char* file_new);
uint8_t fat_create_dir(struct fat_dir_struct* parent, const char* dir, struct fat_dir_entry_struct* dir_entry);
#define fat_delete_dir fat_delete_file
#define fat_move_dir fat_move_file
void fat_get_file_modification_date(const struct fat_dir_entry_struct* dir_entry, uint16_t* year, uint8_t* month, uint8_t* day);
void fat_get_file_modification_time(const struct fat_dir_entry_struct* dir_entry, uint8_t* hour, uint8_t* min, uint8_t* sec);
uint8_t fat_get_dir_entry_of_path(struct fat_fs_struct* fs, const char* path, struct fat_dir_entry_struct* dir_entry);
offset_t fat_get_fs_size(const struct fat_fs_struct* fs);
offset_t fat_get_fs_free(const struct fat_fs_struct* fs);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.

View File

@ -0,0 +1,128 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef FAT_CONFIG_H
#define FAT_CONFIG_H
#include <stdint.h>
#include "sd_raw_config.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup fat
*
* @{
*/
/**
* \file
* FAT configuration (license: GPLv2 or LGPLv2.1)
*/
/**
* \ingroup fat_config
* Controls FAT write support.
*
* Set to 1 to enable FAT write support, set to 0 to disable it.
*/
#define FAT_WRITE_SUPPORT SD_RAW_WRITE_SUPPORT
/**
* \ingroup fat_config
* Controls FAT long filename (LFN) support.
*
* Set to 1 to enable LFN support, set to 0 to disable it.
*/
#define FAT_LFN_SUPPORT 1
/**
* \ingroup fat_config
* Controls FAT date and time support.
*
* Set to 1 to enable FAT date and time stamping support.
*/
#define FAT_DATETIME_SUPPORT 0
/**
* \ingroup fat_config
* Controls FAT32 support.
*
* Set to 1 to enable FAT32 support.
*/
#define FAT_FAT32_SUPPORT SD_RAW_SDHC
/**
* \ingroup fat_config
* Controls updates of directory entries.
*
* Set to 1 to delay directory entry updates until the file is closed.
* This can boost performance significantly, but may cause data loss
* if the file is not properly closed.
*/
#define FAT_DELAY_DIRENTRY_UPDATE 0
/**
* \ingroup fat_config
* Determines the function used for retrieving current date and time.
*
* Define this to the function call which shall be used to retrieve
* current date and time.
*
* \note Used only when FAT_DATETIME_SUPPORT is 1.
*
* \param[out] year Pointer to a \c uint16_t which receives the current year.
* \param[out] month Pointer to a \c uint8_t which receives the current month.
* \param[out] day Pointer to a \c uint8_t which receives the current day.
* \param[out] hour Pointer to a \c uint8_t which receives the current hour.
* \param[out] min Pointer to a \c uint8_t which receives the current minute.
* \param[out] sec Pointer to a \c uint8_t which receives the current sec.
*/
#define fat_get_datetime(year, month, day, hour, min, sec) \
get_datetime(year, month, day, hour, min, sec)
/* forward declaration for the above */
void get_datetime(uint16_t* year, uint8_t* month, uint8_t* day, uint8_t* hour, uint8_t* min, uint8_t* sec);
/**
* \ingroup fat_config
* Maximum number of filesystem handles.
*/
#define FAT_FS_COUNT 1
/**
* \ingroup fat_config
* Maximum number of file handles.
*/
#define FAT_FILE_COUNT 1
/**
* \ingroup fat_config
* Maximum number of directory handles.
*/
#define FAT_DIR_COUNT 2
/**
* @}
*/
#if FAT_FAT32_SUPPORT
typedef uint32_t cluster_t;
#else
typedef uint16_t cluster_t;
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,666 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <string.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include "fat.h"
#include "fat_config.h"
#include "partition.h"
#include "sd_raw.h"
#include "sd_raw_config.h"
#include "uart.h"
#define DEBUG 1
/**
* \mainpage MMC/SD/SDHC card library
*
* This project provides a general purpose library which implements read and write
* support for MMC, SD and SDHC memory cards.
*
* It includes
* - low-level \link sd_raw MMC, SD and SDHC read/write routines \endlink
* - \link partition partition table support \endlink
* - a simple \link fat FAT16/FAT32 read/write implementation \endlink
*
* \section circuit The circuit
* The circuit which was mainly used during development consists of an Atmel AVR
* microcontroller with some passive components. It is quite simple and provides
* an easy test environment. The circuit which can be downloaded on the
* <a href="http://www.roland-riegel.de/sd-reader/">project homepage</a> has been
* improved with regard to operation stability.
*
* I used different microcontrollers during development, the ATmega8 with 8kBytes
* of flash, and its pin-compatible alternative, the ATmega168 with 16kBytes flash.
* The first one is the one I started with, but when I implemented FAT16 write
* support, I ran out of flash space and switched to the ATmega168. For FAT32, an
* ATmega328 is required.
*
* The circuit board is a self-made and self-soldered board consisting of a single
* copper layer and standard DIL components, except of the MMC/SD card connector.
*
* The connector is soldered to the bottom side of the board. It has a simple
* eject button which, when a card is inserted, needs some space beyond the connector
* itself. As an additional feature the connector has two electrical switches
* to detect wether a card is inserted and wether this card is write-protected.
*
* \section pictures Pictures
* \image html pic01.jpg "The circuit board used to implement and test this application."
* \image html pic02.jpg "The MMC/SD card connector on the soldering side of the circuit board."
*
* \section software The software
* The software is written in C (ISO C99). It might not be the smallest or
* the fastest one, but I think it is quite flexible. See the project's
* <a href="http://www.roland-riegel.de/sd-reader/benchmarks/">benchmark page</a> to get an
* idea of the possible data rates.
*
* I implemented an example application providing a simple command prompt which is accessible
* via the UART at 9600 Baud. With commands similiar to the Unix shell you can browse different
* directories, read and write files, create new ones and delete them again. Not all commands are
* available in all software configurations.
* - <tt>cat \<file\></tt>\n
* Writes a hexdump of \<file\> to the terminal.
* - <tt>cd \<directory\></tt>\n
* Changes current working directory to \<directory\>.
* - <tt>disk</tt>\n
* Shows card manufacturer, status, filesystem capacity and free storage space.
* - <tt>init</tt>\n
* Reinitializes and reopens the memory card.
* - <tt>ls</tt>\n
* Shows the content of the current directory.
* - <tt>mkdir \<directory\></tt>\n
* Creates a directory called \<directory\>.
* - <tt>mv \<file\> \<file_new\></tt>\n
* Renames \<file\> to \<file_new\>.
* - <tt>rm \<file\></tt>\n
* Deletes \<file\>.
* - <tt>sync</tt>\n
* Ensures all buffered data is written to the card.
* - <tt>touch \<file\></tt>\n
* Creates \<file\>.
* - <tt>write \<file\> \<offset\></tt>\n
* Writes text to \<file\>, starting from \<offset\>. The text is read
* from the UART, line by line. Finish with an empty line.
*
* \htmlonly
* <p>
* The following table shows some typical code sizes in bytes, using the 20090330 release with a
* buffered read-write MMC/SD configuration, FAT16 and static memory allocation:
* </p>
*
* <table border="1" cellpadding="2">
* <tr>
* <th>layer</th>
* <th>code size</th>
* <th>static RAM usage</th>
* </tr>
* <tr>
* <td>MMC/SD</td>
* <td align="right">2410</td>
* <td align="right">518</td>
* </tr>
* <tr>
* <td>Partition</td>
* <td align="right">456</td>
* <td align="right">17</td>
* </tr>
* <tr>
* <td>FAT16</td>
* <td align="right">7928</td>
* <td align="right">188</td>
* </tr>
* </table>
*
* <p>
* The static RAM is mostly used for buffering memory card access, which
* improves performance and reduces implementation complexity.
* </p>
*
* <p>
* Please note that the numbers above do not include the C library functions
* used, e.g. some string functions. These will raise the numbers somewhat
* if they are not already used in other program parts.
* </p>
*
* <p>
* When opening a partition, filesystem, file or directory, a little amount
* of RAM is used, as listed in the following table. Depending on the library
* configuration, the memory is either allocated statically or dynamically.
* </p>
*
* <table border="1" cellpadding="2">
* <tr>
* <th>descriptor</th>
* <th>dynamic/static RAM</th>
* </tr>
* <tr>
* <td>partition</td>
* <td align="right">17</td>
* </tr>
* <tr>
* <td>filesystem</td>
* <td align="right">26</td>
* </tr>
* <tr>
* <td>file</td>
* <td align="right">53</td>
* </tr>
* <tr>
* <td>directory</td>
* <td align="right">49</td>
* </tr>
* </table>
*
* \endhtmlonly
*
* \section adaptation Adapting the software to your needs
* The only hardware dependent part is the communication layer talking to the
* memory card. The other parts like partition table and FAT support are
* completely independent, you could use them even for managing Compact Flash
* cards or standard ATAPI hard disks.
*
* By changing the MCU* variables in the Makefile, you can use other Atmel
* microcontrollers or different clock speeds. You might also want to change
* the configuration defines in the files fat_config.h, partition_config.h,
* sd_raw_config.h and sd-reader_config.h. For example, you could disable
* write support completely if you only need read support.
*
* For further information, visit the project's
* <a href="http://www.roland-riegel.de/sd-reader/faq/">FAQ page</a>.
*
* \section bugs Bugs or comments?
* If you have comments or found a bug in the software - there might be some
* of them - you may contact me per mail at feedback@roland-riegel.de.
*
* \section acknowledgements Acknowledgements
* Thanks go to Ulrich Radig, who explained on his homepage how to interface
* MMC cards to the Atmel microcontroller (http://www.ulrichradig.de/).
* I adapted his work for my circuit.
*
* \section copyright Copyright 2006-2012 by Roland Riegel
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation (http://www.gnu.org/copyleft/gpl.html).
* At your option, you can alternatively redistribute and/or modify the following
* files under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation (http://www.gnu.org/copyleft/lgpl.html):
* - byteordering.c
* - byteordering.h
* - fat.c
* - fat.h
* - fat_config.h
* - partition.c
* - partition.h
* - partition_config.h
* - sd_raw.c
* - sd_raw.h
* - sd_raw_config.h
* - sd-reader_config.h
*/
static uint8_t read_line(char* buffer, uint8_t buffer_length);
static uint32_t strtolong(const char* str);
static 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);
static struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name);
static uint8_t print_disk_info(const struct fat_fs_struct* fs);
int main()
{
/* we will just use ordinary idle mode */
set_sleep_mode(SLEEP_MODE_IDLE);
/* setup uart */
uart_init();
while(1)
{
/* setup sd card slot */
if(!sd_raw_init())
{
#if DEBUG
uart_puts_p(PSTR("MMC/SD initialization failed\n"));
#endif
continue;
}
/* open first partition */
struct partition_struct* 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)
{
#if DEBUG
uart_puts_p(PSTR("opening partition failed\n"));
#endif
continue;
}
}
/* open file system */
struct fat_fs_struct* fs = fat_open(partition);
if(!fs)
{
#if DEBUG
uart_puts_p(PSTR("opening filesystem failed\n"));
#endif
continue;
}
/* open root directory */
struct fat_dir_entry_struct directory;
fat_get_dir_entry_of_path(fs, "/", &directory);
struct fat_dir_struct* dd = fat_open_dir(fs, &directory);
if(!dd)
{
#if DEBUG
uart_puts_p(PSTR("opening root directory failed\n"));
#endif
continue;
}
/* print some card information as a boot message */
print_disk_info(fs);
/* provide a simple shell */
char buffer[24];
while(1)
{
/* print prompt */
uart_putc('>');
uart_putc(' ');
/* read command */
char* command = buffer;
if(read_line(command, sizeof(buffer)) < 1)
continue;
/* execute command */
if(strcmp_P(command, PSTR("init")) == 0)
{
break;
}
else if(strncmp_P(command, PSTR("cd "), 3) == 0)
{
command += 3;
if(command[0] == '\0')
continue;
/* change directory */
struct fat_dir_entry_struct subdir_entry;
if(find_file_in_dir(fs, dd, command, &subdir_entry))
{
struct fat_dir_struct* dd_new = fat_open_dir(fs, &subdir_entry);
if(dd_new)
{
fat_close_dir(dd);
dd = dd_new;
continue;
}
}
uart_puts_p(PSTR("directory not found: "));
uart_puts(command);
uart_putc('\n');
}
else if(strcmp_P(command, PSTR("ls")) == 0)
{
/* print directory listing */
struct fat_dir_entry_struct dir_entry;
while(fat_read_dir(dd, &dir_entry))
{
uint8_t spaces = sizeof(dir_entry.long_name) - strlen(dir_entry.long_name) + 4;
uart_puts(dir_entry.long_name);
uart_putc(dir_entry.attributes & FAT_ATTRIB_DIR ? '/' : ' ');
while(spaces--)
uart_putc(' ');
uart_putdw_dec(dir_entry.file_size);
uart_putc('\n');
}
}
else if(strncmp_P(command, PSTR("cat "), 4) == 0)
{
command += 4;
if(command[0] == '\0')
continue;
/* search file in current directory and open it */
struct fat_file_struct* fd = open_file_in_dir(fs, dd, command);
if(!fd)
{
uart_puts_p(PSTR("error opening "));
uart_puts(command);
uart_putc('\n');
continue;
}
/* print file contents */
uint8_t buffer[8];
uint32_t offset = 0;
intptr_t count;
while((count = fat_read_file(fd, buffer, sizeof(buffer))) > 0)
{
uart_putdw_hex(offset);
uart_putc(':');
for(intptr_t i = 0; i < count; ++i)
{
uart_putc(' ');
uart_putc_hex(buffer[i]);
}
uart_putc('\n');
offset += 8;
}
fat_close_file(fd);
}
else if(strcmp_P(command, PSTR("disk")) == 0)
{
if(!print_disk_info(fs))
uart_puts_p(PSTR("error reading disk info\n"));
}
#if FAT_WRITE_SUPPORT
else if(strncmp_P(command, PSTR("rm "), 3) == 0)
{
command += 3;
if(command[0] == '\0')
continue;
struct fat_dir_entry_struct file_entry;
if(find_file_in_dir(fs, dd, command, &file_entry))
{
if(fat_delete_file(fs, &file_entry))
continue;
}
uart_puts_p(PSTR("error deleting file: "));
uart_puts(command);
uart_putc('\n');
}
else if(strncmp_P(command, PSTR("touch "), 6) == 0)
{
command += 6;
if(command[0] == '\0')
continue;
struct fat_dir_entry_struct file_entry;
if(!fat_create_file(dd, command, &file_entry))
{
uart_puts_p(PSTR("error creating file: "));
uart_puts(command);
uart_putc('\n');
}
}
else if(strncmp_P(command, PSTR("mv "), 3) == 0)
{
command += 3;
if(command[0] == '\0')
continue;
char* target = command;
while(*target != ' ' && *target != '\0')
++target;
if(*target == ' ')
*target++ = '\0';
else
continue;
struct fat_dir_entry_struct file_entry;
if(find_file_in_dir(fs, dd, command, &file_entry))
{
if(fat_move_file(fs, &file_entry, dd, target))
continue;
}
uart_puts_p(PSTR("error moving file: "));
uart_puts(command);
uart_putc('\n');
}
else if(strncmp_P(command, PSTR("write "), 6) == 0)
{
command += 6;
if(command[0] == '\0')
continue;
char* offset_value = command;
while(*offset_value != ' ' && *offset_value != '\0')
++offset_value;
if(*offset_value == ' ')
*offset_value++ = '\0';
else
continue;
/* search file in current directory and open it */
struct fat_file_struct* fd = open_file_in_dir(fs, dd, command);
if(!fd)
{
uart_puts_p(PSTR("error opening "));
uart_puts(command);
uart_putc('\n');
continue;
}
int32_t offset = strtolong(offset_value);
if(!fat_seek_file(fd, &offset, FAT_SEEK_SET))
{
uart_puts_p(PSTR("error seeking on "));
uart_puts(command);
uart_putc('\n');
fat_close_file(fd);
continue;
}
/* read text from the shell and write it to the file */
uint8_t data_len;
while(1)
{
/* give a different prompt */
uart_putc('<');
uart_putc(' ');
/* read one line of text */
data_len = read_line(buffer, sizeof(buffer));
if(!data_len)
break;
/* write text to file */
if(fat_write_file(fd, (uint8_t*) buffer, data_len) != data_len)
{
uart_puts_p(PSTR("error writing to file\n"));
break;
}
}
fat_close_file(fd);
}
else if(strncmp_P(command, PSTR("mkdir "), 6) == 0)
{
command += 6;
if(command[0] == '\0')
continue;
struct fat_dir_entry_struct dir_entry;
if(!fat_create_dir(dd, command, &dir_entry))
{
uart_puts_p(PSTR("error creating directory: "));
uart_puts(command);
uart_putc('\n');
}
}
#endif
#if SD_RAW_WRITE_BUFFERING
else if(strcmp_P(command, PSTR("sync")) == 0)
{
if(!sd_raw_sync())
uart_puts_p(PSTR("error syncing disk\n"));
}
#endif
else
{
uart_puts_p(PSTR("unknown command: "));
uart_puts(command);
uart_putc('\n');
}
}
/* close directory */
fat_close_dir(dd);
/* close file system */
fat_close(fs);
/* close partition */
partition_close(partition);
}
return 0;
}
uint8_t read_line(char* buffer, uint8_t buffer_length)
{
memset(buffer, 0, buffer_length);
uint8_t read_length = 0;
while(read_length < buffer_length - 1)
{
uint8_t c = uart_getc();
if(c == 0x08 || c == 0x7f)
{
if(read_length < 1)
continue;
--read_length;
buffer[read_length] = '\0';
uart_putc(0x08);
uart_putc(' ');
uart_putc(0x08);
continue;
}
uart_putc(c);
if(c == '\n')
{
buffer[read_length] = '\0';
break;
}
else
{
buffer[read_length] = c;
++read_length;
}
}
return read_length;
}
uint32_t strtolong(const char* str)
{
uint32_t l = 0;
while(*str >= '0' && *str <= '9')
l = l * 10 + (*str++ - '0');
return l;
}
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)
{
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);
}
uint8_t print_disk_info(const struct fat_fs_struct* fs)
{
if(!fs)
return 0;
struct sd_raw_info disk_info;
if(!sd_raw_get_info(&disk_info))
return 0;
uart_puts_p(PSTR("manuf: 0x")); uart_putc_hex(disk_info.manufacturer); uart_putc('\n');
uart_puts_p(PSTR("oem: ")); uart_puts((char*) disk_info.oem); uart_putc('\n');
uart_puts_p(PSTR("prod: ")); uart_puts((char*) disk_info.product); uart_putc('\n');
uart_puts_p(PSTR("rev: ")); uart_putc_hex(disk_info.revision); uart_putc('\n');
uart_puts_p(PSTR("serial: 0x")); uart_putdw_hex(disk_info.serial); uart_putc('\n');
uart_puts_p(PSTR("date: ")); uart_putw_dec(disk_info.manufacturing_month); uart_putc('/');
uart_putw_dec(disk_info.manufacturing_year); uart_putc('\n');
uart_puts_p(PSTR("size: ")); uart_putdw_dec(disk_info.capacity / 1024 / 1024); uart_puts_p(PSTR("MB\n"));
uart_puts_p(PSTR("copy: ")); uart_putw_dec(disk_info.flag_copy); uart_putc('\n');
uart_puts_p(PSTR("wr.pr.: ")); uart_putw_dec(disk_info.flag_write_protect_temp); uart_putc('/');
uart_putw_dec(disk_info.flag_write_protect); uart_putc('\n');
uart_puts_p(PSTR("format: ")); uart_putw_dec(disk_info.format); uart_putc('\n');
uart_puts_p(PSTR("free: ")); uart_putdw_dec(fat_get_fs_free(fs)); uart_putc('/');
uart_putdw_dec(fat_get_fs_size(fs)); uart_putc('\n');
return 1;
}
#if FAT_DATETIME_SUPPORT
void get_datetime(uint16_t* year, uint8_t* month, uint8_t* day, uint8_t* hour, uint8_t* min, uint8_t* sec)
{
*year = 2007;
*month = 1;
*day = 1;
*hour = 0;
*min = 0;
*sec = 0;
}
#endif

Binary file not shown.

View File

@ -0,0 +1,155 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#include "byteordering.h"
#include "partition.h"
#include "partition_config.h"
#include "sd-reader_config.h"
#include <string.h>
#if USE_DYNAMIC_MEMORY
#include <stdlib.h>
#endif
/**
* \addtogroup partition Partition table support
*
* Support for reading partition tables and access to partitions.
*
* @{
*/
/**
* \file
* Partition table implementation (license: GPLv2 or LGPLv2.1)
*
* \author Roland Riegel
*/
/**
* \addtogroup partition_config Configuration of partition table support
* Preprocessor defines to configure the partition support.
*/
#if !USE_DYNAMIC_MEMORY
static struct partition_struct partition_handles[PARTITION_COUNT];
#endif
/**
* Opens a partition.
*
* Opens a partition by its index number and returns a partition
* handle which describes the opened partition.
*
* \note This function does not support extended partitions.
*
* \param[in] device_read A function pointer which is used to read from the disk.
* \param[in] device_read_interval A function pointer which is used to read in constant intervals from the disk.
* \param[in] device_write A function pointer which is used to write to the disk.
* \param[in] device_write_interval A function pointer which is used to write a data stream to disk.
* \param[in] index The index of the partition which should be opened, range 0 to 3.
* A negative value is allowed as well. In this case, the partition opened is
* not checked for existance, begins at offset zero, has a length of zero
* and is of an unknown type. Use this in case you want to open the whole device
* as a single partition (e.g. for "super floppy" use).
* \returns 0 on failure, a partition descriptor on success.
* \see partition_close
*/
struct partition_struct* partition_open(device_read_t device_read, device_read_interval_t device_read_interval, device_write_t device_write, device_write_interval_t device_write_interval, int8_t index)
{
struct partition_struct* new_partition = 0;
uint8_t buffer[0x10];
if(!device_read || !device_read_interval || index >= 4)
return 0;
if(index >= 0)
{
/* read specified partition table index */
if(!device_read(0x01be + index * 0x10, buffer, sizeof(buffer)))
return 0;
/* abort on empty partition entry */
if(buffer[4] == 0x00)
return 0;
}
/* allocate partition descriptor */
#if USE_DYNAMIC_MEMORY
new_partition = malloc(sizeof(*new_partition));
if(!new_partition)
return 0;
#else
new_partition = partition_handles;
uint8_t i;
for(i = 0; i < PARTITION_COUNT; ++i)
{
if(new_partition->type == PARTITION_TYPE_FREE)
break;
++new_partition;
}
if(i >= PARTITION_COUNT)
return 0;
#endif
memset(new_partition, 0, sizeof(*new_partition));
/* fill partition descriptor */
new_partition->device_read = device_read;
new_partition->device_read_interval = device_read_interval;
new_partition->device_write = device_write;
new_partition->device_write_interval = device_write_interval;
if(index >= 0)
{
new_partition->type = buffer[4];
new_partition->offset = read32(&buffer[8]);
new_partition->length = read32(&buffer[12]);
}
else
{
new_partition->type = 0xff;
}
return new_partition;
}
/**
* Closes a partition.
*
* This function destroys a partition descriptor which was
* previously obtained from a call to partition_open().
* When this function returns, the given descriptor will be
* invalid.
*
* \param[in] partition The partition descriptor to destroy.
* \returns 0 on failure, 1 on success.
* \see partition_open
*/
uint8_t partition_close(struct partition_struct* partition)
{
if(!partition)
return 0;
/* destroy partition descriptor */
#if USE_DYNAMIC_MEMORY
free(partition);
#else
partition->type = PARTITION_TYPE_FREE;
#endif
return 1;
}
/**
* @}
*/

View File

@ -0,0 +1,212 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef PARTITION_H
#define PARTITION_H
#include <stdint.h>
#include "sd_raw_config.h"
#include "partition_config.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup partition
*
* @{
*/
/**
* \file
* Partition table header (license: GPLv2 or LGPLv2.1)
*
* \author Roland Riegel
*/
/**
* The partition table entry is not used.
*/
#define PARTITION_TYPE_FREE 0x00
/**
* The partition contains a FAT12 filesystem.
*/
#define PARTITION_TYPE_FAT12 0x01
/**
* The partition contains a FAT16 filesystem with 32MB maximum.
*/
#define PARTITION_TYPE_FAT16_32MB 0x04
/**
* The partition is an extended partition with its own partition table.
*/
#define PARTITION_TYPE_EXTENDED 0x05
/**
* The partition contains a FAT16 filesystem.
*/
#define PARTITION_TYPE_FAT16 0x06
/**
* The partition contains a FAT32 filesystem.
*/
#define PARTITION_TYPE_FAT32 0x0b
/**
* The partition contains a FAT32 filesystem with LBA.
*/
#define PARTITION_TYPE_FAT32_LBA 0x0c
/**
* The partition contains a FAT16 filesystem with LBA.
*/
#define PARTITION_TYPE_FAT16_LBA 0x0e
/**
* The partition is an extended partition with LBA.
*/
#define PARTITION_TYPE_EXTENDED_LBA 0x0f
/**
* The partition has an unknown type.
*/
#define PARTITION_TYPE_UNKNOWN 0xff
/**
* A function pointer used to read from the partition.
*
* \param[in] offset The offset on the device where to start reading.
* \param[out] buffer The buffer into which to place the data.
* \param[in] length The count of bytes to read.
*/
typedef uint8_t (*device_read_t)(offset_t offset, uint8_t* buffer, uintptr_t length);
/**
* A function pointer passed to a \c device_read_interval_t.
*
* \param[in] buffer The buffer which contains the data just read.
* \param[in] offset The offset from which the data in \c buffer was read.
* \param[in] p An opaque pointer.
* \see device_read_interval_t
*/
typedef uint8_t (*device_read_callback_t)(uint8_t* buffer, offset_t offset, void* p);
/**
* A function pointer used to continuously read units of \c interval bytes
* and call a callback function.
*
* This function starts reading at the specified offset. Every \c interval bytes,
* it calls the callback function with the associated data buffer.
*
* By returning zero, the callback may stop reading.
*
* \param[in] offset Offset from which to start reading.
* \param[in] buffer Pointer to a buffer which is at least interval bytes in size.
* \param[in] interval Number of bytes to read before calling the callback function.
* \param[in] length Number of bytes to read altogether.
* \param[in] callback The function to call every interval bytes.
* \param[in] p An opaque pointer directly passed to the callback function.
* \returns 0 on failure, 1 on success
* \see device_read_t
*/
typedef uint8_t (*device_read_interval_t)(offset_t offset, uint8_t* buffer, uintptr_t interval, uintptr_t length, device_read_callback_t callback, void* p);
/**
* A function pointer used to write to the partition.
*
* \param[in] offset The offset on the device where to start writing.
* \param[in] buffer The buffer which to write.
* \param[in] length The count of bytes to write.
*/
typedef uint8_t (*device_write_t)(offset_t offset, const uint8_t* buffer, uintptr_t length);
/**
* A function pointer passed to a \c device_write_interval_t.
*
* \param[in] buffer The buffer which receives the data to write.
* \param[in] offset The offset to which the data in \c buffer will be written.
* \param[in] p An opaque pointer.
* \returns The number of bytes put into \c buffer
* \see device_write_interval_t
*/
typedef uintptr_t (*device_write_callback_t)(uint8_t* buffer, offset_t offset, void* p);
/**
* A function pointer used to continuously write a data stream obtained from
* a callback function.
*
* This function starts writing at the specified offset. To obtain the
* next bytes to write, it calls the callback function. The callback fills the
* provided data buffer and returns the number of bytes it has put into the buffer.
*
* By returning zero, the callback may stop writing.
*
* \param[in] offset Offset where to start writing.
* \param[in] buffer Pointer to a buffer which is used for the callback function.
* \param[in] length Number of bytes to write in total. May be zero for endless writes.
* \param[in] callback The function used to obtain the bytes to write.
* \param[in] p An opaque pointer directly passed to the callback function.
* \returns 0 on failure, 1 on success
* \see device_write_t
*/
typedef uint8_t (*device_write_interval_t)(offset_t offset, uint8_t* buffer, uintptr_t length, device_write_callback_t callback, void* p);
/**
* Describes a partition.
*/
struct partition_struct
{
/**
* The function which reads data from the partition.
*
* \note The offset given to this function is relative to the whole disk,
* not to the start of the partition.
*/
device_read_t device_read;
/**
* The function which repeatedly reads a constant amount of data from the partition.
*
* \note The offset given to this function is relative to the whole disk,
* not to the start of the partition.
*/
device_read_interval_t device_read_interval;
/**
* The function which writes data to the partition.
*
* \note The offset given to this function is relative to the whole disk,
* not to the start of the partition.
*/
device_write_t device_write;
/**
* The function which repeatedly writes data to the partition.
*
* \note The offset given to this function is relative to the whole disk,
* not to the start of the partition.
*/
device_write_interval_t device_write_interval;
/**
* The type of the partition.
*
* Compare this value to the PARTITION_TYPE_* constants.
*/
uint8_t type;
/**
* The offset in blocks on the disk where this partition starts.
*/
uint32_t offset;
/**
* The length in blocks of this partition.
*/
uint32_t length;
};
struct partition_struct* partition_open(device_read_t device_read, device_read_interval_t device_read_interval, device_write_t device_write, device_write_interval_t device_write_interval, int8_t index);
uint8_t partition_close(struct partition_struct* partition);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef PARTITION_CONFIG_H
#define PARTITION_CONFIG_H
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup partition
*
* @{
*/
/**
* \file
* Partition configuration (license: GPLv2 or LGPLv2.1)
*/
/**
* \ingroup partition_config
* Maximum number of partition handles.
*/
#define PARTITION_COUNT 1
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,735 @@
Archive member included to satisfy reference by file (symbol)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
fat.o (__mulsi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
uart.o (__udivmodhi4)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
fat.o (__divmodhi4)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
uart.o (__udivmodsi4)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o (exit)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
sd_raw.o (__tablejump2__)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
fat.o (__do_copy_data)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
partition.o (__do_clear_bss)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
fat.o (__umulhisi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
uart.o (__muluhisi3)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
main.o (strcmp_P)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
main.o (strncmp_P)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
sd_raw.o (memcpy)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
fat.o (memset)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
fat.o (strchr)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
fat.o (strcmp)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
fat.o (strncmp)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
fat.o (strncpy)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
fat.o (strrchr)
Memory Configuration
Name Origin Length Attributes
text 0x0000000000000000 0x0000000000020000 xr
data 0x0000000000800060 0x000000000000ffa0 rw !x
eeprom 0x0000000000810000 0x0000000000010000 rw !x
fuse 0x0000000000820000 0x0000000000000003 rw !x
lock 0x0000000000830000 0x0000000000000400 rw !x
signature 0x0000000000840000 0x0000000000000400 rw !x
user_signatures 0x0000000000850000 0x0000000000000400 rw !x
*default* 0x0000000000000000 0xffffffffffffffff
Linker script and memory map
Address of section .data set to 0x800100
LOAD /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
LOAD partition.o
LOAD sd_raw.o
LOAD uart.o
LOAD byteordering.o
LOAD fat.o
LOAD main.o
START GROUP
LOAD /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a
LOAD /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libm.a
LOAD /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a
LOAD /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libatmega168.a
END GROUP
0x0000000000020000 __TEXT_REGION_LENGTH__ = DEFINED (__TEXT_REGION_LENGTH__)?__TEXT_REGION_LENGTH__:0x20000
0x000000000000ffa0 __DATA_REGION_LENGTH__ = DEFINED (__DATA_REGION_LENGTH__)?__DATA_REGION_LENGTH__:0xffa0
0x0000000000010000 __EEPROM_REGION_LENGTH__ = DEFINED (__EEPROM_REGION_LENGTH__)?__EEPROM_REGION_LENGTH__:0x10000
[0x0000000000000003] __FUSE_REGION_LENGTH__ = DEFINED (__FUSE_REGION_LENGTH__)?__FUSE_REGION_LENGTH__:0x400
0x0000000000000400 __LOCK_REGION_LENGTH__ = DEFINED (__LOCK_REGION_LENGTH__)?__LOCK_REGION_LENGTH__:0x400
0x0000000000000400 __SIGNATURE_REGION_LENGTH__ = DEFINED (__SIGNATURE_REGION_LENGTH__)?__SIGNATURE_REGION_LENGTH__:0x400
0x0000000000000400 __USER_SIGNATURE_REGION_LENGTH__ = DEFINED (__USER_SIGNATURE_REGION_LENGTH__)?__USER_SIGNATURE_REGION_LENGTH__:0x400
.hash
*(.hash)
.dynsym
*(.dynsym)
.dynstr
*(.dynstr)
.gnu.version
*(.gnu.version)
.gnu.version_d
*(.gnu.version_d)
.gnu.version_r
*(.gnu.version_r)
.rel.init
*(.rel.init)
.rela.init
*(.rela.init)
.rel.text
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
.rela.text
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
.rel.fini
*(.rel.fini)
.rela.fini
*(.rela.fini)
.rel.rodata
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
.rela.rodata
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
.rel.data
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
.rela.data
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
.rel.ctors
*(.rel.ctors)
.rela.ctors
*(.rela.ctors)
.rel.dtors
*(.rel.dtors)
.rela.dtors
*(.rela.dtors)
.rel.got
*(.rel.got)
.rela.got
*(.rela.got)
.rel.bss
*(.rel.bss)
.rela.bss
*(.rela.bss)
.rel.plt
*(.rel.plt)
.rela.plt
*(.rela.plt)
.text 0x0000000000000000 0x3574
*(.vectors)
.vectors 0x0000000000000000 0x68 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x0000000000000000 __vectors
0x0000000000000000 __vector_default
*(.vectors)
*(.progmem.gcc*)
.progmem.gcc_sw_table
0x0000000000000068 0x1e sd_raw.o
0x0000000000000086 . = ALIGN (0x2)
0x0000000000000086 __trampolines_start = .
*(.trampolines)
.trampolines 0x0000000000000086 0x0 linker stubs
*(.trampolines*)
0x0000000000000086 __trampolines_end = .
*libprintf_flt.a:*(.progmem.data)
*libc.a:*(.progmem.data)
*(.progmem*)
.progmem.data 0x0000000000000086 0x20c main.o
0x0000000000000292 . = ALIGN (0x2)
*(.jumptables)
*(.jumptables*)
*(.lowtext)
*(.lowtext*)
0x0000000000000292 __ctors_start = .
*(.ctors)
0x0000000000000292 __ctors_end = .
0x0000000000000292 __dtors_start = .
*(.dtors)
0x0000000000000292 __dtors_end = .
SORT(*)(.ctors)
SORT(*)(.dtors)
*(.init0)
.init0 0x0000000000000292 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x0000000000000292 __init
*(.init0)
*(.init1)
*(.init1)
*(.init2)
.init2 0x0000000000000292 0xc /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
*(.init2)
*(.init3)
*(.init3)
*(.init4)
.init4 0x000000000000029e 0x16 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x000000000000029e __do_copy_data
.init4 0x00000000000002b4 0x10 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000002b4 __do_clear_bss
*(.init4)
*(.init5)
*(.init5)
*(.init6)
*(.init6)
*(.init7)
*(.init7)
*(.init8)
*(.init8)
*(.init9)
.init9 0x00000000000002c4 0x8 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
*(.init9)
*(.text)
.text 0x00000000000002cc 0x4 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x00000000000002cc __vector_22
0x00000000000002cc __vector_1
0x00000000000002cc __vector_24
0x00000000000002cc __vector_12
0x00000000000002cc __bad_interrupt
0x00000000000002cc __vector_6
0x00000000000002cc __vector_3
0x00000000000002cc __vector_23
0x00000000000002cc __vector_25
0x00000000000002cc __vector_11
0x00000000000002cc __vector_13
0x00000000000002cc __vector_17
0x00000000000002cc __vector_19
0x00000000000002cc __vector_7
0x00000000000002cc __vector_5
0x00000000000002cc __vector_4
0x00000000000002cc __vector_9
0x00000000000002cc __vector_2
0x00000000000002cc __vector_21
0x00000000000002cc __vector_15
0x00000000000002cc __vector_8
0x00000000000002cc __vector_14
0x00000000000002cc __vector_10
0x00000000000002cc __vector_16
0x00000000000002cc __vector_20
.text 0x00000000000002d0 0x126 partition.o
0x00000000000002d0 partition_open
0x00000000000003e6 partition_close
.text 0x00000000000003f6 0x7de sd_raw.o
0x0000000000000484 sd_raw_available
0x0000000000000490 sd_raw_locked
0x000000000000049e sd_raw_sync
0x00000000000004d2 sd_raw_read
0x0000000000000602 sd_raw_init
0x0000000000000714 sd_raw_read_interval
0x00000000000007ba sd_raw_write
0x0000000000000930 sd_raw_write_interval
0x00000000000009d8 sd_raw_get_info
.text 0x0000000000000bd4 0x224 uart.o
0x0000000000000bd4 uart_init
0x0000000000000bec uart_putc
0x0000000000000c0a uart_putc_hex
0x0000000000000c34 uart_putw_hex
0x0000000000000c46 uart_putdw_hex
0x0000000000000c66 uart_putw_dec
0x0000000000000cde uart_putdw_dec
0x0000000000000d96 uart_puts
0x0000000000000dae uart_puts_p
0x0000000000000dcc uart_getc
0x0000000000000df6 __vector_18
.text 0x0000000000000df8 0x28 byteordering.o
0x0000000000000df8 read16
0x0000000000000e00 read32
0x0000000000000e0c write16
0x0000000000000e14 write32
.text 0x0000000000000e20 0x1dd4 fat.o
0x00000000000018da fat_open
0x0000000000001bec fat_close
0x0000000000001bf8 fat_open_file
0x0000000000001c58 fat_close_file
0x0000000000001c64 fat_read_file
0x0000000000001e6e fat_write_file
0x00000000000020f6 fat_resize_file
0x00000000000022de fat_seek_file
0x0000000000002380 fat_open_dir
0x00000000000023e8 fat_close_dir
0x00000000000023f4 fat_reset_dir
0x000000000000240e fat_read_dir
0x000000000000259c fat_get_dir_entry_of_path
0x00000000000026ae fat_create_file
0x000000000000275c fat_delete_file
0x0000000000002848 fat_move_file
0x0000000000002934 fat_create_dir
0x0000000000002aa2 fat_get_fs_size
0x0000000000002ad6 fat_get_fs_free
.text 0x0000000000002bf4 0x23a main.o
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
0x0000000000002e2e . = ALIGN (0x2)
*(.text.*)
.text.startup 0x0000000000002e2e 0x588 main.o
0x0000000000002e2e main
.text.libgcc.mul
0x00000000000033b6 0x20 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x00000000000033b6 __mulsi3
.text.libgcc.div
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc 0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.prologue
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.builtins
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.fmul
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.fixed
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.mul
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.div
0x00000000000033d6 0x28 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x00000000000033d6 __udivmodhi4
.text.libgcc 0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.prologue
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.builtins
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.fmul
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.fixed
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.mul
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text.libgcc.div
0x00000000000033fe 0x28 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x00000000000033fe __divmodhi4
0x00000000000033fe _div
.text.libgcc 0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text.libgcc.prologue
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text.libgcc.builtins
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text.libgcc.fmul
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text.libgcc.fixed
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text.libgcc.mul
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.div
0x0000000000003426 0x44 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x0000000000003426 __udivmodsi4
.text.libgcc 0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.prologue
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.builtins
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.fmul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.fixed
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.mul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.div
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc 0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.prologue
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.builtins
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.fmul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.fixed
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.mul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.div
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc 0x000000000000346a 0xc /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x000000000000346a __tablejump2__
.text.libgcc.prologue
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.builtins
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.fmul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.fixed
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.mul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.div
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc 0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.prologue
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.builtins
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.fmul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.fixed
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.mul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.div
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc 0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.prologue
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.builtins
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.fmul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.fixed
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.mul
0x0000000000003476 0x1e /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x0000000000003476 __umulhisi3
.text.libgcc.div
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc 0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.prologue
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.builtins
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.fmul
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.fixed
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.mul
0x0000000000003494 0x16 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x0000000000003494 __muluhisi3
.text.libgcc.div
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc 0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.prologue
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.builtins
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.fmul
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.fixed
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.avr-libc
0x00000000000034aa 0x12 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
0x00000000000034aa strcmp_P
.text.avr-libc
0x00000000000034bc 0x1c /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
0x00000000000034bc strncmp_P
.text.avr-libc
0x00000000000034d8 0x12 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
0x00000000000034d8 memcpy
.text.avr-libc
0x00000000000034ea 0xe /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
0x00000000000034ea memset
.text.avr-libc
0x00000000000034f8 0x16 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
0x00000000000034f8 strchr
.text.avr-libc
0x000000000000350e 0x12 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
0x000000000000350e strcmp
.text.avr-libc
0x0000000000003520 0x1c /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
0x0000000000003520 strncmp
.text.avr-libc
0x000000000000353c 0x1e /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
0x000000000000353c strncpy
.text.avr-libc
0x000000000000355a 0x16 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
0x000000000000355a strrchr
0x0000000000003570 . = ALIGN (0x2)
*(.fini9)
.fini9 0x0000000000003570 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x0000000000003570 exit
0x0000000000003570 _exit
*(.fini9)
*(.fini8)
*(.fini8)
*(.fini7)
*(.fini7)
*(.fini6)
*(.fini6)
*(.fini5)
*(.fini5)
*(.fini4)
*(.fini4)
*(.fini3)
*(.fini3)
*(.fini2)
*(.fini2)
*(.fini1)
*(.fini1)
*(.fini0)
.fini0 0x0000000000003570 0x4 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
*(.fini0)
0x0000000000003574 _etext = .
.data 0x0000000000800100 0x10 load address 0x0000000000003574
0x0000000000800100 PROVIDE (__data_start, .)
*(.data)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.data 0x0000000000800100 0x0 partition.o
.data 0x0000000000800100 0x0 sd_raw.o
.data 0x0000000000800100 0x0 uart.o
.data 0x0000000000800100 0x0 byteordering.o
.data 0x0000000000800100 0x0 fat.o
.data 0x0000000000800100 0x0 main.o
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
*(.data*)
*(.rodata)
.rodata 0x0000000000800100 0xd fat.o
*(.rodata*)
.rodata.str1.1
0x000000000080010d 0x2 main.o
*(.gnu.linkonce.d*)
0x0000000000800110 . = ALIGN (0x2)
*fill* 0x000000000080010f 0x1
0x0000000000800110 _edata = .
0x0000000000800110 PROVIDE (__data_end, .)
.bss 0x0000000000800110 0x2c8
0x0000000000800110 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x0000000000800110 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.bss 0x0000000000800110 0x11 partition.o
.bss 0x0000000000800121 0x206 sd_raw.o
.bss 0x0000000000800327 0x0 uart.o
.bss 0x0000000000800327 0x0 byteordering.o
.bss 0x0000000000800327 0xb1 fat.o
.bss 0x00000000008003d8 0x0 main.o
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
*(.bss*)
*(COMMON)
0x00000000008003d8 PROVIDE (__bss_end, .)
0x0000000000003574 __data_load_start = LOADADDR (.data)
0x0000000000003584 __data_load_end = (__data_load_start + SIZEOF (.data))
.noinit 0x00000000008003d8 0x0
[!provide] PROVIDE (__noinit_start, .)
*(.noinit*)
[!provide] PROVIDE (__noinit_end, .)
0x00000000008003d8 _end = .
[!provide] PROVIDE (__heap_start, .)
.eeprom 0x0000000000810000 0x0
*(.eeprom*)
0x0000000000810000 __eeprom_end = .
.fuse
*(.fuse)
*(.lfuse)
*(.hfuse)
*(.efuse)
.lock
*(.lock*)
.signature
*(.signature*)
.user_signatures
*(.user_signatures*)
.stab 0x0000000000000000 0x67bc
*(.stab)
.stab 0x0000000000000000 0x6e4 partition.o
.stab 0x00000000000006e4 0x1350 sd_raw.o
0x1500 (size before relaxing)
.stab 0x0000000000001a34 0xa20 uart.o
0xbf4 (size before relaxing)
.stab 0x0000000000002454 0x414 byteordering.o
0x594 (size before relaxing)
.stab 0x0000000000002868 0x2fdc fat.o
0x31f8 (size before relaxing)
.stab 0x0000000000005844 0xf78 main.o
0x1200 (size before relaxing)
.stabstr 0x0000000000000000 0x2a7b
*(.stabstr)
.stabstr 0x0000000000000000 0x2a7b partition.o
.stab.excl
*(.stab.excl)
.stab.exclstr
*(.stab.exclstr)
.stab.index
*(.stab.index)
.stab.indexstr
*(.stab.indexstr)
.comment 0x0000000000000000 0x11
*(.comment)
.comment 0x0000000000000000 0x11 partition.o
0x12 (size before relaxing)
.comment 0x0000000000000011 0x12 sd_raw.o
.comment 0x0000000000000011 0x12 uart.o
.comment 0x0000000000000011 0x12 byteordering.o
.comment 0x0000000000000011 0x12 fat.o
.comment 0x0000000000000011 0x12 main.o
.note.gnu.avr.deviceinfo
0x0000000000000000 0x3c
.note.gnu.avr.deviceinfo
0x0000000000000000 0x3c /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.note.gnu.build-id
*(.note.gnu.build-id)
.debug
*(.debug)
.line
*(.line)
.debug_srcinfo
*(.debug_srcinfo)
.debug_sfnames
*(.debug_sfnames)
.debug_aranges
*(.debug_aranges)
.debug_pubnames
*(.debug_pubnames)
.debug_info 0x0000000000000000 0x5f4
*(.debug_info .gnu.linkonce.wi.*)
.debug_info 0x0000000000000000 0x5f4 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.debug_abbrev 0x0000000000000000 0x5a2
*(.debug_abbrev)
.debug_abbrev 0x0000000000000000 0x5a2 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.debug_line 0x0000000000000000 0x1a
*(.debug_line .debug_line.* .debug_line_end)
.debug_line 0x0000000000000000 0x1a /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.debug_frame
*(.debug_frame)
.debug_str 0x0000000000000000 0x208
*(.debug_str)
.debug_str 0x0000000000000000 0x208 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.debug_loc
*(.debug_loc)
.debug_macinfo
*(.debug_macinfo)
.debug_weaknames
*(.debug_weaknames)
.debug_funcnames
*(.debug_funcnames)
.debug_typenames
*(.debug_typenames)
.debug_varnames
*(.debug_varnames)
.debug_pubtypes
*(.debug_pubtypes)
.debug_ranges
*(.debug_ranges)
.debug_macro
*(.debug_macro)
OUTPUT(sd-reader.out elf32-avr)
LOAD linker stubs

Binary file not shown.

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef SD_READER_CONFIG_H
#define SD_READER_CONFIG_H
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup config Sd-reader configuration
*
* @{
*/
/**
* \file
* Common sd-reader configuration used by all modules (license: GPLv2 or LGPLv2.1)
*
* \note This file contains only configuration items relevant to
* all sd-reader implementation files. For module specific configuration
* options, please see the files fat_config.h, partition_config.h
* and sd_raw_config.h.
*/
/**
* Controls allocation of memory.
*
* Set to 1 to use malloc()/free() for allocation of structures
* like file and directory handles, set to 0 to use pre-allocated
* fixed-size handle arrays.
*/
#define USE_DYNAMIC_MEMORY 0
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,998 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#include <string.h>
#include <avr/io.h>
#include "sd_raw.h"
/**
* \addtogroup sd_raw MMC/SD/SDHC card raw access
*
* This module implements read and write access to MMC, SD
* and SDHC cards. It serves as a low-level driver for the
* higher level modules such as partition and file system
* access.
*
* @{
*/
/**
* \file
* MMC/SD/SDHC raw access implementation (license: GPLv2 or LGPLv2.1)
*
* \author Roland Riegel
*/
/**
* \addtogroup sd_raw_config MMC/SD configuration
* Preprocessor defines to configure the MMC/SD support.
*/
/**
* @}
*/
/* commands available in SPI mode */
/* CMD0: response R1 */
#define CMD_GO_IDLE_STATE 0x00
/* CMD1: response R1 */
#define CMD_SEND_OP_COND 0x01
/* CMD8: response R7 */
#define CMD_SEND_IF_COND 0x08
/* CMD9: response R1 */
#define CMD_SEND_CSD 0x09
/* CMD10: response R1 */
#define CMD_SEND_CID 0x0a
/* CMD12: response R1 */
#define CMD_STOP_TRANSMISSION 0x0c
/* CMD13: response R2 */
#define CMD_SEND_STATUS 0x0d
/* CMD16: arg0[31:0]: block length, response R1 */
#define CMD_SET_BLOCKLEN 0x10
/* CMD17: arg0[31:0]: data address, response R1 */
#define CMD_READ_SINGLE_BLOCK 0x11
/* CMD18: arg0[31:0]: data address, response R1 */
#define CMD_READ_MULTIPLE_BLOCK 0x12
/* CMD24: arg0[31:0]: data address, response R1 */
#define CMD_WRITE_SINGLE_BLOCK 0x18
/* CMD25: arg0[31:0]: data address, response R1 */
#define CMD_WRITE_MULTIPLE_BLOCK 0x19
/* CMD27: response R1 */
#define CMD_PROGRAM_CSD 0x1b
/* CMD28: arg0[31:0]: data address, response R1b */
#define CMD_SET_WRITE_PROT 0x1c
/* CMD29: arg0[31:0]: data address, response R1b */
#define CMD_CLR_WRITE_PROT 0x1d
/* CMD30: arg0[31:0]: write protect data address, response R1 */
#define CMD_SEND_WRITE_PROT 0x1e
/* CMD32: arg0[31:0]: data address, response R1 */
#define CMD_TAG_SECTOR_START 0x20
/* CMD33: arg0[31:0]: data address, response R1 */
#define CMD_TAG_SECTOR_END 0x21
/* CMD34: arg0[31:0]: data address, response R1 */
#define CMD_UNTAG_SECTOR 0x22
/* CMD35: arg0[31:0]: data address, response R1 */
#define CMD_TAG_ERASE_GROUP_START 0x23
/* CMD36: arg0[31:0]: data address, response R1 */
#define CMD_TAG_ERASE_GROUP_END 0x24
/* CMD37: arg0[31:0]: data address, response R1 */
#define CMD_UNTAG_ERASE_GROUP 0x25
/* CMD38: arg0[31:0]: stuff bits, response R1b */
#define CMD_ERASE 0x26
/* ACMD41: arg0[31:0]: OCR contents, response R1 */
#define CMD_SD_SEND_OP_COND 0x29
/* CMD42: arg0[31:0]: stuff bits, response R1b */
#define CMD_LOCK_UNLOCK 0x2a
/* CMD55: arg0[31:0]: stuff bits, response R1 */
#define CMD_APP 0x37
/* CMD58: arg0[31:0]: stuff bits, response R3 */
#define CMD_READ_OCR 0x3a
/* CMD59: arg0[31:1]: stuff bits, arg0[0:0]: crc option, response R1 */
#define CMD_CRC_ON_OFF 0x3b
/* command responses */
/* R1: size 1 byte */
#define R1_IDLE_STATE 0
#define R1_ERASE_RESET 1
#define R1_ILL_COMMAND 2
#define R1_COM_CRC_ERR 3
#define R1_ERASE_SEQ_ERR 4
#define R1_ADDR_ERR 5
#define R1_PARAM_ERR 6
/* R1b: equals R1, additional busy bytes */
/* R2: size 2 bytes */
#define R2_CARD_LOCKED 0
#define R2_WP_ERASE_SKIP 1
#define R2_ERR 2
#define R2_CARD_ERR 3
#define R2_CARD_ECC_FAIL 4
#define R2_WP_VIOLATION 5
#define R2_INVAL_ERASE 6
#define R2_OUT_OF_RANGE 7
#define R2_CSD_OVERWRITE 7
#define R2_IDLE_STATE (R1_IDLE_STATE + 8)
#define R2_ERASE_RESET (R1_ERASE_RESET + 8)
#define R2_ILL_COMMAND (R1_ILL_COMMAND + 8)
#define R2_COM_CRC_ERR (R1_COM_CRC_ERR + 8)
#define R2_ERASE_SEQ_ERR (R1_ERASE_SEQ_ERR + 8)
#define R2_ADDR_ERR (R1_ADDR_ERR + 8)
#define R2_PARAM_ERR (R1_PARAM_ERR + 8)
/* R3: size 5 bytes */
#define R3_OCR_MASK (0xffffffffUL)
#define R3_IDLE_STATE (R1_IDLE_STATE + 32)
#define R3_ERASE_RESET (R1_ERASE_RESET + 32)
#define R3_ILL_COMMAND (R1_ILL_COMMAND + 32)
#define R3_COM_CRC_ERR (R1_COM_CRC_ERR + 32)
#define R3_ERASE_SEQ_ERR (R1_ERASE_SEQ_ERR + 32)
#define R3_ADDR_ERR (R1_ADDR_ERR + 32)
#define R3_PARAM_ERR (R1_PARAM_ERR + 32)
/* Data Response: size 1 byte */
#define DR_STATUS_MASK 0x0e
#define DR_STATUS_ACCEPTED 0x05
#define DR_STATUS_CRC_ERR 0x0a
#define DR_STATUS_WRITE_ERR 0x0c
/* status bits for card types */
#define SD_RAW_SPEC_1 0
#define SD_RAW_SPEC_2 1
#define SD_RAW_SPEC_SDHC 2
#if !SD_RAW_SAVE_RAM
/* static data buffer for acceleration */
static uint8_t raw_block[512];
/* offset where the data within raw_block lies on the card */
static offset_t raw_block_address;
#if SD_RAW_WRITE_BUFFERING
/* flag to remember if raw_block was written to the card */
static uint8_t raw_block_written;
#endif
#endif
/* card type state */
static uint8_t sd_raw_card_type;
/* private helper functions */
static void sd_raw_send_byte(uint8_t b);
static uint8_t sd_raw_rec_byte();
static uint8_t sd_raw_send_command(uint8_t command, uint32_t arg);
/**
* \ingroup sd_raw
* Initializes memory card communication.
*
* \returns 0 on failure, 1 on success.
*/
uint8_t sd_raw_init()
{
/* enable inputs for reading card status */
configure_pin_available();
configure_pin_locked();
/* enable outputs for MOSI, SCK, SS, input for MISO */
configure_pin_mosi();
configure_pin_sck();
configure_pin_ss();
configure_pin_miso();
unselect_card();
/* initialize SPI with lowest frequency; max. 400kHz during identification mode of card */
SPCR = (0 << SPIE) | /* SPI Interrupt Enable */
(1 << SPE) | /* SPI Enable */
(0 << DORD) | /* Data Order: MSB first */
(1 << MSTR) | /* Master mode */
(0 << CPOL) | /* Clock Polarity: SCK low when idle */
(0 << CPHA) | /* Clock Phase: sample on rising SCK edge */
(1 << SPR1) | /* Clock Frequency: f_OSC / 128 */
(1 << SPR0);
SPSR &= ~(1 << SPI2X); /* No doubled clock frequency */
/* initialization procedure */
sd_raw_card_type = 0;
if(!sd_raw_available())
return 0;
/* card needs 74 cycles minimum to start up */
for(uint8_t i = 0; i < 10; ++i)
{
/* wait 8 clock cycles */
sd_raw_rec_byte();
}
/* address card */
select_card();
/* reset card */
uint8_t response;
for(uint16_t i = 0; ; ++i)
{
response = sd_raw_send_command(CMD_GO_IDLE_STATE, 0);
if(response == (1 << R1_IDLE_STATE))
break;
if(i == 0x1ff)
{
unselect_card();
return 0;
}
}
#if SD_RAW_SDHC
/* check for version of SD card specification */
response = sd_raw_send_command(CMD_SEND_IF_COND, 0x100 /* 2.7V - 3.6V */ | 0xaa /* test pattern */);
if((response & (1 << R1_ILL_COMMAND)) == 0)
{
sd_raw_rec_byte();
sd_raw_rec_byte();
if((sd_raw_rec_byte() & 0x01) == 0)
return 0; /* card operation voltage range doesn't match */
if(sd_raw_rec_byte() != 0xaa)
return 0; /* wrong test pattern */
/* card conforms to SD 2 card specification */
sd_raw_card_type |= (1 << SD_RAW_SPEC_2);
}
else
#endif
{
/* determine SD/MMC card type */
sd_raw_send_command(CMD_APP, 0);
response = sd_raw_send_command(CMD_SD_SEND_OP_COND, 0);
if((response & (1 << R1_ILL_COMMAND)) == 0)
{
/* card conforms to SD 1 card specification */
sd_raw_card_type |= (1 << SD_RAW_SPEC_1);
}
else
{
/* MMC card */
}
}
/* wait for card to get ready */
for(uint16_t i = 0; ; ++i)
{
if(sd_raw_card_type & ((1 << SD_RAW_SPEC_1) | (1 << SD_RAW_SPEC_2)))
{
uint32_t arg = 0;
#if SD_RAW_SDHC
if(sd_raw_card_type & (1 << SD_RAW_SPEC_2))
arg = 0x40000000;
#endif
sd_raw_send_command(CMD_APP, 0);
response = sd_raw_send_command(CMD_SD_SEND_OP_COND, arg);
}
else
{
response = sd_raw_send_command(CMD_SEND_OP_COND, 0);
}
if((response & (1 << R1_IDLE_STATE)) == 0)
break;
if(i == 0x7fff)
{
unselect_card();
return 0;
}
}
#if SD_RAW_SDHC
if(sd_raw_card_type & (1 << SD_RAW_SPEC_2))
{
if(sd_raw_send_command(CMD_READ_OCR, 0))
{
unselect_card();
return 0;
}
if(sd_raw_rec_byte() & 0x40)
sd_raw_card_type |= (1 << SD_RAW_SPEC_SDHC);
sd_raw_rec_byte();
sd_raw_rec_byte();
sd_raw_rec_byte();
}
#endif
/* set block size to 512 bytes */
if(sd_raw_send_command(CMD_SET_BLOCKLEN, 512))
{
unselect_card();
return 0;
}
/* deaddress card */
unselect_card();
/* switch to highest SPI frequency possible */
SPCR &= ~((1 << SPR1) | (1 << SPR0)); /* Clock Frequency: f_OSC / 4 */
SPSR |= (1 << SPI2X); /* Doubled Clock Frequency: f_OSC / 2 */
#if !SD_RAW_SAVE_RAM
/* the first block is likely to be accessed first, so precache it here */
raw_block_address = (offset_t) -1;
#if SD_RAW_WRITE_BUFFERING
raw_block_written = 1;
#endif
if(!sd_raw_read(0, raw_block, sizeof(raw_block)))
return 0;
#endif
return 1;
}
/**
* \ingroup sd_raw
* Checks wether a memory card is located in the slot.
*
* \returns 1 if the card is available, 0 if it is not.
*/
uint8_t sd_raw_available()
{
return get_pin_available() == 0x00;
}
/**
* \ingroup sd_raw
* Checks wether the memory card is locked for write access.
*
* \returns 1 if the card is locked, 0 if it is not.
*/
uint8_t sd_raw_locked()
{
return get_pin_locked() == 0x00;
}
/**
* \ingroup sd_raw
* Sends a raw byte to the memory card.
*
* \param[in] b The byte to sent.
* \see sd_raw_rec_byte
*/
void sd_raw_send_byte(uint8_t b)
{
SPDR = b;
/* wait for byte to be shifted out */
while(!(SPSR & (1 << SPIF)));
SPSR &= ~(1 << SPIF);
}
/**
* \ingroup sd_raw
* Receives a raw byte from the memory card.
*
* \returns The byte which should be read.
* \see sd_raw_send_byte
*/
uint8_t sd_raw_rec_byte()
{
/* send dummy data for receiving some */
SPDR = 0xff;
while(!(SPSR & (1 << SPIF)));
SPSR &= ~(1 << SPIF);
return SPDR;
}
/**
* \ingroup sd_raw
* Send a command to the memory card which responses with a R1 response (and possibly others).
*
* \param[in] command The command to send.
* \param[in] arg The argument for command.
* \returns The command answer.
*/
uint8_t sd_raw_send_command(uint8_t command, uint32_t arg)
{
uint8_t response;
/* wait some clock cycles */
sd_raw_rec_byte();
/* send command via SPI */
sd_raw_send_byte(0x40 | command);
sd_raw_send_byte((arg >> 24) & 0xff);
sd_raw_send_byte((arg >> 16) & 0xff);
sd_raw_send_byte((arg >> 8) & 0xff);
sd_raw_send_byte((arg >> 0) & 0xff);
switch(command)
{
case CMD_GO_IDLE_STATE:
sd_raw_send_byte(0x95);
break;
case CMD_SEND_IF_COND:
sd_raw_send_byte(0x87);
break;
default:
sd_raw_send_byte(0xff);
break;
}
/* receive response */
for(uint8_t i = 0; i < 10; ++i)
{
response = sd_raw_rec_byte();
if(response != 0xff)
break;
}
return response;
}
/**
* \ingroup sd_raw
* Reads raw data from the card.
*
* \param[in] offset The offset from which to read.
* \param[out] buffer The buffer into which to write the data.
* \param[in] length The number of bytes to read.
* \returns 0 on failure, 1 on success.
* \see sd_raw_read_interval, sd_raw_write, sd_raw_write_interval
*/
uint8_t sd_raw_read(offset_t offset, uint8_t* buffer, uintptr_t length)
{
offset_t block_address;
uint16_t block_offset;
uint16_t read_length;
while(length > 0)
{
/* determine byte count to read at once */
block_offset = offset & 0x01ff;
block_address = offset - block_offset;
read_length = 512 - block_offset; /* read up to block border */
if(read_length > length)
read_length = length;
#if !SD_RAW_SAVE_RAM
/* check if the requested data is cached */
if(block_address != raw_block_address)
#endif
{
#if SD_RAW_WRITE_BUFFERING
if(!sd_raw_sync())
return 0;
#endif
/* address card */
select_card();
/* send single block request */
#if SD_RAW_SDHC
if(sd_raw_send_command(CMD_READ_SINGLE_BLOCK, (sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC) ? block_address / 512 : block_address)))
#else
if(sd_raw_send_command(CMD_READ_SINGLE_BLOCK, block_address))
#endif
{
unselect_card();
return 0;
}
/* wait for data block (start byte 0xfe) */
while(sd_raw_rec_byte() != 0xfe);
#if SD_RAW_SAVE_RAM
/* read byte block */
uint16_t read_to = block_offset + read_length;
for(uint16_t i = 0; i < 512; ++i)
{
uint8_t b = sd_raw_rec_byte();
if(i >= block_offset && i < read_to)
*buffer++ = b;
}
#else
/* read byte block */
uint8_t* cache = raw_block;
for(uint16_t i = 0; i < 512; ++i)
*cache++ = sd_raw_rec_byte();
raw_block_address = block_address;
memcpy(buffer, raw_block + block_offset, read_length);
buffer += read_length;
#endif
/* read crc16 */
sd_raw_rec_byte();
sd_raw_rec_byte();
/* deaddress card */
unselect_card();
/* let card some time to finish */
sd_raw_rec_byte();
}
#if !SD_RAW_SAVE_RAM
else
{
/* use cached data */
memcpy(buffer, raw_block + block_offset, read_length);
buffer += read_length;
}
#endif
length -= read_length;
offset += read_length;
}
return 1;
}
/**
* \ingroup sd_raw
* Continuously reads units of \c interval bytes and calls a callback function.
*
* This function starts reading at the specified offset. Every \c interval bytes,
* it calls the callback function with the associated data buffer.
*
* By returning zero, the callback may stop reading.
*
* \note Within the callback function, you can not start another read or
* write operation.
* \note This function only works if the following conditions are met:
* - (offset - (offset % 512)) % interval == 0
* - length % interval == 0
*
* \param[in] offset Offset from which to start reading.
* \param[in] buffer Pointer to a buffer which is at least interval bytes in size.
* \param[in] interval Number of bytes to read before calling the callback function.
* \param[in] length Number of bytes to read altogether.
* \param[in] callback The function to call every interval bytes.
* \param[in] p An opaque pointer directly passed to the callback function.
* \returns 0 on failure, 1 on success
* \see sd_raw_write_interval, sd_raw_read, sd_raw_write
*/
uint8_t sd_raw_read_interval(offset_t offset, uint8_t* buffer, uintptr_t interval, uintptr_t length, sd_raw_read_interval_handler_t callback, void* p)
{
if(!buffer || interval == 0 || length < interval || !callback)
return 0;
#if !SD_RAW_SAVE_RAM
while(length >= interval)
{
/* as reading is now buffered, we directly
* hand over the request to sd_raw_read()
*/
if(!sd_raw_read(offset, buffer, interval))
return 0;
if(!callback(buffer, offset, p))
break;
offset += interval;
length -= interval;
}
return 1;
#else
/* address card */
select_card();
uint16_t block_offset;
uint16_t read_length;
uint8_t* buffer_cur;
uint8_t finished = 0;
do
{
/* determine byte count to read at once */
block_offset = offset & 0x01ff;
read_length = 512 - block_offset;
/* send single block request */
#if SD_RAW_SDHC
if(sd_raw_send_command(CMD_READ_SINGLE_BLOCK, (sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC) ? offset / 512 : offset - block_offset)))
#else
if(sd_raw_send_command(CMD_READ_SINGLE_BLOCK, offset - block_offset))
#endif
{
unselect_card();
return 0;
}
/* wait for data block (start byte 0xfe) */
while(sd_raw_rec_byte() != 0xfe);
/* read up to the data of interest */
for(uint16_t i = 0; i < block_offset; ++i)
sd_raw_rec_byte();
/* read interval bytes of data and execute the callback */
do
{
if(read_length < interval || length < interval)
break;
buffer_cur = buffer;
for(uint16_t i = 0; i < interval; ++i)
*buffer_cur++ = sd_raw_rec_byte();
if(!callback(buffer, offset + (512 - read_length), p))
{
finished = 1;
break;
}
read_length -= interval;
length -= interval;
} while(read_length > 0 && length > 0);
/* read rest of data block */
while(read_length-- > 0)
sd_raw_rec_byte();
/* read crc16 */
sd_raw_rec_byte();
sd_raw_rec_byte();
if(length < interval)
break;
offset = offset - block_offset + 512;
} while(!finished);
/* deaddress card */
unselect_card();
/* let card some time to finish */
sd_raw_rec_byte();
return 1;
#endif
}
#if DOXYGEN || SD_RAW_WRITE_SUPPORT
/**
* \ingroup sd_raw
* Writes raw data to the card.
*
* \note If write buffering is enabled, you might have to
* call sd_raw_sync() before disconnecting the card
* to ensure all remaining data has been written.
*
* \param[in] offset The offset where to start writing.
* \param[in] buffer The buffer containing the data to be written.
* \param[in] length The number of bytes to write.
* \returns 0 on failure, 1 on success.
* \see sd_raw_write_interval, sd_raw_read, sd_raw_read_interval
*/
uint8_t sd_raw_write(offset_t offset, const uint8_t* buffer, uintptr_t length)
{
if(sd_raw_locked())
return 0;
offset_t block_address;
uint16_t block_offset;
uint16_t write_length;
while(length > 0)
{
/* determine byte count to write at once */
block_offset = offset & 0x01ff;
block_address = offset - block_offset;
write_length = 512 - block_offset; /* write up to block border */
if(write_length > length)
write_length = length;
/* Merge the data to write with the content of the block.
* Use the cached block if available.
*/
if(block_address != raw_block_address)
{
#if SD_RAW_WRITE_BUFFERING
if(!sd_raw_sync())
return 0;
#endif
if(block_offset || write_length < 512)
{
if(!sd_raw_read(block_address, raw_block, sizeof(raw_block)))
return 0;
}
raw_block_address = block_address;
}
if(buffer != raw_block)
{
memcpy(raw_block + block_offset, buffer, write_length);
#if SD_RAW_WRITE_BUFFERING
raw_block_written = 0;
if(length == write_length)
return 1;
#endif
}
/* address card */
select_card();
/* send single block request */
#if SD_RAW_SDHC
if(sd_raw_send_command(CMD_WRITE_SINGLE_BLOCK, (sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC) ? block_address / 512 : block_address)))
#else
if(sd_raw_send_command(CMD_WRITE_SINGLE_BLOCK, block_address))
#endif
{
unselect_card();
return 0;
}
/* send start byte */
sd_raw_send_byte(0xfe);
/* write byte block */
uint8_t* cache = raw_block;
for(uint16_t i = 0; i < 512; ++i)
sd_raw_send_byte(*cache++);
/* write dummy crc16 */
sd_raw_send_byte(0xff);
sd_raw_send_byte(0xff);
/* wait while card is busy */
while(sd_raw_rec_byte() != 0xff);
sd_raw_rec_byte();
/* deaddress card */
unselect_card();
buffer += write_length;
offset += write_length;
length -= write_length;
#if SD_RAW_WRITE_BUFFERING
raw_block_written = 1;
#endif
}
return 1;
}
#endif
#if DOXYGEN || SD_RAW_WRITE_SUPPORT
/**
* \ingroup sd_raw
* Writes a continuous data stream obtained from a callback function.
*
* This function starts writing at the specified offset. To obtain the
* next bytes to write, it calls the callback function. The callback fills the
* provided data buffer and returns the number of bytes it has put into the buffer.
*
* By returning zero, the callback may stop writing.
*
* \param[in] offset Offset where to start writing.
* \param[in] buffer Pointer to a buffer which is used for the callback function.
* \param[in] length Number of bytes to write in total. May be zero for endless writes.
* \param[in] callback The function used to obtain the bytes to write.
* \param[in] p An opaque pointer directly passed to the callback function.
* \returns 0 on failure, 1 on success
* \see sd_raw_read_interval, sd_raw_write, sd_raw_read
*/
uint8_t sd_raw_write_interval(offset_t offset, uint8_t* buffer, uintptr_t length, sd_raw_write_interval_handler_t callback, void* p)
{
#if SD_RAW_SAVE_RAM
#error "SD_RAW_WRITE_SUPPORT is not supported together with SD_RAW_SAVE_RAM"
#endif
if(!buffer || !callback)
return 0;
uint8_t endless = (length == 0);
while(endless || length > 0)
{
uint16_t bytes_to_write = callback(buffer, offset, p);
if(!bytes_to_write)
break;
if(!endless && bytes_to_write > length)
return 0;
/* as writing is always buffered, we directly
* hand over the request to sd_raw_write()
*/
if(!sd_raw_write(offset, buffer, bytes_to_write))
return 0;
offset += bytes_to_write;
length -= bytes_to_write;
}
return 1;
}
#endif
#if DOXYGEN || SD_RAW_WRITE_SUPPORT
/**
* \ingroup sd_raw
* Writes the write buffer's content to the card.
*
* \note When write buffering is enabled, you should
* call this function before disconnecting the
* card to ensure all remaining data has been
* written.
*
* \returns 0 on failure, 1 on success.
* \see sd_raw_write
*/
uint8_t sd_raw_sync()
{
#if SD_RAW_WRITE_BUFFERING
if(raw_block_written)
return 1;
if(!sd_raw_write(raw_block_address, raw_block, sizeof(raw_block)))
return 0;
raw_block_written = 1;
#endif
return 1;
}
#endif
/**
* \ingroup sd_raw
* Reads informational data from the card.
*
* This function reads and returns the card's registers
* containing manufacturing and status information.
*
* \note: The information retrieved by this function is
* not required in any way to operate on the card,
* but it might be nice to display some of the data
* to the user.
*
* \param[in] info A pointer to the structure into which to save the information.
* \returns 0 on failure, 1 on success.
*/
uint8_t sd_raw_get_info(struct sd_raw_info* info)
{
if(!info || !sd_raw_available())
return 0;
memset(info, 0, sizeof(*info));
select_card();
/* read cid register */
if(sd_raw_send_command(CMD_SEND_CID, 0))
{
unselect_card();
return 0;
}
while(sd_raw_rec_byte() != 0xfe);
for(uint8_t i = 0; i < 18; ++i)
{
uint8_t b = sd_raw_rec_byte();
switch(i)
{
case 0:
info->manufacturer = b;
break;
case 1:
case 2:
info->oem[i - 1] = b;
break;
case 3:
case 4:
case 5:
case 6:
case 7:
info->product[i - 3] = b;
break;
case 8:
info->revision = b;
break;
case 9:
case 10:
case 11:
case 12:
info->serial |= (uint32_t) b << ((12 - i) * 8);
break;
case 13:
info->manufacturing_year = b << 4;
break;
case 14:
info->manufacturing_year |= b >> 4;
info->manufacturing_month = b & 0x0f;
break;
}
}
/* read csd register */
uint8_t csd_read_bl_len = 0;
uint8_t csd_c_size_mult = 0;
#if SD_RAW_SDHC
uint16_t csd_c_size = 0;
#else
uint32_t csd_c_size = 0;
#endif
uint8_t csd_structure = 0;
if(sd_raw_send_command(CMD_SEND_CSD, 0))
{
unselect_card();
return 0;
}
while(sd_raw_rec_byte() != 0xfe);
for(uint8_t i = 0; i < 18; ++i)
{
uint8_t b = sd_raw_rec_byte();
if(i == 0)
{
csd_structure = b >> 6;
}
else if(i == 14)
{
if(b & 0x40)
info->flag_copy = 1;
if(b & 0x20)
info->flag_write_protect = 1;
if(b & 0x10)
info->flag_write_protect_temp = 1;
info->format = (b & 0x0c) >> 2;
}
else
{
#if SD_RAW_SDHC
if(csd_structure == 0x01)
{
switch(i)
{
case 7:
b &= 0x3f;
case 8:
case 9:
csd_c_size <<= 8;
csd_c_size |= b;
break;
}
if(i == 9)
{
++csd_c_size;
info->capacity = (offset_t) csd_c_size * 512 * 1024;
}
}
else if(csd_structure == 0x00)
#endif
{
switch(i)
{
case 5:
csd_read_bl_len = b & 0x0f;
break;
case 6:
csd_c_size = b & 0x03;
csd_c_size <<= 8;
break;
case 7:
csd_c_size |= b;
csd_c_size <<= 2;
break;
case 8:
csd_c_size |= b >> 6;
++csd_c_size;
break;
case 9:
csd_c_size_mult = b & 0x03;
csd_c_size_mult <<= 1;
break;
case 10:
csd_c_size_mult |= b >> 7;
info->capacity = (uint32_t) csd_c_size << (csd_c_size_mult + csd_read_bl_len + 2);
break;
}
}
}
}
unselect_card();
return 1;
}

View File

@ -0,0 +1,148 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef SD_RAW_H
#define SD_RAW_H
#include <stdint.h>
#include "sd_raw_config.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup sd_raw
*
* @{
*/
/**
* \file
* MMC/SD/SDHC raw access header (license: GPLv2 or LGPLv2.1)
*
* \author Roland Riegel
*/
/**
* The card's layout is harddisk-like, which means it contains
* a master boot record with a partition table.
*/
#define SD_RAW_FORMAT_HARDDISK 0
/**
* The card contains a single filesystem and no partition table.
*/
#define SD_RAW_FORMAT_SUPERFLOPPY 1
/**
* The card's layout follows the Universal File Format.
*/
#define SD_RAW_FORMAT_UNIVERSAL 2
/**
* The card's layout is unknown.
*/
#define SD_RAW_FORMAT_UNKNOWN 3
/**
* This struct is used by sd_raw_get_info() to return
* manufacturing and status information of the card.
*/
struct sd_raw_info
{
/**
* A manufacturer code globally assigned by the SD card organization.
*/
uint8_t manufacturer;
/**
* A string describing the card's OEM or content, globally assigned by the SD card organization.
*/
uint8_t oem[3];
/**
* A product name.
*/
uint8_t product[6];
/**
* The card's revision, coded in packed BCD.
*
* For example, the revision value \c 0x32 means "3.2".
*/
uint8_t revision;
/**
* A serial number assigned by the manufacturer.
*/
uint32_t serial;
/**
* The year of manufacturing.
*
* A value of zero means year 2000.
*/
uint8_t manufacturing_year;
/**
* The month of manufacturing.
*/
uint8_t manufacturing_month;
/**
* The card's total capacity in bytes.
*/
offset_t capacity;
/**
* Defines wether the card's content is original or copied.
*
* A value of \c 0 means original, \c 1 means copied.
*/
uint8_t flag_copy;
/**
* Defines wether the card's content is write-protected.
*
* \note This is an internal flag and does not represent the
* state of the card's mechanical write-protect switch.
*/
uint8_t flag_write_protect;
/**
* Defines wether the card's content is temporarily write-protected.
*
* \note This is an internal flag and does not represent the
* state of the card's mechanical write-protect switch.
*/
uint8_t flag_write_protect_temp;
/**
* The card's data layout.
*
* See the \c SD_RAW_FORMAT_* constants for details.
*
* \note This value is not guaranteed to match reality.
*/
uint8_t format;
};
typedef uint8_t (*sd_raw_read_interval_handler_t)(uint8_t* buffer, offset_t offset, void* p);
typedef uintptr_t (*sd_raw_write_interval_handler_t)(uint8_t* buffer, offset_t offset, void* p);
uint8_t sd_raw_init();
uint8_t sd_raw_available();
uint8_t sd_raw_locked();
uint8_t sd_raw_read(offset_t offset, uint8_t* buffer, uintptr_t length);
uint8_t sd_raw_read_interval(offset_t offset, uint8_t* buffer, uintptr_t interval, uintptr_t length, sd_raw_read_interval_handler_t callback, void* p);
uint8_t sd_raw_write(offset_t offset, const uint8_t* buffer, uintptr_t length);
uint8_t sd_raw_write_interval(offset_t offset, uint8_t* buffer, uintptr_t length, sd_raw_write_interval_handler_t callback, void* p);
uint8_t sd_raw_sync();
uint8_t sd_raw_get_info(struct sd_raw_info* info);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.

View File

@ -0,0 +1,139 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*/
#ifndef SD_RAW_CONFIG_H
#define SD_RAW_CONFIG_H
#include <stdint.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* \addtogroup sd_raw
*
* @{
*/
/**
* \file
* MMC/SD support configuration (license: GPLv2 or LGPLv2.1)
*/
/**
* \ingroup sd_raw_config
* Controls MMC/SD write support.
*
* Set to 1 to enable MMC/SD write support, set to 0 to disable it.
*/
#define SD_RAW_WRITE_SUPPORT 1
/**
* \ingroup sd_raw_config
* Controls MMC/SD write buffering.
*
* Set to 1 to buffer write accesses, set to 0 to disable it.
*
* \note This option has no effect when SD_RAW_WRITE_SUPPORT is 0.
*/
#define SD_RAW_WRITE_BUFFERING 1
/**
* \ingroup sd_raw_config
* Controls MMC/SD access buffering.
*
* Set to 1 to save static RAM, but be aware that you will
* lose performance.
*
* \note When SD_RAW_WRITE_SUPPORT is 1, SD_RAW_SAVE_RAM will
* be reset to 0.
*/
#define SD_RAW_SAVE_RAM 1
/**
* \ingroup sd_raw_config
* Controls support for SDHC cards.
*
* Set to 1 to support so-called SDHC memory cards, i.e. SD
* cards with more than 2 gigabytes of memory.
*/
#define SD_RAW_SDHC 0
/**
* @}
*/
/* defines for customisation of sd/mmc port access */
#if defined(__AVR_ATmega8__) || \
defined(__AVR_ATmega48__) || \
defined(__AVR_ATmega48P__) || \
defined(__AVR_ATmega88__) || \
defined(__AVR_ATmega88P__) || \
defined(__AVR_ATmega168__) || \
defined(__AVR_ATmega168P__) || \
defined(__AVR_ATmega328P__)
#define configure_pin_mosi() DDRB |= (1 << DDB3)
#define configure_pin_sck() DDRB |= (1 << DDB5)
#define configure_pin_ss() DDRB |= (1 << DDB2)
#define configure_pin_miso() DDRB &= ~(1 << DDB4)
#define select_card() PORTB &= ~(1 << PORTB2)
#define unselect_card() PORTB |= (1 << PORTB2)
#elif defined(__AVR_ATmega16__) || \
defined(__AVR_ATmega32__)
#define configure_pin_mosi() DDRB |= (1 << DDB5)
#define configure_pin_sck() DDRB |= (1 << DDB7)
#define configure_pin_ss() DDRB |= (1 << DDB4)
#define configure_pin_miso() DDRB &= ~(1 << DDB6)
#define select_card() PORTB &= ~(1 << PORTB4)
#define unselect_card() PORTB |= (1 << PORTB4)
#elif defined(__AVR_ATmega64__) || \
defined(__AVR_ATmega128__) || \
defined(__AVR_ATmega169__)
#define configure_pin_mosi() DDRB |= (1 << DDB2)
#define configure_pin_sck() DDRB |= (1 << DDB1)
#define configure_pin_ss() DDRB |= (1 << DDB0)
#define configure_pin_miso() DDRB &= ~(1 << DDB3)
#define select_card() PORTB &= ~(1 << PORTB0)
#define unselect_card() PORTB |= (1 << PORTB0)
#else
#error "no sd/mmc pin mapping available!"
#endif
#define configure_pin_available() DDRC &= ~(1 << DDC4)
#define configure_pin_locked() DDRC &= ~(1 << DDC5)
#define get_pin_available() (PINC & (1 << PINC4))
#define get_pin_locked() (PINC & (1 << PINC5))
#if SD_RAW_SDHC
typedef uint64_t offset_t;
#else
typedef uint32_t offset_t;
#endif
/* configuration checks */
#if SD_RAW_WRITE_SUPPORT
#undef SD_RAW_SAVE_RAM
#define SD_RAW_SAVE_RAM 0
#else
#undef SD_RAW_WRITE_BUFFERING
#define SD_RAW_WRITE_BUFFERING 0
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,198 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sfr_defs.h>
#include <avr/sleep.h>
#include "uart.h"
/* some mcus have multiple uarts */
#ifdef UDR0
#define UBRRH UBRR0H
#define UBRRL UBRR0L
#define UDR UDR0
#define UCSRA UCSR0A
#define UDRE UDRE0
#define RXC RXC0
#define UCSRB UCSR0B
#define RXEN RXEN0
#define TXEN TXEN0
#define RXCIE RXCIE0
#define UCSRC UCSR0C
#define URSEL
#define UCSZ0 UCSZ00
#define UCSZ1 UCSZ01
#define UCSRC_SELECT 0
#else
#define UCSRC_SELECT (1 << URSEL)
#endif
#ifndef USART_RXC_vect
#if defined(UART0_RX_vect)
#define USART_RXC_vect UART0_RX_vect
#elif defined(UART_RX_vect)
#define USART_RXC_vect UART_RX_vect
#elif defined(USART0_RX_vect)
#define USART_RXC_vect USART0_RX_vect
#elif defined(USART_RX_vect)
#define USART_RXC_vect USART_RX_vect
#elif defined(USART0_RXC_vect)
#define USART_RXC_vect USART0_RXC_vect
#elif defined(USART_RXC_vect)
#define USART_RXC_vect USART_RXC_vect
#else
#error "Uart receive complete interrupt not defined!"
#endif
#endif
#define BAUD 9600UL
#define UBRRVAL (F_CPU/(BAUD*16)-1)
#define USE_SLEEP 1
void uart_init()
{
/* set baud rate */
UBRRH = UBRRVAL >> 8;
UBRRL = UBRRVAL & 0xff;
/* set frame format: 8 bit, no parity, 1 bit */
UCSRC = UCSRC_SELECT | (1 << UCSZ1) | (1 << UCSZ0);
/* enable serial receiver and transmitter */
#if !USE_SLEEP
UCSRB = (1 << RXEN) | (1 << TXEN);
#else
UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
#endif
}
void uart_putc(uint8_t c)
{
if(c == '\n')
uart_putc('\r');
/* wait until transmit buffer is empty */
while(!(UCSRA & (1 << UDRE)));
/* send next byte */
UDR = c;
}
void uart_putc_hex(uint8_t b)
{
/* upper nibble */
if((b >> 4) < 0x0a)
uart_putc((b >> 4) + '0');
else
uart_putc((b >> 4) - 0x0a + 'a');
/* lower nibble */
if((b & 0x0f) < 0x0a)
uart_putc((b & 0x0f) + '0');
else
uart_putc((b & 0x0f) - 0x0a + 'a');
}
void uart_putw_hex(uint16_t w)
{
uart_putc_hex((uint8_t) (w >> 8));
uart_putc_hex((uint8_t) (w & 0xff));
}
void uart_putdw_hex(uint32_t dw)
{
uart_putw_hex((uint16_t) (dw >> 16));
uart_putw_hex((uint16_t) (dw & 0xffff));
}
void uart_putw_dec(uint16_t w)
{
uint16_t num = 10000;
uint8_t started = 0;
while(num > 0)
{
uint8_t b = w / num;
if(b > 0 || started || num == 1)
{
uart_putc('0' + b);
started = 1;
}
w -= b * num;
num /= 10;
}
}
void uart_putdw_dec(uint32_t dw)
{
uint32_t num = 1000000000;
uint8_t started = 0;
while(num > 0)
{
uint8_t b = dw / num;
if(b > 0 || started || num == 1)
{
uart_putc('0' + b);
started = 1;
}
dw -= b * num;
num /= 10;
}
}
void uart_puts(const char* str)
{
while(*str)
uart_putc(*str++);
}
void uart_puts_p(PGM_P str)
{
while(1)
{
uint8_t b = pgm_read_byte_near(str++);
if(!b)
break;
uart_putc(b);
}
}
uint8_t uart_getc()
{
/* wait until receive buffer is full */
#if USE_SLEEP
uint8_t sreg = SREG;
sei();
while(!(UCSRA & (1 << RXC)))
sleep_mode();
SREG = sreg;
#else
while(!(UCSRA & (1 << RXC)));
#endif
uint8_t b = UDR;
if(b == '\r')
b = '\n';
return b;
}
EMPTY_INTERRUPT(USART_RXC_vect)

View File

@ -0,0 +1,42 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef UART_H
#define UART_H
#include <stdint.h>
#include <avr/pgmspace.h>
#ifdef __cplusplus
extern "C"
{
#endif
void uart_init();
void uart_putc(uint8_t c);
void uart_putc_hex(uint8_t b);
void uart_putw_hex(uint16_t w);
void uart_putdw_hex(uint32_t dw);
void uart_putw_dec(uint16_t w);
void uart_putdw_dec(uint32_t dw);
void uart_puts(const char* str);
void uart_puts_p(PGM_P str);
uint8_t uart_getc();
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.