jeudi 27 mai 2010

Un peu de mécanique

tableauPoint de moteurs ou d'arbre à  cames ici, ce qu'on appelle mécanique dans le monde du hardware concerne toutes les pièces qui ne sont pas électroniques. Par exemple les boitiers, la face avant d'une carte, le chà¢ssis ... Et dans notre cas, une baie 19' fait maison.

Quand j'ai fait l'électricité dans notre maison, j'ai décidé de faire en même temps un cà¢blage basse tension complet. Il peut servir à  tout ce que je veux, ethernet bien sur, mais aussi téléphone, capteurs déportés, liaisons séries etc... L'idée était donc de banaliser tout cela en cà¢ble ethernet et prises RJ45, le tout revenant vers la GTL en une armoire de brassage. Celle-ci doit regrouper les platines de brassage, un switch ethernet, le répartiteur téléphonique et les équipements communicants. On peut alors affecter une prise à  une fonction simplement en la brassant vers l'équipement adéquat.

Au vu de la quantité de prises prévues[1] le mieux était de s'orienter vers du matériel professionnel en 19'[2]. Mais une baie 19' prend beaucoup trop de place et coute 1 bras. J'ai donc décidé de faire cela sur mesure.

Le matériau de base se trouve partout : des cornières perforées prévues pour monter des étagères métalliques. On choisira le modèle avec des trous larges permettant de s'adapter facilement à  l'entraxe des équipements 19'. Dans mon cas, deux cornières furent suffisantes. Il suffit alors de découper aux dimensions voulues, ici du 4U : 2 platines 1U, un switch 1U et un dernier U pour des équipements actifs.

Un petit montage à  blanc :

montage à  blanc

et on peut passer à  l'installation. Chaque morceau en contact avec le mur est solidement fixé. Il ne s'agit pas que tout tombe[3] ! Les cornières sont reliées par des boulons et les coins sont renforcés par des équerres métalliques prévues pour. le cadre est bien entendu relié à  la barrette de terre.

Emplacement prévu On fixe bien au mur Ecrous/boulons plus renforts de coin Et hop avec les platines RJ45

Si la construction de la baie n'a durée qu'une nuit, le cà¢blage des platines s'est déroulé sur plusieurs mois au fur et à  mesure des besoins. Sur la photo finish on retrouve tous les composants du schéma ci-dessus :

  • platines de brassage à  gauche
  • switch netgear en bleu
  • répartiteurs téléphone fixe et adsl en haut
  • box adsl[4]
  • le DTI (beige tout en haut)

et scotché sur la porte les plans qui permettent de retrouver toutes les prises :)

pas fini mais déjà  en service état actuel

Voila, et pour le fun, une dernière photo de la GTL avant cà¢blage :)

Notes

[1] 33

[2] pas trop cher sur ebay

[3] et comme tout bon bricoleur du dimanche, je blinde!

[4] je vous laisse deviner le FAI :)


Commentaires du post original

vendredi 14 mai 2010

Liaison série : RS232 vs TTL

Un petit article pour rappeler quelques bases, ça ne fait jamais de mal. Outre les niveaux de voltage tension, il existe une autre différence de taille entre le RS232 et le TTL, la représentation des 0 et des 1 ! Tout le monde le sait[1]. Mais habitués que nous sommes à  utiliser des MAX232 & co[2], quand il s'agit de manipuler les signaux, il arrive qu'on mette du temps à  s'en souvenir[3]. Vous l'aurez compris, cela m'est arrivé récemment :) Donc petit rappel.

La liaison série RS232 utilise pour représenter le 1 un niveau compris entre -3V et -25V et pour le 0 entre +3V et +25V. Généralement en sortie de nos PC on trouve -12V et +12V.

En TTL par contre le 0 est représenté par une tension entre 0 et 0.7V alors que le 1 est entre 2.2V et 5V.

La conversion ne se borne donc pas à  ramener les -12/+12 vers 0V et 5V, il faut aussi inverser les signaux[4] !

Preuve par l'exemple, voici un port série de PC branché sur un MAX3235 le tout relié à  un oscillo.

