Voici la procédure d'initialisation de GiveIO:
/*
Test la présence et l'installation de giveio
Giveio est un logiciel permettant de déverouiller l'acces aux ports d'entrées/sorties
du PC en désactivant la couche de protection HAL des technologies NT
Pour installer GIVEIO:
Cliquer sur "INSTDRV.EXE" qui installe le pilote dans C:/WINDOWS/SYSTEM32/DRIVERS
Pour l'activer, il suffit de cliquer sur activate dans "INSTDRV.EXE"
La manipulation pour l'activation est à effectuer à chaque démarrage
Cependant on peut forcer WINDOWS à utiliser ce pilote des que l'on veut accéder aux ports
Pour cela, il faut dans le gestionnaire de périphérique afficher les périphériqes cachés
Puis dans les périphériques NON PLUG&PLAY double-cliquer sur GIVEIO
Et dans l'onglet "Pilote" sélectionner pour démarrage la valeur "systeme"
*/
int InitWinNTDirectIO(void)
{
HANDLE h;
h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(h == INVALID_HANDLE_VALUE)
return 0;
CloseHandle(h);
return 1;
}
Maintenant, les fonctions pour ecrire sur le port // (désolé pour la place prise, mais je ne voulais pas poster une source juste pour ça)
/*----------------------------------------------------------------*/
/*Ecriture de "octet" sur le registre "adresse" du port parallele */
/*----------------------------------------------------------------*/
void ecrire_broche_2_a_9(unsigned char octet)
{
_asm {
/*Deplace dans le registre DX l'adresse du registre en ecriture du port paralelle*/
mov dx,WRITEPORT
/*Deplace dans le registre al (8 bits) le char octet transmis en parametre*/
mov al,octet
/*Ecrit sur l'adresse contenue dans DX la valeur contenue dans al*/
out dx,al
}
}
/*---------------------------------------------------------------*/
/*lecture d'un octet sur le registre "adresse" du port parallele */
/*---------------------------------------------------------------*/
int lire_broche_2_a_9(void)
{
char bit;
_asm {
/*Deplace dans le registre DX l'adresse du registre en lecture du port paralelle*/
mov dx,WRITEPORT
/*Ecrit dans le registre al la valeur contenue à l'adresse contenue par DX*/
in al,dx
/*Deplace la valeur contenue par le registre al dans le char bit*/
mov bit,al
}
return (bit);
}
/*--------------------------------------------------------------------------------------------------*/
/*Les fonctions suivantes permettent de lire/écrire sur une broche du port parallele */
/*Ceci pour pouvoir faire des opérations comme le load du registre sans affecter les autres broches */
/*Pour ce faire on utilise les opérations AND et OR de l'assembleur qui fonctionne comme en C */
/*--------------------------------------------------------------------------------------------------*/
/*/!\: Les broches 1, 14 et 17 qui appartiennent au registre en lecture-ecriture */
/* sont inversées, ainsi que la broche 11 qui appartient au registre en lecture */
/*----------------------------------------------------------------------*/
/*clear_brocheX(): */
/*Annule toute tension sur la broche1 du port parallele */
/*Prend la valeur sur le registre en commande avant de faire un ET */
/*Pour ne pas affecter toutes les broches du registre READANDWRITEPORT */
/*----------------------------------------------------------------------*/
void clear_broche1(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
or al, 1
out dx, al
}
}
void clear_broche2(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0xFE
out dx, al
}
}
void clear_broche3(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0xFD
out dx, al
}
}
void clear_broche4(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0xFB
out dx, al
}
}
void clear_broche5(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0xF7
out dx, al
}
}
void clear_broche6(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0xEF
out dx, al
}
}
void clear_broche7(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0xDF
out dx, al
}
}
void clear_broche8(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0xBF
out dx, al
}
}
void clear_broche9(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
and al, 0x7F
out dx, al
}
}
void clear_broche14(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
or al, 2
out dx, al
}
}
void clear_broche16(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
and al, 0xFB
out dx, al
}
}
void clear_broche17(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
or al, 8
out dx, al
}
}
/*----------------------------------------------------------------------*/
/*set_brocheX(): */
/*Envoie une tension sur la broche 1 du port parallele */
/*Prend la valeur sur le registre en commande avant de faire un OU */
/*Pour ne pas affecter toute les broches du registre READANDWRITEPORT */
/*----------------------------------------------------------------------*/
void set_broche1(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
and al, 0xFE
out dx, al
}
}
void set_broche2(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 1
out dx, al
}
}
void set_broche3(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 2
out dx, al
}
}
void set_broche4(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 4
out dx, al
}
}
void set_broche5(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 8
out dx, al
}
}
void set_broche6(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 16
out dx, al
}
}
void set_broche7(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 32
out dx, al
}
}
void set_broche8(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 64
out dx, al
}
}
void set_broche9(void)
{
_asm
{
mov dx, WRITEPORT
in al, dx
or al, 128
out dx, al
}
}
void set_broche14(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
and al, 0xFD
out dx, al
}
}
void set_broche16(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
or al, 4
out dx, al
}
}
void set_broche17(void)
{
_asm
{
mov dx, READANDWRITEPORT
in al, dx
and al, 0xF7
out dx, al
}
}
/*---------------------------------------*/
/*Pour lire une broche du port parallelle*/
/*---------------------------------------*/
/*C'est la broche 1 du registre en lectrue-écritue placé au */
/*registre READANDWRITEPORT. Cette broche est inversée, il faut */
/*donc faire un NON bit-a-bit pour avoir sa valeur */
char lire_broche1(void)
{
char bit;
_asm {
mov dx, READANDWRITEPORT
in al, dx
or al, 0xFE
mov bit, al
}
bit = ~bit;
return (bit);
}
/*C'est la broche 2 du registre en lectrue-écritue placé au */
/*registre READANDWRITEPORT. Cette broche est inversée, il */
/*faut donc faire un NON bit-a-bit pour avoir sa valeur */
char lire_broche14(void)
{
char bit;
_asm {
mov dx, READANDWRITEPORT
in al, dx
or al, 2
mov bit, al
}
bit = ~bit;
return (bit);
}
/*C'est la broche 3 du registre en lectrue-écritue */
/*placé au registre READANDWRITEPORT */
char lire_broche16(void)
{
char bit;
_asm {
mov dx, READANDWRITEPORT
in al, dx
and al, 4
mov bit, al
}
return (bit);
}
/*C'est la broche 4 du registre en lectrue-écritue placé au */
/*registre READANDWRITEPORT. Cette broche est inversée, il faut */
/*donc faire un NON bit-a-bit pour avoir sa valeur */
char lire_broche17(void)
{
char bit;
_asm {
mov dx, READANDWRITEPORT
in al, dx
or al, 0xF7
mov bit, al
}
bit = ~bit;
return (bit);
}
/*C'est la broche 1 du registre en écritue placé au registre WRITEPORT*/
char lire_broche2(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 1
mov bit, al
}
return (bit);
}
/*C'est la broche 2 du registre en écriture placé au registre WRITEPORT*/
char lire_broche3(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 2
mov bit, al
}
return (bit);
}
/*C'est la broche 3 du registre en écritue placé au registre WRITEPORT*/
char lire_broche4(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 4
mov bit, al
}
return (bit);
}
/*C'est la broche 4 du registre en écritue placé au registre WRITEPORT*/
char lire_broche5(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 8
mov bit, al
}
return (bit);
}
/*C'est la broche 5 du registre en écritue placé au registre WRITEPORT*/
char lire_broche6(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 16
mov bit, al
}
return (bit);
}
/*C'est la broche 6 du registre en écriture placé au registre WRITEPORT*/
char lire_broche7(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 32
mov bit, al
}
return (bit);
}
/*C'est la broche 7 du registre en écritue placé au registre WRITEPORT*/
char lire_broche8(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 64
mov bit, al
}
return (bit);
}
/*C'est la broche 8 du registre en écritue placé au registre WRITEPORT*/
char lire_broche9(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 128
mov bit, al
}
return (bit);
}
/*C'est la broche 7 du registre en lecture placé au registre READPORT*/
char lire_broche10(void)
{
char bit;
_asm {
mov dx, READPORT
in al, dx
and al, 64
mov bit, al
}
return (bit);
}
/*C'est la broche 8 du registre en lecture placé au */
/*registre READPORT. Cette broche est inversée, */
/*il faut donc faire un NON bit-a-bit pour avoir sa valeur */
char lire_broche11(void)
{
char bit;
_asm {
mov dx, READPORT
in al, dx
or al, 0x7F
mov bit, al
}
bit = ~bit;
return (bit);
}
/*C'est la broche 6 du registre en lecture placé au registre READPORT*/
char lire_broche12(void)
{
char bit;
_asm {
mov dx, READPORT
in al, dx
and al, 32
mov bit, al
}
return (bit);
}
/*C'est la broche 5 du registre en lecture placé au registre READPORT*/
char lire_broche13(void)
{
char bit;
_asm {
mov dx, READPORT
in al, dx
and al, 16
mov bit, al
}
return (bit);
}
/*C'est la broche 4 du registre en lecture placé au registre READPORT*/
char lire_broche15(void)
{
char bit;
_asm {
mov dx, WRITEPORT
in al, dx
and al, 8
mov bit, al
}
return (bit);
}
Si c'est pas suffisament clair, n'hésite pas à demander.
Vive le C
Tchao
Savon