Vitat's homepage
28 Mar 2024, 13:33 *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: 21.03.08 Произведено обновление сайта/Site was updated
 
  Home   Forum   Help Search Login Register  

Pages: [1] 2 3 4   Go Down
  Print  
Author Topic: Собрал "yampp+emulator в одном" Сергея. Вопросы к автору.(+photo)  (Read 39467 times)
0 Members and 1 Guest are viewing this topic.
efko
Junior
**
Gender: Male
Posts: 26

339806526
View Profile Email
« on: 15 Dec 2007, 02:43 »

привет. Собрал yampp+эмулятор в одном по проекту Сергея на atmega162.
После решения мелких обнаруженных проблем в печатке все вроде как заработало. Т.е на HU появился пункт MultiCD который успешно выбирается. Но дальше не все так хорошо. При подключенном винте сообщает об ошибке Error_01, что означает неправильный размер кластера. При включении без винта - ошибка Error_04 - что значит NO_HDD - здесь все ок.
Проблема в том что размер кластера на винте 100% совпадает с размером, заданным в constant.h
Самое интересное в том, что если залить оригинальную прошивку yampp_pioneer_v2.2.zip, то все успешно определяется и работает.
Копания в коде Сергея привели к след результату:
1.Ошибка ERROR_01 неправильный размер кластера формируется в след участке кода файла Yampp3.c
Code:
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 я обратил внимание на след расхождение:
В проекте Сергея:
Code:
#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;
}

, в отличии от оригинальной прошивки эмулятора:
Code:
#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, может быть Вы подскажете. Почему еще может появляться ошибка размера кластера, кроме как ошибки размера кластера собственно?Smile

Заранее благодарен! Извиняюсь за некоторую "сумбурность" рассказа.
« Last Edit: 17 Dec 2007, 00:11 by efko » Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #1 on: 15 Dec 2007, 12:36 »

У  Вас скорее всего читается мусор с диска. Во первых:  какой кварц меги, не меняли? Во вторых побрубуйте уменьшить/увеличить
колличесвто NOP в файле ata_if.c функция (u08 ExecuteCommand(u08 NumSectors, u08 *Buffer)).


for(i=BPS / MINIBUFFERSIZE;i;i--)
      {  // cycle sector by minibuffers
         cli(); //Need for block HU message
         SetAddress(CMD_A + CMD_DATA);         // setup addressing and chip selects         
         DDRA=0x00;            // port A as input
         PORTA=0xFF;            // activate Pullups
         DDRC=0x00;            // port C as input
         PORTC=0xFF;            // activate Pullups
         
         asm volatile ("movw r30,r28");
         asm volatile ("adiw r30,1");             
         for(j=MINIBUFFERSIZE;j;)
         {   // cycle minibuffer by words         
            cbi(PORTB, 1);                   // set DIOR lo            
            
            asm volatile ("nop");       // allow pin change !!! BE carefull! On other clocks change number of 'nop'
            asm volatile ("nop");       // allow pin change   
                                       
            
            //asm volatile ("nop");       // allow pin change                                          
            //asm volatile ("nop");       // allow pin change


то что выделено
Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #2 on: 15 Dec 2007, 13:18 »

Вдогонку
CHS_ACCES_FIRST закоментируйте.
Logged
efko
Junior
**
Gender: Male
Posts: 26

339806526
View Profile Email
« Reply #3 on: 15 Dec 2007, 14:25 »

Сергей здравствуйте! Рад Вашему появлению на форуме!) Долго пытался связаться с вами)
Кварц меги 12 Мгц, без изменений. Фьюзы как в yampp3/usb, только без совместимости с mega161.Тут все нормально.

Мусор в каком плане? Некорректное чтение секторов? Пробовал несколько винтов, форматил разными прогами. Может быть попробовать с FAT16? Можно как то получить log обмена даннами с винтом в вашей прошивке? после раскоментирования DEBUG_ATA и ENABLE_SERIAL пропадает обмен с HU. Пока не понял почему, но HU просто перестает видеть MultiCD. В общем вопросов пока больше чем ответов) Некоторые может быть очень глупые.

Во вторых побрубуйте уменьшить/увеличить
колличесвто NOP в файле ata_if.c функция (u08 ExecuteCommand(u08 NumSectors, u08 *Buffer))

ок,попробую. Спасибо за совет.

