Direccion Hrdware

Iniciado por Riki_89D, 28 Abril 2011, 12:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Riki_89D

Hola que tal,nose si esto va aqui,la pregunta es clara,como puedo saber la direcicon de memoria de cada periferico del PC para Escribir/Leer mediante programacion ?¿ (En este caso ASM)

Arkangel_0x7C5

puedes hacerlo de 2 maneras, preguntándole al SO o enumerando los dispositivos conectados al bus-PCI y USB

La primera depende del SO en el que estés, con la otra es cuestion de usar las instrucciones in out para comunicarte con el Hardware

Riki_89D

Hola mil gracias :) me decantare por la segunda,pero me porias explicar un poco mejor,que debo ir probando con IN y OUT?¿ :S,y por cierto hace un tiempo pregunte como acceder al Mouse cuano se esta booteando,pense que se aria desde el BIOS y efectivamente,encontre ayer la interrupcion 15h y la funcion c2h (creo),pero una persona me dijo,no se usan la int del BIOS,se accede al hardware directamente con IN y OUT,es eso cierto ?¿


saludos y mil gracias  :)

Arkangel_0x7C5

yo solo se lo del PCI, que te servira para la mayorria del hardware.

Al hardware se le suelen asignar unas direcciones de I/O o tambin de memria. pueden ser estáticas o variar.

Se enumeran asi:

#define outb(port,value) \
__asm__ __volatile__("outb %%al,%%dx"::"a" (value),"d" (port))

#define inb(port) ({\
unsigned char _v; \
__asm__ __volatile__ ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
_v; \
})
#define outw(port,value) \
__asm__ __volatile__("outw %%ax,%%dx"::"a" (value),"d" (port))

#define inw(port) ({\
unsigned short _v; \
__asm__ __volatile__ ("inw %%dx,%%ax":"=a" (_v):"d" (port)); \
_v; \
})
#define outd(port,value) \
__asm__ __volatile__("outl %%eax,%%dx"::"a" (value),"d" (port))

#define ind(port) ({\
unsigned long _v; \
__asm__ __volatile__ ("inl %%dx,%%eax":"=a" (_v):"d" (port)); \
_v; \
})

#define PCI_CONFIG_ADDRESS 0xCF8
#define PCI_CONFIG_DATA 0xCFC
//Las direcciones del espacio PCI estan compuestas de esta manera
typedef struct PCI_ADDRESS{
union {
struct {
unsigned long zero:2;
unsigned long Registro:6;//Numero de registro del espacio PCI de un dispositivo
unsigned long Funtion:3;
unsigned long Device:5;
unsigned long Bus:8;
unsigned long Reserved:7;
unsigned long Enable:1;
}flag;
unsigned long ADDRESS;
};
}PCI_ADDRESS;
typedef struct HARDWARE_ID{
union{
struct {
unsigned long vendor;
unsigned long device;
};
unsigned long id;
};
}HARDWARE_ID;


void PCI_Enum(){
PCI_ADDRESS Addr;
HARDWARE_ID ID;
Addr.ADDRESS = 0;
ID.id = 0;
Addr.flag.Enable = 1;

for(short bus = 0;bus<256;bus++){//Busca en un numero de bus los dispositivos, hay 256 posibles
//Cada bus tiene al menos un dispositivo y 32 de maximo
for(short dev = 0;dev<32;dev++){//Busca en un bus los dispositivos
//Cada dispositivo puede tener una o hasta 8 funciones diferentes
for(int fun = 0;fun<8;fun++){//La funcion 0 siempre estara disponible, sino el dispositivo no esta
Addr.flag.Funtion = fun;
Addr.flag.Device = dev;
Addr.flag.Bus = bus;

outd(PCI_CONFIG_ADDRESS,Addr.ADDRESS);
ID.id = ind(PCI_CONFIG_DATA);
if(!(ID.vendor+1)){//Si el vendor es 0xFFFF significa que esa funcion no esta presente
if(!fun)break;
}else{
printf("Detected: PCI\VEND_%X04&DEV_%X04\n",ID.vendor, ID.device);
};
}
};
}

};


busca en esta pagina lo que necesites: http://wiki.osdev.org/PCI#Configuration_Space