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 *.deb

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

samedi 23 janvier 2016

Créer un seedbox avec un raspberry pi.

Après que Free n'est rendu inutile sa seedbox avec ses DNS menteurs impossibles à changer (je parle de l'utilitaire de téléchargement : voir ici et ), je me suis enfin laissé acheté un raspberry pi 2. Le but était de remplacer la fonction seedbox qu'ils ont gaché, et de faciliter la connection de n'importe quel pc sur mon réseau domestique à mon service vpn.


Premièré étape : Installation du système de base

Je suis un afficionados d'archlinux, mais j'ai voulu revenir sur Debian, en effet je cherche de la stabilité et je n'ai pas besoin des dernières version des logiciels ni d'une quelconque interface graphique.

Je suis habitué à la netinstall, j'aime bien partir d'un système minimaliste j'ai donc récupéré une image de minibian qui à l'avantage d'être petite (je n'ai qu'une carte SD de 2 Go) et d'avoir un serveur ssh activé par défaut.

Ici je suppose que votre carte µSD est désignée par /dev/mmcblk0

wget http://sourceforge.net/projects/minibian/files/2015-11-12-jessie-minibian.tar.gz/download
tar -xvf 2015-11-12-jessie-minibian.tar.gz
cat 2015-11-12-jessie-minibian.img >> /dev/mmcblk0
sync
sync permée de vider les tampons des systèmes de fichiers (si l'écriture n'était pas complète).

Après l'écriture de l'image retirez et reconnectez la carte sd. Deux partition y sont présentent : la partition boot contenant les fichiers de configuration nécéssaires au démarrage. Et la deuxième partition (mmcblockp1 qui est là plus grande) qui contient le système qu'il nous faut redimensionner pour qu'elle complète totalement la carte. J'ai utilisé Gparted  car je suis un flemmard (voir avec resize2fs). Cette opération peur être réalisée après le premier boot avec l'utilitaire raspi-config.

Il ne reste plus qu'a nommer votre raspberry pi sans quoi vous pouvez rencontrer des problèmes de connection sur votre réseau. En utilisant votre gestionnaire de fichier il vous faut accéder à la deuxième partition de la carte et avec votre éditeur préfére :

