Fonera 2.0 : Boom Boom Boom Boom, I want you in my room ! Let's spendthe night together ! From now until forever !

Un matin comme les autres… Sauf qu’il y a eu un petit détour par la poste, un colis m’attendait. Dans le colis… Une Fonera 2.0 devel, des stickers, des stylos… Matin bonheur !

Pas vraiment le temps de faire le tour, ce sera pour cette nuit. Juste quelques infos après connexion de la console série :

32 Mb de RAM
Contrôleur USB 2.0
pilotes usblp, usb-serial, usb mass storage….
connexion clef USB, montage, bonheur…

Aller, en attendant la nuit, quelques photos :

Ça va être chaud ce soir dans le leflab !

tic: symbol lookup error: tic: undefined symbol: _nc_check_termtype2

Oh, la belle erreur à la construction d’OpenWrt ! Après avoir creusé un peu il s’avère que le problème ne vient pas du tout d’OpenWrt ou du ncurses compilé mais d’un problème de version des outils ncurses du système hôte. Un petit coup d’apt-get install ncurses-base ncurses-bin ncurses-term et tout marche.

Si vous avez le même problème, mettez tout simplement votre système hôte à jour.

Papi ! Y'a trop de Fonera ! Je m'y retrouve plus !

Le monde commence à grouiller de Fonera et de modèle différent de Fonera. 1.0, 1.1, plus, 2.0…. Aaaahhhhhh. Bon, récapitulatif :

FON2100 aka La Fonera 1.0 :
Atheros AR2315 180MHz, 8MB/16MB, 1 Ether (blindage métal sur le PCB, connecteur console à 10 pins)
FON2200 aka La Fonera 1.1 :
Atheros AR2315 180MHz, 8MB/16MB, 1 Ether (pas de blindage sur le PCB, connecteur console à 4 pins)
FON2201 aka La Fonera+ :
Atheros AR2315 180MHz, 8MB/16MB, 2 Ether (switch Marvell 88E6060).
FON2202 aka La Fonera 2.0 :
Atheros AR2315 180MHz, 8MB/32MB, 2 Ether (switch Marvell 88E6060) + USB 2.0.

La Fonera 2.0 disponible en version développeur

Cela fait quelques jours que la nouvelle Fonera 2.0 est disponible dans la boutique fon. Elle ressemble à une Fonera+ avec quelques ajouts importants :
contrôleur USB 2.0
une led en plus pour l’USB

Martin Varsavsky, super boss de Fon, l’annonce plus ou moins clairement sur son blog. La Fonera 2.0 est ouverte et il invite les développeurs à participer et créer des applications en plus de celles déjà en cours de finalisation (File sharing, serveur d’impression, Scanner, Webcam, etc) : «As you can see this is just the beginning of a great toy that we are making together with you guys, let´s have FUN!».

Résultat : une communauté de développeurs, liés au projet OpenWrt, appelée Fonosfera : «The Fonera 2.0 will be an open platform for developers to build their applications on top of, much like a hacked iPhone is now».

Bref, que du bon on dirait. Les miennes sont commandées, ne reste qu’à attendre et regarder tout cela de plus près… Le checkout le SVN OpenWrt et je branche mon fer à souder, tic, tac, tic, tac…

En attendant on peut regarder la page qui va bien sur le Wiki OpenWrt.

Vas-y josette sort le crémant, y'a OpenWrt qui tourne sur la Fonera+

Oui, vous avez bien lu ! Le dernier snapshot d’OpenWrt (20080910) passe comme une lettre par la poste et je dois dire que c’est un vrai bonheur. Après download de l’image rootfs (openwrt-atheros-root.jffs2-64k) et du kernel (openwrt-atheros-vmlinux.lzma) on flash tranquillement tout ça comme d’habitude via RedBoot et un adaptateur console judicieusement connecté au port qui va bien.

Le démarrage est des plus classique :
+Ethernet eth0: MAC address 00:00:00:00:0:00
IP: 192.168.10.10/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.10.1

