Comunidade OSDevBrasil.net
Maio 22, 2012, 08:00:07 *
Bem-vindo, Visitante. Por favor faça o Login ou Registro.

Login com nome de usuário, senha e duração da sessão
Notícias: Anuncie a nossa comunidade a amigos, fóruns...
 
   Home   Ajuda Pesquisa Login Registrar  
Páginas: [1]
  Imprimir  
Autor Tópico: IRQ 6 do FDC + bochs  (Lida 944 vezes)
arabasso
OS Newbie
*

Karma: 0
Mensagens: 3


arabasso@host.sk
Ver Perfil
« : Agosto 04, 2008, 08:58:00 »

Estou desenvolvendo um driver de disquetes, e estou utilizando a IRQ 6 para descobrir se houve alguma interrupção. Mas o bochs simplemente não dispara certas IRQ's, como o reset da controladora, quando o motor está ON ou OFF, etc. Baseado nisso, pergunto:

1) Tem alguma diretiva no bochs que sane esse problema?
2) Devo implementar um esquema de timeout (usando o relógio do sistema)?
3) Devo implementar um sistema de Pooling e esperar até a próxima instrução?

Desde já, obrigado.
Até...
Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #1 : Agosto 04, 2008, 01:38:41 »

Você habilitou a PIC e mascou o bit do irq 6?
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

arabasso
OS Newbie
*

Karma: 0
Mensagens: 3


arabasso@host.sk
Ver Perfil
« Responder #2 : Agosto 04, 2008, 09:00:36 »

Sim, reprogramei o PIC para usar as entradas 32 até 47 da IDT, e habilitei o IRQ 6. Talvez você não tenha entendido minha pergunta: No PC real e no VMWare, as IRQ's são disparadas normalmente, mas no Bochs, algumas ele não dispara. O que pode estar acontecendo?

Eis o código:

Código:
void Interrupt::irqRemap()
{
// ICW1

System::outportb(PIC_CMD_MASTER, 0x11);
System::outportb(PIC_CMD_SLAVE, 0x11);

// ICW2

System::outportb(PIC_DATA_MASTER, 0x20); // Remap
System::outportb(PIC_DATA_SLAVE, 0x28); // Pics

// ICW3

System::outportb(PIC_DATA_MASTER, 0x04); // IRQ 2 - Em cascata.
System::outportb(PIC_DATA_SLAVE, 0x02);

// ICW4

System::outportb(PIC_DATA_MASTER, 0x01);
System::outportb(PIC_DATA_SLAVE, 0x01);

// Desabilitando todas as interrupções...

System::outportb(PIC_DATA_MASTER, 0xff);
System::outportb(PIC_DATA_SLAVE, 0xff);
}

void Interrupt::irqEnable(IH_TYPE irq)
{
ocw1 &= ~ (0x01 << irq);

if (irq < 0x08)
System::outportb(PIC_DATA_MASTER, ocw1 & 0xff);

else
System::outportb(PIC_DATA_SLAVE, ocw1 >> 0x08);
}

void Interrupt::irqDisable(IH_TYPE irq)
{
ocw1 |= (0x01 << irq);

if (irq < 8)
System::outportb(PIC_DATA_MASTER, ocw1 & 0xff);

else
System::outportb(PIC_DATA_SLAVE, ocw1 >> 0x08);
}
Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #3 : Agosto 05, 2008, 10:56:21 »

Aí é meio complicado mesmo de descobrir o problema, seu código me parece estar certo, mas pode ser problema com a versão do Bochs (para mim já aconteceu), qual a sua versão?

Me lembrei agora também, vou reinicia a PIC? Bom a cada IRQ chamada o controlador deve ser reiniciado:

Código:
outportb(0x20,0x20);

E se for um controlador da segunda PIC deve ser reiniciado os 2, desse modo:

Código:
outportb(0xA0, 0x20); // Reinicia os dois controladores.
outportb(0x20, 0x20);
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

arabasso
OS Newbie
*

Karma: 0
Mensagens: 3


arabasso@host.sk
Ver Perfil
« Responder #4 : Agosto 05, 2008, 04:34:59 »

É acho que deve ser o bochs. Ele é bem básico, não é tão completo quanto o VMware, muito menos um PC real. A versão do bochs que eu uso é a 2.3.7, que por sinal é a mais recente. Não sei se o problema está sendo eu desenvolver tudo em C++, mas funciona legal no WM e no PC.

Outro problema do bochs é a falta de suporte a teclado ABNT2. Estou escrevendo um driver de teclado também, e para minha supresa, as teclas que ele não reconhece, ele coloca o mesmo valor da tecla CTRL (29).

Apesar de tudo, mesmo o PC real não fica disparando IRQ toda vez que alguma coisa aconteceu no FDC (recalibragem, seek, reset, motor ON e OFF). E eu precisava criar um driver de disquetes pra carregar o Kernel. Alguém conhece um "esquema", tipo por timeout ou pooling (esperar até que o FDC esteja pronto) para se criar um driver para disquetes?

Aqui está o meu Handler de IRQ's:

Código:
void irq_handler(REGISTERS regs)
{
Handler * ih = Interrupt::getEventHandler((Interrupt::IH_TYPE) regs.int_no);

if (ih)
{
ih->setRegisters(& regs);
ih->onInterrupt();
}

if (regs.int_no >= 40)
System::outportb(Interrupt::PIC_CMD_SLAVE, 0x20);

System::outportb(Interrupt::PIC_CMD_MASTER, 0x20);
}
Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #5 : Agosto 05, 2008, 05:26:05 »

Bom, com versões antigas eu conseguia ler o disquete bem facilmente (Bochs 2.2), agora ele devem ter mudado alguma coisa, porque o driver que havia desenvolvido parou de funcionar...

Vou checar isso ainda e qualquer coisa irei trazer a informações neste tópico.
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #6 : Agosto 06, 2008, 11:03:47 »

Na minha implementação de driver de disquete a um delay (um for aninhado com outro) e é usado para esperar até ligar/desligar o motor do disquete, mas não sei se pode ser isso.

No driver de disquete que fiz foi implementado o fdc_wait, ele serve para você esperar se o IRQ foi disparado, se quiser pode olhar os drivers do Projeto SOmBRA, mas tem um erro dele que deve ser por causa justamente na novas versões do Bochs, mas ainda não verifiquei se é o erro de IRQ.

Vou analisar o driver e ver qual possa ser o problema, se ele funcionar, eu irei lhe disponibilizar o código dele.
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

Páginas: [1]
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2006-2009, Simple Machines XHTML 1.0 Válido! CSS Válido!