lundi 26 juin 2017

Créer son propre fichier de disposition clavier sous Linux

Comment créer son propre keymap

Quand on travaille dans un environnement international où les ordinateurs sont équipés de claviers qwerty, il nous faut souvent faire l'impasse sur les caractères spéciaux et par exemple utiliser un correcteur d'orthographe une fois le texte tapé.

Cependant, il existe une disposition clavier déjà intégré à Windows et Linux : le keymap US international. Cette disposition permet à partir du clavier qwerty le plus simple d'écrire les caractères spéciaux les plus utilisés. Elle est, par exemple, utilisée aux Pays-Bas où tous les claviers sont configurés en US-international même si la plupart des gens l'ignorent et apprennent les codes Windows tel que Alt+132=ä. Pourtant, le clavier international est assez intuitif et rapide.
Clavier US AltGr International

Clavier US International

C'est un hasard qui m'a amené à utiliser cette disposition : l'achat d'un thinkpad à clavier qwerty. J'ai lontemps chercher une configuration qwerty française (keymap "cf" sous linux) comme on le trouve au Canada, mais celui-ci a un agencement de touches différent pas forcement compatible avec un qwerty basique. Je me suis retrouvé à utiliser la configuration English (intl., with dead keys) (plus complète que la version US intl) sous X (et par extension wayland car les fichiers xkb sont compatibles).