montage

En rouge, channel 1, une sonde x10 sur le fil 3 de la DB9, Tx du RS232 donc. En bleu, channel 2, une sonde x10 sur la patte 1 du max3235 soit Rx en TTL. Du PC, on envoi 2 caractères C en 9600-8N1. Nous sortons à  l'oscillo la jolie trace suivante : trace

  • En Idle la ligne est à  1, -10V en RS232 et +5V en TTL
  • le bit de start S passe à  0
  • les 8 bits de données pour C, caractère ascii 0x43 soit b01000011, sachant que le LSB est transmit en 1er
  • le bit de stop S' à  1
  • le caractère suivant ...

Voila, voila, du très simple, la base, mais si cela permet à  quelqu'un d'éviter de perdre autant de temps que moi, c'est déjà  cela de gagné :)

Aller et pour essayer de donner un peu de contenu à  cet article, j'ai trouvé des vidéos sur l'utilisation de l'oscilloscope très bien faites. C'est chez BTCinstrumentation.

Notes

[1] ou au moins l'a su

[2] on préfèrera les nouveaux modèles sans capa externes !

[3] surtout la nuit

[4] youhou, coucou la NAND


Commentaires du post original

mardi 9 février 2010

Don de livres

Il y a quelques temps, j'ai récupéré dans une poubelle au boulot des livres techniques (comment peut-on jeter des livres !!!) Malheureusement le besoin de place se fait cruellement sentir sur mes étagères et il faut donc m'en débarrasser :(

Ce sont principalement des manuels de référence hardware pour i386, i486, PowerPC divers ... La liste complète. Voir aussi le thread sur fr.comp.ordinosaures

A prendre en main propre dans le 22, ou par la poste contre FdP. J'ai mis le poids approximatif à  côté de chaque livre pour pouvoir estimer les frais.

Je peux scanner les tables des matières à  la demande.

A vot' bon cœur


Commentaires du post original

Éditer des fichiers XML en ligne de commande : xmlstarlet

Présentation

XML!!!!

De nos jours, nous sommes cernés de fichiers XML. Ils sont présents partout que ce soit pour les préférences des applications (gconf pour Gnome) les fichiers en rapport avec les GPS (GPX, KML), les descriptions d'interface graphiques (Qt UI, GTK Glade, Mozilla XUL), les documents (OpenOffice ODF Microsoft OOXML) etc... La liste serait sans fin.

Je ne rentrerai pas ici dans les considérations polémiques sur le bien fondé de ces choix, mais les faits sont la : nous devons faire avec. Il est relativement facile d'écrire une application capable de travailler avec ces fichiers, les langages de haut niveau proposent tous des API dédiées plus ou moins simples. Même en C la libxml2 rend cela relativement facile.

Mais la complication vient lorsque l'on veux travailler en shell. La ou des fichiers à  plat étaient faciles à  utiliser avec sed/grep/awk et quelques regex bien senties, le XML est une horreur sans nom. Sortir le Python ou le Perl n'est pas toujours possible (disponibilité sur la plateforme, versions datant de Mathusalem ...). Dans ces moments, on se rabat souvent sur bash[1]. Et c'est la que xmlstarlet va vous venir en aide. Il s'agit d'un programme en ligne de commande qui va se charger du parsing XML et vous permettre de lire et modifier facilement[2] vos fichiers.

Installation

xmlstarlet devrait être disponible dans toutes les bonnes crémeries[3].

Par exemple pour ArchLinux, il est dans AUR

yaourt -S xmlstarlet

Ou bien pour debian et dérivées

aptitude install xmlstarlet

Sinon, il est fourni dans une version portable compilée statiquement avec la libxml2 et la libxslt. Téléchargez le rpm xmlstarlet-1.0.1-1.i586.rpm sur SourceForge. Il suffit alors de le décompresser dans un répertoire temporaire avec la commande[4] :

rpm2cpio xmlstarlet-1.0.1-1.i586.rpm | cpio -idmv

et de récupérer le binaire présent dans ./usr/bin/xml

Utilisation

hello

Nous allons nous contenter de lire et de modifier des valeurs et des attributs. Pour une utilisation plus avancée, allez lire la documentation.

Comme exemple, nous allons utiliser un fichier UI de Qt très simple. Une boà®te de dialogue avec un bouton sans layout ni rien.

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="text">
    <string>Hello</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Lecture

Commençons par regarder la structure :

$ xml el hello.ui
ui
ui/class
ui/widget
ui/widget/property
ui/widget/property/string
ui/widget/widget
ui/widget/widget/property
ui/widget/widget/property/string
ui/resources
ui/connections

Nous retrouvons ici tous les champs de notre fichier XML. Ce sont ces chaines de caractères qui vont nous permettre d'accéder aux valeurs à  lire et modifier.

On peut aussi regarder les paramètres '-a' et '-v' qui donnent plus d'infos sur la structure. (attributs et valeurs). Par exemple pour le bouton :

$ xml el -v hello.ui
...
ui/widget/widget[@class='QPushButton' and @name='pushButton']
ui/widget/widget/property[@name='text']
ui/widget/widget/property/string

Maintenant, si nous voulons voir le texte du bouton, on va utiliser la commande 'sel' :

$ xml sel -t -v "/ui/widget/widget/property/string" hello.ui
Hello
  • sel: pour selectionner un chemin (xpath)
  • -t: requête dans le document
  • -v: on veux la valeur
  • /ui/widget/widget/property/string : c'est le chemin que nous cherchons.

Alors bien sur ici, nous n'avons qu'un seul bouton. Mais il faut pouvoir caractériser plus finement a chaine recherchée. C'est à  dire la property text du widget dont le nom est pushButton. Cela donne donc :

$ xml sel -t -v "/ui/widget/widget[@name='pushButton']/property[@name='text']/string" hello.ui
Hello
  • widget[@name='pushButton'] nous permet de dire que l'on cherche le widget dont l'attribut name est pushButton
  • idem pour property[@name='text']

On peut aussi chercher les valeurs des attributs. Quelle est la classe de ma fenêtre principale ?

$ xml sel -t -v "/ui/widget/@class" hello.ui
QDialog
  • @class: nous cherchons l'attribut class de widget

Modification

Maintenant, nous allons utiliser la commande 'ed' pour modifier notre fichier XML.

$ xml ed -u "/ui/widget/widget[@name='pushButton']/property[@name='text']/string" -v GoodBye hello.ui
...
      <property name="text">
        <string>GoodBye</string>
      </property>
...
  • -u: update
  • -v: nouvelle valeur

De même pour changer un attribut, par exemple, le nom de notre bouton :

$ xml ed -u "/ui/widget/widget[@name='pushButton']/@name" -v btn hello.ui
...
    <widget class="QPushButton" name="btn">

Voyez aussi les options :

  • -i: pour insérer un élément
  • -d: pour effacer un élément
  • ...

Voila, avec ces quelques commandes simple, on peut déjà  sortir quelque chose de ces fichiers XML à  partir d'un petit scrip shell. xmlstarlet permet d'en faire beaucoup plus, je vous renvoi donc une nouvelle fois vers la documentation

Notes

[1] ou pire csh :(

[2] enfin, relativement, on parle quand même d'XML la !

[3] votre gestionnaire de paquet favoris

[4] Sous ArchLinux, il existe un script rpmextract.sh qui fait le boulot


Commentaires du post original

vendredi 4 décembre 2009

gcal : Éphémérides solaires

sunrise De nombreux sites existent permettant de trouver les heures de lever et de coucher du soleil. De même en cherchant 30s on trouve très facilement les calculs nous permettant de ré-implémenter l'algorithme. Mais plutôt que de réinventer la roue, nous allons utiliser le méconnu gcal pour trouver les heures cherchées. En fait, gcal n'est pas si méconnu que cela, mais on s'arrête souvent à  sa 1ère fonction : afficher un calendrier.

$ gcal

Décembre 2009

Lundi          7 14 21 28
Mardi       1  8 15 22 29
Mercredi    2  9 16 23 30
Jeudi       3 10 17 24 31
Vendredi    4 11 18 25
Samedi      5 12 19 26
Dimanche    6 13 20 27

Voir pour les plus courageux, calculer les jours de fête de l'an prochain :

$ gcal -qfr --holiday-list 2010
...
Liste permanente des jours de fête:       L'année 2010 N'EST PAS une année bissextile.

Jour de l'An (FR)                        + Ve,   1 Jan 2010
Quinquagesima Sunday (FR)                - Di,  14 Fé 2010
Vendredi Saint (FR)                      * Ve,   2 Avr 2010
Dimanche de Pà¢ques (FR)                 + Di,   4 Avr 2010
Lundi de Pà¢ques (FR)                    + Lu,   5 Avr 2010
Fête du Travail (FR)                    + Sa,   1 May 2010
Jour de la Victoire (FR)                 + Sa,   8 May 2010
Ascension du Christ (FR)                 + Je,  13 May 2010
Dimanche de la Pentecôte (FR)           + Di,  23 May 2010
Lundi de la Pentecôte (FR)              + Lu,  24 May 2010
Fête Nationale (FR)                     + Me,  14 Jui 2010
Ascension de la Vierge (FR)              + Di,  15 Aoà»t 2010
Toussaint (FR)                           + Lu,   1 Nov 2010
Jour de l'Armistice (FR)                 + Je,  11 Nov 2010
Veille de Noà«l (FR)                     - Ve,  24 Dé 2010
Fête de Noà«l (FR)                      + Sa,  25 Dé 2010
Boxing Day (FR)                          * Di,  26 Dé 2010
Sylvester/New Year's Eve (FR)            - Ve,  31 Dé 2010

Or il est bien encore plus puissant que cela ! La preuve ? a quelle heure se couche le soleil à  Paris aujourd'hui ?

$ gcal -c -#'0*d1#999_%s4+485124+0022107,+01:'

Fixed date list:

Je,   3 Dé 2009: 16:53

ne fuyez pas :) nous allons détailler. konsole

  • -c : passer en mode date fixe. C'est un mode qui permet d'associer du texte à  une date indépendamment de l'année, du mois ... Ces dates/textes sont définies dans des fichiers de ressources avec une syntaxe particulière. Typiquement, le 14 juillet ou un anniversaire seront définit ainsi.
  • -# : va nous permettre de définir une date fixe sans passer par un fichier de ressource, mais directement sur la ligne de commande.
  • 0*d1#999 : la, c'est la partie peu claire. normalement, ici on définit la date fixe suivant ce format. mais nous sommes dans un cas particulier, nous voulons que cette ligne de texte soit valable pour tous les jours de l'année (le soleil se couche tous les jours ![1]). Pour cela il faut utiliser cette chaine de caractères.
  • _ : cet underscore représente un espace séparateur entre la date et le texte associé
  • %s4+485124+0022107,+01: : voici la magie, cette chaine dit à  gcal de calculer des données en rapport avec le soleil :
    • s : coucher de soleil (o pour le lever)
    • 4 : calcul à  réaliser. Ici quand le centre du soleil passe à  34'[2] sous l'horizon et disparait. la réfraction est prise en compte.
    • +485124+0022107 : les coordonnées géographiques de Paris au format ISO 6709:1983 (voir aussi) soit :
      • +485124 : 48°51'24' N
      • +0022107 : 2°21'07'' E[3]
    • ,+01: : le décalage horaire par rapport à  l'UTC pour l'avoir en heure locale[4]

Et voila ! Vous voyez ce n'est pas si compliqué[5] !

Maintenant, on peut varier un peu les plaisirs :

$ C='+4844-0032715' # Lannion
$ TZ=$(date +%:z)
$ gcal %20091204 -cQUx -#"0*d1#999_%o4${C},${TZ}__-_%s4${C},${TZ}"
08:51 - 17:17

Demain, à  Lannion, le soleil sera visible de 8h51 à  17h17.

Ah oui, les nouvelles options :

  • C='+4844-0032715' : une variable qui contient nos coordonnées, j'aime pas écrire deux fois la même chose
  • TZ=$(date +%:z) : une variable qui contient le décalage heure locale/UTC soit +01:00. man date pour plus d'infos[6]$
  • %20091204 : permet de fixer la date du calcul
  • Q : on supprime l'affichage des lignes blanches
  • U : on supprime l'affichage de la date

Si l'on continue, on peut avoir les heures de la lune : moon

$ gcal %20091204 -cQUx -#"0*d1#999_%(4${C},${TZ}__-_%)4${C},${TZ}"
19:38 - 11:07

Les phases de lune

$ gcal %20091225 -cQUx -#"0*d1#999_%Z" --moonimage-lines=10
(je laisse la surprise)

Et plein d'autre choses encore comme --limit, --atmosphere les calculs de distances, de biorythme ...

Pour finir quelques liens :

Notes

[1] on verra les pôles plus tard

[2] des minutes d'arc bien sur !!

[3] Les coordonnées viennent de Wikipedia

[4] heure d'hiver: UTC+1

[5] et puis c'est moi qui ai passé les heures dans la doc pour trouver tous ces détails :)

[6] A noter, --time-offset devrait faire la même chose, mais je n'ai pas réussit, si quelqu'un a une explication ...


Commentaires du post original

jeudi 4 décembre 2008

Alimentation de laboratoire pas chère

Quand on fait des petits montages électroniques, une alimentation de laboratoire deviens vite indispensable. Jouer avec des piles et des ponts diviseurs, ça va bien un temps mais cela deviens vite très lourd !

Par contre une vrai alim de labo coute vite des sous. Alors quitte à  mettre pas cher, autant mettre rien du tout[1] ! Avec un peu d'astuce, d'espièglerie c'est la vie... heu non. Un peu d'astuce et surtout un bon moteur de recherche peut transformer une vieille alim ATX qui prend la poussière en alim non réglable mais qui nous fournira les tensions les plus courantes[2].

Attention Même débranchée, de fortes tensions mortelles sont présentes dans une alim. Laissez les condensateurs se décharger plusieurs jours avant de l'ouvrir ! Et bien sur faites aussi une croix sur votre garantie :)

Je ne vais re-détailler ici tout le processus, de nombreuses pages existent déjà . Je me contente donc de vous renvoyer vers la page que j'ai principalement utilisée, très claire et détaillée ainsi que sur mon wiki ou j'ai regroupé plusieurs autres liens

Coté matériel, je n'ai eu à  acheter que la résistance de puissance à  4.30€, j'ai trouvé tout le reste dans les poubelles[3] ou dessoudé à  partir de vieux matos patiemment collecté et stocké. En temps de réalisation, vu mon taux d'occupation actuel, j'ai étalé sur plusieurs semaines, mais ça peut être torché en 2h.

Voici quelques photos commentées. Tout d'abord un petit plan[4] pour le placement Plan

L'essentiel positionné et soudé click La résistance doit être fixée en contact avec la carcasse métallique et dans le chemin du ventilateur pour assurer un bon refroidissement.

Le ventilateur étant particulièrement bruyant, j'ai ajouté un petit interrupteur pour choisir de l'alimenter en 5V (utilisation normale) ou de le repasser en 12V en cas d'utilisation prolongée ou particulièrement consommatrice. Il est soudé sur une plaque à  trous ce qui me permet de conserver le connecteur d'origine du ventilateur. Les alims sont repiqués sur les fiches bananes. Comme les LED, il est simplement fixé à  la super glue. click

Enfin, le produit fini :) click J'ai conservé les prises Molex pour pouvoir y brancher un disque ou un lecteur CD.