Если закоментировать CHS_ACCES_FIRST - плейер виснет на определении винта (постоянно горит светодиод) после чего теряется связь с HU.
Не понимаю, откуда у меня столько проблем. У вас ведь вроде все работало. Кстати, работает до сих пор?)

И попутные вопросы, что "включают" следющие переменные

//#define TEST_MEM   
//#define USE_LOW_EXT
//#define PLAY_WITHOUT_HU
//#define LOG
//#define PRINTUNKOWN
//#define SENDTEST  //for test
//#define HEXDUMP
//#define ENABLE_CRC

Заранее благодарен!
 
Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #4 on: 15 Dec 2007, 15:17 »

Quote
Мусор в каком плане? Некорректное чтение секторов?
Да

 CHS_ACCES_FIRST - должен быть закоментирован.
Еще две функции

void WriteBYTE(u08 addr, u08 dat)
u08 ReadBYTE(u08 addr)



asm volatile ("nop");      // allow pin change      
   cbi(PORTB, 1);             // set DIOR lo
   asm volatile ("nop");      // allow pin change                  
   asm volatile ("nop");      // allow pin change         
         


там тоже NOP надо подправить

//#define TEST_MEM   
//#define USE_LOW_EXT
для отладки

TEST_MEM     проверка внешней  памяти
#define PRINTUNKOWN            вывод неопознанных комманд IPBUS
//#define PLAY_WITHOUT_HU  работа без магнитофона
/#define LOG  лог обмена по IPBUS
HEXDUMP      не используется
ENABLE_CRC осталась от прежних версия незнаю работает ли


если включить  ENABLE_SERIAL  то в прошивке просто не остается места Компилятор должен ругаться.
Поэтому надо на время чегото выключит, например TAG(файл mpeg.c закоментировать #define TAGON)

Вообще я посетовал бы такой алгоритм:
выключить TAGON
включить ENABLE_SERIAL,TEST_MEM, PLAY_WITHOUT_HU (забыл)
скомпилировать и загрузить прошивку
подлючить к COM порту
в терминале должно появиться 'TEST mem ok' или ошибки памяти
это можно сделать без винта и HU
убедились что память и UART работают

выключаем TEST_MEM

теперь плейр должен вывести 'Init ok\nGoing to main loop...'  начать играть .Если нет играемя с  NOP's
« Last Edit: 15 Dec 2007, 16:21 by Sergey » Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #5 on: 15 Dec 2007, 16:24 »

Еще можно включить PWR_BEEPS 
если есть писк, VS1001 работает
Logged
efko
Junior
**
Gender: Male
Posts: 26

339806526
View Profile Email
« Reply #6 on: 15 Dec 2007, 17:30 »

Спасибо за подробное разъяснение. Ситуация становится более менее ясной.
Quote
Еще можно включить PWR_BEEPS 
если есть писк, VS1001 работает
писк есть. Более того загонял тестовую прошивку yampp3/usb. Все тесты проходит на ура. Т.е аппаратно все работает.
Прошивка Виталия тоже. Музыка воспроизводится.  UART-ом переключал песни, папки, прокрутку и т д.

Quote
там тоже NOP надо подправить
насколько я понимаю их количество следует изменять пропорционально во всех указанных Вами функциях? Обычные временные задержки? Есть ограничение сверху по их количеству?

Quote
если включить  ENABLE_SERIAL  то в прошивке просто не остается места Компилятор должен ругаться.
Поэтому надо на время чегото выключит, например TAG(файл mpeg.c закоментировать #define TAGON)

Вообще я посетовал бы такой алгоритм:
выключить TAGON
включить ENABLE_SERIAL,TEST_MEM, PLAY_WITHOUT_HU (забыл)
скомпилировать и загрузить прошивку
подлючить к COM порту
в терминале должно появиться 'TEST mem ok' или ошибки памяти
это можно сделать без винта и HU
убедились что память и UART работают

выключаем TEST_MEM

теперь плейр должен вывести 'Init ok\nGoing to main loop...'  начать играть .Если нет играемя с  NOP's

Очень ценная информация! Именно это хотел узнать.Спасибо. Сегодня попробую.

Еще вопрос - тип файловой системы FAT32 или FAT32LBA? Идентификаторы у них разные. 0B и 0С если не ошибаюсь. Или тупо форматнуть виндой и не заморачиваться?
« Last Edit: 15 Dec 2007, 17:36 by efko » Logged
efko
Junior
**
Gender: Male
Posts: 26

339806526
View Profile Email
« Reply #7 on: 15 Dec 2007, 17:34 »

Если кто будет повторять конструкцию - замечен небольшой баг в схеме (yampp162.sch) - сигнал сброса VRST с PD5, правильно будет - с PD2. На плате (yampp_162_v2_R1.pcb) ошибки нет!
Да и вообще pcb полностью без ошибок.
« Last Edit: 15 Dec 2007, 17:39 by efko » Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #8 on: 15 Dec 2007, 17:54 »

Quote
Или тупо форматнуть виндой и не заморачиваться?
Лучше из под доса. У Винды на все свое мнение Smile

Quote
насколько я понимаю их количество следует изменять пропорционально во всех указанных Вами функциях?

Да.
Обыкновенные временные задержки
Количество от 1  и пока не заработает но не больше 10
Чтобы посмотреть что читатеся добавте это код
Code:
{
    u16 i;
for(i=0;i<512;i++)
    {

UART_Printfu08( FAT_CACHE[i]);
PRINT(" ");
}
}
   
после
#else
   // read partition table
   ATA_ReadLBA0(0,   1, FAT_CACHE);
#endif
в функции u08 init_fat(void)  файл fat.c
« Last Edit: 15 Dec 2007, 18:07 by Sergey » Logged
efko
Junior
**
Gender: Male
Posts: 26

339806526
View Profile Email
« Reply #9 on: 16 Dec 2007, 00:00 »

Продолжаю ..
CHS_ACCES_FIRST закоментировал.
TAGON выключил.
ENABLE_SERIAL,TEST_MEM, PLAY_WITHOUT_HU включил.

>mem test ok.
==
добавил вывод FAT_CACHE на терминал.
Убрал  TEST_MEM.

итог: плейер пропикивает три раза, висит и перезапускается и т по бесконечному циклу.
терминал молчит. Хотя, пробел выводит.
===
CHS_ACCES_FIRST раскоментировал.
виснуть перестал. Пищит три раза и выводит 512 нулей))
===
добавил в Fat.c (то, что выделено):
#else
   // read partition table
   ATA_ReadLBA0(0,   1, FAT_CACHE);
