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