We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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)
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; } //MISSING A BRACKET HERE 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) { } You seem to have a lot of unmatch brackets, I think? White space is free, use some. Code is not just for you. Others may have to read it.
The code compiles, but I had to give only the important bits because the forum does not like big posts.
I know varbials are not in my listing because they will not fit in the message.
vodi is a typing mistake and is void in the code of course.
Give me you're email address now and I will send you the code to fix.
thank you.
"vodi is a typing mistake"
Which is why you should never re-type the code into the forum! Always use copy-and-paste!
"and is void in the code of course"
Why of course? All you've said so far is that it doesn't work - despite being asked, you haven't actually confirmed yet that it compiles cleanly (ie, without errors or warnings).
And if that's one obvious typing mistake, how many more are buried in your post?!
"Give me you're email address now and I will send you the code to fix."
Well, if you sent the complete project (not just a few source files) together with a thorough description of what it's supposed to do, the target hardware it's supposed to run on, and how exactly it is failing, someone might be prepared to give you a Quote to fix it for you...
What is you're email address?
I said the code compiles!
Whats' wrong with this code
void fatcheck(void) { 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) { mmc_change(name); }
"Whats' wrong with this code?"
It's red!
You still haven't answered: "...why you think it's "wrong" - what does it do that it shouldn't, and/or what doesn't it do that it should?"
You still haven't given any meaningful description of the "problems" that you've observed.
You still haven't even confirmed that it compiles without warnings.
Did you write this code yourself, or is it from a 3rd party?
What testing have you done in an attempt to narrow-down the source of these "problems"?
Have you tried it in a simulator?
Are you sure that the target is correct & working?
Are you sure that you've configured everything correctly?
ok, its' red but that doesnt' stop it working ;)
Whet I write to a file it looks good but when i read the file back its' f**ked up!
See above.
Yes it does.
Some I wrote myself and some from somewhere else.
I know that the the problem is in the reading of a file, or the writing.
Simulators are for wimps!
Yes.
Maybe a problem in the code.
"Some I wrote myself and some from somewhere else."
Did the 3rd-party code work when you got it?
How did you check that it was suitable for your tools and your hardware? eg, you make extensive use of int, long etc - are you sure that any assumptions about size, endianness, etc are valid?
What have you done to isolate whether the "problems" are in the bits you've changed, or the original 3rd-party bits?
"Whet I write to a file it looks good"
Where does it "look good"? How are you checking it? What are your criteria for "looking good" - does that mean you've carefully checked in detail that it's all 100.0% correct, or you've just had a quick glance?
"when i read the file back its' f**ked up!"
That's not very descriptive, is it?
How, exactly, is it "f**ked up"?
Where is it getting "f**ked up" - ie, are you low-level raw sector accesses working, or is it higher up the chain?
Can you read files that were created by other systems?
"Simulators are for wimps!"
And only idiots refuse to use a tool that could help them when they're stuck! You're not getting anywhere without the simulator, so why not give it a try? Why make life difficult for yourself?
Q: Are you sure that the target is correct & working? A: Yes.
How are you sure? What testing have you done?
Some I wrote myself and some from somewhere else. "Did the 3rd-party code work when you got it?
Yes, but not properly.
The original code makes no such assumptions. I was told that it was platform and compiler neutral.
I put my bits into a separate file.
Yes. The call returns no error.
Pretty good description I though. Could also be decribed as scr**ed up or mu**ed up if you prefer.
It doesnt do what it should. The read fails.
Interesting, I'll check on that one.
No, but the only other platform I use is Windows and I dont trust that. Do you?
Id prefer to understand the code. Besides, how would I stimulate a memory card?
Erm, because the hardware guys said so. They tested it.
If simulators are for wimps, then I would figure that asking for help in forums is also for wimps...
Have you done a raw dump of the written data, and manually checked that the data conforms to the expected format?
Following that logic ...
If all trees are green then it follows that all shoes are green, all cars are green and all g-strings are green.
Yes, but its complimercated and takes time!
Patience please.
"Yes, but its complimercated and takes time!"
So stop wasting your time making useless posts and get on with it!
SIR, YES SIR
id prefer to understand the code. Besides, how would I stimulate a memory card?
Can you read a file put on the memory card by a PC? Can your PC read a file you put on the memory card with a PC?
F**KUP says nothing. What do you read back Bad data? scrambled data? No data? Have you tried writing and reading a single byte? Does the file name appear on the card?
The chance that someone can just look at a few pages of code from an incomplete program and find a logic error are slim to none. AS you said none of use can run your code. the best anyone else can do is help you narrow don the problem.