Comunidade OSDevBrasil.net
Maio 22, 2012, 06:44:46 *
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] 2
  Imprimir  
Autor Tópico: Driver VESA básico  (Lida 1077 vezes)
zMad
OS Newbie
*

Karma: 1
Mensagens: 30


Ver Perfil Email
« : Janeiro 08, 2010, 11:53:34 »

Bom, eu sempre me interessei pelo desenvolvimento de drivers, mas nunca havia feito nada antes, e agora com o sombra que é bem simples da pra fazer algumas brincadeiras  Sorriso forçado
Esses dias comecei a tentar escrever um de video para a cirrus, consegui fazer um mode-setting de várias resoluções mas estranhamente o sistema parava de responder e muitos outros problemas com o PCI... e no mais é mazoquismo escrever drivers para VGA's  Indeciso então desisti e fui tentar algo mais simples.
Comecei a escrever um do VESA, mas não queria ter que mudar pro modo real e depois voltar pro PM,
tentei usar a vm86, tive muitos problemas para usar a combinação nos registradores ES:DI que as funções da INT 10 necessitam pra escrever os dados, só depois fui pensar em escrever estes dados no endereço baixo de 0x8000 onde o grub instala o stage2, bem poderia ser até outro mais baixo, mas este está bom, até porque posso copiar o dados de lá e escrever novamente depois que pegar os dados que me interessam, e o melhor é que não precisa ir até o modo real (quer dizer em partes xD vm86)...
Aqui estão os primeiros resultados, consigo mostrar os modos, as informações, e fazer o mode-setting. Mas agora estou tendo problemas em escrever no Framebuffer (estou usando o modo linear), o framebuffer fica em 0xC0000000, mas mesmo que eu escreva lá não aparece nada na tela...

Mostrando as informações:


Mostrando os modos:


Nem adianta mostrar com o modo ligado pois só aparece coisa preta xD

Sobre o Framebuffer em 0xC0000000, tentei usar o page_map com um ponteiro mas ele não consegue alocar as páginas, se alguem tiver alguma idéia de como dá pra resolver isto...
Registrado
gnomo
Moderador Global
OS Full Member
*****

Karma: 6
Mensagens: 173


gnomo_86@linuxmail.org
Ver Perfil WWW Email
« Responder #1 : Janeiro 09, 2010, 10:59:09 »

Olá! atualmente estou trabalhando em um Driver BGA(Bochs Graphics Adaptor) e outro VGA, no BGA também estou tendo problemas com o framebuffer, ja tentei até modificar o endereço nas configurações PCI do dispositivo e nada, provavelmente é problema no SOmBRA mesmo, portanto o BGA (com extensoes VBE) só esta usando o modo "banked" de memória até para resoluções como 1024x768x32, o que o deixa consideravelmente mais lento!
Outra consideração quanto "a tela fica preta" é que o Bochs/Qemu(?) não inicia com a paleta de cores do DAC(Digital-Analog Converter) totalmente setada, me parece que só as 64 primeiras entradas (EGA), um erro que eu estava cometendo era justamente por causa disso, nos modos 8-bits, que necessitam dessa paleta de cores, eu tentava desenhar a tela totalmente branca para visualizar o resultado, ou seja, valor de pixel 0xFF, porém na paleta de cores só estava setado até a cor de valor 64, portanto o resultado que eu tinha na tela era uma tela totalmente preta!

Add, meu msn ai.

Abraços.
Registrado

Projeto SOmBRA - http://code.google.com/p/projeto-sombra
E-Mail: gnomo@projeto-sombra.org

S.O.: Debian 6.0 "Squeeze"

gnomo
Moderador Global
OS Full Member
*****

Karma: 6
Mensagens: 173


gnomo_86@linuxmail.org
Ver Perfil WWW Email
« Responder #2 : Janeiro 09, 2010, 11:01:04 »

Ah... quanto ao FrameBuffer e a paginação, semana que vem o Mounter volta das férias do SOmBRA, ele vai poder ajudar melhor, já que ele que esta elaborando a paginação.
Registrado

Projeto SOmBRA - http://code.google.com/p/projeto-sombra
E-Mail: gnomo@projeto-sombra.org

S.O.: Debian 6.0 "Squeeze"

zMad
OS Newbie
*

Karma: 1
Mensagens: 30


Ver Perfil Email
« Responder #3 : Janeiro 10, 2010, 01:23:15 »

Usando o modo de bankswitch o driver responde a escrita em 0xA0000, mas o fb que é bom não está funcionando de maneira alguma.
Geralmente o fb está em 0xC0000000, mas o kernel é mapeado lá como está no script do ld, não sei se isto tem alguma relação, mas mesmo colocando o kernel em 0x80000000 não adiantou nada...
Mas acho que o problema é a paginação, pois mesmo usando o page_map(0xC0000000,0xC000xxxx) e tentando escrever na tela não aparece nada, e usando o modo com ponteiro diretamente também não ocorre nada.
Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #4 : Janeiro 10, 2010, 08:55:00 »

