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 * 4;
00089 
00090     *sect = vol->vol_tab_sect[tabnum] + tabpos / vol->vol_sectsz;
00091     *pos = tabpos % vol->vol_sectsz;
00092 }
00093 
00103 int Phat32GetClusterLink(NUTDEVICE * dev, uint32_t clust, uint32_t * link)
00104 {
00105     uint32_t sect, pos;
00106     int sbn;
00107     PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00108 
00109     
00110     if (clust >= (PHATEOC & PHAT32CMASK)) {
00111         return -1;
00112     }
00113 
00114     
00115     PhatTableLoc(vol, clust, 0, §, &pos);
00116     if ((sbn = PhatSectorLoad(dev, sect)) < 0) {
00117         return -1;
00118     }
00119 
00120     
00121     *link = vol->vol_buf[sbn].sect_data[pos];
00122     *link += (uint32_t)(vol->vol_buf[sbn].sect_data[pos + 1]) << 8;
00123     *link += (uint32_t)(vol->vol_buf[sbn].sect_data[pos + 2]) << 16;
00124     *link += (uint32_t)(vol->vol_buf[sbn].sect_data[pos + 3]) << 24;
00125 
00126     return 0;
00127 }
00128 
00138 int Phat32SetClusterLink(NUTDEVICE * dev, uint32_t clust, uint32_t link)
00139 {
00140     int tabnum;
00141     uint32_t sect;
00142     uint32_t pos;
00143     int sbn;
00144     PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00145 
00146     for (tabnum = 0; tabnum < 2 && vol->vol_tab_sect[tabnum]; tabnum++) {
00147         link &= PHAT32CMASK;
00148 
00149         PhatTableLoc(vol, clust, tabnum, §, &pos);
00150         if ((sbn = PhatSectorLoad(dev, sect)) < 0) {
00151             return -1;
00152         }
00153         vol->vol_buf[sbn].sect_data[pos] = (uint8_t) link;
00154         vol->vol_buf[sbn].sect_data[pos + 1] = (uint8_t) (link >> 8);
00155         vol->vol_buf[sbn].sect_data[pos + 2] = (uint8_t) (link >> 16);
00156         vol->vol_buf[sbn].sect_data[pos + 3] = (uint8_t) (link >> 24);
00157         vol->vol_buf[sbn].sect_dirty = 1;
00158     }
00159     return 0;
00160 }
00161 
00170 int Phat32ReleaseChain(NUTDEVICE * dev, uint32_t first)
00171 {
00172     uint32_t next;
00173     PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00174 
00175     while (first < (PHATEOC & PHAT32CMASK)) {
00176         if (Phat32GetClusterLink(dev, first, &next)) {
00177             
00178             return -1;
00179         }
00180         if (next < 2) {
00181             
00182             break;
00183         }
00184         if (Phat32SetClusterLink(dev, first, 0)) {
00185             
00186             return -1;
00187         }
00188         vol->vol_numfree++;
00189         first = next;
00190     }
00191     return 0;
00192 }
00193