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