FDD

Тема в разделе "WASM.OS.DEVEL", создана пользователем valhalla, 11 июн 2010.

  1. valhalla

    valhalla New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2010
    Сообщения:
    9
    Всем привет.

    Возникла надобность поработать с FDD. Столкнулся со следующей проблемой: IRQ6 срабатывает только один раз. В функции reset() после вызова enable_controller(). В функции calibrate() уже ничего не работает. Запускал в bochs и в qemu, последний выдает FLOPPY ERROR: fdctrl_unimplemented: unimplemented command 0x00 во все том же calibrate() при вызовае send_command(drive).

    P.S. fdc_flag изначально равен 0 и меняется в обработчике прерывания

    Код (Text):
    1. void wait_irq()
    2. {
    3.         while(!fdc_flag);
    4.         fdc_flag = 0;
    5. }
    6.  
    7.  
    8. void init_fdd()
    9. {
    10.         init_dma();
    11.         reset();
    12.    //...
    13. }
    14. void reset()
    15. {
    16.         disable_controller();
    17.         enable_controller();
    18.         wait_irq(); // здесь все работает нормально
    19.         //...
    20.         calibrate(0);
    21. }
    22.  
    23. u32int calibrate(u32int drive)
    24. {
    25.          control_motor(1); // включаю мотор
    26.  
    27.         int i;
    28.         for(i = 0; i< 10; i++)
    29.         {
    30.                 send_command(0x7);
    31.                 send_command(drive);
    32.                 wait_irq(); // а вот это уже не срабатывает.
    33.                
    34.                //...
    35.         }
    36.        //...
    37. }
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Непонятно, как объявлена переменная fdc_flag. Если без volatile, компилятор почти наверняка соптимизирует while в бесконечный цикл.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а покажите обработчик тоже
     
  4. valhalla

    valhalla New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2010
    Сообщения:
    9
    Код (Text):
    1. cli
    2. pushl $0
    3. pushl $38
    4. pusha
    5. movw %ds, %ax
    6. pushl %eax
    7. movw $0x10, %ax
    8. movw %ax, %ds
    9. movw %ax, %es
    10. movw %ax, %fs
    11. movw %ax, %gs
    12. call handler
    13. popl %ebx
    14. movw %bx, %ds
    15. movw %bx, %es
    16. movw %bx, %fs
    17. movw %bx, %gs
    18. popa
    19. add $0x8, %esp
    20. sti
    21. iret
    Код (Text):
    1. void handler(registers_t regs)
    2. {
    3.         if(regs.int_number >= 32 && regs.int_number <= 47)
    4.         {
    5.                 if(regs.int_number >= 40)
    6.                         outb(0xA0, 0x20);
    7.                 outb(0x20, 0x20);
    8.         }
    9.         handlers[regs.int_number](regs);
    10. }
    в handlers адреса обработчиков

    Код (Text):
    1. static void fdd_callback(registers_t regs)
    2. {
    3.         fdc_flag = 1;
    4. }
    Код (Text):
    1. struct registers_struct
    2. {
    3.         u32int ds;
    4.         u32int edi;
    5.         u32int esi;
    6.         u32int ebp;
    7.         u32int esp;
    8.         u32int ebx;
    9.         u32int edx;
    10.         u32int ecx;
    11.         u32int eax;
    12.         u32int int_number;
    13.         u32int error_code;
    14.         u32int eip;
    15.         u32int cs;
    16.         u32int eflags;
    17.         u32int user_esp;
    18.         u32int ss;
    19. } __attribute__((packed));
    20.  
    21. typedef struct registers_struct registers_t;
    P.S. оптимизация отключена
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    немного не по теме, но - в чем прикол посылать EOI до вызова обработчика и все это при выключенных прерываниях? да еще и какойто странный sti перед iret. не суть проблемы, но все же странный код
     
  6. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    cli тоже выглядит странновато. Обработчик прерывания вызывается через дескриптор trap-gate?

    ----8<----
    valhalla,

    Мне всё же кажется, стóит обратить внимание на wait_irq() (в идеале — глянуть дизасм).
     
  7. valhalla

    valhalla New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2010
    Сообщения:
    9
    Смотрел уже, wait_irq() нормальный. Отлаживал в bochs, и выяснилось что не заходим именно в обработчик прерывания.
     
  8. valhalla

    valhalla New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2010
    Сообщения:
    9
    Так, проблему прерываний я решил, но теперь возникла новая). На виртуальных машинах (bochs, qemu, VirtualBox) дискета читается, причем правильно (проверял)). На реальном железе не работает. Тестировал на нескольких машинах. Просто по адресу 0x1000 все нули.

    Вот код:
    Код (Text):
    1. u32int read_sector(u8int head, u8int track, u8int sector)
    2. {
    3.        u32int st0, cyl;
    4.        
    5.       init_dma();
    6.       dma_read();
    7.       send_command(FDC_CMD_READ_SECT | FDC_CMD_EXT_MULTITRACK | FDC_CMD_EXT_SKIP | FDC_CMD_EXT_DENSITY);
    8.      
    9.        send_command(head << 2 | 0 );
    10.        send_command(track);
    11.        send_command(head);
    12.        send_command(sector);
    13.        send_command(FLPYDSK_SECTOR_DTL_512);
    14.        send_command(FLPY_SECTORS_PER_TRACK);
    15.        send_command(FLPYDSK_GAP3_LENGTH_3_5);
    16.        send_command(0xFF);
    17.        wait_irq();
    18.        u32int retVal;
    19.        u8int j;
    20.        for (j=0; j<7; ++j)
    21.         {  
    22.                 u32int val = flpydsk_read_data();
    23.                 if ((j==6) && (val==2))
    24.                        retVal = 0;
    25.                 else
    26.                        retVal = -1;  
    27.         }
    28.         check_int(&st0,&cyl);
    29.         return retVal;
    30. }
    31. void init_dma ()
    32. {
    33.         outb (0x0a,0x06);  
    34.         outb (0x0c,0xff);  
    35.         outb (0x04, 0);  
    36.         outb (0x04, 0x10);
    37.         outb (0x0c, 0xff);  
    38.         outb (0x05, 0xff);  
    39.         outb (0x05, 0x23);
    40.         outb (0x81, 0);    
    41.         outb (0x0a, 0x02);  
    42. }
    43.  
    44. void dma_read ()
    45.  {
    46.         outb (0x0a, 0x06);
    47.         outb (0x0b, 0x46)
    48.         outb (0x0a, 0x02);
    49. }
     
  9. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    valhalla,

    А дамп BIOS с реального железа (или модель/ревижн/прошивка) можно?
     
  10. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    valhalla,

    Упорол явную глупость по запарке, звиняй. Почудилась специфичная BIOS.
     
  11. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    Есть у ково нить ссылка на спецификацию по fdd
    ато в гугле ненашол..
    и если можно на асм а не на С--
     
  12. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    это спецификация http://www.intel.com/design/archives/periphrl/docs/29046803.htm
    она не может быть на C или ASM.
    это те исходник нужен.
     
  13. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    Код (Text):
    1. это спецификация http://www.intel.com/design/archives/periphrl/docs/29046803.htm
    2. она не может быть на C или ASM.
    3. это те исходник нужен.
    я имел введу примеры кода.
    А за ссылку спс.
     
  14. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    я могу посоветовать тебе книгу: Программирование дисковых подсистем.
    вот ссылка там и архив с исходниками на asm:http://s401.hotfile.com/get/71befc0acf1131e7e83e03c161b37000217f582b/4d0fdc8e/256/bcb074c29f8c44ae/2fb466/progr_disk_sist.rar

    если не скачается, скажи как прикрепить файл. я скину.
     
  15. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    зайдите на мой топик. может сможете помочь. http://wasm.ru/forum/viewtopic.php?id=39657
     
  16. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    abcd008 Прикрепи плиз файл, ато ссылка бита.
    Чтоб пиркрепить файл нужно писать смс через "Ответить", а не через "Быстрый ответ"
     
  17. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    тупой форум. я ему файл прикрепляю и жму отправить. а он мне все по новой и не чего не отправляется.
    дай mail я туда скину.
    или здесь попробуй. я тут качал http://books.tr200.ru/v.php?id=34454
     
  18. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    Код (Text):
    1. тупой форум. я ему файл прикрепляю и жму отправить. а он мне все по новой и не чего не отправляется.
    Че у мня все норм добавляется.

    спс. Ссылка норм