1
10
13
14
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
104
105
106
107
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
135
136
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
...
...
...
#define FX_SOURCE_CODE
#include "fx_api.h"
#ifdef FX_ENABLE_EXFAT
#include "fx_system.h"
#include "fx_media.h"
#include "fx_utility.h"
#include "fx_directory_exFAT.h"
#ifdef FX_ENABLE_FAULT_TOLERANT
#include "fx_fault_tolerant.h"
#endif
...
UINT _fx_utility_exFAT_cluster_state_get(FX_MEDIA *media_ptr, ULONG cluster, UCHAR *cluster_state)
{
UINT status;
UINT bitmap_offset;
UCHAR cluster_shift;
UCHAR eight_clusters_block;
#ifdef FX_ENABLE_FAULT_TOLERANT
ULONG value;
if (media_ptr -> fx_media_fault_tolerant_enabled &&
(media_ptr -> fx_media_fault_tolerant_state & FX_FAULT_TOLERANT_STATE_STARTED))
{
/* ... */
status = _fx_fault_tolerant_read_FAT(media_ptr, cluster, &value, FX_FAULT_TOLERANT_BITMAP_LOG_TYPE);
if (status != FX_READ_CONTINUE)
{
*cluster_state = (UCHAR)value;
return(status);
}if (status != FX_READ_CONTINUE) { ... }
}if (media_ptr -> fx_media_fault_tolerant_enabled && (media_ptr -> fx_media_fault_tolerant_state & FX_FAULT_TOLERANT_STATE_STARTED)) { ... }
/* ... */#endif
status = _fx_utility_exFAT_bitmap_cache_prepare(media_ptr, cluster);
if (status == FX_SUCCESS)
{
bitmap_offset = (UINT)(cluster - media_ptr -> fx_media_exfat_bitmap_cache_start_cluster) >> BITS_PER_BYTE_SHIFT;
eight_clusters_block = *(media_ptr -> fx_media_exfat_bitmap_cache + bitmap_offset);
if (eight_clusters_block == 0x00)
{
*cluster_state = FX_EXFAT_BITMAP_CLUSTER_FREE;
}if (eight_clusters_block == 0x00) { ... }
else if (0xFF == eight_clusters_block)
{
*cluster_state = FX_EXFAT_BITMAP_CLUSTER_OCCUPIED;
}else if (0xFF == eight_clusters_block) { ... }
else
{
cluster_shift = (UCHAR)((cluster - FX_FAT_ENTRY_START) % BITS_PER_BYTE);
*cluster_state = (eight_clusters_block >> cluster_shift) & 0x1;
}else { ... }
}if (status == FX_SUCCESS) { ... }
return(status);
}_fx_utility_exFAT_cluster_state_get (FX_MEDIA *media_ptr, ULONG cluster, UCHAR *cluster_state) { ... }
/* ... */
#endif