====== Linksys NSLU2 ====== ===== Web references ===== * [[http://1wt.eu/articles/nslu2/|Hacking into the Linksys NSLU2]] * [[http://www.nslu2-linux.org/wiki/Debian/HomePage|Debian/NSLU2]] * [[http://www.nslu2-linux.org/wiki/Debian/BuildImage|How to build a new Debian/NSLU2 image]] ===== Hardware ===== See the [[wp>NSLU2]]. ^ CPU | XScale-IXP42x 266 MHz | ^ RAM | 32 Mb | ^ Flash | 8 Mb | ===== Flashing a new firmware ===== Obviously we want Debian GNU/Linux on it! ==== Flashing a Debian kernel and initramfs ==== See [[http://www.cyrius.com/debian/nslu2/install.html|Installing Debian on the Linksys NSLU2]] Put the NSLU2 in upgrade mode, as described into the **[[http://www.cyrius.com/debian/nslu2/install.html|HOWTO]]**. Then run the following commands: apt-get install upslug2 slugimage wget http://cyrius.com/debian/nslu2/files/sda1-2.6.18.dfsg.1-13etch2 upslug2 -i sda1-2.6.18.dfsg.1-13etch2 :-( The above is an **official Debian image**, for a system installed onto **/dev/sda1**. Unfortunately it **does not support** the integrated Ethernet interface (Intel IXP4xx) because it needs a proprietary microcode to operate. After flashing the firmware, we can **prepare a Debian base system on and USB memory stick**. I prepared a 2 Gb USB stick following this **[[http://www.cyrius.com/debian/nslu2/unpack.html|Manual install]]**. ==== Flashing a Debian Installer ==== There is also an **unofficial Debian installer NSLU image** that can be found here: **[[http://www.slug-firmware.net/d-dls.php|www.slug-firmware.net]]**. This image contains a Debian installer that let you to start a standard installation. It contains also the microcode for the Ethernet port. After flashing the Debian installer image you can login into the NSLU2 via ssh (login/password: **installer**/**install**): ssh installer@192.168.1.77 ==== Files ==== ^ File ^ Note ^ Md5sum ^ ^ {{.nslu2:debian-5.0beta1.zip}} [[http://www.slug-firmware.net/d-dls.php|web]] | Unofficial Debian installer based on Debian Lenny | d1101168a492f62810234b067724d3df | ^ {{.nslu2:debian-4.0r3.zip}} [[http://www.slug-firmware.net/d-dls.php|web]] | Unofficial Debian installer based on Debian 4.0 Etch | b8b9fe6389b04cf8520157010b1a0a8f | ^ {{.nslu2:sda1-2.6.18.dfsg.1-13etch2.bz2}} [[http://cyrius.com/debian/nslu2/files/sda1-2.6.18.dfsg.1-13etch2|web]] | Firmware for root on /dev/sda1 | 53566d5b06418128255d50cd8226f8be | **Note:** I tried to install the Debian system on a 2Gb USB stick. I got problems using the debian-5.0beta1 installer: the system crashed several times at different stages of progress, so I was unable to complete it. I experienced some trouble also with the debian-4.0r3 installer: the program insists on crashing during partition format, so I pre-formatted the USB stick. During setup I loaded these modules: * ext3-modules-2.6.18-6-ixp4xx-di * partman-ext3 * usb-storage-modules-2.6.18-6-ixp4xx-di ===== Problem with halt and reboot ===== If you boot the NSLU2 with the serial line connected to an host (I use minicom to debug the boot process), then you will find that **''reboot''** or **''halt''** commands will be ignored. I did not investigate much, just discovered that **''/etc/init.d/rc {0|6}''** works. ===== Serial port pinout ===== ^ Pin 1 | 3.3V (pin 1 has a white stripe next to it) | ^ Pin 2 | RXD (from serial terminal program to NSLU2) | ^ Pin 3 | TXD (from NSLU2 to serial terminal program) | ^ Pin 4 | GND | By default, RedBoot, APEX and the Linux kernel all use **115200,8,N,1** settings. ===== Customize the Debian Firmware ===== Install the **slugimage** package, download the [[http://cyrius.com/debian/nslu2/files/sda1-2.6.18.dfsg.1-13etch2|original image]] and unpack it: slugimage --unpack --input sda1-2.6.18.dfsg.1-13etch2 Several files will be extracted: * **apex.bin**: second stage boot loader for ARM chip (little-endian image) * **ramdisk.gz**: initramfs image (little-endian, gzip, cpio archive) * **RedBoot**: RedBoot boot manager * **SysConf**: Configuration of the NSLU2 * **Trailer**: Trailer * **vmlinuz**: kernel image (little-endian image) I changed the kernel image **vmlinuz** and the init ramdisk **ramdisk.gz** with customized versions Note that the extracted files are little-endian, where the images provided by me are big-endian, so I byte-swapped them before packing back. Also note that the initramfs image **must be padded to 4 Mb** size. dd if=ramdisk.gz of=ramdisk-pad.gz ibs=4M conv=sync byteswap.py vmlinuz vmlinuz-swap byteswap.py ramdisk-pad.gz ramdisk-pad.gz-swap slugimage --pack --output myfirmware-2.6.18-5-ixp4xx-1.bin -k vmlinuz-swap -r ramdisk-pad.gz-swap -L apex.bin Do not use the **''%%--little%%''** option of ''slugimage'' to byte-swap kernel and initramfs images, because it swaps also the ''apex.bin'' file. Here it is the **byteswap.py** Python utility I used to byte-swap the files: #!/usr/bin/python # swap every 32bit word in input and write it to output import array, sys if len(sys.argv) != 3: sys.stderr.write('Invalid arguments.\n') sys.stderr.write('Usage: %s \n' % sys.argv[0]) sys.exit(1) if sys.argv[1] == '-': file = sys.stdin else: file = open(sys.argv[1], 'rb') input = file.read() a = array.array('I') # add padding if needed a.fromstring(input + '\0' * (4-len(input)&3)) a.byteswap() if sys.argv[2] == '-': file = sys.stdout else: file = open(sys.argv[2], 'wb') a.tofile(file) ===== Always-On ===== {{ :doc:appunti:hardware:nslu2:nslu2_always-on_patch.jpg?200|NSLU2 Always-on patch}} The NSLU2 does not support the Always-On natively, there are several recipes to implement this feature, I choosed a simple one (a simple wire) from [[http://www.nslu2-linux.org/wiki/HowTo/ForcePowerAlwaysOn|this page]]. ^ power restore | The NSLU2 power-on an boot as soon as the power is restored. | ^ power button | When the power button is pressed: The system is going down for reboot NOW! | ^ reboot(8) | The NSLU2 properly reboots. | ^ poweroff(8) | The shutdown sequence is run, but power is not removed and LEDs stay on. You can restart by pressing the power button. |