Всем привет. Возникла надобность поработать с 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): void wait_irq() { while(!fdc_flag); fdc_flag = 0; } void init_fdd() { init_dma(); reset(); //... } void reset() { disable_controller(); enable_controller(); wait_irq(); // здесь все работает нормально //... calibrate(0); } u32int calibrate(u32int drive) { control_motor(1); // включаю мотор int i; for(i = 0; i< 10; i++) { send_command(0x7); send_command(drive); wait_irq(); // а вот это уже не срабатывает. //... } //... }
Непонятно, как объявлена переменная fdc_flag. Если без volatile, компилятор почти наверняка соптимизирует while в бесконечный цикл.
Код (Text): cli pushl $0 pushl $38 pusha movw %ds, %ax pushl %eax movw $0x10, %ax movw %ax, %ds movw %ax, %es movw %ax, %fs movw %ax, %gs call handler popl %ebx movw %bx, %ds movw %bx, %es movw %bx, %fs movw %bx, %gs popa add $0x8, %esp sti iret Код (Text): void handler(registers_t regs) { if(regs.int_number >= 32 && regs.int_number <= 47) { if(regs.int_number >= 40) outb(0xA0, 0x20); outb(0x20, 0x20); } handlers[regs.int_number](regs); } в handlers адреса обработчиков Код (Text): static void fdd_callback(registers_t regs) { fdc_flag = 1; } Код (Text): struct registers_struct { u32int ds; u32int edi; u32int esi; u32int ebp; u32int esp; u32int ebx; u32int edx; u32int ecx; u32int eax; u32int int_number; u32int error_code; u32int eip; u32int cs; u32int eflags; u32int user_esp; u32int ss; } __attribute__((packed)); typedef struct registers_struct registers_t; P.S. оптимизация отключена
немного не по теме, но - в чем прикол посылать EOI до вызова обработчика и все это при выключенных прерываниях? да еще и какойто странный sti перед iret. не суть проблемы, но все же странный код
cli тоже выглядит странновато. Обработчик прерывания вызывается через дескриптор trap-gate? ----8<---- valhalla, Мне всё же кажется, стóит обратить внимание на wait_irq() (в идеале — глянуть дизасм).
Смотрел уже, wait_irq() нормальный. Отлаживал в bochs, и выяснилось что не заходим именно в обработчик прерывания.
Так, проблему прерываний я решил, но теперь возникла новая). На виртуальных машинах (bochs, qemu, VirtualBox) дискета читается, причем правильно (проверял)). На реальном железе не работает. Тестировал на нескольких машинах. Просто по адресу 0x1000 все нули. Вот код: Код (Text): u32int read_sector(u8int head, u8int track, u8int sector) { u32int st0, cyl; init_dma(); dma_read(); send_command(FDC_CMD_READ_SECT | FDC_CMD_EXT_MULTITRACK | FDC_CMD_EXT_SKIP | FDC_CMD_EXT_DENSITY); send_command(head << 2 | 0 ); send_command(track); send_command(head); send_command(sector); send_command(FLPYDSK_SECTOR_DTL_512); send_command(FLPY_SECTORS_PER_TRACK); send_command(FLPYDSK_GAP3_LENGTH_3_5); send_command(0xFF); wait_irq(); u32int retVal; u8int j; for (j=0; j<7; ++j) { u32int val = flpydsk_read_data(); if ((j==6) && (val==2)) retVal = 0; else retVal = -1; } check_int(&st0,&cyl); return retVal; } void init_dma () { outb (0x0a,0x06); outb (0x0c,0xff); outb (0x04, 0); outb (0x04, 0x10); outb (0x0c, 0xff); outb (0x05, 0xff); outb (0x05, 0x23); outb (0x81, 0); outb (0x0a, 0x02); } void dma_read () { outb (0x0a, 0x06); outb (0x0b, 0x46) outb (0x0a, 0x02); }
это спецификация http://www.intel.com/design/archives/periphrl/docs/29046803.htm она не может быть на C или ASM. это те исходник нужен.
Код (Text): это спецификация http://www.intel.com/design/archives/periphrl/docs/29046803.htm она не может быть на C или ASM. это те исходник нужен. я имел введу примеры кода. А за ссылку спс.
я могу посоветовать тебе книгу: Программирование дисковых подсистем. вот ссылка там и архив с исходниками на asm:http://s401.hotfile.com/get/71befc0acf1131e7e83e03c161b37000217f582b/4d0fdc8e/256/bcb074c29f8c44ae/2fb466/progr_disk_sist.rar если не скачается, скажи как прикрепить файл. я скину.
abcd008 Прикрепи плиз файл, ато ссылка бита. Чтоб пиркрепить файл нужно писать смс через "Ответить", а не через "Быстрый ответ"
тупой форум. я ему файл прикрепляю и жму отправить. а он мне все по новой и не чего не отправляется. дай mail я туда скину. или здесь попробуй. я тут качал http://books.tr200.ru/v.php?id=34454
Код (Text): тупой форум. я ему файл прикрепляю и жму отправить. а он мне все по новой и не чего не отправляется. Че у мня все норм добавляется. спс. Ссылка норм