Changez  /etc/hostname (j'ai choisi comme nom EEPRON à la place du minibian par défaut)
Modifiez /etc/hosts : mettez de nouveau le nom choisi à la place de minibian.
Ça donne quelque chose comme ça:

$cat /etc/hostname
EEPRON
$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 EEPRON

Premier boot:

La raspberry alimenté et connectée au réseau ethernet (compter 15 secondes de démarrage pour minibian), j'ai récupéré l'addrese ip en utilisant l'interface de la freebox, sinon imposez une adresse ip statique.
Pour imposer une adresse ip statique remplacez la ligne "iface eth0 line" dans /etc/network/interfaces par

iface eth0 inet static
address 192.168.0.222
netmask 255.255.255.0
gateway 192.168.0.254

Connection et création d'un utilisateur

Vous n'avez plus qu'a vous connecter sur la raspberry: dans un terminal tapez :

ssh root@192.168.0.xx

Informez le mot de passe "raspberry" et vous pouvez créer un utilisateur et ajoutez le à au groupe sudo pour pouvoir se passer du compte route.

adduser toto
adduser toto sudo

Petite mise à jour du système:

sudo apt-get update
sudo apt-get upgrade

Mettre le système à l'heure:

Pour mettre à jour le firmware il vous faut mettre à l'heure votre système (en effet le raspberry pi n'as pas d'horloge interne). Vous pouvez le faire manuellement avec date ou utiliser un serveur ntp afin que le système se mette à l'heure à chaque démarrage. Pour celà configurez /etc/default/ntpdate.

# The settings in this file are used by the program ntpdate-debian, but not
# by the upstream program ntpdate.

# Set to "yes" to take the server list from /etc/ntp.conf, from package ntp,
# so you only have to keep it in one place.
NTPDATE_USE_NTP_CONF=yes

# List of NTP servers to use  (Separate multiple servers with spaces.)
# Not used if NTPDATE_USE_NTP_CONF is yes.
NTPSERVERS="online.net"

# Additional options to pass to ntpdate
NTPOPTIONS=""

Ensuite pour forcer la synchronisation

systemctl stop ntp
ntpdate-debian online.net
systemctl enable ntp
systemctl start ntp

Personnellement j'utilise le serveur ntp de ma freebox, ici il est intelligent de remplacer directement mafreebox.free.fr par son adresse ip (192.168.0.254 pour moi). Ce sera utile si vous utiliser une connection VPN et faite un routage original.

Mise à jour du firmware du raspberry pi:

Le firmware fait environ 50 Mo

sudo apt-get install rpi-update 
sudo rpi-update

Pensez à redémarrer pour que le nouveau firmware soit chargé.

Autres paquets utiles

Si vous n'avez pas déjà redimmensionnée votre partition installer l'utilitaire:

sudo apt-get install raspi-config
sudo raspi-config

D'autres paramètres sont modifiable avec cette interface ncurses, mais bon rien ne vous empêche de modifier directement les fichiers sur votre partition /boot/config.txt. Toute modification nécessite un redémarrage.

Et puis quelques outils utiles si vous voulez avoir une connexion wifi (n'oubliez pas les firmware de vos dongle)

sudo apt-get install net-tools iw wireless-tools wpa_supplicant dbus aptitude

Finalement, si vous avez cette erreur au boot : cfg80211: Calling CRDA to update world regulatory domain. Alors installez
 
sudo apt-get install crda wireless-regdb

Client VPN avec PPTP

J'utilise le point to point tunelling pour me connecter à mon fournisseur vpn. Pour celà il faut installer:

sudo apt-get install pptp-linux

Voici ma configuration pour purevpn

~# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client    server    secret            IP addresses
purevpn0s******* serveur_vpn "motdepasse" * 

~# cat /etc/ppp/peers/serveur_pptp
pty "pptp adresse.pointtoserver.com --nolaunchpppd"
name purevpn0s*******
remotename serveur_pptp
ipparam serveur_pptp
file /etc/ppp/options.pptp
require-mppe-128
refuse-eap noauth

Vous pouvez également utiliser les paramètres maxfail 0 et persist, ainsi votre connection se reconnectra/essayera de se connecter en boucle.

~# cat /etc/ppp/ip-up.d/serveur_pptp
#!/bin/bash
# This script is called with the following arguments:
# Arg Name
# $1 Interface name
# $2 The tty
# $3 The link speed
# $4 Local IP number
# $5 Peer IP number
# $6 Optional ``ipparam'' value foo

ip route replace default dev $1

Ici toute les connections par défault sont désomais routées par ppp0 (nom de l'interface). Ceci ne pause pas de problème pour le résaux local car par défaut :

~#ip route
default dev eth0 via 192.168.0.254 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.29 

192.168.0.254 est l'adresse de ma box, 192.168.0.29 celui de mon rapberry pi.
192.168.0.0/24 ou 192.168.0.* signifie toutes les adreses de mon réseau local. Ainsi dès que le système souhaite accéder à un périphérique réseau local, il est bien redirigé vers l'interface ethernet.

~# cat /etc/ppp/ip-down.d/serveur_pptp
#!bin/bash
killall rtorrent
ip route del $5
ip route replace default dev eth0 via 192.168.0.254

Ici je stoppe tous process rtorrent lorsque que la connection s'arrète (au cas où). Ce n'est pas élégant du tout, je suis sûre que l'on pourrait utiliser systemd pour rtorrent (cliquez moi). Je supprime ensuite le routage qui se met en place par défaut lorsque la connection pptp est lancée.

N'oubliez pas de rendre executables vous scripts:

sudo chmod+x /etc/ppp/ip-up.d/serveur_pptp
sudo chmod+x /etc/ppp/ip-down.d/serveur_pptp

Désormais vous pouvez vous connecter au serveur pptp avec les commandes:

pppd call serveur_pptp
#Ou avec :
pon serveur_pptp
#et stopper avec
poff serveur_pptp

Vous pouvez utiliser traceroute et route pour vérifier que votre tunnel est bien en place, exemple :

#vérifier que l'interface ppp0 existe bien et que les toutages sont bien en place
ip route
#vérifier que votre adresse sortante est bien celle du serveur pptp
traceroute www.google.fr

Rendre cette connection automatique

Par défault avec pppd et pon c'est le serveur de la configuration /etc/ppp/peers/provider qui est connecté, vous pouvez créer un lien symbolique de votre configuration vers /etc/ppp/peers/provider.
Pour rendre cette configuration automatique j'ai récupéré un un fichier ppp@.service d'archlinux car minibian ne l'a pas. Placez le dans /etc/systemd/system/ :

~# cat /etc/systemd/system/ppp\@.service
[Unit]
Description=PPP link to %I
Before=network.target

[Service]
ExecStart=/usr/sbin/pppd call %I nodetach nolog

[Install]
WantedBy=multi-user.target

Ensuite charger le module ppp_generic et activez le service ppp@votre_serveur :

modprobe ppp_generic
systemctl enable ppp@serveur_pptp.service
systemctl start ppp@serveur_pptp.service

J'ai vu d'autres possibilitées en utilisant le fichir /etc/network/interfaces que j'ai tenté sans grand succés.

Accéder à un partage Windows Freebox

Ma configuration pour la freebox :

~# cat /etc/fstab
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 errors=remount-ro,noatime,nodiratime,commit=120 0 1
//192.168.0.254/Disque\040dur /mnt/freebox cifs auto,user,username=freebox,rw,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,noperm 0 0

Encore une fois 192.168.0.254 est l'adresse de ma freebox. \040 représente un espace, ça peut être pratique pour un chemin avec des espaces sur un partage samba.

Noubliez pas de créer /mnt/freebox avec les bon droits d'accès.

sudo mkdir /mnt/freebox
mount /mnt/freebox
sudo chmod -R a+rw /mnt/freebox

Mon but est d'utiliser le partage pour sauvegarder les torrents de distribution linux que je télécharge sur mininova.

N.B:

Les options gid, uid, file_mode, dir_mode, et noperm permettent à l'utilisateur d'uid et gid correpondant (voir id username) qui accéde le montage samba à avoir tout les droits d'écritures. Sinon l'écriture ne marche seulement que si l'utilisateur correspond et si l'option noperm est utilisée ! (Le partage samba peut être monté par n'importe qui par contre).

rtorrent

Rtorrent est un client torrent avec une interface console, il est léger et plutôt facile à prendre en main. Il gère également les liens magnet.

Installation

sudo apt-get install rtorrent screen

Screen est un utilitaire sympathique qui vous permettra de lancer rtorrent en tache de fond et d'accéder à son interface ulterieurement.

Voici mon fichier de configuration /home/toto/.rtorrent.rc

# Copy to ~/.rtorrent.rc and enable/modify the options as needed. Remember to
# uncomment the options you wish to enable.

# Maximum and minimum number of peers to connect to per torrent.
min_peers = 1
max_peers = 50

# Same as above but for seeding completed torrents (-1 = same as downloading)
min_peers_seed = 1
max_peers_seed = 20

# Maximum number of uploads single torrent may use
max_uploads = 7

# Maximum number of simultaneous downloads
max_downloads_global = 5
# Maximum number of simultaneous uploads
max_uploads_global = 10

# Global upload and download rate in KiB. "0" for unlimited.
download_rate = 0
upload_rate = 100

# Default directory to save the downloaded torrents.
directory = /mnt/freebox/Téléchargements/

# Default session directory. Make sure you don't run multiple instance
# of rtorrent using the same session directory. Perhaps using a
# relative path?
session = ./.rtorrent

# Watch a directory for new torrents, and stop those that have been
# deleted.
schedule = watch_directory,5,5,load_start="/mnt/freebox/Téléchargements/A\ Télécharger/*.torrent"
schedule = tied_directory,6,5,start_tied=
schedule = untied_directory,7,5,stop_untied=

# Close torrents when diskspace is low.
schedule = low_diskspace,5,60,close_low_diskspace=2000M

# Periodically save session data
schedule = session_save,240,300,session_save=

# Enable the default ratio group.
ratio.enable=
# Change the limits, the defaults should be sufficient.
# Upload to a minimum ratio of 4.0
ratio.min.set=400
# Upload to a maximum ratio of 20.0
ratio.max.set=2000
# Upload a minimum of 250 MB
ratio.upload.set=250M

# When seeding ratio is reached close the torrent
system.method.set = group.seeding.ratio.command, d.close=

# Move files to ./unsorted when download completes
system.method.set_key = event.download.finished,move_complete,"execute=mv,-n,$d.get_base_path=,\
/mnt/freebox/Téléchargements/Téléchargés;d.set_directory=/mnt/freebox/Téléchargements/Téléchargés"

# Port range to use for listening.
port_range = 33101-33199

# Start opening ports at a random position within the port range.
port_random = yes

# Encryption options, set to none (default) or any combination of the following:
# allow_incoming, try_outgoing, require, require_RC4, enable_retry, prefer_plaintext
#
# The example value allows incoming encrypted connections, starts unencrypted
# outgoing connections but retries with encryption if they fail, preferring
# plaintext to RC4 encryption after the encrypted handshake
#
encryption = allow_incoming,try_outgoing,enable_retry,prefer_plaintext

# Sort the main view by ratio
view.sort_current = main,greater=d.get_ratio=
view.sort_new = main,less=d.get_ratio=
view.sort = main

# Sort the seeding view by the upload rate and only show torrents with peers
view.sort_current = seeding,greater=d.get_up_rate=
view.filter = seeding,"and=d.get_complete=,d.get_peers_connected="
view.sort_new = seeding,less=d.get_up_rate=
view.sort = seeding

# Sort the leeching view by name
view.sort_current = leeching,greater=d.get_name=
view.sort_new = leeching,greater=d.get_name=
view.sort = leeching

# Filter the active view by connected peers
view.sort_current = active,less=d.get_name=
view.sort_new = leeching,less=d.get_name=
view.filter = active,d.get_peers_connected=
view.sort = active

schedule = sort_main,11,5,view.sort=main
schedule = sort_seeding,12,5,view.sort=seeding
schedule = sort_leeching,13,5,view.sort=leeching
schedule = sort_active,14,5,view.sort=active

# Enable DHT support for trackerless torrents or when all trackers are down.
# May be set to "disable" (completely disable DHT), "off" (do not start DHT),
# "auto" (start and stop DHT as needed), or "on" (start DHT immediately).
# The default is "off". For DHT to work, a session directory must be defined.
# 
#dht = auto

# UDP port to use for DHT. 
# 
#dht_port = 6881

# Enable peer exchange (for torrents not marked private)
#
#peer_exchange = yes

Ici ce qui est important ici :

#Où sont mis les fichiers de téléchargement temporaires
directory = /mnt/freebox/Téléchargements/
#Le répertoire où l'on surveille l'ajour de fichiers .torrent
schedule = watch_directory,5,5,load_start="/mnt/freebox/Téléchargements/A\ Télécharger/*.torrent"
#Le dossier dans lequel les téléchargements terminés sont déplacés
system.method.set_key = event.download.finished,move_complete,"execute=mv,-n,$d.get_base_path=,\
/mnt/freebox/Téléchargements/Téléchargés;d.set_directory=/mnt/freebox/Téléchargements/Téléchargés"

Le lancer au démarrage 

Pour cela j'utilise le script /etc/rc.local (même si je crois que le faire avec cron est plus judicieux). Je lance rtorrent en tant qu'utilisateur toto qui a tous les droits d'écriture dont j'ai parlé plus haut.
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/bin/printf "         My IP address is\033[0;31m \
`/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{ print $2 }' | awk -F: '{ print $2 }'` \033[0m\n" > /dev/console

sleep 5

value=$(/bin/ip route|/bin/grep -c "default dev ppp0")
if [ $value -eq 1 ]
then
    /usr/bin/printf  "PPTP connection seems ok start rtorrent" > /dev/console
    /bin/su - toto -c "screen -d -m -S rtorrent rtorrent"
fi

exit 0

Le sleep est la car le rc.local démarre plus tôt que prévu. Le script rc.local étant exécuter avec l'option -e, ie il s'arrête dès qu'il rencontre une erreur, et pour lui, quand on attribue 0 à une valeur c'est une erreur.

Ainsi, si on n'attends pas que la connectionn pptp ne se lance, ici value=0, et le rc.local échoue !

Pour accéder par la suite a rtorrent (loggé en tant qu'utilisateur toto):
screen -r rtorrent

Utilisation du Raspberry comme un accès au serveur PPTP/VPN.

C'est utile si comme moi vous avez une connection free, vous pouvez alors utiliser la connection si vous souffrez à regarder des vidéos pixelisées sur youtube. Pour celà la raspberry va faire office de proxy qui lui se connecte par le serveur distant pour accéder à internet.

J'utilise squid comme proxy:

sudo apt-get install squid

Dans /etc/squid/squid.conf j'ai modifié ces valeurs.

http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
http_port 3456

Désormais il me suffit juste d'activer le proxy sur Firefox ou mon network manager.


Petits plus

Si vous voulez surveiller la temperature du raspberry :

cat /sys/class/thermal/thermal_zone0/temp

Si vous voulez voir quelle est la fréquence maximale (sur demande) à laquelle le système tourne :

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

Par défault le système n'est pas à 1GHz, il est entre 600 et 900 MHz (sans aucun paramètre dans /boot/config.txt). Le fontionnement à 1 GHz est considéré comme un surcadençage de l'horloge, alors que le système est vendu à 1GHz... Il doit êtreprudent de rajouter un dissipateur thermique.

Si vous voulez débloquer les fonctions matérielles pour décoder des flux vidéos vous avez à acheter des codes sur http://www.raspberrypi.com/

SI vous souhaitez une horloge temps réel pour garder l'heure vous pouvez la réaliser vous même, ou bien la commander : lien.

jeudi 14 janvier 2016

Disques vinyle

J'avais choisi d'étudier les disques vinyle dans le cadre de mon TIPE. Cette année le thème était mobilité et mouvement (2011).

Les disques vinyle ont été remplacés à l'arrivée du Compact Disc (CD) audio dans les années 1980 ; leur utilisation est désormais réduite à certains audiophiles et collectionneurs. Cependant, ce support connaît un regain d'intérêt dans notre ère numérique. C'est un objet qui attire l'œil et j'ai été intrigué la première fois que j'en ai vus dans un vide grenier. C'est ainsi que j'ai commencé à en utiliser en me procurant des disques d'occasion à faire tourner sur la vieille platine de la famille. Ayant pris conscience de l'existence d'un débat CD audio contre vinyle, j'ai voulu me forger ma propre opinion. J'ai donc profité de la compatibilité avec le thème de cette année pour comprendre leur fonctionnement. J'ai vite découvert que le système de lecture n'était pas aussi simple qu'un cône que l'on fait vibrer à l'aide d'une aiguille. C'est un système fragile et s'il n'est pas bien réglé, en plus de l'augmentation de la distorsion, on accélère la détérioration du support. Comment le son est-il stocké, puis lu ? Le support est-il aussi parfait que certains le prétendent ?

Le dossier et les médias


Pour la recherche d'information au sujet il a fallu faire la part des choses entre le vrai et le faux. J'ai surtout rencontré des amateurs qui, pour leur recherche personnelle, ont récupéré des formules de calcul issus de travaux d'ingénieurs. Pour me préparer à  l'étude d'une platine de lecture, j'ai essayé de mettre en exergue les erreurs de lecture à l'aide d'une modélisation et j'ai pu mettre un nom sur ces problèmes par la suite. Il ne me manquait plus qu'à retrouver expérimentalement les effets que j'avais prédis. J'ai donc pu trouver une platine générique aux caractéristiques limitées pour la réalisation de l'expérience (aucun des problèmes identifiés n'était absent). Ces recherches m'ont permis de conclure sur les limitations du système de lecture et du support physique.