dimanche 9 septembre 2007

Linux et les E/S en pascal

Les programmes DOS que je souhaite porter sous linux sont écrit avec turbo-pascal. Donc voici la version pascal de l'article précédent :


program portout;

Uses ports;

function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';

const
BASEPORT=$378; //lpt1

begin
// on demande l'accès des adresses BASEPORT à BASEPORT+3
if (ioperm(BASEPORT, 3, 1))<>0 then
Halt(1);

// Initialisation de tous les signaux de données (D0-D7) à l'état bas (0)
port[BASEPORT] := 0;

// on libère l'accès des adresses BASEPORT à BASEPORT+3
if (ioperm(BASEPORT, 3, 0))<>0 then
Halt(1);

end.


Le compilateur utilisé est freepascal. Donc un simple fpc portout.pas suffit à le compiler.

programmation des ports E/S sous linux

En cherchant à porter d'anciens programmes dos vers linux, j'ai été confronté à la problématique de l'accès aux ports d'entrées/sorties du processeur. A l'époque du dos c'était simple, puisque il n'existait aucune protection à ce niveau, mais avec des systèmes en mode protégé cela est moins évident. Il existe plusieurs possibilités avec linux. L'une d'entre elle passe par des api système qui sont ioperm, outb et inb.
ioperm a pour rôle de demander l'autorisation au système d'accéder aux entrées sorties. Lorsque les opérations d'E/S sont terminés on demande à ioperm de libérer les autorisations.
Si le système accorde l'accès au peut appeler des api comme outb ou inb. Voici un exemple minimaliste en c pour illustrer cette technique :


/*
* programme très simple permettant d'accéder au port parallèle
*/

#include
#include
#include

#define BASEPORT 0x378 /* lp1 */

int main()
{

/* on demande l'accès des adresses BASEPORT à BASEPORT+3*/
if (ioperm(BASEPORT, 3, 1)) {
perror("ioperm");
exit(1);
}

/* Initialisation de tous les signaux de données (D0-D7) à l'état bas (0) */

outb(0, BASEPORT);

/* on libère l'accès des adresses BASEPORT à BASEPORT+3*/
if (ioperm(BASEPORT, 3, 0)) {
perror("ioperm");
exit(1);
}

exit(0);
}

Installation de l'environnement MPLAB sous linux

Cet environnement est conçu par Microchip pour le développement d'application pour les micro-contrôleurs de la famille PIC. Ces circuits permettent d'embarquer et d'enfouir de petits systèmes informatiques.
L' IDE MPLAB est prévu à l'origine pour windows. Compte tenu qu'il s'agit d'une application windows classique, qui ne semble pas utiliser d'api très complexe, je me suis dit qu'elle devait assez bien fonctionner sous linux grâce à wine. L'installation de MPLAB s'est en effet déroulé sans problème, le setup installshield fonctionnant normalement. Par contre la mise en route de MPLAB s'est accompagné d'erreurs COM sur ce qui semble être une gestion de la localisation. Une fois les boites de dialogues passé, la première mise en route semble fonctionner tout à fait normalement.

Par contre mes tests se sont bornés à quelques opérations simple. Ne possédant pas de platine de développement, je n'ai pas pu valider la connection à ce genre de matériel.