#endif
   // read partition table
   ATA_ReadLBA0(0,   1, FAT_CACHE);

#ifdef ENABLE_SERIAL
   {
   u16 i;
   for(i=0;i<512;i++)
       {
      
       UART_Printfu08( FAT_CACHE);
       PRINT(" ");
      }
   }
#endif   

итог - пищит три раза, на терминале:
Code:
33 C0 8E
D0 BC 00 7C FB 50 07 50 1F FC BE 1B 7C BF 1B 06 50 57 B9 E5 01 F3 A4 CB BE BE 07
 B1 04 38 2C 7C 09 75 15 83 C6 10 E2 F5 CD 18 8B 14 8B EE 83 C6 10 49 74 16 38 2
C 74 F6 BE 10 07 4E AC 3C 00 74 FA BB 07 00 B4 0E CD 10 EB F2 89 46 25 96 8A 46
04 B4 06 3C 0E 74 11 B4 0B 3C 0C 74 05 3A C4 75 2B 40 C6 46 25 06 75 24 BB AA 55
 50 B4 41 CD 13 58 72 16 81 FB 55 AA 75 10 F6 C1 01 74 0B 8A E0 88 56 24 C7 06 A
1 06 EB 1E 88 66 04 BF 0A 00 B8 01 02 8B DC 33 C9 83 FF 05 7F 03 8B 4E 25 03 4E
02 CD 13 72 29 BE 52 07 81 3E FE 7D 55 AA 74 5A 83 EF 05 7F DA 85 F6 75 83 BE 29
 07 EB 8A 98 91 52 99 03 46 08 13 56 0A E8 12 00 5A EB D5 4F 74 E4 33 C0 CD 13 E
B B8 00 00 80 37 35 15 56 33 F6 56 56 52 50 06 53 51 BE 10 00 56 8B F4 50 52 B8
00 42 8A 56 24 CD 13 5A 58 8D 64 10 72 0A 40 75 01 42 80 C7 02 E2 F7 F8 5E C3 EB
 74 8D A5 A2 A5 E0 AD A0 EF 20 E2 A0 A1 AB A8 E6 A0 20 E0 A0 A7 A4 A5 AB AE A2 0