Voici quelques exemples d'utilisation du clavier us-intl sous X :
Alt+e é
Alt+' puis e é
Alt+` puis e è
Alt+6 puis e ê
Alt+, ç
Alt+5 €
Alt+[ «
Alt+] »
Alt+z æ
Alt+6 puis 9 ⁹
J'ai toutefois eu un problème quand j'ai voulu utiliser le clavier dans une console Linux (en dehors de X). Je n'ai trouvé aucun keymap (/usr/share/kbd/keymap) us-intl.

Un keymap proche est us-acentos qui est une disposition qui a tenté de rajouter les lettres de l'encodage latin1 sur les claviers US. Cela n'a pas marché à cause de l'encodage ISO8859 (latin1) (latin9) qui a donné naissance a us-intl.iso15.map.gz et us-intl.iso1.map.gz. Cependant, j'ai pu le trouver : us-intl.iso15.kmap.gz mais il ne fonctionne pas de la même manière que sous X : il n'utilise pas Alt-Gr comme touche de modification, mais Ctrl+. ; pas pratique..

Il a donc fallu que je le fasse, vous trouverez deux versions à la fin de mes notes.

Un peu de théorie

Une touche de modification, modificatrice ou plus simplement un modificateur est une touche de clavier d'ordinateur qui permet de modifier le comportement d'une ou plusieurs autres touches auxiliaires lorsqu'elles sont enfoncées simultanément.

Plus spécifiquement, on a :

  • Les touches mortes (dead key) étant une touche qui n'affiche rien lorsqu'elle est activée. Utilisé avec une autre touche, elle modifie le symbole de cette autre touche (utilisé pour les accents par exemple).
  • Les touches de combinaison (Compose en anglais) permettant d'associer deux autres touches afin de créer un nouveau caractère (touche combinaison a+e donne æ).
  • Les touches métas ou méta-modificateurs permettant d'accéder a des fonctions, par exemple la touche windows ou alt (alt+tab, alt+F4, alt+4, windows).

Exemple de keymap

keymaps 0-2,4-6,8-9,12
keycode   1 = Escape           Escape         
    alt    keycode   1 = Meta_Escape
keycode   7 = six              circumflex
    altgr keycode  7 = dead_circumflex
keycode  15 = Tab              Tab            
    alt    keycode  15 = Meta_Tab       
    shift    keycode  15 = Meta_Tab
keycode  38 = l
    #control keycode 38 = Control_l #déjà définit ligne précédente
    altgr keycode  38 = +oslash
    shift altgr keycode  38 = +Oslash
keycode  45 = x
keycode  52 = period           greater          guillemotright
    control    keycode  52 = Compose 
À chaque touche de modification est attribué un poids suivant cette table.
 Shift               1
AltGr                2
Control              4
Alt                  8
ShiftL              16
ShiftR              32
CtrlL               64
CtrlR              128
CapsShift          256
CapsShift fonctionne par défaut comme shift - comme son nom l'indique, il verrouille simplement "Maj".

Pour chaque touche on peut donc définir 2⁸ = 256 combinaisons. Cependant nous n'avons pas à tous les préciser. On peut par exemple définir la gamme des combinaisons utilisée dans le fichier.
keymaps 0-2,4-5,8,12
Ici, seules les combinaisons plain, Shift, AltGr, Control, Control+Shift, Alt et Control+Alt sont définissables par des symboles. Le reste sera rempli par le symbole vide : la touche n'aura aucun effet.

Le comportement de chaque touche est définissable de plusieurs manières :

keycode keynumber = keysym keysym keysym...

Ou comme dans l'exemple
keycode 1 = Escape Escape 
Tout les keysyms sont arrangés comme prévu à la ligne keymaps. Ceux non définis sont automatiquement remplacé par VoidSymbol.

Un autre comportement intéressant est automatiquement complété lorsqu'on définit des touches de l'alphabet.
keycode  45 = x 
Est équivalent à ce comportement.
Plain                 x
Shift                   X
AltGr                 x
Shift+AltGr             X
Control                 Control_x
Shift+Control           Control_x
AltGr+Control           Control_x
Shift+AltGr+Control     Control_x
Alt                     Meta_x
Shift+Alt               Meta_X
AltGr+Alt               Meta_x
Shift+AltGr+Alt         Meta_X
Control+Alt             Meta_Control_x
Shift+Control+Alt       Meta_Control_x
AltGr+Control+Alt       Meta_Control_x
Shift+AltGr+Control+Alt Meta_Control_x
Chaque combinaison peut être écrasée en la redefinissant comme montré ici:
keycode  38 = l
    #control keycode 38 = Control_l #déjà définit ligne précédente
    altgr keycode  38 = +oslash
    shift altgr keycode  38 = +Oslash
Les symboles utilisables sont soit des lettres, soit des chiffres, des diacritiques, des chaînes de caractères, codes de contrôle (Ctrl+C... voir les contrôles codes standards ici https://en.wikipedia.org/wiki/C0_and_C1_control_codes), et d'autres symboles métas ou non. Ils peuvent être écrits directement, en décimal, octal, hexadécimal, unicode ou encore symboliquement (voir http://wiki.linuxquestions.org/wiki/List_of_keysyms).

Pour ajouter des glyphes aux lettres, on peut définir les diacritiques sur des touches mortes (ou touche de composition).
keycode 7 = six circumflex
      altgr keycode 7 = dead_circumflex
AltGr+6 a le même comportement que le ^ sur le clavier français. Il faut tout de même attribuer un comportement pour chaque combinaison.

compose '^' 'a' to acircumflex

Majuscule et Verrouillage :
keycode 44 = +z Z
Maj n'inverse pas le verrouillage.
keycode 44 = +z +Z
      altgr keycode 44 = ae
      shift altgr keycode 44 = AE
Le verrouillage n'a pas d'effet sur les combinaisons altgr + touche 44.
keycode 44 = +z +Z
      altgr keycode 44 = +ae
      shift altgr keycode 44 = +AE
Le verrouillage change la casse de altgr + touche 44.

À propos de ma version us-intl pour le tty

À télécharger ici :

https://github.com/z3bu/us-intl

Sur la version us-altgrintl-deadkeys AltGr est un modificateur, il permet d'acceder aux niveaux 3 et 4 qui touches soient des caractères spéciaux, soient des touches mortes.

Sur la version us-intl-deadkeys les touches mortes sont actives par défaut (donc au niveau 1 et 2), les versions "vivantes" des symboles sont aux niveaux 3 et 4 (touche AltGr enfoncée).

Le verrouillage n'a d'effet que sur les lettres.
Certaines touches mortes ne sont pas implémentées (Alt Maj / et alt Maj -)

Rajouté le symbole ± sur la touche -

Rajouté la possibilité de rentrer des caractères avec leur unicode avec AltGr et le clavier numérique (4 chiffres hexadécimaux).

Je conseille pour configuration /etc/vconsole.conf
KEYMAP=us-altgrintl-deadkeys
FONT="unifont"
UNICODE=1
GNU unifont peut être téléchargé ici : http://unifoundry.com/unifont.html

Apprenez à mieux utiliser le terminal sous Linux ici :
http://wiki.linuxquestions.org/wiki/Control_keys

Il manque encore : la cédille morte, le point (supérieur et inférieur) mort. Quelques caractères complexes.

Conclusion

Le résultat est limité par le terminal offert par le kernel. GNU unifont est conseillé - il a un meilleur support pour l'unicode.

Plus qu'a essayer kmscon et fb (ou encore wayland avec le bon compositeur) - dommage que le développement soit arrêté - de telles solutions gèrent directement les dispositions claviers xkb et support entièrement unicode.

jeudi 4 mai 2017

Configuration d'un thinkpad sous linux

Quelques notes d'instalation pour un thinpad t450s - elles doivent être valable pour d'autres modèles.

Mise à jour du microcode Intel

Intel-ucode permet de mettre à jour le microcode des processeurs intel afin de corriger des potentiels bugs et problèmes de sécurité. De telles mises à jour sont possible via le bios cependant mais peuvent être automatiques via le kernel.

Pour cela installez intel-ucode et regénérez le fichier de configuration de votre bootloader.
grub-mkconfig -o /boot/grub/grub.cfg

Gestion de l'énergie

Paquets de base: acpi_call.
Si vous utilisez un thinkpad récent qui a un processeur Ivybridge (les modèles *30, 840, *50, 60*) installez tpacpi-bat sinon utilisez tp_smapi

Afin d'avoir une durée de batterie optimale il est judicieux de combiner TLP et powertop.

Powertop

Aprés installation il faut effectuer une suite de test pour permettre à powertop de mieux estimer la consomation du thinkpad.
powertop --calibrate
Il faut créer le fichier service pour systemd. Dans /etc/systemd/system/powertop Copiez/Collez la configuration :
[Unit]
Description=Powertop tunings

[Service]
Type=idle
ExecStart=/usr/bin/powertop --auto-tune

[Install]
WantedBy=multi-user.target

Sauvegardez et activez le service :
sudo systemctl enable --now powertop
Vérifiez que tout les paramètres "tunables" lorsque vous lancez powertop son sur "good".

TLP

TLP a presque les mêmes fonctions que powertop il faut donc se débarasser de la majorité des fonctionalitées de TLP

Le fichier /etc/default/tlp:
# ------------------------------------------------------------------------------
# tlp - Parameters for power save

# Hint: some features are disabled by default, remove the leading # to enable
# them.

# Set to 0 to disable, 1 to enable TLP.
TLP_ENABLE=1

# Dirty page values (timeouts in secs).
MAX_LOST_WORK_SECS_ON_BAT=15

# Battery charge thresholds (ThinkPad only, tp-smapi or acpi-call kernel module
# required). Charging starts when the remaining capacity falls below the
# START_CHARGE_TRESH value and stops when exceeding the STOP_CHARGE_TRESH value.
# Main / Internal battery (values in %)
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=90
# Ultrabay / Slice / Replaceable battery (values in %)
START_CHARGE_THRESH_BAT1=75
STOP_CHARGE_THRESH_BAT1=90
Si votre ordinateur est la plupart du temps branché, afin d'augmenter le nombre de cycle recharge/décharge de votre batterie (et donc augmenter leur vie) paramétrez les seuils de charge
START_CHARGE_THRESH_BAT0=50 STOP_CHARGE_THRESH_BAT0=60 START_CHARGE_THRESH_BAT1=50 STOP_CHARGE_THRESH_BAT1=60 Plus qu'à activer le service tlp
sudo systemctl enable --now tlp.service  
sudo systemctl enable --now tlp-sleep.service

SSD : FStrim

Soyez sur d'installer le paquet linux-util. FStrim n'a pas d'effets significatif sur les performances des disques SSD. Il a un effet sur le long terme en supprimant les blocs non utilisés sur le disque.

Vérifier que le disque support le triming
hdparm -I /dev/sda | grep TRIM
Activer le trimmer.
systemctl enable fstrim.timer

Lecteur d'empreintes

Installez fprintd et libfprint
fprintd-enroll

GDM gère automatiquement le lecteur d'empreinte.

jeudi 14 juillet 2016

Mod sans interrupteur pour la console Sega Saturn

Cette article présente en premier le principe du choix de zone puis le fonctionnement du mod sans interrupteur.

NB: l'encodage sécurité de la console à récemment était craqué, il va bientôt être possible de charger des jeux par USB/ clef USB en rajoutant simplement une carte sur le port extension d'origine de la console !

Zonage 

Le zonage de chaque console est défini par le PCB par le biais de 4 broches.

JP6/JP7
JP8/JP9
JP10/JP11
JP12/JP13
bit0
bit1
bit2
bit3
 315-5744, broche 5
 
315-5
744, broche 6
 
315-5
744, broche 7
 
315-5
744, broche 8
 
L'état de chaque broche (+5V/0V) défini le code pays comme affiché sur ce tableau:

bit3
JP12/JP13
bit2
JP10/JP11
bit1
JP8/JP9
bit0
JP6/JP7
Zone Valeur
Hexa
0 0 0 0 non utilisé 0
0 0 0 1 Japon 1
0 0 1 0 Taiwan, Philipines 2
0 0 1 1 inconnu 3
0 1 0 0 USA, Canada 4
0 1 0 1 Brésil 5
0 1 1 0 inconnu 6
0 1 1 1 inconnu 7
1 0 0 0 inconnu 8
1 0 0 1 inconnu 9
1 0 1 0 inconnu A
1 0 1 1 inconnu B
1 1 0 0 Europe C
1 1 0 1 inconnu D
1 1 1 0 inconnu E
1 1 1 1 inconnu F

Ici JP8/9 ne nous intéressent pas à moins que vous n'ayez des jeux/ou une console provenant de Taïwan/ des Philippines.

Pour le format de vidéo NTSC (60 Hz) ou PAL (50 Hz) c'est sur une autre broche qu'il faut agir (état bas pour le PAL) :

PALJP1/JP2f315-5690, broche 79

Il nous faut donc changer l'état à chaque broche par le biais des jumpers.

Mod sans interrupteur

J'ai modifié le "saturnswitchless" mod pour travailler avec un compileur plus récent (XC8) que le projet original par Sebastian Kienzl. J'ai également choisi un PIC qui me revenait moins cher sur ebay, le PIC16f628a, me disant qu'il ne serait pas difficile d'adapter le code.

Le code se trouve ici avec le fichier .hex à charger sur le PIC (avec le pickit).

Une fois installé, il fonctionne ainsi : en fonction de l'appui sur le bouton reset on a :

  • pour un appui court - Reset classique de la console
  • pour un appui mi-long - changement 50/60 Hz (clignotement de la DEL de mise sous tension plus rapide et plus long une fois en en 60 Hz)
  • pour un appui long - Changement de la zone : Europe/Japon/USA. Un appui maintenu fera défiler les différentes zones en boucle.
Le voyant de mise sous tension est remplacé par une diode bicolore ce qui donne directement un code couleur pour la zone sélectionée.

Dès que vous changer les paramètres, ceux-ci sont sauvegradé dans l'EEPROM du PIC.

Guide d'installation

Voici un petit guide pour la console saturn modèle 1, plus précisèment le PCB version 837-11892-01:PAL, pour les autres modèles vous pouvez vous baser sur cet article qui vous permetra d'identifier le routage de chaque jumper.

J'ai défini le brochage du PIC16f628a ainsi :

RB0 (entrèe) utilisé comme une interruption externe, relié RESET BUTTON
RB1 (sortie) mode vidéo PAL si 0 NTSC si 1 (JP1)
RB2 (sortie) le reset de la console
RB4 (sortie) DEL verte
RB5 (sortie) DEL rouge
RA0 (sortie) JP6 (bit 0 du zonage)
RA1 (sortie) JP10 (bit 2 du zonage)
RA2 (sortie) JP12 (bit 3 du zonage)

Chaque broche de zone/mode vidéo des puces de la console peut être reliée à la masse ou au +5V pour être activé.  J'ai reproduit ici le routage des jumpers du modèle que j'ai.


mode vidéo


bit 0


bits 2 et 3

Voici donc ce qu'il faut faire en photo : chaque point rouge est l'endroit où connecter une broche du PIC.

Carte mère coté verso :

Enlever R29 et relier RB1
Une piste à couper (JP7), RA0 à relier
Carte mère coté recto :

RA1 et RA2 à relier au PIC (chacun ont deux points où il peuvent être souder), deux pistes à couper (JP10 et JP12)

Carte fille :
Carte fille, une piste à couper, deux points à souder RB0 et RB2

Il y faut également mettre la diode bicolore à anode commune, dont les deux cathodes sont reliées à RA4 et RA5 en série avec des resistances de 200 ohms.

Il ne faut pas oublier de mettre un condensateur céramique de 100 nF au plus proche du +5V et la masse du PIC.

Profitez des jeux japonais à bas prix !
Fréquence :

dimanche 27 mars 2016

Utilisation du STM32 VL/L discovery sous Linux

C'est possible et on peut se faciliter la vie avec un bon makefile. Auparavant ils vous faut installer l'ensemble des outils : le compilateur et l'outil de flashage/déboggage.

Cross compiler pour ARM

Installation du compilateur gcc-arm-none-eabi

Il devrait être fourni par la majorité des distributions :

#Debian/Ubuntu
sudo apt-get install gcc-arm-none-eabi
#Archlinux
yaourt gcc-arm-none-eabi

Sinon vous trouverez ici les sources et binaires.

https://github.com/esden/summon-arm-toolchain

Le tarball :

https://launchpad.net/gcc-arm-embedded/+download

Example de compilation

Compilation d'un fichier main.c

/usr/bin/arm-none-eabi-gcc -O1 -c -mcpu=cortex-m3 -mthumb \
-msoft-float -gdwarf-2 -mno-sched-prolog -fno-hosted -mtune=cortex-m3 -march=armv7-m -mfix-cortex-m3-ldrd \
-DSTM32F10X_MD_VL -DUSE_STDPERIPH_DRIVER -I"/home/toto/ROM_READER/cmsis" -I"/home/toto/ROM_READER/device"\
-I"/home/toto/ROM_READER/inc" -I"/home/toto/ROM_READER/stm32lib/inc" /home/toto/ROM_READER/src/main.c

Édition des liens (connection des fichiers compilés)

/usr/bin/arm-none-eabi-gcc -o Demo.elf -O1  -g -Wall \
-Werror  -fno-exceptions -ffunction-sections -fdata-sections -nostartfiles -Wl,--gc-sections,\
-T/home/toto/ROM_READER/device/linker/STM32F100RB_FLASH.ld  core_cm3.o system_stm32f10x.o \
stm32f10x_gpio.o stm32f10x_rcc.o main.o startup_stm32f10x_md_vl.o 

Convertion du binaire au format elf en binaire exécutable par le systême.

/usr/bin/arm-none-eabi-objcopy -O binary Demo.elf Demo.bin

Liste de la taille des sections et la taille totale.

/usr/bin/arm-none-eabi-size -B Demo.hex

Flasher le STM-32

Installation de st-link

Si vous n'avez pas de "flasheur" JTAG comme le bus pirate, les kit de développment ont une puce (un autre stm32) qui convertie la liaison série en JTAG. Cela parmet de programmer directement votre STM32 par USB.

Pour communiquer avec cette puce vous avez besoin de st-link (https://github.com/texane/stlink). St-link foruni une bibliothèque de communication (libstlink), un serveur de déboggage GDB (st-util), et un outil de flashage (st-flash). Les dépendances requises sont libusb, pkg-config et autotools.

git clone stlink
cd stlink
./autogen.sh
./configure
make

Exemple pour charger un fichier

Il vous faudra utiliser l'option v1 pour votre vl discovery et v2 pour votre l discovery (v2 l'est par défaut). Stlink vous permet de lire et d'écrire la rom flash du stm32.

# Lecture de 4096 addresses d'un VL et transfert dans out.bin
./st-flash read v1 out.bin 0x8000000 4096
# De même avec un v2
./st-flash read out.bin 0x8000000 4096
# Écriture du binaire in.bin dans la rom
./st-flash write v1 in.bin 0x8000000 

Pour lancer le programme, n'oubliez pas de resetter votre stm32 après le chargement du binaire.

Si vous n'aimez pas la ligne de commande, reportez vous sur l'interface graphique stlink-gui:



Un makefile

Pour vous faciliter la vie voici un Makefile et les sources fournies par STM pour le VL-Discovery (https://github.com/z3bu/STM32VL-Discovery).

git clone https://github.com/z3bu/STM32VL-Discovery
cd STM32VL-Discovery
#Compilation de la démo
make
#Écriture de la flash
make load

Les bibliothèques fournies par STM sont dans le dossier stm32lib. Les fichiers core sont dans cmsis, l'éditeure de lien, le fichier assembleur de startup, et d'autres définitions pour le STM32 sont dans le dossier device.

Décommentez ou ajoutez dans le Makefile et inc/stm32f10x_conf.h lorsque vous voulez utiliser de nouvelles bibliothèques dans votre programme.

samedi 26 mars 2016

Utiliser votre vieux modem club internet comme routeur/point d'accés et plus si affinité.

Si vous avez un modem AH4222 à l'interface SFR inexploitable (il ne permet pas de changer son adresse ip et d'autres paramètres), voici comment rétablir sont firmware d'origine, voir le modifier.

Le routeur à par défaut l'adresse IP 192.168.1.1. Cadencé à 256 MHz, 16 MB de ram, il a une petite ROM de 4 Mio Il a heureusement un utilitaire CFE (Common Firmware Environment) qui permet de flasher le bcm6348.

Méthode simple

Si vous voulez simplement remettre le firmware d'origine, la méthode la plus simple est de télécharger le firmware que j'ai pu recompilé ici (la méthode de recompilation se trouve après). Le CFE est accessible par liaison série et également par l'interface web après avoir maintenu le bouton reset pendant 30 secondes. accédez par la suite à l'interface sur l'adresse de la box.

Méthode avancée

Vous povez utiliser la liaison série. Les paramètres de liaison sont 115200bps, 8 bits, pas de parité, 1 bit de stop. Les niveaux sont à 3.3V.

Donc si vous voulez vous amuser: achetez un convertisseur USB-Série.

Le brochage est, en numérotant les broches du haut vers le bas :
  1. Vcc (3.3V)
  2. Rx
  3. Tx
  4. GND
Pour connecter un terminal depuis linux a votre box:
#Avec putty
putty -serial /dev/ttyUSB0 -sercfg 11520
#Avec screen
screen /dev/ttyUSB0 115200

Si vous utilisez le port série de votre PC, remplacez ttyUSB0 par ttyS0.

Vous devriez être en mesure de voir les logs de boot de la box. Au début du boot un compteur vous laissera le temps d'accéder au CFE, c'est ce qui nous intéressera pour flasher le modem.
CFE version 1.0.37-0.7 for BCM96348 (32bit,SP,BE)
Build Date: Thu Mar  2 16:45:45 CST 2006 (root@hp)
Copyright (C) 2000,2001,2002,2003 Broadcom Corporation.

Initializing Arena.
Initializing Devices.
Flash device ID:22f6
AMD FLASH FAMILY
Auto-negotiation timed-out
10 MB Half-Duplex (assumed)
CPU type 0x29107: 256MHz, Bus: 128MHz, Ref: 32MHz

Total memory used by CFE:  0x80401000 - 0x805232F0 (1188592)
Initialized Data:          0x8041B390 - 0x8041CC60 (6352)
BSS Area:                  0x8041CC60 - 0x804212F0 (18064)
Local Heap:                0x804212F0 - 0x805212F0 (1048576)
Stack Area:                0x805212F0 - 0x805232F0 (8192)
Text (code) segment:       0x80401000 - 0x8041B388 (107400)
Boot area (physical):      0x00524000 - 0x00564000
Relocation Factor:         I:00000000 - D:00000000

Board IP address                : 192.168.1.1:ffffff00  
Host IP address                 : 192.168.1.100  
Gateway IP address              :   
Run from flash/host (f/h)       : f  
Default host run file name      : vmlinux  
Default host flash file name    : bcm963xx_fs_kernel  
Boot delay (0-9 seconds)        : 1  
Board Id Name                   : 96348GW  
Psi size in KB                  : 24
Number of MAC Addresses (1-32)  : 12  
Base MAC Address                : 00:16:38:de:de:de  
Ethernet PHY Type               : Internal
Memory size in MB               : 16

*** Press any key to stop auto run (1 seconds) ***
Auto run second count down: 

Voici les logs du CFE, vous pouvez y accédez si vous appuyez sur une touche (par votre terminal série) dans le temps qui vous est imparti.

Par la suite il est possible de changer le "boot delay" et l'addresse IP utilisé par le CFE.

Compilation du firmware

Avant d'essayer de tout recompiler j'ai tenté de récupérer le firmware image d'origine sur une box qui n'avait pas subi de mise à jour lors du passage à SFR.
cat /dev/mtdblock > /dev/ttySO

Du coté de mon linux j'ai utilisé dd pour récupérer l'image. Cependant cette méthode ne semble pas marcher.

Installation de la toolchain (debian 8)

Téléchargez au choix les .rpm ou .deb ici et installez les.

dpkg -i *.ded

Le tout est installé dans /opt/toolchain.

Maintenant vous pouvez récupérer les sources publiées par Club Internet (v44) dans le même répertoire (vous aurez des problèmes avec cmplzma et mksquashfs qui nécessitent libfstc++.so.5, les sources en elles mêmes nécessitent des modifications)

Sinon vous pouvez clonez le git https://github.com/z3bu/AH4222/ auquel j'ai apporté des modifications sur les binaires permettant la compression de l'image finale (cmplzma et squashfs version 2.0 compilés pour Debian 8), mais également quelquse mini patch sur le code source. Pour cmplzma j'ai utilisé le paquet officiel (sinon prenez le ici), pour squashfs j'ai du retrouver la bonne version et la recompiler. Quelqu'un a fais un dépot avec pleins d'utilitaires de ce genre : https://github.com/z3bu/firmware-mod-kit.

Placez vous dans le dossier des sources et compilez le tout ainsi :

make PROFILE=96348GWV

Désormais pour le transférer, référez vous à l'interface web du CFE. Si vous voulez le faire par le port série il vous faut :

Installer tftp-hpa, modifier/identifier le répertoire du serveur (par défaut /srv/tftp) dans le fichier /etc/conf.d/tftpd.

Copiez-y le firmware qui se situe dans

Lancer le service

systemctl start tftpd 

Maintenant il est temps de revenir au CFE par le port série, à l'aide d'un terminal entrez :

flashimage 192.168.1.41:bcm96348GWV_fs_kernel_AH4222...

J'ai eu quelques problème de conflit d'adresse ip lors du flashage, il est possible de changer l'addresse ip du routeur à l'aide du CFE, mais il faudra redémarrer la box par la suite. Ce problème de conflit rendait le chargement de l'image par tftp impossible.

Une fois flashé vous pouvez vous connecter à l'aide de telnet sur la box ! Les identifiants par défaut sont :

id: root
mdp : clubadmin

Par contre j'aurais aimé retrouver retrouver le brochage du port JTAG, si quelqu'un a des sources.

lundi 29 février 2016

Playing around with the Chipkit Max32


Here is a little review of the chipkit Max 32 and how to use it under linux.

During a project I had to adapt a sainsmart screen to the 3.3V Max 32.
Here is how I modified the board and the UTFT library to use the SD card and the screen.

Be careful my english is awful in this document.

lundi 8 février 2016

Utiliser un minitel comme un terminal avec un Raspberry Pi

Encore un article sur l'utilisation d'un minitel en tant que terminal, mais celui ci est plus direct, car les articles que j'ai lu datent d'une époque ou systemd n'était encore qu'a ses débuts dans Debian (Raspbian pour les Pis).



Le truc qui m'a le plus embetté dans ma recherche d'infos c'est de voir des articles ou l'auteur avait acheté un adapteur USB-UART au lieu d'utiliser directement l'UART présent sur raspberry pi.

Le montage électronique : 


Alors, tout d'abord faites attention encore un coût caché du raspberry : ses entrées/sorties ne sont pas protégées ! Donc à vous d'utiliser un buffer qui adaptera le signal au GPIOs ou comme sur mon schéma d'utiliser des diodes Zener de 3,3V pour empécher toute surtension suceptible de griller vos précieuses entrées (je n'ai pas confiance en ce vieux minitel dont la broche Rx peut monter jusqu'a 15V). On utilise le 3,3V du Pi, sa masse (qu'on relie à celle du minitel) et les broches TX0 et RX0.
Le brochage DIN du minitel vu coté soudure
Pour la conversion en elle même : la broche transmission du minitel (Tx mi) est en collecteur ouvert, cela signifie qu'il y a un transistor qui impose le 0.
Sur le schéma on j'ai mis une resistance de rappel de 200k ohm (30k est déjà assez grand) vous pouvez vous en passer si connecté sur le raspberry Pi (les GPIO sont déjà équipé de résistance de ~50k). Je conseil de la laisser pour faire des tests de connection (par exemple faire un retour la sortie Tx du minitel sur son Rx).

La branche de réception du minitel semble être une résistance de tirage, je lui ai mesuré une tension de 4V en entrée. Le montage se comporte ainsi: lorsque Tx pi est en état bas le transistor est passant (Rx mi relié à la masse = 0V), lorsque que Tx pi est à l'état haut (3,3V) le transistor est bloqué, Rx mi est "tiré" à 4V par le minitel.

Configurer le minitel

Appuyez en même temps sur Fnct+T, puis A (passage en mode périphérique)
Puis : Fnct+T puis E (désactivation de l'echo du terminal)
Puis : Fnct+P puis 4 (Passage à une connection à 4800 baud/s)

Par défaut le minitel est a une connection à 1200 bauds. Chaque caractère est envoyé sur 7 bits, avec une parité paire (bit de controle) et un bit de stop.

Tester la connection

Dans un terminal tapez :

#Pour configurer la connection série et le tty
stty -F /dev/ttyUSB0 4800 istrip cs7 parenb -parodd brkint \
ignpar icrnl ixon ixany opost onlcr cread hupcl isig icanon \
echo echoe echok
# Tester l'envoi vers le minitel
echo 'Hello World' > /dev/ttyAMA0
# Tester la réception des données depuis le minitel (elle
seront seulement affichées sur le minitel si vous n'appuyez pas sur entrée)
cat /dev/ttyAMA0

Vous pouvez déjà essayer d'avoir un tty avec (attention c'est sale mais vous pouvez tout de même vous logger) :

agetty ttyAMA0 4800

Avoir un tty au démarrage

La configuration peut être extrèmement simple : ajoutez à /boot/cmdline.txt

console=ttyAMA0,4800e7 loglevel=1

4800 bauds sur 7 bits et de parité paire (even en anglais).
L'option logelevel=1 est utile pour avoir le moins d'info envoyé au terminal (la connection est plutôt lente et va ralentir le démarrage).

Si vous voulez avoir les erreurs du kernel ajoutez-y également :
kgdboc=ttyAMA0

Ce moyen marche plutôt bien, on a même les logs de boot mais agetty affiche d'immondes rectangles blancs, en effet il essaye de resetté les paramètres du terminal. De plus le fichier terminfo qui contient la définition de tout les caractères d'échappement (ces caractères qui permettent de faire bipper le minitel, de changer ses paramètre par exemple) ne correspond pas au terminal (par défault vt100 et pas minitel1b-80). Vous aurez un terminal qui fonctionne mais des logiciels avec des interfaces curse aura des problèmes (exemple raspi-config, menu-wifi... etc.).

À propos, le fichier /boot/cmdline.txt est l'ensemble des arguments fourni au kernel lors au démarrage. Sur un linux avec grub ce sont les paramètres que l'on retrouve sur les ligne "linux" dans le grub.conf.

Comment avoir un terminal "propre"

Il nous faut donc le fichier de définition du minitel il n'est pas sur debian par défaut. Télécharger le ici et placer le dans /etc/terminfo/m/ (il est possible qu'il soit déjà présent dans votre /usr/share/terminfo). Dans ce tuto on utilise le fichier minitel1b-80.

Je trouve que la définition minitel1b-80 n'est pas parfaite, je m'attarderai peut être à le modifier un jour. Quelqu'un l'a fait !  Alexandre MONTARON qui a bien gentiment mis un lien vers cet article. Il met à jour les terminfos pour les différents minitels (le mien est un de 80 colonnes en noir et blanc).

Pour avoir sa version télécharger (il donne le fichier source !!!) le fichier mntl.ti ici et compilez le.

tic mntl.ti -dir /etc/terminfo

Vous pouvez par la suite sélectionner le bon fichier de définition (m1b, m1b-nb, m1b-x80).

Le fichier de définition est utilisé ainsi avec agetty (alternative getty qui est une version en ligne de commande de getty) :

agetty -c ttyAMA0 4800 minitel1b-80

L'option -c pour agetty corrige le problème des rectangles blanc dont j'ai parlé plus haut.

Maintenant il nous faut dire à notre système d'utiliser cette commande. Avec Raspbian Jessie l'inittab n'est plus utilisé (systemd gère l'obtention de tty), /etc/inittab est toujours présent mais inutile.

Du coup, l'obtention du tty marche ainsi :
  • soit le kernel dit qu'il veut un tty (avec l'option console=...)
  • soit un fichier de configuration systemd existe
Un mix des deux est possible, le kernel dit qu'il veut un tty, qu'il va utiliser pour afficher ses log de démarrage, mais systemd utilise le fichier de configuration si il est présent.

Il va falloir créer un fichier de configuration systemd avec les bons paramètres :

/etc/systemd/system/serial-getty\@.service 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Serial Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
BindsTo=dev-%i.device
After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=-/sbin/agetty -c %i 4800 minitel1b-80
Type=idle
Restart=always
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

[Install]
WantedBy=getty.target

Ensuite il n'y a plus qu'a activer le service au démarrage et le lancer.
ln -s /etc/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyAMA0.service
systemctl daemon-reload
systemctl start serial-getty@ttyS2.service

Voilà maintenant amusez vous à modifier les messages d'accueil dans /etc/issue et /etc/motd :)

Bonus 

Quelques combinaisons de touches non triviales :

Ctrl+1  {   Ctrl+4  ~
Ctrl+2  |    Ctrl+5  '
Ctrl+3  }   Ctrl+6  _

Fnct+1 F1
Fnct+2 F2
   ...       ...
Fnct+0 F10

Et à essayez à tout prix, le starwars en ASCII :

telnet towel.blinkenlights.nl

À propos de mgetty

Certains essayent de remplacer agetty par mgetty, passez votre route... J'ai passé une journée entière dessus. Il faut compiler les sources patchées et même là, on a un login moche qui ne marche pas car mgetty n'aime pas être en dehors de son groupe de processus "terminal" (i.e. être lancé au démarrage).

Sources

http://www.jbase.com/r5/knowledgebase/howto/general/common/CreateTerminfo/modify.htm
http://pila.fr/wordpress/?p=361
http://minitel.lozi.org/
http://tldp.org/HOWTO/Text-Terminal-HOWTO-16.html
http://www.tldp.org/HOWTO/Text-Terminal-HOWTO-19.html
http://www.faqs.org/docs/Linux-HOWTO/Remote-Serial-Console-HOWTO.html#GETTY-GETTY