Linux et Macintosh

LaurentVivier@wanadoo.fr

Mon Macintosh est une veille machine (un powerbook G3/250, ou 3500) sur lequel on ne peut pas installer MacOS X. Toutes les évolutions majeures de MacOS me sont donc interdites (iTunes, iPhoto, iDVD, et j'en passe...). De plus les matériels récents ne sont pas supportés: ma carte PCMCIA USB n'est pas reconnu par le firmware et donc pas par MacOS 9.1 (MacOS 9.2 n'est pas supporté). Heureusement, une bidouille le permet (insérer la carte une fois le système démarré, après avoir installé les extensions USB à partir du site WEB d'Apple).

Linux étant relativement bien supporté sur cette machine, il est plus intéressant d'utiliser cet environnement de travail.
Les difficultés que l'on recontre se trouvent notamment au niveau de la configuration du clavier et du contrôleur d'écran.

Ma distribution est une Mandrake 9.1 PPC.

Le clavier:

La gestion du clavier est configurable au niveau du noyau:

Le noyau peut soit renvoyer les codes de touche spécifiques au Mac, soit des codes de touche génériques.
Dans le premier cas, il faut utiliser des descriptions de clavier spécifiques au Macintosh (il en existe peu, et varie entre les Macs avec clavier USB, newworld, et les Macs avec clavier ADB, oldworld), dans le deuxième cas on pourra utiliser les descriptions de clavier courantes (de type PC) avec l'inconvénient que les claviers Macintosh ne correspondent pas exactement.

Je pense que ce paramètre à été introduit dans un but d'unicité, de simplification de la gestion du clavier. Son impact se situe aussi bien au niveau console que X, puisque son action se trouve à la source: le noyau.

Ce paramètre est activé en écrivant 1 dans /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes, et peut être activé automatiquement en plaçant dev.mac_hid.keyboard_sends_linux_keycodes = 1 dans /etc/sysctl.conf.

La gestion clavier de la console:

A partir de ce moment, n'importe quelle description de clavier PC peut être utilisée. Elles se trouvent sous /usr/lib/kbd/keymaps/i386/. Si nous avions gardé le mode par défaut il aurait fallu utiliser celles sous /usr/lib/kbd/keymaps/mac. Celle qui convient le mieux est fr-latin1. Elle peut être chargé grace à la commande loadkeys. La configuration automatique du système se fait grâce au fichier de configuration /etc/sysconfig/keyboard:

KEYBOARD=fr
KEYTABLE=fr-latin1
DISABLE_WINDOWS_KEY=yes

Mais comme je l'ai dit auparavant, ceci est un clavier PC, et ne correspond pas tout à fait à mon clavier Macintosh de type "AppleDesign" (Le clavier de type "Extended" est aussi différent). Le clavier intégré de mon powerbook est un sous-ensemble de ce clavier.

Je suis donc parti d'une description de clavier Macintosh dans lequel j'ai remplacé les keycodes "Macintosh" par des keycodes "Linux" (excusez les anglicismes). Pour plus de détails voir les man de keymaps,loadkeys et dumpkeys. showkey permet aussi de verifier le keycode de la touche pressée.

Le fichier créé fr-AppleDesign.kmap peut être placé dans /usr/lib/kbd/keymaps/i386/azerty/ et défini dans /etc/sysconfig/keyboard.

KEYBOARD=fr
KEYTABLE=fr-AppleDesign
DISABLE_WINDOWS_KEY=yes

La gestion clavier de X11 (xkb)

La définition du clavier est donnée dans /etc/X11/XF86XConfig-4, dans une section InputDevice.
La commande qui nous permet de tester les différents fichiers de configuration en temps-réel est setxkbmap. La commande xev nous permet de connaître les codes des touches comme showkey en mode console. Tous les fichiers de définitions xkb se trouvent sous /etc/X11/xkb.

Le premier fichier (et le moins utile) est celui qui décrit la géométrie de votre clavier. Il permet juste au serveur X d'avoir une représentation physique du clavier (taille, position des touches, des LEDs). Cette description se trouve dans le répertoire xkb/geometry. Le fichier "macintosh" nous concerne, il décrit un clavier de type "Extended II".  Pour visualiser ce clavier, on peut utiliser xkbprint à partir d'un fichier généré par xkbcomp.

Exemple:

cd /etc/X11/xkb/geometry
xkbcomp "macintosh(ExtendedII)"
xkbprint ExtendedII.xkm -color -level2

En imprimant ou en visualisant le résultat avec ghostscript, on obtient:


J'ai modifié ce fichier pour y décrire mon clavier AppleDesign (/etc/X11/xkb/geometry/macintosh):



On peut générer dans un fichier jpeg l'image du clavier courant avec les commandes suivantes:

setxkbmap -print | xkbcomp - - | xkbprint -color -level2 -kc - - | ghostscript -sDEVICE=jpeg -sOutputFile=appledesign.jpg -g2048x2048

Nous allons maintenant décrire le clavier Apple Design et associer des symboles à des codes de touche.

Pour faire prendre en compte le clavier par X, j'ai éditer le fichier XF86Config-4, pour définir mon InputDevice:
Section "InputDevice"
Identifier "Keyboard1"
Driver "Keyboard"
Option "XkbModel" "appledesign"
Option "XkbLayout" "fr"

EndSection

Ceci explique tout simplement que j'ai un clavier de type Apple Design au format français.
L'altération à apporter au clavier macintosh US pour passer en français n'est pas standard comme celle d'un clavier PC. Il a donc fallu que je modifie les règles de correspondance décrites dans /etc/X11/xkb/rules/xfree86.

[...]
! model         =       geometry
  appledesign   =       macintosh(appledesign)
[...]
! model         layout  =       symbols
 appledesign $oldlayouts  =       en_US(%m)+%l%(v)(%m)
[...]
! $pcmodels = pc101 pc102 pc104 pc105 appledesign

La première partie décrit que pour le "layout" "appledesign" pour définir la géométrie du clavier, on utilise l'entrée "appledesign" du fichier xkb/geometry/macintosh.
La deuxième partie explique comment associer les keycodes aux symboles des touches.
La troisième partie permet d'appliquer les règles standards associées au clavier PC sur notre clavier Apple Design.

Le fichier map généré à partir du fichier XF86Config-4 est (seulement pour information):

xkb_keymap {
        xkb_keycodes  { include "xfree86+aliases(azerty)"       };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "en_US(appledesign)+fr(appledesign)"    };
        xkb_geometry  { include "macintosh(appledesign)"        };
};


Chaque touche (identifiée par un scancode) est nommée (c'est le nom qui apparait sur le dessin) grâce au fichier de description que l'on trouve dans /etc/X11/xkb/keycodes. Comme les keycodes sont ceux génériques de linux, on peut utiliser les valeurs (par défaut) définies dans keycodes/xfree86.

A chacun de ces noms, il faut associer les symboles correspondants, ceci est fait dans /etc/X11/xkb/symbols. Le clavier du Macintosh étant différent, il faut définir un nouveau fichier. J'ai pour cela rajouté une entrée "appledesign" dans les fichiers xkb/symbols/us, xkb/symbols/en_US et surtout xkb/symbols/fr. Le clavier français est défini dans les règles précédentes ("en_US(appledesign)+fr(appledesign)")comme une altération du clavier US (en effet la plupart des touches ne bougent pas). La description de l'altération est donnée par l'entrée "appledesign" du fichier xkb/symbols/fr.

Le clavier français étant décrit par rapport à en_US, je décris donc une entrée "appledesign" dans xkb/symbols/en_US. Je suppose (je n'en ai pas sous la main) qu'un clavier Apple Design US est identique à un clavier PC standard (la touche "Apple" est assimilée à la touche "Windows"):

[...]
xkb_symbols "appledesign" {
    include  "us(appledesign)"

    replace key <RALT> { [ Mode_switch ] };
    replace key <LALT> { [ Mode_switch ] };
    replace key <LWIN> { [ Alt_L, Meta_L ] };

    include "iso9995-3(basic)"

    modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R };
    modifier_map Mod3 { Mode_switch };
};
[...]


J'ai décrit en_US en fonction de xkb/symbols/us pour faire comme cela est fait pour le clavier PC:

[...]
xkb_symbols "appledesign" {
    include "us(pc105)"
};
[...]

L'écran

Driver FrameBuffer


Une configuration simple qui marche toujours est d'utiliser le driver Framebuffer du noyau :
Section "Device"
Identifier "Device1"
Driver "fbdev"
EndSection
Si votre chipset n'est pas supporté par le noyau (comme pour mon powerbook, le Chips&Technologies CT65554), assurez-vous bien qu'il utilise alors le driver FrameBuffer OpenFirmware qui récupère l'écran déja initialisé et se contente d'écrire en mémoire graphique.



Ceci correspond en fait à donner au kernel le paramètre: video=ofonly

Driver Chips

Pour que le driver Chips fonctionne correctement (taille maximum et fréquence maximum correctes), les deux lignes suivantes en gras doivent être présentes dans la section "Device":
Section "Device"
Identifier "device1"
VendorName "C&T"
BoardName "Chips & Technologies CT65554"
Driver "chips"
BusID "PCI:0:17:0"
Option "DPMS"
VideoRam 2048
DacSpeed 157.5

EndSection
La raison d'être du paramètre DacSpeed est expliquée sur le site de XFree86 dans la documentation du driver chips. Ma version de X est "XFree86 Version 4.3.0", je crois que le driver chips ne fonctionne pas correctement dans les versions précédentes.

Si vous avez compilé le noyau avec l'émulation APM pour Macintosh (apm_emu) le serveur X sera alors  capable de passer l'écran en mode veille. S'il est présent sous forme de module, rajoutez dans /etc/modules.conf:
alias char-major-10-134 apm_emu 

La Configuration

Voila le fichier de configuration que j'utilise (driver chips): /etc/X11/XF86Config-4