RedBoot(tm) bootstrap and debug environment [ROMRAM]
OpenWrt certified release, version 1.1 – built 22:32:28, May 7 2007
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.

Board: FON 2201
RAM: 0x80000000-0x81000000, [0x80040290-0x80fe1000] available
FLASH: 0xa8000000 – 0xa87f0000, 128 blocks of 0x00010000 bytes each.
== Executing boot script in 10.000 seconds – enter ^C to abort
La Fonera+, ou plus exactement la FON2201, avec le firmware par défaut utilise un second bootloader (stage2 quoi) qui lui-même charge le kernel, etc… Le firmware OpenWrt n’a pas besoin de cela. Tout fonction exactement comme avec une Fonera classique (vieille maintenant). On flash donc exactement de la même manière à grands coups de :
fis init

ip_address -l 192.168.10.10/24 -h 192.168.10.1

load -r -b 0x80041000 openwrt-atheros-2.6-root.jffs2-64k
fis create -b 0x80041000 -f 0xA8030000 -l 0x006F0000 -e 0x00000000 rootfs

load -r -b 0x80041000 openwrt-atheros-2.6-vmlinux.lzma
fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7
On patiente puis on s’occupe de la configuration de Redboot qui appel l’ancien loader :
RedBoot> fconfig -l -n
boot_script: true
boot_script_data:
.. fis load -b 0x80100000 loader
.. go 0x80100000

boot_script_timeout: 2
bootp: false
bootp_my_gateway_ip: 0.0.0.0
bootp_my_ip: 192.168.1.1
bootp_my_ip_mask: 255.255.255.0
bootp_server_ip: 192.168.1.254
console_baud_rate: 9600
gdb_port: 9000
info_console_force: false
net_debug: false
On corrige :
RedBoot> fconfig
Run script at boot: true
Boot script:
.. fis load -b 0x80100000 loader
.. go 0x80100000
Enter script, terminate with empty line
>> fis load -l vmlinux.bin.l7
>> exec
>>
Boot script timeout (1000ms resolution): 10
Use BOOTP for network configuration: false
Gateway IP address:
Local IP address: 192.168.10.10
Local IP address mask: 255.255.255.0
Default server IP address: 192.168.10.1
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration – continue (y/n)?y
On reboot avec un petit reset. Et là ! Là, la magie arrive (je met une tartine mais, regardez bien, ça brille) :
RedBoot> fis load -l vmlinux.bin.l7
Image loaded from 0x80041000-0x80297085
RedBoot> exec
Now booting linux kernel:
Base address 0x80030000 Entry 0x80041000
Cmdline :
Linux version 2.6.26.3 (andy@devsandbox.padded-cell.net)
(gcc version 4.1.2) #1 Tue Sep 9 17:29:16 PDT 2008
CPU revision is: 00019064 (MIPS 4KEc)
Determined physical RAM map:
memory: 01000000 @ 00000000 (usable)
Initrd not found or empty – disabling initrd
Zone PFN ranges:
Normal 0 -> 4096
Movable zone start PFN for each node
early_node_map[1] active PFN ranges
0: 0 -> 4096
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 4064
Kernel command line: console=ttyS0,9600 rootfstype=squashfs,jffs2 init=/etc/preinit
Primary instruction cache 16kB, VIPT, 4-way, linesize 16 bytes.
Primary data cache 16kB, 4-way, VIPT, no aliases, linesize 16 bytes
PID hash table entries: 64 (order: 6, 256 bytes)
console [ttyS0] enabled
Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 13480k/16384k available (1943k kernel code, 2904k reserved, 323k data, 128k init, 0k highmem)
SLUB: Genslabs=6, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Mount-cache hash table entries: 512
net_namespace: 644 bytes
NET: Registered protocol family 16
Radio config found at offset 0xf8(0x1f8)
AR531x PCI init…
done
PCI: fixing up device 0,3,0
PCI: Failed to allocate mem resource #1:4000000@84000000 for 0000:00:00.0
PCI: Failed to allocate mem resource #1:4000000@84000000 for 0000:00:03.0
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 512 (order: 0, 4096 bytes)
TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 512 bind 512)
TCP reno registered
NET: Registered protocol family 1
ar531x: Registering GPIODEV device
squashfs: version 3.0 (2006/03/15) Phillip Lougher
Registering mini_fo version $Id$
JFFS2 version 2.2. (NAND) (SUMMARY) © 2001-2006 Red Hat, Inc.
msgmni has been set to 26
io scheduler noop registered
io scheduler deadline registered (default)
gpiodev: gpio device registered with major 254
gpiodev: gpio platform device registered with access mask FFFFFFFF

