⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat_8c-source.html

📁 单片机的软件
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Procyon AVRlib: fat.c Source File</title><link href="dox.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.4.2 --><div class="qindex"><a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a></div><h1>fat.c</h1><a href="fat_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*! \file fat.c \brief FAT16/32 file system driver. */</span>00002 <span class="comment">//*****************************************************************************</span>00003 <span class="comment">//</span>00004 <span class="comment">// File Name    : 'fat.c'</span>00005 <span class="comment">// Title        : FAT16/32 file system driver</span>00006 <span class="comment">// Author       : Pascal Stang</span>00007 <span class="comment">// Date         : 11/07/2000</span>00008 <span class="comment">// Revised      : 12/12/2000</span>00009 <span class="comment">// Version      : 0.3</span>00010 <span class="comment">// Target MCU   : ATmega103 (should work for Atmel AVR Series)</span>00011 <span class="comment">// Editor Tabs  : 4</span>00012 <span class="comment">//</span>00013 <span class="comment">// This code is based in part on work done by Jesper Hansen for his</span>00014 <span class="comment">//      YAMPP MP3 player project.</span>00015 <span class="comment">//</span>00016 <span class="comment">// NOTE: This code is currently below version 1.0, and therefore is considered</span>00017 <span class="comment">// to be lacking in some functionality or documentation, or may not be fully</span>00018 <span class="comment">// tested.  Nonetheless, you can expect most functions to work.</span>00019 <span class="comment">//</span>00020 <span class="comment">// This code is distributed under the GNU Public License</span>00021 <span class="comment">//      which can be found at http://www.gnu.org/licenses/gpl.txt</span>00022 <span class="comment">//</span>00023 <span class="comment">//*****************************************************************************</span>00024 00025 00026 <span class="preprocessor">#include &lt;avr/io.h&gt;</span>00027 <span class="preprocessor">#include &lt;avr/pgmspace.h&gt;</span>00028 <span class="preprocessor">#include &lt;string.h&gt;</span>00029 00030 <span class="preprocessor">#include "<a class="code" href="ata_8h.html">ata.h</a>"</span>00031 <span class="preprocessor">#include "<a class="code" href="rprintf_8h.html">rprintf.h</a>"</span>00032 00033 <span class="preprocessor">#include "<a class="code" href="fat_8h.html">fat.h</a>"</span>00034 <span class="preprocessor">#include "<a class="code" href="fatconf_8h.html">fatconf.h</a>"</span>00035 00036 <span class="comment">// globals</span>00037 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *SectorBuffer  =      (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) SECTOR_BUFFER1_ADDR;00038 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *LongNameBuffer =     (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) LONGNAME_BUFFER_ADDR;00039 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *DirNameBuffer =      (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) DIRNAME_BUFFER_ADDR;00040 00041 <span class="keyword">struct </span>partrecord PartInfo;00042 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Fat32Enabled;00043 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> FirstDataSector;00044 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>  BytesPerSector;00045 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>  SectorsPerCluster;00046 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> FirstFATSector;00047 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> FirstDirSector;00048 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> FileSize;00049 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> FatInCache = 0;00050 00051 <span class="comment">/*************************************************************************/</span>00052 <span class="comment">/*************************************************************************/</span>00053 00054 00055 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatClustToSect(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> clust)00056 {00057     <span class="keywordflow">return</span> ((clust-2) * SectorsPerCluster) + FirstDataSector;00058 }00059 00060 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fatClusterSize(<span class="keywordtype">void</span>)00061 {00062     <span class="comment">// return the number of sectors in a disk cluster</span>00063     <span class="keywordflow">return</span> SectorsPerCluster;00064 }00065 00066 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> fatInit( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> device)00067 {00068     <span class="comment">//struct partrecord *pr;</span>00069     <span class="keyword">struct </span>bpb710 *bpb;00070 00071     <span class="comment">// read partition table</span>00072     <span class="comment">// TODO.... error checking</span>00073     ataReadSectors(DRIVE0, 0, 1, SectorBuffer);00074     <span class="comment">// map first partition record   </span>00075     <span class="comment">// save partition information to global PartInfo</span>00076     PartInfo = *((<span class="keyword">struct </span>partrecord *) ((<span class="keyword">struct </span>partsector *) SectorBuffer)-&gt;psPart);00077 <span class="comment">//  PartInfo = *pr;</span>00078     00079     <span class="comment">// Read the Partition BootSector</span>00080     <span class="comment">// **first sector of partition in PartInfo.prStartLBA</span>00081     ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );00082     bpb = (<span class="keyword">struct </span>bpb710 *) ((<span class="keyword">struct </span>bootsector710 *) SectorBuffer)-&gt;bsBPB;00083 00084     <span class="comment">// setup global disk constants</span>00085     FirstDataSector = PartInfo.prStartLBA;00086     <span class="keywordflow">if</span>(bpb-&gt;bpbFATsecs)00087     {00088         <span class="comment">// bpbFATsecs is non-zero and is therefore valid</span>00089         FirstDataSector += bpb-&gt;bpbResSectors + bpb-&gt;bpbFATs * bpb-&gt;bpbFATsecs;00090     }00091     <span class="keywordflow">else</span>00092     {00093         <span class="comment">// bpbFATsecs is zero, real value is in bpbBigFATsecs</span>00094         FirstDataSector += bpb-&gt;bpbResSectors + bpb-&gt;bpbFATs * bpb-&gt;bpbBigFATsecs;00095     }00096     SectorsPerCluster   = bpb-&gt;bpbSecPerClust;00097     BytesPerSector      = bpb-&gt;bpbBytesPerSec;00098     FirstFATSector      = bpb-&gt;bpbResSectors + PartInfo.prStartLBA;00099 00100     <span class="keywordflow">switch</span> (PartInfo.prPartType)00101     {00102         <span class="keywordflow">case</span> PART_TYPE_DOSFAT16:00103         <span class="keywordflow">case</span> PART_TYPE_FAT16:00104         <span class="keywordflow">case</span> PART_TYPE_FAT16LBA:00105             <span class="comment">// first directory cluster is 2 by default (clusters range 2-&gt;big)</span>00106             FirstDirSector  = CLUST_FIRST;00107             <span class="comment">// push data sector pointer to end of root directory area</span>00108             <span class="comment">//FirstDataSector += (bpb-&gt;bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;</span>00109             Fat32Enabled = FALSE;00110             <span class="keywordflow">break</span>;00111         <span class="keywordflow">case</span> PART_TYPE_FAT32LBA:00112         <span class="keywordflow">case</span> PART_TYPE_FAT32:00113             <span class="comment">// bpbRootClust field exists in FAT32 bpb710, but not in lesser bpb's</span>00114             FirstDirSector = bpb-&gt;bpbRootClust;00115             <span class="comment">// push data sector pointer to end of root directory area</span>00116             <span class="comment">// need this? FirstDataSector += (bpb-&gt;bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;</span>00117             Fat32Enabled = TRUE;00118             <span class="keywordflow">break</span>;00119         <span class="keywordflow">default</span>:00120             <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Found: No Partition!\r\n"</span>);00121             <span class="comment">//return 1;</span>00122             <span class="keywordflow">break</span>;00123     }00124 00125 00126 <span class="preprocessor">#ifdef DEBUG_FAT</span>00127 <span class="preprocessor"></span>    <span class="keywordflow">switch</span> (PartInfo.prPartType)00128     {00129         <span class="keywordflow">case</span> PART_TYPE_DOSFAT16:00130                 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Found: DOSFAT 16\r\n"</span>);00131                 <span class="keywordflow">break</span>;00132         <span class="keywordflow">case</span> PART_TYPE_FAT16:00133                 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Found: FAT16\r\n"</span>);00134                 <span class="keywordflow">break</span>;00135         <span class="keywordflow">case</span> PART_TYPE_FAT16LBA:00136                 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Found: FAT16 LBA\r\n"</span>);00137                 <span class="keywordflow">break</span>;00138         <span class="keywordflow">case</span> PART_TYPE_FAT32LBA:00139                 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Found: FAT32 LBA\r\n"</span>);00140                 <span class="keywordflow">break</span>;00141         <span class="keywordflow">case</span> PART_TYPE_FAT32:00142                 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Found: FAT32\r\n"</span>);00143                 <span class="comment">//return 1; </span>00144                 <span class="keywordflow">break</span>;00145         <span class="keywordflow">default</span>:00146                 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Found: No Partition!\r\n"</span>);00147                 <span class="comment">//return 1;</span>00148                 <span class="keywordflow">break</span>;00149     }00150 00151     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"First sector    : "</span>);  <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(PartInfo.prStartLBA);    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00152     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Size            : "</span>);  <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(PartInfo.prSize);        <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00153     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"bytes/sector    : "</span>);  <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(bpb-&gt;bpbBytesPerSec);    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00154     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"sectors/cluster : "</span>);  <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(bpb-&gt;bpbSecPerClust);    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00155     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"reserved sectors: "</span>);  <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(bpb-&gt;bpbResSectors);     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00156     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"FatSectors      : "</span>);  <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(bpb-&gt;bpbFATsecs);        <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00157     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BigFatSectors   : "</span>);  <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(bpb-&gt;bpbBigFATsecs);     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00158     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Number of Fats  : "</span>);  <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(bpb-&gt;bpbFATs);           <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00159     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"First Fat Sector: "</span>);  <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(FirstFATSector);         <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00160     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"First Data Sect : "</span>);  <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(FirstDataSector);        <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00161     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"First Dir Clust : "</span>);  <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(FirstDirSector);         <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00162 <span class="preprocessor">#endif</span>00163 <span class="preprocessor"></span>00164     <span class="keywordflow">return</span> 0;   00165 }00166 <span class="comment"></span>00167 <span class="comment">//////////////////////////////////////////////////////////////</span>00168 <span class="comment"></span>00169 00170 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> baseentry = 0;00171 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> entrycount = 0;00172 00173 00174 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatGetDirEntry(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> entry, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count)00175 {00176     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> sector;00177     <span class="keyword">struct </span>direntry *de = 0;    <span class="comment">// avoid compiler warning by initializing</span>00178     <span class="keyword">struct </span>winentry *we;00179     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hasBuffer;00180     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> b;00181     <span class="keywordtype">int</span> i,index;00182     <span class="keywordtype">char</span> *p;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -