Compiler CyanogenMod pour un HTC Desire

Voici les étapes à suivre pour compiler la version Gingerbread de CyanogenMod pour le HTC Desire sous une Ubuntu 10.04 toute fraiche.

Prérequis

Installer les packages

Il faut dans un premier temps installer les paquets suivants :
sudo apt-get git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev sun-java6-jdk pngcrush schedtool

Puis si c’est une distribution 64 bits il faut aussi :
sudo apt-get install g++-multilib lib32z1-dev lib32ncurses5-dev lib32readline5-dev gcc-4.3-multilib g++-4.3-multilib

Créer les répertoires

Pour l’environnement de développement :
mkdir -p ~/bin
mkdir -p ~/android/system

Installer le dépôt

Il faut télécharger le binaire repo :
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo

Redémarrer pour que les modifications prennent effet.

Pour initialiser le dépôt :
cd ~/android/system/
repo init -u git://github.com/CyanogenMod/android.git -b gingerbread
repo sync -j16

Cela peut prendre pas mal de temps (même plusieurs heures)

Copier les fichier propriétaires

Pour cela on télécharge les fichiers du GIT de Kali-
cd ~
git clone https://github.com/Kali-/proprietary_vendor_htc.git -b gingerbread
mkdir -p ~/android/system/vendor/htc/bravo
cp -rf ~/proprietary_vendor_htc/bravo/* ~/android/system/vendor/htc/bravo/

Télécharger RomManager

A effectuer à chaque mise à jour de RomManager :
~/android/system/vendor/cyanogen/get-rommanager

Compiler CyanogenMod

Mettre à jour le dépôt

cd ~/android/system/
repo sync

Compiler

. build/envsetup.sh && brunch bravo

Installation

Copier le fichier ~/android/system/out/target/product/bravo/update.cm-XXXXX-signed.zip à la racine de la carte SD.

Source sur le wiki CyanogenMod

Installation d’un régulateur de vitesse sur un Fiat Scudo 2.0 JTD RHK

Attention, c’est une manipulation délicate, qui peut rendre inopérante votre véhicule si le mauvais calculateur est sélectionné ! Ce n’est que la méthode utilisé sur un de mes véhicules.

Pour effectuer l’opération il faut :
– un comodo pour le régulateur/limiteur de vitesse (Qui est le même sur les Fiat Scudo, Peugeot Expert et Citroën Jumpy)
– une interface Peugeot/Citroën PSA XS Evolution (avec diagbox)

Dans un premier temps, installer le comodo à son emplacement.

Une fois l’opération effectuée, brancher l’ordinateur pourvu de l’interface PSA XS Evolution et du logiciel DiagBox (testé en version 6.05)

La marche à suivre est la suivante :
Sélectionner Peugeot
Expert
Expert 3
Vérifier que le code VIN est bien le bon et Valider.
Cliquer sur DiagBox puis Réparations et patienter pendant la détections des composants… Puis Valider

Il faut maintenant valider la régulation (et limitation si vous l’avez) dans le calculateur Injection/allumage ainsi que le Boîtier de servitude intelligent(BSI).

Injection/allumage

Pour le premier, dans notre cas, le calculateur n’est pas correctement reconnu, on sélectionne donc Injection/allumage | Calculateur inconnu puis on Valide
On clique ensuite sur HDI_SID803A puis HDI_SID803A RHK qui correspond dans notre cas au calculateur du Scudo 2.0 JTD.
Puis Télédécodage et Télédécodage Manuel.
Il faut cliquer sur Limitation de vitesse véhicule (LVV) puis Valider et sélectionner Présent et enfin cliquer sur Actionner qui demandera de couper et remettre le contact pour activer la fonction.
Faire de même avec Régulation de vitesse véhicule (RVV2)

Boîtier de servitude intelligent(BSI)

Une fois ces opérations effectuées, le calculateur d’injection est pret, il ne reste plus qu’à retourner au menu de test global grâce à la flêche de retour en bas à gauche pour enfin sélectionner le BSI puis
Télédécodage
Télédécodage Manuel
Configuration du véhicule
Aide à la conduite
et enfin cliquer sur Présence et type de régulation de vitesse véhicule et Valider pour sélectionner le type de régulateur, dans notre cas Régulation et limitation de vitesse et enfin Actionner.

Voilà, le véhicule bénéficie d’un régulateur/limiteur de vitesse. Pour une version optimale il faut aussi changer l’accélérateur pour pouvoir débloquer le limiteur en cas d’appuis fort dessus.

Modifier le Splash Screen sur un HTC Desire

Il est possible de changer le premier écran de démarrage d’un téléphone HTC sous Android, pour cela il faut qu’il soit S-OFF, ce qui fut effectué grâce au soft d’AlphaRev.

Pour effectuer cette opération les logiciels nbimg ainsi que fastboot sont nécessaires.

On commence par créé une image de 800 par 480 avec GIMP puis on l’enregistre ensuite en BMP 24 Bits et convertit l’image dans le format splash screen HTC avec la commande suivante :
nbimg -F desire_splash1.bmp -w 480 -h 800
et renomme ensuite le fichier obtenu en .img.

Il ne reste plus qu’à redémarrer le téléphone en mode recovery (touche vol- et power en même temps) puis sélectionner fastboot et le brancher en usb.

Et enfin lancer fastboot sur le PC pour flasher l’image sur la partition splash1
sudo fastboot flash splash1 desire_splash1.img

Une fois ceci effectué, redémarrer le téléphone et apprécier la nouvelle image de boot.

Dictionnaires pour Firefox, Thunderbird et LibreOffice

Il est possible d’ajouter des dictionnaires dans différents logiciels libres grâce au site http://www.dicollecte.org/

Pour Firefox et Thunderbird l’extension de correction orthographique est disponible ici : https://addons.mozilla.org/fr/firefox/addon/dictionnaires-français/

Pour LibreOffice (et sûrement OpenOffice) l’extension pour la correction orthographique est téléchargeable sur le site suivant : http://extensions.libreoffice.org/extension-center/dictionnaires-francais
et l’extension pour la correction grammaticale ici : http://www.dicollecte.org/grammalecte/telecharger.php

Réparer une clé usb non reconnue

J’avais une clé usb PNY Micro Attaché City de 8Go qui n’était plus détectée en mass storage, le composant USB était détecté mais pas la mémoire Flash.

J’ai donc lancé ChipGenius et vu que le composant était un UT163, j’ai ensuite téléchargé le logiciel USBest UT163 qui a détecté la clé mais pas le firmware ni la mémoire, j’avais une erreur code:0x54 qui est le manque de firmware sur la clé.

Je me suis alors tourné vers le logiciel Super Stick Recovery Tool qui lui a détecté la clé et l’a réparée et formatée. Le chip détecté est maintenant un UT165, je ne sais pas pourquoi, mais le fait est que maintenant la clé est détectée et je peux de nouveau copier des données dessus.

Une grande partie des logiciels sont disponibles sur le site flashboot.ru ou usbdev.ru

Récupérer les adresses IP, Mac, passerelles sous linux en C

Voici un exemple de programme en C qui permet de récupérer différents paramètres réseau, ce n’est pas encore l’idéal mais ça a le mérite de marcher, d’être simple et assez lisible.

Pour cela je me suis inspiré de ce que me donne un strace ifconfig pour les adresses IP, Mac, le masque réseau ainsi que le broadcast.

Pour la passerelle (ou gateway) j’ai utilisé le retour de la commande netstat -rn, qui est équivalent à la commande route -en, puis grep ^0.0.0.0 qui permet de sélectionner la ligne commençant par 0.0.0.0 (qui est la route par défaut), et enfin awk -F ' ' '{print $2}' permet d’isoler le résultat avec le séparateur espace et de prendre le second résultat.

#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <net/route.h>
#include <netinet/in.h>
#include <sys/ioctl.h>

int main(int argc, char* argv[])
{
	int socketd;
	char IPAddr[16];
	char Netmask[16];
	char Broadcast[16];
	char MacAddr[13];
    char Route[16];
	struct ifreq ifr;

	socketd = socket(AF_INET, SOCK_DGRAM, 0);
	if (socketd <= 0)
	{
		perror("socket");
		return -1;
	}
	
	IPAddr[0]=0;
	Netmask[0]=0;
	Broadcast[0]=0;
	MacAddr[0]=0;
    Route[0]=0;

	strcpy(ifr.ifr_name, "eth0");

	if (0 == ioctl(socketd, SIOCGIFADDR, &ifr))
	{	
		strcpy(IPAddr,(char*) inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
	}

	if (0 == ioctl(socketd, SIOCGIFNETMASK, &ifr))
	{
		strcpy(Netmask,(char*) inet_ntoa(((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr));
	}

	if (0 == ioctl(socketd, SIOCGIFBRDADDR, &ifr))
	{
		strcpy(Broadcast,(char*) inet_ntoa(((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr));
	}

	if (0 == ioctl(socketd, SIOCGIFHWADDR, &ifr))
	{
		sprintf(MacAddr,"%02X%02X%02X%02X%02X%02X",(unsigned char)ifr.ifr_hwaddr.sa_data[0],(unsigned char)ifr.ifr_hwaddr.sa_data[1]
			,(unsigned char)ifr.ifr_hwaddr.sa_data[2],(unsigned char)ifr.ifr_hwaddr.sa_data[3]
			,(unsigned char)ifr.ifr_hwaddr.sa_data[4],(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
	}

	close(socketd);

  FILE *fic; 
  
  fic = popen("netstat -rn |grep ^0.0.0.0|awk -F ' ' '{print $2}'", "r");
  if(fic == NULL){
      printf("Impossible d'ouvrir le tube\n");
  }else
  {
    fgets(Route, 16, fic);
    pclose(fic);
  }
	printf("IP: %s\nNetmask: %s\nBroadcast: %s\nRoute: %s\nMac: %s\n", IPAddr, Netmask, Broadcast, Route, MacAddr);

}

Création d’un makefile simple

Voici un exemple de Makefile simple pour un client ayant du code en commun avec un autre programme serveur.
La compilation peut être faite avec la commande
make ou si vous voulez lier directement le cross-compilateur un make CROSS_COMPILE=/home/esver/travail/proj/toolchain/arm-none-linux-gnueabi-

#-------------------------------------------------------------------------------
#		User-modifiable options
#-------------------------------------------------------------------------------
# comment this line for cross compilation
COMPILE_FOR_HOST = true

CLIENT_APPLICATION = .
CLIENT_DRIVERS = ../drivers
PROJ_COMMON = ../../../Common
PROJ_COMMON_APPLICATION = $(PROJ_COMMON)/application
PROJ_COMMON_DRIVERS = $(PROJ_COMMON)/drivers

#for developpement test
PROJ_COPY_DIRECTORY = /tftpboot/rootfsC/root/

#name of the application
OUTPUT = Client

# Output directories
BIN = build/bin
OBJ = build/obj

#-------------------------------------------------------------------------------
#		Tools
#-------------------------------------------------------------------------------

# Tool suffix when cross-compiling
CROSS_COMPILE ?= arm-none-linux-gnueabi-

# Compilation tools
ifdef COMPILE_FOR_HOST
CC = gcc
else
CC = $(CROSS_COMPILE)gcc
endif

# Flags
INCLUDES = -I$(PROJ_COMMON_APPLICATION)/debug
INCLUDES += -I$(PROJ_COMMON_APPLICATION)/proj_data
INCLUDES += -I$(PROJ_COMMON_APPLICATION)/msg_queue
INCLUDES += -I$(CLIENT_DRIVERS)/driver_led

#-O2 optimisation, peut aussi etre -O3
#-g3 debug, a enlever pour un binaire plus petit et pour la prod
CFLAGS = -D_XOPEN_SOURCE=600 -O2 -g3 -Wall -c -std=c99 -c

ifdef COMPILE_FOR_HOST
CFLAGS += -DCOMPILE_FOR_HOST
endif

CFLAGS += $(INCLUDES)
LDFLAGS = -lpthread

#-------------------------------------------------------------------------------
#		Directories
#-------------------------------------------------------------------------------

VPATH = $(CLIENT_APPLICATION)/supervisor
VPATH += $(CLIENT_APPLICATION)/mesCom/mes_Tx
VPATH += $(CLIENT_APPLICATION)/mesCom/mes_Rx
VPATH += $(CLIENT_APPLICATION)/led_Flash
VPATH += $(CLIENT_APPLICATION)/utility
VPATH += $(CLIENT_DRIVERS)/driver_led
VPATH += $(PROJ_COMMON_APPLICATION)/msg_queue
VPATH += $(PROJ_COMMON_APPLICATION)/debug/

#-------------------------------------------------------------------------------
#		Files
#-------------------------------------------------------------------------------

PROJ_O = main.o msg_Inst.o
PROJ_O +=  thread_Mes_Tx.o
PROJ_O +=  thread_Mes_Rx.o
PROJ_O +=  thread_led_flash.o
PROJ_O +=  utility.o

PROJ_O +=  driver_led.o

PROJ_O +=  msg_queue.o
PROJ_O +=  debug.o

#-------------------------------------------------------------------------------
#		Rules
#-------------------------------------------------------------------------------

all: $(BIN) $(OBJ) $(OUTPUT) copy

#create binary directory
$(BIN) $(OBJ):
	@echo 'Create $@ directory'
	@mkdir -p $@

#create the charger binary
$(OUTPUT): $(PROJ_O)
	@echo 'Generate the binary $@'
	@$(CC) $(LDFLAGS) -o $(BIN)/$@ $(OBJ)/*.o

#create the charger objects
%.o: %.c
	@echo 'Compiling objects $@'
	@$(CC) $(CFLAGS) -o $(OBJ)/$@ $^

#copy the binary in a directory (tftpboot for example)
copy:
ifndef COMPILE_FOR_HOST
	@echo 'Copying the files in $(OPERA_COPY_DIRECTORY)'
	@cp $(BIN)/$(OUTPUT) $(OPERA_COPY_DIRECTORY)
endif

clean:
	@echo 'Remove $(PROJ_O) $(BIN)/$(OUTPUT)'
	@-rm -f $(OBJ)/*.o $(BIN)/$(OUTPUT)

Fonction de débug en couleur basée sur printf

Voici une petite fonction que j’utilise lorsque je développe en C sous linux, elle s’appelle de la même façon que printf, la seule différence est que l’affichage dans la console se fait en couleur, et ceci grâce aux « ANSI escape code » et plus précisément aux paramètres Select Graphic Rendition (SGR) :

#include <stdio.h>
#include <stdarg.h>

void esver_debug_red(const char *format, ...)
{
    char buffer[256];
    va_list args;
    va_start (args, format);
    vsnprintf (buffer, sizeof(buffer), format, args);
    printf("\x1B[31m%s\x1B[0m", buffer);
    va_end (args);
}

Cette fonction passe la couleur du texte en rouge, affiche le texte demandé puis repasse à la couleur classique du terminal.

Petites explication sur les couleurs SGR grâce à la chaine %c[31m ;
dans notre exemple nous commençons par afficher le caractère hexa 0x1B qui correspond en ascii au caractère Echap suivit d’un crochet ouvrant.
Vient ensuite la couleur du texte, dans notre cas 31 qui est la couleur rouge.

D’autres couleurs sont possibles pour le texte :
30 Noir
31 Rouge
32 Vert
33 Jaune
34 Bleu
35 Magenta
36 Cyan
37 Blanc
39 Couleur par défaut

On peut aussi rajouter un point virgule et ensuite le code couleur du fond du texte (non présent dans notre cas ) :
40 Noir
41 Rouge
42 Vert
43 Jaune
44 Bleu
45 Magenta
46 Cyan
47 Blanc
49 Couleur par défaut

D’autres options sont disponibles, toujours à séparer par un point virgule :
0 Reset
1 Lumineux ou gras
2 Faible
4 Souligné
7 Image négative
9 Barré

Et il faut ensuite finir par le caractère m qui ferme cette balise couleur.

Et voilà, une belle fonction de débug toute colorisée.

Pour plus d’informations il faut aller sur la page wikipedia des ANSI escape code.

PS: la même fonction est aussi possible en shell avec une commande du type :

echo -e "\x1b[31mVotre texte\x1b[0m"

Mettre un site web en maintenance

Voici une petite astuce toute simple qui permet de mettre son site en maintenance, lorsque l’on met à jours sa version de WordPress par exemple. Cela permet de ne pas avoir un site bancal lors de la mise à jour, et aussi de ne pas offrir l’accès à des fichiers ou l’arborescence du site à tout le monde (surtout à des personnes mal intentionnées).

Il suffit de mettre 2 fichiers sur son serveur :
– un fichier html maintenance.html qui contiendra un petit message explicatif pour les visiteurs du site.
– un fichier .htaccess redirigeant tout le site (sauf votre IP pour vos tests) vers la page de maintenance.
Le contenu du fichier .htaccess sera le suivant :

ErrorDocument 403 /maintenance.html
allow from VOTRE.ADRESSE.IP
deny from all
<Files maintenance.html>
allow from all
</Files>

Configuration de VirtualBox avec l’interface phpVirtualBox

Pour installer VirtualBox sur un serveur dédié sous ubuntu 10.04 il faut tout d’abord ajouter le dépot au fichier /etc/apt/sources.list :
deb http://download.virtualbox.org/virtualbox/debian lucid contrib
Et ensuite installer les clés du dépot :
$ wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
Mettre à jour la liste des paquets
$ sudo apt-get update
Et installer VirtualBox ainsi que php5 pour apache2 :
$ sudo apt-get install virtualbox-4.0 libapache2-mod-php5

Il faut ensuite créer le fichier /etc/vbox/vbox.cfg et y ajouter une ligne contenant
VBOXWEB_USER=l_utilisateur_de_virtualbox

Passons ensuite à l’installation de l’interface graphique en php grâce à phpVirtualBox :
$ cd /var/www/
$ sudo wget "http://sourceforge.net/projects/phpvirtualbox/files/Older versions/phpvirtualbox-4.0-7.zip"
$ sudo unzip phpvirtualbox-4.0-7.zip
$ cd phpvirtualbox-4.0-7

Il faut modifier le fichier config.php en y modifiant les lignes
var $username = 'votre_login';
var $password = 'votre_mot_de_passe';
var $language = 'fr_fr';
var $consoleHost = 'adresse_ip_du_server';

Il ne reste ensuite plus qu’à télécharger et installer le pack d’extension propriétaire d’Oracle pour VirtualBox :

$ wget http://download.virtualbox.org/virtualbox/4.0.2/Oracle_VM_VirtualBox_Extension_Pack-4.0.2-69518.vbox-extpack
$ sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.0.2-69518.vbox-extpack

Et voilà, vous avez VirtualBox fonctionnel accessible sur http://adresse_ip_du_server/phpvirtualbox-4.0-7

Si plus tard vous voulez mettre à jour le pack d’extension propriétaire d’Oracle il suffit de faire :
$ sudo VBoxManage extpack uninstall "Oracle VM VirtualBox Extension Pack"
$ sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.0.10-72436.vbox-extpack