Index: embios/trunk/target/ipodnano2g/target.h |
— | — | @@ -35,4 +35,7 @@ |
36 | 36 | #define USB_NUM_ENDPOINTS 5
|
37 | 37 |
|
38 | 38 |
|
| 39 | +#define NUM_VOLUMES 1
|
| 40 | +
|
| 41 | +
|
39 | 42 | #endif
|
Index: embios/trunk/fat.c |
— | — | @@ -208,12 +208,12 @@ |
209 | 209 | |
210 | 210 | static char fat_cache_sectors[FAT_CACHE_SIZE][SECTOR_SIZE]; |
211 | 211 | static struct fat_cache_entry fat_cache[FAT_CACHE_SIZE]; |
212 | | -static struct mutex cache_mutex SHAREDBSS_ATTR; |
| 212 | +static struct mutex cache_mutex; |
213 | 213 | |
214 | 214 | #if defined(HAVE_HOTSWAP) && !(CONFIG_STORAGE & STORAGE_MMC) /* A better condition ?? */ |
215 | 215 | void fat_lock(void) |
216 | 216 | { |
217 | | - mutex_lock(&cache_mutex); |
| 217 | + mutex_lock(&cache_mutex, TIMEOUT_BLOCK); |
218 | 218 | } |
219 | 219 | |
220 | 220 | void fat_unlock(void) |
— | — | @@ -475,7 +475,7 @@ |
476 | 476 | else |
477 | 477 | { /* volume is not accessible any more, e.g. MMC removed */ |
478 | 478 | int i; |
479 | | - mutex_lock(&cache_mutex); |
| 479 | + mutex_lock(&cache_mutex, TIMEOUT_BLOCK); |
480 | 480 | for(i = 0;i < FAT_CACHE_SIZE;i++) |
481 | 481 | { |
482 | 482 | struct fat_cache_entry *fce = &fat_cache[i]; |
— | — | @@ -660,7 +660,7 @@ |
661 | 661 | unsigned char *sectorbuf = &fat_cache_sectors[cache_index][0]; |
662 | 662 | int rc; |
663 | 663 | |
664 | | - mutex_lock(&cache_mutex); /* make changes atomic */ |
| 664 | + mutex_lock(&cache_mutex, TIMEOUT_BLOCK); /* make changes atomic */ |
665 | 665 | |
666 | 666 | /* Delete the cache entry if it isn't the sector we want */ |
667 | 667 | if(fce->inuse && (fce->secnum != secnum |
— | — | @@ -970,7 +970,7 @@ |
971 | 971 | unsigned char *sec; |
972 | 972 | DEBUGF("flush_fat()"); |
973 | 973 | |
974 | | - mutex_lock(&cache_mutex); |
| 974 | + mutex_lock(&cache_mutex, TIMEOUT_BLOCK); |
975 | 975 | for(i = 0;i < FAT_CACHE_SIZE;i++) |
976 | 976 | { |
977 | 977 | struct fat_cache_entry *fce = &fat_cache[i]; |
— | — | @@ -1013,81 +1013,11 @@ |
1014 | 1014 | if (tenth) |
1015 | 1015 | *tenth = (tm->tm_sec & 1) * 100; |
1016 | 1016 | #else |
1017 | | - /* non-RTC version returns an increment from the supplied time, or a |
1018 | | - * fixed standard time/date if no time given as input */ |
1019 | 1017 | |
1020 | | -/* Macros to convert a 2-digit string to a decimal constant. |
1021 | | - (YEAR), MONTH and DAY are set by the date command, which outputs |
1022 | | - DAY as 00..31 and MONTH as 01..12. The leading zero would lead to |
1023 | | - misinterpretation as an octal constant. */ |
1024 | | -#define S100(x) 1 ## x |
1025 | | -#define C2DIG2DEC(x) (S100(x)-100) |
1026 | | -/* The actual build date, as FAT date constant */ |
1027 | | -#define BUILD_DATE_FAT (((YEAR - 1980) << 9) \ |
1028 | | - | (C2DIG2DEC(MONTH) << 5) \ |
1029 | | - | C2DIG2DEC(DAY)) |
| 1018 | + if (date) *date = (1 << 5) | 1; |
| 1019 | + if (time) *time = 0; |
| 1020 | + if (tenth) *tenth = 0; |
1030 | 1021 | |
1031 | | - bool date_forced = false; |
1032 | | - bool next_day = false; |
1033 | | - unsigned time2 = 0; /* double time, for CRTTIME with 1s precision */ |
1034 | | - |
1035 | | - if (date && *date < BUILD_DATE_FAT) |
1036 | | - { |
1037 | | - *date = BUILD_DATE_FAT; |
1038 | | - date_forced = true; |
1039 | | - } |
1040 | | - |
1041 | | - if (time) |
1042 | | - { |
1043 | | - time2 = *time << 1; |
1044 | | - if (time2 == 0 || date_forced) |
1045 | | - { |
1046 | | - time2 = (11 < 6) | 11; /* set to 00:11:11 */ |
1047 | | - } |
1048 | | - else |
1049 | | - { |
1050 | | - unsigned mins = (time2 >> 6) & 0x3f; |
1051 | | - unsigned hours = (time2 >> 12) & 0x1f; |
1052 | | - |
1053 | | - mins = 11 * ((mins/11) + 1); /* advance to next multiple of 11 */ |
1054 | | - if (mins > 59) |
1055 | | - { |
1056 | | - mins = 11; /* 00 would be a bad marker */ |
1057 | | - if (++hours > 23) |
1058 | | - { |
1059 | | - hours = 0; |
1060 | | - next_day = true; |
1061 | | - } |
1062 | | - } |
1063 | | - time2 = (hours << 12) | (mins << 6) | mins; /* secs = mins */ |
1064 | | - } |
1065 | | - *time = time2 >> 1; |
1066 | | - } |
1067 | | - |
1068 | | - if (tenth) |
1069 | | - *tenth = (time2 & 1) * 100; |
1070 | | - |
1071 | | - if (date && next_day) |
1072 | | - { |
1073 | | - static const unsigned char daysinmonth[] = |
1074 | | - {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; |
1075 | | - unsigned day = *date & 0x1f; |
1076 | | - unsigned month = (*date >> 5) & 0x0f; |
1077 | | - unsigned year = (*date >> 9) & 0x7f; |
1078 | | - |
1079 | | - /* simplification: ignore leap years */ |
1080 | | - if (++day > daysinmonth[month-1]) |
1081 | | - { |
1082 | | - day = 1; |
1083 | | - if (++month > 12) |
1084 | | - { |
1085 | | - month = 1; |
1086 | | - year++; |
1087 | | - } |
1088 | | - } |
1089 | | - *date = (year << 9) | (month << 5) | day; |
1090 | | - } |
1091 | | - |
1092 | 1022 | #endif /* CONFIG_RTC */ |
1093 | 1023 | } |
1094 | 1024 | |
— | — | @@ -1104,7 +1034,7 @@ |
1105 | 1035 | unsigned int sector = firstentry / DIR_ENTRIES_PER_SECTOR; |
1106 | 1036 | unsigned char chksum = 0; |
1107 | 1037 | unsigned int i, j=0; |
1108 | | - unsigned int nameidx=0, namelen = utf8length(name); |
| 1038 | + unsigned int nameidx=0, namelen = strlen(name); |
1109 | 1039 | int rc; |
1110 | 1040 | unsigned short name_utf16[namelen + 1]; |
1111 | 1041 | |
— | — | @@ -1132,7 +1062,7 @@ |
1133 | 1063 | /* we need to convert the name first */ |
1134 | 1064 | /* since it is written in reverse order */ |
1135 | 1065 | for (i = 0; i <= namelen; i++) |
1136 | | - name = utf8decode(name, &name_utf16[i]); |
| 1066 | + name_utf16[i] = *(name++); |
1137 | 1067 | |
1138 | 1068 | for (i=0; i < numentries; i++) { |
1139 | 1069 | /* new sector? */ |
— | — | @@ -2456,7 +2386,7 @@ |
2457 | 2387 | break; |
2458 | 2388 | /* utf8encode will return a pointer after the converted |
2459 | 2389 | * string, subtract the pointer to the start to get the length of it */ |
2460 | | - segm_utf8len = utf8encode(ucs, longname_utf8segm) - longname_utf8segm; |
| 2390 | + segm_utf8len = 1; |
2461 | 2391 | |
2462 | 2392 | /* warn the trailing zero ! (FAT_FILENAME_BYTES includes it) */ |
2463 | 2393 | if (longname_utf8len + segm_utf8len >= FAT_FILENAME_BYTES) { |
— | — | @@ -2465,6 +2395,8 @@ |
2466 | 2396 | break; /* fallback later */ |
2467 | 2397 | } |
2468 | 2398 | else { |
| 2399 | + if (ucs < 128) longname_utf8segm[0] = (unsigned char)ucs; |
| 2400 | + else longname_utf8segm[0] = '?'; |
2469 | 2401 | longname_utf8segm[segm_utf8len] = 0; |
2470 | 2402 | strcat(entry->name + longname_utf8len, longname_utf8segm); |
2471 | 2403 | longname_utf8len += segm_utf8len; |
— | — | @@ -2482,9 +2414,8 @@ |
2483 | 2415 | are control characters. */ |
2484 | 2416 | DEBUGF("SN-DOS: %s", shortname); |
2485 | 2417 | unsigned char *utf8; |
2486 | | - utf8 = iso_decode(shortname, entry->name, -1, |
2487 | | - strlen(shortname)); |
2488 | | - *utf8 = 0; |
| 2418 | + memcpy(entry->name, shortname, strlen(shortname)); |
| 2419 | + *(entry->name + strlen(shortname)) = 0; |
2489 | 2420 | DEBUGF("SN: %s", entry->name); |
2490 | 2421 | } else { |
2491 | 2422 | DEBUGF("LN: %s", entry->name); |