Serial: 8250/16550 driver $Revision: 1.90 $ 1 ports, IRQ sharing disabled
serial8250: ttyS0 at MMIO 0xb1100003 (irq = 37) is a 16550A
eth0: Atheros AR231x: 00:18:84:a0:5b:98, irq 4
ar2313_eth_mii: probed
eth0: Marvell 88E6060 PHY driver attached.
eth0: attached PHY driver [Marvell 88E6060] (mii_bus:phy_addr=0:1f)

cmdlinepart partition parsing not available
Searching for RedBoot partition table in spiflash at offset 0x7d0000
Searching for RedBoot partition table in spiflash at offset 0x7e0000
6 RedBoot partitions found on MTD device spiflash
Creating 6 MTD partitions on « spiflash »:
0x00000000-0x00030000 : « RedBoot »
0x00030000-0x00720000 : « rootfs »
mtd: partition « rootfs » set to be root filesystem
split_squashfs: no squashfs found in « spiflash »
0x00720000-0x007e0000 : « vmlinux.bin.l7 »
0x007e0000-0x007ef000 : « FIS directory »
0x007ef000-0x007f0000 : « RedBoot config »
0x007f0000-0x00800000 : « boardconfig »
Registered led device: gpio0
Registered led device: gpio1
Registered led device: wlan
Registered led device: gpio3
Registered led device: gpio4
Registered led device: gpio7

nf_conntrack version 0.5.0 (1024 buckets, 4096 max)
eth0: Configuring MAC for full duplex
ip_tables: (C) 2000-2006 Netfilter Core Team
TCP vegas registered
NET: Registered protocol family 17
Bridge firewalling registered
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFS: Mounted root (jffs2 filesystem) readonly.
Freeing unused kernel memory: 128k freed
Please be patient, while OpenWrt loads …
Algorithmics/MIPS FPU Emulator v1.5
– preinit –
Press CTRL-C for failsafe
– init –
Please press Enter to activate this console. PPP generic driver version 2.4.2
device eth0.0 entered promiscuous mode
device eth0 entered promiscuous mode
br-lan: port 1(eth0.0) entering learning state
br-lan: topology change detected, propagating
br-lan: port 1(eth0.0) entering forwarding state
ipt_time loading
wlan: trunk
ath_hal: module license ‘Proprietary’ taints kernel.
ath_hal: 0.10.5.6 (AR5212, AR5312, RF5111, RF5112, RF2316, RF2317, TX_DESC_SWAP)
ath_rate_minstrel: Minstrel automatic rate control algorithm 1.2 (trunk)
ath_rate_minstrel: look around rate set to 10%
ath_rate_minstrel: EWMA rolloff level set to 75%
ath_rate_minstrel: max segment size in the mrr set to 6000 us
wlan: mac acl policy registered
ath_ahb: trunk
wifi0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
wifi0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
wifi0: H/W encryption support: WEP AES AES_CCM TKIP
ath_ahb: wifi0: Atheros 2315 WiSoC: mem=0xb0000000, irq=3

BusyBox v1.11.1 (2008-09-09 15:08:51 PDT) built-in shell (ash)
Enter ‘help’ for a list of built-in commands.

_______ ________ __
| |.—–.—–.—–.| | | |.—-.| |_
| – || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
KAMIKAZE (bleeding edge, r12419) ——————-
* 10 oz Vodka Shake well with ice and strain
* 10 oz Triple sec mixture into 10 shot glasses.
* 10 oz lime juice Salute!
—————————————————
root@OpenWrt:/#
C’est bô ! On verse une larme, on s’essuit, on se mouche un bon coup et on se prépare pour les grandes émotions :
root@OpenWrt:/# cat /proc/net/dev
Inter-| Receive
face |bytes packets errs drop fifo…
lo: 0 0 0 0 0…
eth0: 0 0 0 0 0…
eth0.0: 0 0 0 0 0…
eth0.1: 0 0 0 0 0…
br-lan: 0 0 0 0 0…
wifi0: 0 0 0 0 0…
Mais ?! Mais le support VLAN intégré est configuré et fonctionne ! On a même droit à un bridge :
brctl show
bridge name bridge id STP enabled interfaces
br-lan 8000.001884a05b98 no eth0.0
J’aime pas pour les test, on revoit ça temporairement :
root@OpenWrt:/# ifconfig br-lan down
br-lan: port 1(eth0.0) entering disabled state
root@OpenWrt:/# brctl delbr br-lan
device eth0.0 left promiscuous mode
br-lan: port 1(eth0.0) entering disabled state
root@OpenWrt:/# ifconfig eth0.0 192.168.10.10
root@OpenWrt:/# ifconfig eth0.1 192.168.0.24
Et :
root@OpenWrt:/# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: seq=0 ttl=64 time=1.912 ms
64 bytes from 192.168.0.1: seq=1 ttl=64 time=1.475 ms
root@OpenWrt:/# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1): 56 data bytes
64 bytes from 192.168.10.1: seq=0 ttl=64 time=2.538 ms
64 bytes from 192.168.10.1: seq=1 ttl=64 time=1.460 ms
Allez, juste pour le plaisir :
root@OpenWrt:/# arp
IP address HW type Flags HW address Mask Device
192.168.10.1 0x1 0x2 00:0d:60:cb:5a:27 * eth0.0
192.168.0.1 0x1 0x2 00:19:66:2e:b2:13 * eth0.1
Bien, on revoit la configuration, ce coup-ci on se passera d’uci et on va taper directement dans les fichiers de configuration :
# /etc/config/network
config ‘interface’ ‘loopback’
option ‘ifname’ ‘lo’
option ‘proto’ ‘static’
option ‘ipaddr’ ‘127.0.0.1’
option ‘netmask’ ‘255.0.0.0’

config ‘interface’ ‘lan’
option ‘type’ ‘bridge’
option ‘proto’ ‘static’
option ‘netmask’ ‘255.255.255.0’
option ‘ifname’ ‘eth0.0’
option ‘ipaddr’ ‘192.168.0.24’

config ‘interface’ ‘wan’
option ‘ifname’ ‘eth0.1’
option ‘proto’ ‘static’
option ‘netmask’ ‘255.255.255.0’
option ‘ipaddr’ ‘192.168.10.10’
# /etc/config/wireless
config wifi-device wifi0
option type atheros
option channel auto
option disabled 0
option channel 6
option disabled 0
option diversity 0
option txantenna 1
option rxantenna 1
option mode 11bg

config wifi-iface
option device wifi0
option network lan
option mode ap
option ssid OWRTplus
option encryption psk
option key ‘coucou’
option txpower ’18’
On passera en DHCP plus tard (j’ai pas envie de tripotter la config, trop excité), en attendant, on reboot et on continu :
root@OpenWrt:/# cat > /etc/resolv.conf
nameserver 80.10.246.130
nameserver 80.10.246.3
root@OpenWrt:/# route add default gw 192.168.0.10
root@OpenWrt:/# ping www.google.com
PING www.google.com (209.85.129.147): 56 data bytes
64 bytes from 209.85.129.147: seq=0 ttl=239 time=47.223 ms
64 bytes from 209.85.129.147: seq=1 ttl=239 time=47.247 ms
Bien, la Fonera+ accède au net. Ca veut dire qu’on peut installer des choses. ipkg y’a plus, voici opkg et il est préconfiguré :
root@OpenWrt:/# cat /etc/opkg.conf
src snapshots http://downloads.openwrt.org/snapshots/atheros/packages
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists

root@OpenWrt:/# opkg update

root@OpenWrt:/# opkg install wpa-supplicant
Installing wpa-supplicant (0.6.3-1) to root…
Configuring wpa-supplicant

root@OpenWrt:/# opkg install hostapd
Installing hostapd (0.6.4-1) to root…
Installing libopenssl (0.9.8h-1) to root…
Installing zlib (1.2.3-5) to root…
Configuring hostapd
Configuring libopenssl
Configuring zlib
Là, à ce moment précis, je ronronne…. et je reboot. ET LA… C’EST LE DRAME !
device ath0 entered promiscuous mode
br-lan: port 2(ath0) entering learning state
br-lan: topology change detected, propagating
br-lan: port 2(ath0) entering forwarding state
br-lan: port 2(ath0) entering disabled state
device ath0 left promiscuous mode
br-lan: port 2(ath0) entering disabled state
Après moult recherches je lance finalement :
root@OpenWrt:/etc/init.d# /sbin/wifi down
root@OpenWrt:/etc/init.d# /sbin/wifi up
Configuration file: /var/run/hostapd-ath0.conf
Line 10: invalid WPA passphrase length 6 (expected 8..63)
WPA-PSK enabled, but PSK or passphrase is not configured.
2 errors found in configuration file ‘/var/run/hostapd-ath0.conf’
enable_atheros(wifi0): Failed to set up hostapd for interface ath0
Ok, je me cache derrière mon clavier et je change gentillement ma passphrase… hum hum. Allez pour être sûr un petit reboot. Et tout marche. Voici une Fonera+ avec un OpenWrt, deux ports ether, un bridge, et un AP WPA qui roule…

Les gars d’OpenWrt là, ils brillent la nuit et ont des poils de partout, pas de doute. Y’a encore à dire sur cette version, mais ce sera pour un prochain billet.

Problèmes et corrections de la RTC DS1302 sur carte ACME Fox

Dans un précédent billet j’ai détaillé la mise en oeuvre d’une RTC à base de DS1302 pour la carte ACME Fox. Constatant une dérive d’horloge assez importante, j’ai décidé de revoir la chose. Un quartz c’est fragile et il y a un petit problème dans le code du support DS1302 dans le noyau…

La dérive d’horloge vient du montage lui-même. Il faut faire très attention avec les quartz et respecter les conseils donnés dans la datasheet :

Ground plane is the key ! Sinon le quartz fait un peu… antenne et ne tient pas la route. J’ai donc bien blindé la chose et cela devrait mieux se passer (le temps nous le dira puisque la dérive est de quelques dixièmes de seconde par jour seulement).

Mais durant les expérimentations, le DS1302 ne fonctionnait pas toujours. Certes, il pouvait stocker la date mais l’horloge elle-même ne fonctionnait pas. Étrange. La datasheet apporte la réponse :

«CLOCK HALT FLAG : it 7 of the seconds register is defined as the clock halt (CH) flag. When this bit is set to logic 1, the clock oscillator s stopped and the DS1302 is placed into a low-power standby mode with a current drain of less than 100nA. When his bit is written to logic 0, the clock will start. The initial power-on state is not defined.»

En bon français, le bit 7 du registre des secondes est le drapeau CH qui, à 1, arrête l’horloge. Pire encore, l’état à la mise sous tension du composant est indéfini ! Un petit coup d’oeil dans le code (os/linux-2.6-tag–devboard-R2_01-1/arch/cris/arch-v10/drivers/ds1302.c) et, surprise, pas une seule ligne ne s’assure que ce drapeau est bien à zéro.