D'autres photos sont disponibles sur le wiki. N'oubliez pas d'isoler vos connections à  la gaine thermo ou au scotch d'électricien.

Notes

[1] ou presque

[2] et même du -/+ pour des amplis op.

[3] oui ça aide de travailler dans une boite qui fait du hard, et merci à  Jean-Pierre pour la LED jaune

[4] inkscape powered


Commentaires du post original

lundi 6 octobre 2008

Fonera 2 : Personnaliser, compiler, regénérer OpenWRT

OpenWRTNous allons voir dans cet article l'environnement de développement de OpenWRT (kamikaze). Étant un système embarqué, OpenWRT est souvent destiné à  fonctionner sur des architectures différentes de votre machine de bureau. Pour cela il faut mettre en place un environnement de cross-compilation permettant de compiler des binaires pour une architecture différente. Pour la Fonera, par exemple, il me faut générer des binaires MIPS à  partir d'une machine x86.

L'équipe d'OpenWRT propose plusieurs outils qui permettent de réaliser cette tà¢che, réputée compliquée, avec une facilité indécente. Nous allons passer en revue ces différents outils de manière à  trouver celui en adéquation avec chaque besoin. Tout au long nous prendrons en exemple la Fonera.

Selon ce que vous voulez faire, vous n'aurez pas besoin d'installer l'environnement complet de développement. Nous pouvons distinguer trois niveaux en fonction de la tà¢che :

  • ImageBuilder pour générer un firmware personnalisé ;
  • le SDK pour compiler de nouveaux paquets ;
  • BuildRoot qui est l'environnement complet.