0 8E E8 A8 A1 AA A0 20 AF E0 A8 20 A7 A0 A3 E0 E3 A7 AA A5 20 AE AF A5 E0 A0 E6
A8 AE AD AD AE A9 20 E1 A8 E1 E2 A5 AC EB 00 8E AF A5 E0 A0 E6 A8 AE AD AD A0 EF
 20 E1 A8 E1 E2 A5 AC A0 20 AD A5 20 AD A0 A9 A4 A5 AD A0 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 00 00 00 8B FC 1E 57 8B F5 CB 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 30 20 B7 90 00 00 80 01 01 00 0C FE FF FF 3F 00 0
0 00 D9 E5 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 55 AA Init ok
Going to main loop...
пошел играть. Тут у меня чуть не случился орг..м)) В общем по быстрому выключаю PLAY_WITHOUT_HU. включаю TAGON.
 Итог - голова видит трек, похоже дает команду на плей, время стоит и перезагружается.
===
выключаю TAGON.
Итог - голова увидела трек, время пошло, все запело, но при попытке переключить треки - перезагруз головы.
===
включил LOG и UART, хотел глянуть чего там голова передает - ошибка PRINT_MESSAGE в IP_bus.c при компиляции.
==
Далее CHS_ACCES_FIRST закоментировал.
LOG, TAGON выключил.
ENABLE_SERIAL,PLAY_WITHOUT_HU включил.

и игрался nop-ами при помощи след конструкции:
Code:
{
u08 i;
for(i=0;i<NUMBER_OF_NOP;i++)
        {
asm volatile ("nop");
      }
    }


в constant.h добавил #define NUMBER_OF_NOP 2 // задержка
Ни в какую не выводит. Просто висит.
Вот такие пироги.
« Last Edit: 16 Dec 2007, 00:34 by efko » Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #10 on: 16 Dec 2007, 00:49 »

верните все назад и 'nop' тоже
закоментируйте CHS_ACCES_FIRST
раскоментируйте    
//delay10us();   в функции u08 ATA_ReadLBA0(u32 LBA, u08 NumSectors, u08 *Buffer) файл ata_if.c

если не поможет
надо определить где виснет плеер
ставте

PRINT("START funname");
вызов функции
PRINT("END   funname");

в цепочке init_fat()

например
PRINT("START init_fan()")
init_fat();
PRINT("END init_fan()")

обязательно закоментируйте USE_LOW_EXT



Logged
efko
Junior
**
Gender: Male
Posts: 26

339806526
View Profile Email
« Reply #11 on: 16 Dec 2007, 01:13 »

понял.Сейчас попробую.
В принциеп все вроде как заработало. Через одно место правда) Частенько перезгружаясь, не выдавая теги и не всегда переключая треки) Но уже что то. Кстати, на кнопку Band реагирует нормально. Чего то там меняется на экране HU.
 И еще - у вас хватает места в прошивке под TAGON? У меня уже начинает ругаться когда включаешь. Хотя UART и пр выключены.
Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #12 on: 16 Dec 2007, 01:16 »

Quote
и игрался NOP-ами при помощи след конструкции:
так играть NOP нельзя    Exclamation Exclamation Exclamation
только добавлять или убирать
asm volatile ("nop"); !!!!!!!!!!!!!!!!!!!!!!!!!!!
« Last Edit: 16 Dec 2007, 01:25 by Sergey » Logged
Sergey
Member
***
Posts: 76


View Profile Email
« Reply #13 on: 16 Dec 2007, 01:22 »

Quote
И еще - у вас хватает места в прошивке под TAGON
все хватает У Вас какая версия avr нужна  WinAVR 20040404
Когда грузите файл в yaap программа не должна вылезать за 0x4000
Logged
efko
Junior
**
Gender: Male
Posts: 26

339806526
View Profile Email
« Reply #14 on: 16 Dec 2007, 01:29 »

WinAVR-20040720, с этим разберусь я думаю. Наверное стоит повесить вашу версию. Разницы нет конечно, но на всякий случай. 
за 0x4000 в любом случае не вылазит. Странно, но при включении TAGON он даже не пищит. а тупо ресетится по циклу.
Я уже думаю не бракованная ли у меня mega. Может 12 мгц ей слишком много?)

Все таки нужно добить CHS_ACCES_FIRST. Кстати, это оч важно, раскоментирована она или нет, с точки зрения проигрывания файлов. Или с точки зрения HU?

Спасибо за помощь! Без Вас я скорее всего уже выкинул бы все в окошко))
Logged
Pages: [1] 2 3 4   Go Up
  Print  
 
Jump to:  

TinyPortal v1.0.5 beta 1© Bloc

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!