Só para frisar, o page_map aloca um endereço virtual e não o endereço físico de memória, essa vai ser uma das funções que ainda devo fazer! Caso necessário, vou fazer isso imediatamente!

Só as páginas até os primeiros 1MB pode-se ter certeza que são alocadas de 1 para 1, então ali o endereço virtual == físico. Faltaria uma função page_map_vf(void *virt_addr, void *fisic_addr);

Em breve poderemos ter essa função, o certo seria libera-la somente para endereços especiais.

Abraços
Registrado

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

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

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

zMad
OS Newbie
*

Karma: 1
Mensagens: 30


Ver Perfil Email
« Responder #5 : Janeiro 14, 2010, 12:25:30 »

Formatei meu pc pra colocar o windows 7, mas só depois lembrei que não tinha salvo o driver vesa (mas da pra reescreve-lo facilmente xD) e que o wubi não funciona no windows 7. Agora o desafio é compilar o sombra nele pois no ubuntu é muito fácil, mas aqui no windows tá difícil, estou baixando o cygwin pra tentar compilar...
Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #6 : Janeiro 14, 2010, 10:17:53 »

Você pode compilar o SOmBRA seguindo o tutorial que está na Wiki do Projeto.

Abraços
Registrado

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

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

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

zMad
OS Newbie
*

Karma: 1
Mensagens: 30


Ver Perfil Email
« Responder #7 : Janeiro 16, 2010, 01:14:24 »

Eu consegui compilar usando o sdk + cygwin, mas devo dizer que é lento (muito lento...) e isso é ruim pois sempre faço uma modificação tenho que recompilar e toma tempo, no ubuntu o processo era uma bala xD
Mas resolvi parcialmente o problema, instalei o ubuntu 9.10 dentro de uma vm do virtualbox e está rodando liso, compila umas 7x mais rápido que no windows, essa velocidade usando toda a interface pesada do ubuntu, vou por um fluxbox e vamos ver no que dá.
Registrado
zMad
OS Newbie
*

Karma: 1
Mensagens: 30


Ver Perfil Email
« Responder #8 : Fevereiro 22, 2010, 04:31:15 »

Agora sim, o problema era justamente a paginação, eu mesmo criei uma função pra mapear um endereço em 1:1, então pude escrever como bem entender na tela usando um framebuffer linear e em quantas cores quiser, não dá pra postar fotos agora pois estou numa lan house.
Agora o próximo passo é criar uma estrutura para drivers de console, para poder criar um em vesa, algo parecido com o linux. Agora um coisa importante também é criar uma fonte descente xD pois eu criei uma 8x8 e 10x8, a 10x8 ainda fica bem legal com cores cinza, mas se por branco fica parecendo letras bold.
E mais para frente seria legal criar um driver pro mouse xD

Há, notei que quando tento usar a vm86 no qemu da sempre erro na int 0x20-0x21 ou causa exceção...no virtualbox e bochs está rodando bem, apesar do bochs acusar algo parecido com read_virtual_dword: segment violation...

EDIT:

« Última modificação: Fevereiro 25, 2010, 05:07:14 por zMad » Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #9 : Fevereiro 25, 2010, 05:39:45 »

Opa, tudo certo zMad? Bom, esses erros deverão sumir com o tempo, ainda tenho que ver uma interface para gerenciar endereços físicos, até por questão de manipular DMA, e outros hardwares que nos entregam um endereço físico para acesso... No caso estava pensando em fazer uma alteração da função malloc e do free. Mas se alguem tem alguma proposta, podemos ver!

EDIT: Quanto ao bochs o erro deve possivelmente vir dessa linha do código do emulador:

http://bochs.sourceforge.net/cgi-bin/lxr/source/cpu/vm8086.cc#L93

Pode ser que o mesmo erro esteja afetando o qemu... Eu imagino qual linha do SOmBRA está causando esse erro e vou checar se é ela mesma.

EDIT 2: Muito boa a imagem, estou vendo que em breve poderemos ter uma interface gráfica no SOmBRA!

Abraços
« Última modificação: Fevereiro 25, 2010, 05:47:33 por Mounter » Registrado

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

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

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

gnomo
Moderador Global
OS Full Member
*****

Karma: 6
Mensagens: 173


gnomo_86@linuxmail.org
Ver Perfil WWW Email
« Responder #10 : Fevereiro 25, 2010, 10:14:48 »

zMad, poderia me mandar a alteração da paginação para mim? assim posso testar o LFB do Driver  BGA. Sorridente
Registrado