Les deux premiers sont en fait des version allégées et adaptées du 3ème.

ImageBuilder

Avec ImageBuilder, nous allons pouvoir adapter la distribution OpenWRT à  nos besoins (le filesystem pour être précis). Typiquement pour ajouter des paquets non présents dans la version de base, en retirer, préparer une configuration spécifique ... Cet outil vient donc avec des versions binaires de tous les paquets standards.

Pour la Fonera et kamikaze 7.09, vous le téléchargez ici. Prenez le fichier ImageBuilder correspondant à  votre architecture de développement (i686 ou x86_64).

Pour ajouter un paquet :

$ cp /tmp/hello_1-1_mips.ipk packages/
$ make image PACKAGES="hello"

Pour ajouter des fichiers, construisez votre arborescence dans un répertoire (par exemple /tmp/files/etc/monfichier.conf)

$ make image FILES="/tmp/files"

et monfichier.conf sera ajouté au répertoire etc de votre image.

$ make help

vous explique tout cela.

Note: Il semble que les Profiles ne fonctionnent pas avec ImageBuilder.

SDK

GCC Le SDK va nous permettre de compiler de nouveaux paquets pour OpenWRT. Il inclu donc les binaires de compilation croisées (mips-linux-uclibc-gcc par exemple) qui vont vous permettre de générer des exécutables MIPS à  partir d'une machine PC. Nous pouvons donc l'utiliser pour générer des paquets existants avec une configuration différente voir créer carément de nouveaux paquets.

