привет. Собрал yampp+эмулятор в одном по проекту Сергея на atmega162.
После решения мелких обнаруженных проблем в печатке все вроде как заработало. Т.е на HU появился пункт MultiCD который успешно выбирается. Но дальше не все так хорошо. При подключенном винте сообщает об ошибке Error_01, что означает неправильный размер кластера. При включении без винта - ошибка Error_04 - что значит NO_HDD - здесь все ок.
Проблема в том что размер кластера на винте 100% совпадает с размером, заданным в constant.h
Самое интересное в том, что если залить оригинальную прошивку
yampp_pioneer_v2.2.zip, то все успешно определяется и работает.
Копания в коде Сергея привели к след результату:
1.Ошибка ERROR_01 неправильный размер кластера формируется в след участке кода файла Yampp3.c
ATA_Init(); // Init and wait for drive
ATA_SW_Reset(); // Reset drive
if (ATA_SetDownTime())
{
if (init_fat()) // Read disk structure
{
SetPlayerError(1,1); //Error 01 CLUSTER SIZE INVALID
}
else
{
wMaxDirs = dirlist();
т.е init_fat() возвращает ВСЕГДА не нулевое значение.
В теле этой функции, которая описана в файле FAT.C я обратил внимание на след расхождение:
В проекте Сергея:
#ifdef CHS_ACCES_FIRST
//++++++++++++++++++++++++++++++++++++++++
// fix from Uli (Ulrich.Behrenbeck@Informatik-Werkstatt.de)
ATA_ReadCHS0(1, 1, 1, 1, FAT_CACHE);
// LBA bit NOT set !!! a raw erroneous CHS access
//++++++++++++++++++++++++++++++++++++++++
#else
// read partition table
ATA_ReadLBA0(0, 1, FAT_CACHE);
#endif
// get the partition record
pr = (struct partrecord *) ((struct partsector*)FAT_CACHE)->psPart;
// and find the first valid sector
first_sec = pr->prStartLBA;
// Read the Partition BootSector
ATA_ReadLBA0(first_sec, 1, FAT_CACHE);
// get BIOS parameter block
#ifdef FAT16
bpb = (struct bpb50*)((struct bootsector50*)FAT_CACHE)->bsBPB;
#else
bpb = (struct bpb710*)((struct bootsector710*)FAT_CACHE)->bsBPB;
#endif
// and setup some constants
if (bpb->bpbSecPerClust != SECT_PER_CLUST) // Recompile code for this disk
// return false;
{
return bpb->bpbSecPerClust;
}
, в отличии от оригинальной прошивки эмулятора:
#ifdef CHS_ACCES_FIRST
//++++++++++++++++++++++++++++++++++++++++
// fix from Uli (Ulrich.Behrenbeck@Informatik-Werkstatt.de)
ATA_ReadCHS0(1, 1, 1, 1, TMP_SECTOR);
// LBA bit NOT set !!! a raw erroneous CHS access
//++++++++++++++++++++++++++++++++++++++++
#else
ATA_ReadLBA0(0, 1, TMP_SECTOR);
#endif
// read partition table
ATA_ReadLBA0(0, 1, TMP_SECTOR);
// get the partition record
pr = (struct partrecord *) ((struct partsector*)TMP_SECTOR)->psPart;
// and find the first valid sector
first_sec = pr->prStartLBA;
// Read the Partition BootSector
ATA_ReadLBA0(first_sec, 1, TMP_SECTOR);
// get BIOS parameter block
#ifdef FAT16
bpb = (struct bpb50*)((struct bootsector50*)TMP_SECTOR)->bsBPB;
#else
bpb = (struct bpb710*)((struct bootsector710*)TMP_SECTOR)->bsBPB;
#endif
// and setup some constants
if (bpb->bpbSecPerClust != SECT_PER_CLUST) // Recompile code for this disk
// return false;
return bpb->bpbSecPerClust;
отсутствует пара строчек после #endif -
// read partition table
ATA_ReadLBA0(0, 1, TMP_SECTOR);
т.е насколько я понимаю ATA_readLBA0() по ошибке не вызывается в прошивке Сергея, если раскоментирован параметр #define CHS_ACCES_FIRST.
Так и должно быть? Почему в оригинальной прошивке вызов этой функции происходит в любом случае, независимо от значения CHS_ACCES_FIRST?
Может ли быть косяк в этом? Кстати у него он был закоментирован по умолчанию, у меня же в таком случае виснет на определении винта. Пришлось раскомментировать.
Вопрос конечно больше к Сергею, но он не отвечает на письма. Vitat, может быть Вы подскажете. Почему еще может появляться ошибка размера кластера, кроме как ошибки размера кластера собственно?
Заранее благодарен! Извиняюсь за некоторую "сумбурность" рассказа.