Projeto SOmBRA - http://code.google.com/p/projeto-sombra
E-Mail: gnomo@projeto-sombra.org

S.O.: Debian 6.0 "Squeeze"

zMad
OS Newbie
*

Karma: 1
Mensagens: 30


Ver Perfil Email
« Responder #11 : Fevereiro 25, 2010, 10:29:59 »

Código:
#define PAGE_MAP_DEBUG 0

void page_map_phys(void *physaddr)
{
unsigned short pt_index, pd_index;

pagetab_t *pagetab;

#if PAGE_MAP_DEBUG
printf("page_map_phys:\n");
#endif

pd_index = PAGE_GET_DIR(physaddr);

    pt_index = PAGE_GET_TAB(physaddr);

#if PAGE_MAP_DEBUG
printf("-- dir index %d\n", pd_index);
printf("-- tab index %d\n", pt_index);
#endif

if (!((*pagedir)[pd_index] & PAGE_PRESENT))
(*pagedir)[pd_index] = (frame_get() << 12) | PAGE_PRESENT_WRITE_USER;

#if PAGE_MAP_DEBUG
printf("-- dir value 0x%08x\n", (*pagedir)[pd_index]);
#endif

pagetab = PAGETAB(pd_index);

#if PAGE_MAP_DEBUG
printf("-- phys 0x%08x\n", ((unsigned)physaddr)&0xfffff000);
#endif

if (!((*pagetab)[pt_index] & PAGE_PRESENT))
(*pagetab)[pt_index] = (((unsigned)physaddr)&0xfffff000) | PAGE_GLOBAL | PAGE_PRESENT_WRITE_USER;

}

Este código só mapeia uma página em 1:1, então você vai ter que calcular o número de páginas que o framebuffer e mapear uma por uma em seu devido endereço, coisa bem simples com um loop.

Eu o fiz dá maneira abaixo:
Código:
xres = vbemode.XResolution;
yres = vbemode.YResolution;
bpp = vbemode.BitsPerPixel;

buffersize = xres * yres * (bpp >> 3);

if (buffersize & 0xFFF) {
buffersize &= ~0xFFF;
buffersize += 0x1000;
}
pagesneed = buffersize / 4096;

printf("-- buffer size 0x%x\n", buffersize);
printf("-- pages lfb %d\n", pagesneed);

ptr = (unsigned short*)vbemode.PhysBasePtr;
lfbptr = ptr;
for (map = 0; map < pagesneed; map++)
page_map_phys((unsigned*)(vbemode.PhysBasePtr + (map * 4096)));

Mais uma imagem:
« Última modificação: Fevereiro 25, 2010, 10:55:00 por zMad » Registrado
Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« Responder #12 : Fevereiro 26, 2010, 06:46:43 »

=o

Apelação suprema o.O =o
Registrado



gnomo
Moderador Global
OS Full Member
*****

Karma: 6
Mensagens: 173


gnomo_86@linuxmail.org
Ver Perfil WWW Email
« Responder #13 : Fevereiro 26, 2010, 03:02:53 »

BGA Driver funcionando em modos com combinações de Width: 320, 400, 640, 800 e 1024; Height: 240, 300, 480, 600 e 768; e profundidades: 8, 16, 24 e 32 !
Todos nos modos banked com 64Kb ou no modo LFB (Linear Frame Buffer) com a memória requisitada pelo dispositivo PCI (no QEmu são requisitados 8MB para memoria de video que estou mapeando no endereço fisico entre 16MB e 24MB).

O driver funciona corretamente no QEmu e no Bochs, no VirtualBox.

zMad, obrigado pelo código da paginação. Sorridente
Registrado

Projeto SOmBRA - http://code.google.com/p/projeto-sombra
E-Mail: gnomo@projeto-sombra.org

S.O.: Debian 6.0 "Squeeze"

zMad
OS Newbie
*

Karma: 1
Mensagens: 30


Ver Perfil Email
« Responder #14 : Fevereiro 26, 2010, 03:50:14 »

BGA Driver funcionando em modos com combinações de Width: 320, 400, 640, 800 e 1024; Height: 240, 300, 480, 600 e 768; e profundidades: 8, 16, 24 e 32 !
Todos nos modos banked com 64Kb ou no modo LFB (Linear Frame Buffer) com a memória requisitada pelo dispositivo PCI (no QEmu são requisitados 8MB para memoria de video que estou mapeando no endereço fisico entre 16MB e 24MB).

O driver funciona corretamente no QEmu e no Bochs, no VirtualBox.

zMad, obrigado pelo código da paginação. Sorridente

Agora seria legal criarmos uma estrutura do driver de video, e um console para framebuffer independente como no linux, aproveita e faz um teste ai com o mouse que você pos pra funcionar   Sorridente
Registrado
Páginas: [1] 2
  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!