unsigned char sectors_per_cluster; unsigned int *pi; unsigned long *pl; pi = (unsigned int *)&raw_block[FAT_BYTES_PER_SECTOR]; partition.bytes_per_sector = *pi++; partition.sectors_per_cluster = *pi & 0xFF; pi = (unsigned int *)&raw_block[FAT_RESERVED_SECTORS]; reserved_sectors = *pi++; number_of_fats = *pi & 0xFF; pl = (unsigned long *)&raw_block[FAT_FAT_SIZE]; sectors_per_fat = *pl; partition.fat1_start_sector = partition.offset + reserved_sectors; partition.fat2_start_sector = partition.fat1_start_sector + sectors_per_fat; partition.root_dir_start_sector = partition.fat2_start_sector + sectors_per_fat; partition.last_free_chain = 0; fat_find_free_chain();} static unsigned long fat_calc_data_address(unsigned long cluster, unsigned char sector) {unsigned long offset; offset = ((cluster - 2) * partition.sectors_per_cluster); offset += partition.root_dir_start_sector; offset += sector; offset *= partition.bytes_per_sector; return offset;} static unsigned long fat_calc_chain_address(unsigned long index) {unsigned long offset; offset = partition.fat1_start_sector + (index >> 7); offset *= partition.bytes_per_sector; return offset;} void fat_load_root_directory(void) {unsigned long offset; offset = partition.root_dir_start_sector; offset *= partition.bytes_per_sector; mmc_read(offset); directory.parent_cluster = 0x00; directory.start_cluster = 0x02; directory.current_sector = 0x00; directory.current_cluster = 0x02; directory.current_direntry = (DIRENTRY *)FIRST_ENTRY_IN_ROOT;} static void fat_load_directory(unsigned long cluster, unsigned char sector, unsigned char new) {mmc_read(fat_calc_data_address(cluster, sector)); if (new) {directory.parent_cluster = directory.start_cluster; directory.start_cluster = cluster; directory.current_direntry = (DIRENTRY *)FIRST_ENTRY_IN_DIR;} directory.current_cluster = cluster; directory.current_sector = sector;} static void fat_read_next_sector_or_cluster(void) {if (directory.current_sector == (partition.sectors_per_cluster-1)) fat_load_directory(fat_next_chain(directory.current_cluster), 0, FALSE); else {directory.current_sector++; fat_load_directory(directory.current_cluster, directory.current_sector, FALSE);}} static DIRENTRY *fat_seek_directory(char *name, unsigned char find_free) {unsigned char i; DIRENTRY *p = (DIRENTRY *)START_OF_SECTOR; fat_load_directory(directory.start_cluster, 0, FALSE); i = 0; while(1) {i++; if (match_name(name, p->Name, 8)) if (p->Attribute & ATTRIB_SUBDIR) {if (!find_free) return p; else return 0;} if (!p->Name[0]) {if (!find_free) return 0; else return p;} p++; if (!(i % 0x10)) {i = 0; p = (DIRENTRY *)START_OF_SECTOR; fat_read_next_sector_or_cluster();}} return 0;} static DIRENTRY *fat_seek_file(char *name, unsigned char find_free) {unsigned char i; DIRENTRY *p = (DIRENTRY *)START_OF_SECTOR; fat_load_directory(directory.start_cluster, 0, FALSE); i = 0; while(1) {i++; if (match_name(name, p->Name, 11)) if (p->Attribute == ATTRIB_ARCHIVE) return p; if (!p->Name[0]) {if (!find_free) return 0; else return p;} p++; if (!(i % 0x10)) {i = 0; p = (DIRENTRY *)START_OF_SECTOR; fat_read_next_sector_or_cluster();}} return 0;} static unsigned long fat_find_free_chain(void) {unsigned long index = partition.last_free_chain; unsigned long *p; mmc_read(fat_calc_chain_address(index)); p = (unsigned long* )START_OF_SECTOR; p += (index & 0x7F); while(*p) {index++; p++; if (!(index % 0x80)) {mmc_read(fat_calc_chain_address(index)); p = (unsigned long* )START_OF_SECTOR;}} partition.last_free_chain = index; return index;} unsigned char fat_read_direntry(unsigned char first) {if (first) fat_load_directory(directory.start_cluster, 0, FALSE); else {if (directory.current_direntry == (DIRENTRY *)LAST_DIRENTRY) {fat_read_next_sector_or_cluster(); directory.current_direntry = (DIRENTRY *)START_OF_SECTOR;} else directory.current_direntry += 0x20; }} static unsigned long fat_next_chain(unsigned long from) {unsigned long *p; mmc_read(fat_calc_chain_address(from)); p = (unsigned long* )START_OF_SECTOR; p += (from & 0x7F); return *p;} void fat_mark_next_chain(unsigned long old, unsigned long new) {unsigned long *p; unsigned long offset; offset = fat_calc_chain_address(old); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (old & 0x7F); *p = new; mmc_write(offset); offset = fat_calc_chain_address(new); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (new & 0x7F); *p = 0x0FFFFFFF; mmc_write(offset);} void fat_chain_free(unsigned long index) {unsigned long *p; unsigned long temp = index; unsigned long offset; while (temp) {offset = fat_calc_chain_address(temp); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (temp & 0x7F); temp = *p; *p = 0; mmc_write(offset); }} static void fat_clear_sector(unsigned long cluster, unsigned char sector) {mmc_clear(fat_calc_data_address(cluster, sector));} unsigned char fat_make_directory(char *name)
two sentences of equal validity: "my code is self documenting" "the moon is made of green cheese"
Erik
"self-documenting code" can tell you what a function or variable is used for. However, it seldom answers the question "why".
"Tidied code"
Nope. Try again. Preview next time. If you don't preserve formatting (indentation), nobody's going to give it a second look.
Tidied code
void fatcheck(vodi) { unsigned char sectors_per_cluster; unsigned int *pi; unsigned long *pl; pi = (unsigned int *)&raw_block[FAT_BYTES_PER_SECTOR]; partition.bytes_per_sector = *pi++; partition.sectors_per_cluster = *pi & 0xFF; pi = (unsigned int *)&raw_block[FAT_RESERVED_SECTORS]; reserved_sectors = *pi++; number_of_fats = *pi & 0xFF; pl = (unsigned long *)&raw_block[FAT_FAT_SIZE]; sectors_per_fat = *pl; partition.fat1_start_sector = partition.offset + reserved_sectors; partition.fat2_start_sector = partition.fat1_start_sector + sectors_per_fat; partition.root_dir_start_sector = partition.fat2_start_sector + sectors_per_fat; partition.last_free_chain = 0; fat_find_free_chain();} static unsigned long fat_calc_data_address(unsigned long cluster, unsigned char sector) {unsigned long offset; offset = ((cluster - 2) * partition.sectors_per_cluster); offset += partition.root_dir_start_sector; offset += sector; offset *= partition.bytes_per_sector; return offset;} static unsigned long fat_calc_chain_address(unsigned long index) {unsigned long offset; offset = partition.fat1_start_sector + (index >> 7); offset *= partition.bytes_per_sector; return offset;} void fat_load_root_directory(void) {unsigned long offset; offset = partition.root_dir_start_sector; offset *= partition.bytes_per_sector; mmc_read(offset); directory.parent_cluster = 0x00; directory.start_cluster = 0x02; directory.current_sector = 0x00; directory.current_cluster = 0x02; directory.current_direntry = (DIRENTRY *)FIRST_ENTRY_IN_ROOT;} static void fat_load_directory(unsigned long cluster, unsigned char sector, unsigned char new) {mmc_read(fat_calc_data_address(cluster, sector)); if (new) {directory.parent_cluster = directory.start_cluster; directory.start_cluster = cluster; directory.current_direntry = (DIRENTRY *)FIRST_ENTRY_IN_DIR;} directory.current_cluster = cluster; directory.current_sector = sector;} static void fat_read_next_sector_or_cluster(void) {if (directory.current_sector == (partition.sectors_per_cluster-1)) fat_load_directory(fat_next_chain(directory.current_cluster), 0, FALSE); else {directory.current_sector++; fat_load_directory(directory.current_cluster, directory.current_sector, FALSE);}} static DIRENTRY *fat_seek_directory(char *name, unsigned char find_free) {unsigned char i; DIRENTRY *p = (DIRENTRY *)START_OF_SECTOR; fat_load_directory(directory.start_cluster, 0, FALSE); i = 0; while(1) {i++; if (match_name(name, p->Name, 8)) if (p->Attribute & ATTRIB_SUBDIR) {if (!find_free) return p; else return 0;} if (!p->Name[0]) {if (!find_free) return 0; else return p;} p++; if (!(i % 0x10)) {i = 0; p = (DIRENTRY *)START_OF_SECTOR; fat_read_next_sector_or_cluster();}} return 0;} static DIRENTRY *fat_seek_file(char *name, unsigned char find_free) {unsigned char i; DIRENTRY *p = (DIRENTRY *)START_OF_SECTOR; fat_load_directory(directory.start_cluster, 0, FALSE); i = 0; while(1) {i++; if (match_name(name, p->Name, 11)) if (p->Attribute == ATTRIB_ARCHIVE) return p; if (!p->Name[0]) {if (!find_free) return 0; else return p;} p++; if (!(i % 0x10)) {i = 0; p = (DIRENTRY *)START_OF_SECTOR; fat_read_next_sector_or_cluster();}} return 0;} static unsigned long fat_find_free_chain(void) {unsigned long index = partition.last_free_chain; unsigned long *p; mmc_read(fat_calc_chain_address(index)); p = (unsigned long* )START_OF_SECTOR; p += (index & 0x7F); while(*p) {index++; p++; if (!(index % 0x80)) {mmc_read(fat_calc_chain_address(index)); p = (unsigned long* )START_OF_SECTOR;}} partition.last_free_chain = index; return index;} unsigned char fat_read_direntry(unsigned char first) {if (first) fat_load_directory(directory.start_cluster, 0, FALSE); else {if (directory.current_direntry == (DIRENTRY *)LAST_DIRENTRY) {fat_read_next_sector_or_cluster(); directory.current_direntry = (DIRENTRY *)START_OF_SECTOR;} else directory.current_direntry += 0x20; }} static unsigned long fat_next_chain(unsigned long from) {unsigned long *p; mmc_read(fat_calc_chain_address(from)); p = (unsigned long* )START_OF_SECTOR; p += (from & 0x7F); return *p;} void fat_mark_next_chain(unsigned long old, unsigned long new) {unsigned long *p; unsigned long offset; offset = fat_calc_chain_address(old); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (old & 0x7F); *p = new; mmc_write(offset); offset = fat_calc_chain_address(new); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (new & 0x7F); *p = 0x0FFFFFFF; mmc_write(offset);} void fat_chain_free(unsigned long index) {unsigned long *p; unsigned long temp = index; unsigned long offset; while (temp) {offset = fat_calc_chain_address(temp); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (temp & 0x7F); temp = *p; *p = 0; mmc_write(offset); }} static void fat_clear_sector(unsigned long cluster, unsigned char sector) {mmc_clear(fat_calc_data_address(cluster, sector));} unsigned char fat_make_directory(char *name) }
I use self documented code so comments are not needed
If this is an example of self-documented code, then I think I'll stick with the old-school method of including comments!
What about indentation?
Also looks like you've missed the start of the first function. Maybe it's important? Probably would stop the code compiling.
Oh - And looks like the end of the last function is missing too.
Please consider tidying up the code before posting again.
C251 Code is for fat on a SD memory stick I use self documented code so comments are not needed When I open a file I do not get the right data
You didn't read and/or follow the instructions for posting source code - so it's illegible.
You haven't said what toolset is applicable.
You haven't said what it's supposed to do, and it appears to contain no comments.
You haven't said why you think it's "wrong" - what does it do that it shouldn't, and/or what doesn't it do that it should?
View all questions in Keil forum