Vous le téléchargez au même endroit mais cette fois il s'agit du fichier SDK. De même décompressez le dans un répertoire de travail.

Deux erreurs ?

Avant d'aller plus loin, chez moi j'ai rencontré deux erreurs lors du make avec le SDK Kamikaze 7.09 pour Atheros.

$ make
/bin/sh: Syntax error: "&" unexpected
make: *** [world] Erreur 2

Bizarement celle-la se résoud en augmentant le niveau de verbosité :

$ make V=99

à  chaque fois que vous utilisez make

Deuxième erreur :

make: option requires an argument -- C
Usage: make [options] [target] ...
Options:
  -b, -m                      Ignored for compatibility.
  -B, --always-make           Unconditionally make all targets.
  -C DIRECTORY, --directory=DIRECTORY
                             Change to DIRECTORY before doing anything.
...

Il suffit de remplacer le ; par un . à  la ligne 79 du Makefile :

                      xargs -n1 $(MAKE) compile -C. \

Ce qui est étrange, c'est que je n'ai pas ces problèmes avec le BuildRoot.

Ajouter un paquet existant

Pour générer un paquet que vous n'avez pas, il vous suffit de copier le répertoire source dans package et de taper make à  la racine du SDK.

Avant de vous lancer dans la création d'un nouveau paquet, je vous invite à  aller voir si quelqu'un ne s'en ai pas déjà  chargé. Dans le cas contraire, suivez le guide ...

