Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00064 #include <errno.h>
00065 
00066 #include <fs/phatfs.h>
00067 #include <fs/phatvol.h>
00068 #include <fs/phatio.h>
00069 
00074 
00086 static void PhatTableLoc(PHATVOL * vol, uint32_t clust, int tabnum, uint32_t * sect, uint32_t * pos)
00087 {
00088     uint32_t tabpos = clust * 2;
00089 
00090     *sect = vol->vol_tab_sect[tabnum] + tabpos / vol->vol_sectsz;
00091     *pos = tabpos % vol->vol_sectsz;
00092 }
00093 
00103 int Phat16GetClusterLink(NUTDEVICE * dev, uint32_t clust, uint32_t * link)
00104 {
00105     uint32_t sect;
00106     uint32_t pos;
00107     int sbn;
00108     PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00109 
00110     
00111     if (clust >= (PHATEOC & PHAT16CMASK)) {
00112         return -1;
00113     }
00114 
00115     
00116     PhatTableLoc(vol, clust, 0, §, &pos);
00117     if ((sbn = PhatSectorLoad(dev, sect)) < 0) {
00118         return -1;
00119     }
00120 
00121     
00122     *link = vol->vol_buf[sbn].sect_data[pos];
00123     *link += (uint32_t)(vol->vol_buf[sbn].sect_data[pos + 1]) << 8;
00124 
00125     return 0;
00126 }
00127 
00137 int Phat16SetClusterLink(NUTDEVICE * dev, uint32_t clust, uint32_t link)
00138 {
00139     int tabnum;
00140     uint32_t sect;
00141     uint32_t pos;
00142     int sbn;
00143     PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00144 
00145     for (tabnum = 0; tabnum < 2 && vol->vol_tab_sect[tabnum]; tabnum++) {
00146         PhatTableLoc(vol, clust, tabnum, §, &pos);
00147         if ((sbn = PhatSectorLoad(dev, sect)) < 0) {
00148             return -1;
00149         }
00150         vol->vol_buf[sbn].sect_data[pos] = (uint8_t) link;
00151         vol->vol_buf[sbn].sect_data[pos + 1] = (uint8_t) (link >> 8);
00152         vol->vol_buf[sbn].sect_dirty = 1;
00153     }
00154     return 0;
00155 }
00156 
00165 int Phat16ReleaseChain(NUTDEVICE * dev, uint32_t first)
00166 {
00167     uint32_t next;
00168     PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00169 
00170     while (first < (PHATEOC & PHAT16CMASK)) {
00171         if (Phat16GetClusterLink(dev, first, &next)) {
00172             
00173             return -1;
00174         }
00175         if (next < 2) {
00176             
00177             break;
00178         }
00179         if (Phat16SetClusterLink(dev, first, 0)) {
00180             
00181             return -1;
00182         }
00183         vol->vol_numfree++;
00184         first = next;
00185     }
00186     return 0;
00187 }
00188