Mise en place d'un port série sur le NAS NSLU2 de Linksys équipé de la distribution uNSLUng

La plupart des appliances qui marchent avec un linux embarqué disposent d'au moins un port série, mais qui n'est malheureusement accessible qu'en interne. Dans le meilleur des cas, le connecteur et les transceivers RS232 sont présents, mais le plus souvent il n'y a rien qu'un emplacement sur la carte mère pour un accès aux signaux ttl ou 3.3V du port série. Il convient donc de souder un connecteur sur la carte mère de notre appliance, et de réaliser un adaptateur de niveau qui nous permettra de connecter notre console série. Les efforts seront bien récompensés, puisque la plupart du temps les constructeurs donnent accès à un shell direct, sans aucune protection étant donné la relative complexité 'mécanique' d'accès à ce shell. Nota: Le principe est également valable pour le WRT54G de Linksys qui dispose non pas d'un mais de 2 ports série...

Voyons ici comment cela se passe sur un NAS NSLU2 de Linksys...

Installation d'un port Console:

Implantation et brochage du connecteur série sur le NSLU2 J'ai soudé un connecteur sur la carte mère du nslu2 afin de raccorder une liaison série. L'emplacement est prévu et se nomme "J2". Il y a 4 points au pas de 2.54 mm. Il se situe juste en dessous des 2 rams et de la batterie. Par contre, c'est un niveau TTL 3.3V, qui n'est pas branchable directement sur un port RS232. Il convient donc d'adapter les niveaux avec par exemple un MAX3232 + 4 condensateurs ou un kit d'adaptation déjà fait. Il y a plus d'infos sur la page du site NSLU2. J'ai personnellement réalisé un petit adaptateur avec un max3232, 4 condensateurs, un connecteur Subd 9 points femelle sur un bout de carte d'étude. Attention toutefois: le MAX232 (et équivalent) est fait pour adapter des niveaux TTL (5V) vers un port série, alors que le max3232 est fait pour adapter des niveaux 3.3V vers rs232. Si vous vous inspirez de cet article pour ajouter un port série sur votre lecteur satellite ou votre téléphone portable (et oui, ca peut marcher aussi, je l'ai fait sur un téléphone Nokia...) il faudra d'abord vérifier si votre port série fonctionne en 5V ou en 3.3V...

Utilisation:

Ca commence a devenir rigolo après avoir branché, puisque l'on peut via ce port, soit accéder à Redboot (le chargeur de démarrage et utilitaire de diagnostique intégré) ou tout simplement suivre le boot linux de votre nslu2 et entrer en root sous shell sur la machine....

Arès avoir connecté le NSLU2 à votre adaptateur TTL 3.3V -> RS232, et l'adaptateur au PC, munissez vous de Putty et faites une connexion sur le port série de votre choix à 115200 bauds, no parity, 8 bits 1 stop (sur putty juste préciser le port et la vitesse, le reste est ok par défaut).

Allumez votre NSLU2, et préparez vous à taper control+C dès qu'il vous le demandera :

Ethernet eth0: MAC address 00:0f:66:7f:3c:d4
IP: 192.168.0.1/255.255.255.0, Gateway: 192.168.0.1
Default server: 0.0.0.0, DNS server IP: 0.0.0.0

RedBoot(tm) bootstrap and debug environment [ROMRAM]
Red Hat certified release, version 1.92 - built 15:16:07, Feb  3 2004

Platform: IXDP425 Development Platform (XScale)
Copyright (C) 2000, 2001, 2002, Red Hat, Inc.

RAM: 0x00000000-0x02000000, 0x000723a0-0x01ff3000 available
FLASH: 0x50000000 - 0x50800000, 64 blocks of 0x00020000 bytes each.
== Executing boot script in 2.000 seconds - enter ^C to abort
^C <------- ON TAPE CTRL C ICI!!!!!!!!!!!
RedBoot>

Vous voila sous Redboot. De cet environnement, on peut très facilement transformer son nslu2 en une inutile enclume. Donc si vous ne savez pas ce que vous faites, éteignez le tout et allez la plage ;).

Sachant que Redboot dispose d'une aide en ligne, et que Redhat (l'editeur de redboot) a eu la délicatesse de nous mettre une doc à disposition (Le Redboot User Guide), on va pouvoir expérimenter.

Aide :

help

Boot normal :

boot;exec 0x01d00000

Affichage des infos de version et de mémoire :

version

Redémarrage :

reset

Effacement de la mémoire de paramètres (au cas ou elle serait endommagée, elle sera automatiquement réinitialisée lors du prochain boot) :