Hello world!

Pour commencer essayons de générer le fameux Hello world!. Positionnez vous dans le répertoire du SDK puis :

$ cd tmp
$ cat > hello.c
#include <stdio.h>
int main (int argc, char * argv)
{
   printf ("Hello world!\n");
   return 0;
}
^D

Compilons le et exécutons le sur la Fonera[1] :

$ ../staging_dir_mips/bin/mips-linux-uclibc-gcc hello.c -o hello -I../staging_dir_mips/include
$ scp hello root@fonera:/tmp
$ ssh root@fonera /tmp/hello
Hello world!

Construire un paquet

Paquet Bon, c'est bien joli, mais ça manque d'automatisation. Nous allons en faire un paquet. Créez les répertoires hello/src dans le dossier package du SDK et copiez y hello.c.

Voici donc les sources de notre paquet. Maintenant il faut créer un fichier de contrôle pour que le SDK sache comment générer et installer nos fichiers. Créons donc un fichier Makefile situé dans package/hello. Il doit contenir :

include $(TOPDIR)/rules.mk

PKG_NAME:=hello
PKG_RELEASE:=1
PKG_VERSION:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

include $(INCLUDE_DIR)/package.mk

define Package/hello
	SECTION:=utils
	CATEGORY:=Utilities
	TITLE:=hello
	DESCRIPTION:=The Hello World