On ajoute donc :
/* LEFINNOIS */
printk(KERN_INFO « %s: HC enable.n », ds1302_name);
out_byte(0x81);
lefinnois = in_byte();
ds1302_wenable();
out_byte(0x80);
out_byte(lefinnois & 0x7F);
ds1302_wdisable();
out_byte(0x81);
if((res = in_byte()) && 0x80) {
printk(KERN_INFO « %s: HC enable OK.n », ds1302_name);
}
printk(KERN_INFO « %s: HC enable done.n », ds1302_name);
/* /LEFINNOIS */
Dans la fonction ds1302_probe(void). Effectivement au démarrage on retrouve :
ds1302: RTC found.
ds1302: SDA, SCL, RST on PB0, PB1, GENIO2
ds1302: HC enable.
ds1302: HC enable OK.
ds1302: HC enable done.

ACME FOX, Webcam OV511 et time-lapse vidéo

Dans un billet précédent, je parlais de l’intégration de code dans le SDK de la carte ACME Fox 4/16. Ce code est en grande partie tiré du programme vidcat (w3cam) permettant de récupérer une image PPM depuis une caméra supportée par l’API V4L (Video for Linux). Le premier essai d’utilisation de ce code est la récupération d’image toutes les 3 minutes pour composer une vidéo.
 
 

Le code modifié et personnalisé de vidcat est pour l’heure copié dans zone de mémoire flash en lecture/écriture (/mnt/flash). Une clef USB de 256Mo est montée dans /mnt/flash/mount. Depuis ce répertoire un script est utilisé :
while(true);
do
../vidcat;
date
cp rototo.ppm `date +%s`.ppm;
sleep 180;
done
On récupère ensuite les PPM en montant la clef sur un PC ou en téléchargeant les fichiers avec scp.

On produit ensuite une liste de fichier avec un simple ls *.ppm | sort > list.

Reste ensuite à produite une vidéo avec transcode :
% transcode -x imlist,null -y ffmpeg,null -F mpeg4 –use_rgb
-i list -o test.mp4 -w 8000 –import_asr 1 -g 640×480
-z -k –export_fps 15
250 PPM avec un frame par seconde de 15 nous donne une vidéo de quelques 16 secondes de la webcam posée sur le bord de la fenêtre un jour ensoleillé. Rien de bien fantastique mais pour un premier essai, c’est pas mal je trouve…

Intégration de code dans le SDK ACME FOX

Toujours dans la série «je joue avec ma carte FOX» voici l’intégration d’un petit code dans le SDK. En d’autres termes, plutôt de de compiler les sources de mon outil, j’ai voulu l’intégrer proprement dans l’interface de configuration du SDK.

Procédure à suivre…

On commence par ajouter les sources dans un sous-répertoire du répertoire apps et on ajoute un Makefile qui va bien :
AXIS_USABLE_LIBS = UCLIBC GLIBC
include $(AXIS_TOP_DIR)/tools/build/Rules.axis

PROGS = vidcat
INSTDIR = $(prefix)/usr/bin
#LDLIBS = -lusb

all: $(PROGS)
$(PROGS): $(PROGS).o
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

install: $(PROGS)
$(INSTALL) -p -o root -g root -m 0777 $(PROGS) $(INSTDIR)
clean:
rm -f $(PROGS) *.o core
On enregistre et on lance un petit make cris-axis-linux-gnu.

On se tourne ensuite vers configure-files/common/AC_common et on y ajoute :
menu « Lefinnois »
config LEFINNOIS_V4LCAPTURE
bool « Client de capture de frame V4L pour cam OV511 YUV »
default n
endmenu
Ceci permet d’ajouter le menu qui va bien dans l’interface de configuration. Reste à prendre cela en considération. Pour ce faire on tripote configure-files/devboard/devboard :
if [ « $AXIS_CONFIG_LEFINNOIS_V4LCAPTURE » = « y » ]; then
sub_no_fetch apps/v4lcapture
fi
Et voilà. L’affaire est dans le sac. Un petit coup de ./configure et le Makefile est mis à jour avec le répertoire apps/v4lcapture. Un coup d’oeil à axis_config.h et on retrouve :
i#define AXIS_CONFIG_LEFINNOIS_V4LCAPTURE 1
Petite compilation avec un simple make et voilà, tout est en place :
% find . -name vidcat
./apps/v4lcapture/vidcat
./target/cris-axis-linux-gnu/usr/bin/vidcat