fis erase -f 0x50040000 -l 0x20000

Chargement firmware. Il faut bien évidemment un serveur tftp pour cette opération, et qu'il contienne l'image de boot à charger et que le NSLU2 soit raccordé au pc en ethernet par un cable croisé en plus de la liaison série. Ici le serveur tftp est en 192.168.0.2, et nous nous apprêtons à unslunger....

load -r -v -b 0x01000000 -h 192.168.0.2 Unslung-6.10-beta.bin

Vérification de la somme de contrôle de l'image chargée :

cksum

Ecriture du firmware sur la flash (Attention! Il faut que la somme de contrôle corresponde à celle de l'image!):

fis write -f 0x50060000 -b 0x01060000 -l 0x7a0000

Reboot du NSL :

reset

Si on laisse se dérouler un boot normal, voici ce que l'on obtient sur la liaison série (il n'y a pas de doute, on est bien sous Linux!)

have eRcOmM
copy kernel code from flash to RAM
copy ramdisk file from flash to RAM
run kernel
Using base address 0x01d00000 and length 0x000e9bac
Uncompressing Linux................................................................ done, booting the kernel.
Linux version 2.4.22-xfs (unslung@unslung.org) (gcc version 3.4.4) #1 Sat Dec 29 03:29:38 UTC 2007
CPU: XScale-IXP425/IXC1100 revision 1
Machine: Intel IXDP425 Development Platform
Warning: bad configuration page, trying to continue
Security risk: creating user accessible mapping for 0x60000000 at 0xff00f000
Security risk: creating user accessible mapping for 0x51000000 at 0xf1000000
On node 0 totalpages: 8192
zone(0): 8192 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyS0,115200n8 root=/dev/mtdblock4 rootfstype=jffs2 rw init=/linuxrc mem=32M@0x00000000
Calibrating delay loop... 131.48 BogoMIPS
Memory: 32MB = 32MB total
Memory: 30272KB available (1582K code, 281K data, 244K init)
Dentry cache hash table entries: 4096 (order: 3, 32768 bytes)
Inode cache hash table entries: 2048 (order: 2, 16384 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 8192 (order: 3, 32768 bytes)
POSIX conformance testing by UNIFIX
PCI Autoconfig: Found Bus 0, Device 1, Function 0
PCI Autoconfig: BAR 0, Mem, size=0x1000, address=0x4bfff000
PCI Autoconfig: Found Bus 0, Device 1, Function 1
PCI Autoconfig: BAR 0, Mem, size=0x1000, address=0x4bffe000
PCI Autoconfig: Found Bus 0, Device 1, Function 2
PCI Autoconfig: BAR 0, Mem, size=0x100, address=0x4bffdf00
PCI: bus0: Fast back to back transfers disabled
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
VFS: Disk quotas vdquot_6.5.1
Journalled Block Device driver loaded
devfs: v1.12c (20020818) Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x0
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
JFFS2 version 2.1. (C) 2001 Red Hat, Inc., designed by Axis Communications AB.
i2c-core.o: i2c core module
i2c-dev.o: i2c /dev entries driver module
i2c-core.o: driver i2c-dev dummy driver registered.
i2c-algo-bit.o: i2c bit algorithm module version 2.6.1 (20010830)
pty: 256 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI enabled
ttyS00 at 0xff000003 (irq = 15) is a XScale UART
ttyS01 at 0xff001003 (irq = 13) is a XScale UART
RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize
SCSI subsystem driver Revision: 1.00
* host:<NULL>
cfi_cmdset_0001: Erase suspend on write enabled
Using buffer write method
Creating 6 MTD partitions on "IXP425 Flash":
0x00000000-0x00040000 : "RedBoot"
0x00040000-0x00060000 : "SysConf"
0x00060000-0x00160000 : "Kernel"
0x00160000-0x00180000 : "Ramdisk"
0x00180000-0x007e0000 : "Flashdisk"
0x007e0000-0x00800000 : "FIS directory"
usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
pci probe begin
ehci_hcd 00:01.2: NEC Corporation USB 2.0
ehci_hcd 00:01.2: irq 26, pci mem c3872f00
usb.c: new USB bus registered, assigned bus number 1
PCI: 00:01.2 PCI cache line size set incorrectly (0 bytes) by BIOS/FW.
PCI: 00:01.2 PCI cache line size corrected to 32.
ehci_hcd 00:01.2: USB 2.0 enabled, EHCI 1.00, driver 2003-Jun-19/2.4
Device descriptor:8 bytes received.
Device descriptor:18 bytes received.
hub.c: USB hub found
hub.c: 5 ports detected
pci probe ok
host/usb-uhci.c: $Revision: 1.3 $ time 03:30:28 Dec 29 2007
host/usb-uhci.c: High bandwidth mode enabled
host/usb-uhci.c: v1.275:USB Universal Host Controller Interface driver
host/usb-ohci.c: USB OHCI at membase 0xc387a000, IRQ 28
host/usb-ohci.c: usb-00:01.0, NEC Corporation USB
usb.c: new USB bus registered, assigned bus number 2
Device descriptor:8 bytes received.
Device descriptor:18 bytes received.
hub.c: USB hub found
hub.c: 3 ports detected
host/usb-ohci.c: USB OHCI at membase 0xc3880000, IRQ 27
host/usb-ohci.c: usb-00:01.1, NEC Corporation USB (#2)
usb.c: new USB bus registered, assigned bus number 3
Device descriptor:8 bytes received.
Device descriptor:18 bytes received.
hub.c: USB hub found
hub.c: 2 ports detected
Initializing USB Mass Storage driver...
usb.c: registered new driver usb-storage
USB Mass Storage support registered.
i2c-dev.o: Registered 'IXP425 I2C Adapter' as minor 0
i2c-core.o: adapter IXP425 I2C Adapter registered as adapter 0.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 2048 bind 4096)
IP-Config: No network devices available.
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
NetWinder Floating Point Emulator V0.97 (double precision)
VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 244K
Sleeping while waiting for disk...
1
Can't find valid rootfs, using ramdisk ...
Insmod ixp400
Warning: loading ixp400 will taint the kernel: no license
  See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module init.
Insmod ixp425
ixp425_eth:
Initializing IXP425 NPE Ethernet driver software v. 1.1
ixp425_eth: CPU clock speed (approx) = 0 MHz
[error] ixEthMiiPhyScan : unexpected Mii PHY ID 00008201
ixp425_eth: ixp0 is using the PHY at address 1
ixp425_eth: ixp1 is using the PHY at address 0


BusyBox v1.3.1 (2007-12-29 03:38:35 UTC) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

# ixp425_eth: ixEthMiiLinkStatus failed on PHY0.
        Can't determine
the auto negotiated parameters. Using default values.
Creating ramfs for /dev:
Creating ramfs for /var:
Starting Hostname :
                                                                OK
Starting Modules :
enable_irq(22) unbalanced from c39431bc
X1226: I2C based RTC driver.
i2c-core.o: driver X1226 registered.
X1226: found X1226 on IXP425 I2C Adapter
i2c-core.o: client [X1226] registered to adapter [IXP425 I2C Adapter](pos. 0).
atr is 20
Warning: loading ufsd will taint the kernel: non-GPL license - Commertial product
  See http://www.tux.org/lkml/#export-tainted for information about tainted modules
ufsd: driver loaded
Starting Modules :
Setting LAN media type :
Starting Set CGI_ds.conf:
                                                                OK
Restore time and timezone:
11/30/1999-17:03:37
                                                                OK
Restore usrgrpshares:
                                                                OK
Starting WEB Server:
User guest password set to none.
                                                                OK
                                                                OK
Starting samba:
Starting INET Server:
                                                                OK
Creating ramfs for /tmp:
Starting QuickSet Daemon :
                                                                OK
                                                                OK
                                                                OK
Starting Crond :
Starting Rest Task :

Checking quotas. This may take some time.

Done.
Turning on quota.
LKG7F3CD4: boot complete!
                                                                OK
Starting Optware Packages:
Starting Bootdisk scripts:
====> linksys_hostname is LKG7F3CD4
====> real_hostname is LKG7F3CD4
Checking disk status :
Tue Nov 30 17:04:19 PST 1999

Ce qui, sur un unslung, nous permet de passer directement sous shell (juste faire entrée et vous y êtes...):

# ls -al
drwxr-xr-x    1 root     root            0 Dec 31  1969 .
drwxr-xr-x    1 root     root            0 Dec 31  1969 ..
-rw-r--r--    1 root     root           26 Dec 31  1969 .unslung
drwxr-xr-x    1 root     root            0 Dec 31  1969 bin
drwxr-xr-x    1 root     root            0 Dec 31  1969 dev
drwxr-xr-x    1 root     root            0 Dec 31  1969 dev.state
drwxr-xr-x    1 root     root            0 Nov 30 17:04 etc
drwxr-xr-x    1 root     root            0 Dec 31  1969 home
drwxr-xr-x    1 root     root            0 Dec 31  1969 initrd
drwxr-xr-x    1 root     root            0 Dec 31  1969 lib
-rwxr-xr-x    1 root     root         2585 Dec 31  1969 linuxrc
drwxr-xr-x    1 root     root            0 Dec 31  1969 lost+found
drwxr-xr-x    1 root     root            0 Dec 31  1969 mnt
drwxr-xr-x    1 root     root            0 Dec 31  1969 opt
dr-xr-xr-x   46 root     root            0 Dec 31  1969 proc
drwxr-xr-x    1 root     root            0 Dec 31  1969 root
drwxr-xr-x    1 root     root            0 Dec 31  1969 sbin
drwxrwxr-x    1 admin    everyone        0 Dec 31  1969 share
drwxrwxrwt    1 root     root            0 Nov 30 17:03 tmp
drwxr-xr-x    1 root     root            0 Dec 31  1969 unslung
drwxr-xr-x    1 root     root            0 Dec 31  1969 upload
drwxr-xr-x    1 root     root            0 Dec 31  1969 usr
drwxr-xr-x    1 root     root            0 Dec 31  1969 var
drwxr-xr-x    1 root     root            0 Dec 31  1969 var.state

# cat .unslung
V2.3R63-uNSLUng-6.10-beta

# cat /proc/cpuinfo
Processor       : XScale-IXP425/IXC1100 rev 1 (v5b)
BogoMIPS        : 131.48
Features        : swp half thumb fastmult edsp

Hardware        : Intel IXDP425 Development Platform
Revision        : 0000
Serial          : 0000000000000000
# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/mtdblock4            6.4M      6.1M    320.0k  95% /
/dev/mtdblock4            6.4M      6.1M    320.0k  95% /dev.state
/dev/mtdblock4            6.4M      6.1M    320.0k  95% /var.state
# mount
/dev/root on / type jffs2 (rw)
proc on /proc type proc (rw)
usbdevfs on /proc/bus/usb type usbdevfs (rw)
/dev/root on /dev.state type jffs2 (rw)
ramfs on /dev type ramfs (rw)
/dev/root on /var.state type jffs2 (rw)
ramfs on /var type ramfs (rw)
none on /tmp type ramfs (rw)
# free
              total         used         free       shared      buffers
  Mem:        30516        15720        14796            0            0
 Swap:            0            0            0
Total:        30516        15720        14796
# ps aux
  PID  Uid     VmSize Stat Command
    1 root        404 S   /bin/init
    2 root            SW  [keventd]
    3 root            SWN [ksoftirqd_CPU0]
    4 root            SW  [kswapd]
    5 root            SW  [bdflush]
    6 root            SW  [kupdated]
    7 root            SW  [mtdblockd]
    8 root            SW  [khubd]
    9 root            Z N [jffs2_gcd_mtd4]
  153 root            SWN [jffs2_gcd_mtd4]
  161 root            DW  [ixp425_csr]
  162 root            SW  [ixp425 ixp0]
  165 root        696 S   /bin/sh
  281 root        552 S   /sbin/syslogd -n
  282 root        528 S   /sbin/klogd -n
  321 root        836 S   upnpd &>/dev/null
  330 root        836 S   upnpd &>/dev/null
  331 root        836 S   upnpd &>/dev/null
  334 root        836 S   upnpd &>/dev/null
  335 root        836 S   upnpd &>/dev/null
  336 root        836 S   upnpd &>/dev/null
  422 root        912 S   /usr/sbin/thttpd -C /etc/thttpd.conf
  442 root       2936 S   /usr/sbin/smbd -D
  444 root       2940 S   /usr/sbin/smbd -D
  445 root       2424 S   /usr/sbin/nmbd -D
  452 root        464 S   /bin/inetd
  474 root        668 S   /usr/sbin/QuickSet
  482 root        616 S   /usr/sbin/USB_Detect
  487 root        584 S   /usr/sbin/USB_Detect
  490 root        460 S   /usr/sbin/onetouch_detect
  493 root        572 S   /usr/sbin/onetouch_detect
  503 root        416 S   /usr/sbin/crond
  509 root        564 S   /usr/sbin/CheckResetButton
  511 root        388 S   /usr/sbin/CheckPowerButton
  513 root        388 S   /usr/sbin/do_umount
  583 root        628 R   ps aux
# help [les commandes du shell busybox]

Built-in commands:
-------------------
        . : bg break cd chdir continue eval exec exit export false fg
        hash help jobs kill let local pwd read readonly return set shift
        source times trap true type ulimit umask unset wait