endef

define Build/Compile
	mkdir -p $(PKG_BUILD_DIR)
	$(CP) ./src/* $(PKG_BUILD_DIR)/
	$(TARGET_CC) $(PKG_BUILD_DIR)/hello.c -o $(PKG_BUILD_DIR)/hello
	## $(MAKE) CC=$(TARGET_CC) -C $(PKG_BUILD_DIR)
endef

define Package/hello/install
	$(INSTALL_DIR) $(1)/usr/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/usr/bin
endef

$(eval $(call BuildPackage,hello))

Voyons rapidement la syntaxe : au début et dans la section Package/hello on renseigne des variables décrivant le paquet (nom, versions, description ...).

Dans la section Build/Compile, la manière de compiler les sources. Copie des fichiers dans le répertoire de compilation et appel du compilateur croisé (TARGET_CC). Notez aussi la ligne en commentaire qui servirait dans le cas ou on aurait un Makefile pour les sources.

Enfin viens la section Package/hello/install qui indique quels fichiers installer ou. Création de /usr/bin et copie de hello dedans.

Vous pouvez trouver une description plus détaillée du format de fichier dans la doc BuildRoot. Enfin, il faut signaler que le SDK est capable de télécharger automatiquement des sources[2] simplifiant encore le fichier de contrôle.

Je vous invite aussi à  aller voir les sources pour pleins d'exemples.

Une fois ceci fait, positionnez vous à  la racine du SDK et tapez simplement :

$ make

le SDK va détecter les nouveaux packages et lancer le processus de génération de ceux-ci. Une fois terminé, vous trouverez les fichiers .ipk dans bin/packages. Il ne vous reste plus qu'a le copier sur la Fonera pour l'installer.

$ scp bin/packages/hello_1-1_mips.ipk root@fonera:/tmp
$ ssh root@fonera
...
root@OpenWrt:~# ipkg install hello_1-1_mips.ipk
root@OpenWrt:~# hello
Hello world!

\o/ Youhou !

Vous trouverez ici les sources et binaires

Buildroot

TuXAlors la, c'est du lourd. L'environnement complet de développement, vous allez pouvoir tout recompiler et hacker le noyau comme des petits fous. :) Comme il s'agit d'un sur-ensemble des deux outils précédents, vous pouvez bien sur utiliser BuildRoot pour simplement compiler un package ou générer un filesystem perso. A noter qu'une très bonne documentation est disponible.

Génération

Pour récupérer le BuildRoot Kamikaze 7.09, faites simplement :

$ svn co https://svn.openwrt.org/openwrt/tags/kamikaze_7.09/

ou alors :

$ wget http://downloads.openwrt.org/kamikaze/7.09/kamikaze_7.09.tar.bz2 && tar xvjf kamikaze_7.09.tar.bz2

Les gentils dev d'OpenWRT nous ont concocté un joli menu pour configurer tout ceci :

$ make menuconfig

Vous pouvez alors choisir la cible, quelques options de configuration, les images à  générer et les paquets à  inclure dans votre image. Vous pouvez aussi reconstruire ImageBuilder et le SDK. Si vous voulez changer des options du noyau[3], utilisez :

$ make kernel_menuconfig

Pour la Fonera, choisissez Atheros [2.6] comme cible.

Enfin, il est temps de compiler/générer tout cela. tapez simplement :

$ make

et allez raconter 12 histoires à  vos enfants. Chez moi (Athlon XP 1600+) ça a mis 1h30. Toutes les sources nécessaires sont téléchargées, patchées, le compilateur croisé est construit ainsi que le noyau et le filesystem. A la fin, vous trouvez ce qui vous intéresse dans le répertoire bin.

$ ls bin/
openwrt-atheros-2.6-root.jffs2-128k  openwrt-atheros-2.6-vmlinux.elf
openwrt-atheros-2.6-root.jffs2-256k  openwrt-atheros-2.6-vmlinux.gz
openwrt-atheros-2.6-root.jffs2-64k   openwrt-atheros-2.6-vmlinux.lzma

Lors des prochains make seules les parties nécessaires seront reconstruites. En particulier le compilateur ne sera pas recompilé à  chaque fois. :)

A noter quelques autres répertoires intéressants :

  • build_mips : contient tout ce qui a été compilé et généré. En particulier build_mips/root le système de fichiers ;
  • staging_dir_mips : le cross-compiler ;
  • package : les sources des paquets (fichiers de contrôle, patchs ...) ;
  • dl : les sources téléchargées lors de la construction.

Packages

Pour ajouter votre propre package, procédez comme avec le SDK. Puis lors du menuconfig, sélectionnez le simplement.

menuconfig

Fichiers

Si vous voulez ajouter des fichiers à  cette image, créez un répertoire files. Par exemple pour changer la configuration réseau par défaut :

mkdir -p files/etc/config
cat > files/etc/config
## Attention, il manque lo !!
config interface lan
       option ifname   eth0
       option proto    dhcp
       option hostname fonera

Lors du prochain make, BuildRoot remplacera la configuration réseau de package/base_files par la votre.

Émulation MIPS

Qemu logo Autant vous prévenir tout de suite, il ne semble pas possible d'émuler votre Fonera, même si quelques travaux existent.

Par contre, il est possible de lancer un programme MIPS sur votre PC :

$ cd /data/OpenWrt/kamikaze_7.09/build_mips/
$ qemu-mips -L /data/OpenWrt/kamikaze_7.09/build_mips/root root/bin/busybox

avec le SDK et notre programme hello ci-dessus :

$ qemu-mips -L /data/OpenWrt/OpenWrt-SDK-atheros-2.6-for-Linux-i686/staging_dir_mips/ hello

Cela peut vous permettre de tester quelques commandes. Mais à  priori pour le kernel, il vous faudra flasher.

Visiblement il existe pleins d'émulateurs MIPS mais je n'ai pas eu le courage d'en tester d'autres.

Voila, nous sommes maintenant capables de

  • ajouter des fichiers et des paquets dans une image sans rien recompiler ;
  • compiler des programmes, des paquets et en faire de nouveaux ;
  • regénerer un OpenWrt complet noyau y compris.

Nous voila prêts pour de nouvelles aventures au prochain épisode, porter open2300 sur la Fonera et lui donner accès au port série.

Liens

La doc de WhiteRussian, plutôt obsolète.

La doc de Kamikaze :

  • Moteur de recherche de paquets ipkg

Notes

[1] on pourra aussi émuler, mais on verra ça plus tard

[2] par exemple sur sourceforge

[3] et voir de jolis oops :)


Commentaires du post original