Here you may find relative information for getting OpenWRT on a RB1xx box.
A relative thread at the openwrt forum.
Status: It has been done !! Directions follow:
Credits go to: Andrea Conti, David Goodenough and the friendly and helpful yaffs2 development community.
* flash a recent version of RouterBoot booter if you have an older version. Version 2.7 was used in this case, flashed with xmodem.
* format the nand from the RootBoot menu
* get the netboot image and place it on the bootp directory. You may use dnsmasq for dhcp/bootp server
* select boot from ethernet from the bootloader
* after boot, get your network going. You need to have access to a web server
* mount /dev/mtdblock2 /mnt; cd /mnt; wget kernel
* cd /; umount /mnt; mount /dev/mtdblock3 /mnt; cd /mnt; wget openwrt-adm5120-2.6-rootfs.tgz
* gzip -d openwrt-adm5120-2.6-rootfs.tgz; tar xvf openwrt-adm5120-2.6-rootfs.tar; rm openwrt-adm5120-2.6-rootfs.tar; cd /; umount /mnt; sync; reboot
* select boot from nand from the bootloader and boot
* openwrt now gives life & power to your rb133 device !!
svn co https://svn.openwrt.org/openwrt/trunk/ -r 7406
From: Alexandros C. Couloumbis <alex <at> ozo.com> Subject: Re: Problem with Yaffs on Routerboard RB112 and kernel 2.6.19 Newsgroups: gmane.linux.file-systems.yaffs Date: 2007-05-17 17:56:11 GMT (10 weeks, 3 days, 20 hours and 42 minutes ago) I am happy to announce that I finally have a RB133 booting from nand a latest kamikaze system. Kernel is 2.6.19.2 with latest yaffs2 cvs and Andreas last patch. A quick howto is here: http://rb1xx.ozo.com/doku.php#quick_howto Kernel config options follow: CONFIG_YAFFS_FS=y CONFIG_YAFFS_YAFFS1=y # CONFIG_YAFFS_DOES_ECC is not set CONFIG_YAFFS_YAFFS2=y CONFIG_YAFFS_AUTO_YAFFS2=y # CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS=10 # CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set # CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y # NAND Flash Device Drivers CONFIG_MTD_NAND=y # CONFIG_MTD_NAND_VERIFY_WRITE is not set CONFIG_MTD_NAND_ECC_SMC=y CONFIG_MTD_NAND_RB100=y CONFIG_MTD_NAND_IDS=y # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_NANDSIM is not set # OneNAND Flash Device Drivers # CONFIG_MTD_ONENAND is not set # Memory Technology Devices (MTD) CONFIG_MTD=y # CONFIG_MTD_DEBUG is not set # CONFIG_MTD_CONCAT is not set CONFIG_MTD_PARTITIONS=y CONFIG_MTD_SPLIT_ROOTFS=y # CONFIG_MTD_REDBOOT_PARTS is not set CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_MYLOADER_PARTS=y CONFIG_MTD_CHAR=y CONFIG_MTD_BLOCK=y CONFIG_MTD_CFI=y # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_GEN_PROBE=y # CONFIG_MTD_CFI_ADV_OPTIONS is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_CFI_INTELEXT is not set CONFIG_MTD_CFI_AMDSTD=y CONFIG_MTD_CFI_AMDSTD_FORCE_BOTTOM_BOOT=y # CONFIG_MTD_CFI_STAA is not set CONFIG_MTD_CFI_UTIL=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # CONFIG_MTD_OBSOLETE_CHIPS is not set CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_PCI is not set # CONFIG_MTD_PLATRAM is not set CONFIG_MTD_ADM5120=y # Self-contained MTD device drivers # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_MTDRAM is not set CONFIG_MTD_BLOCK2MTD=y # CONFIG_MTD_DOC2000 is not set # CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001PLUS is not set
Old Status: So far we are only able to netboot OpenWRT. Efforts are focussed on debuging the way RootBOOT loader reads & writes from & to the nand/yaffs combo, a quite fun quest I have to admit !!
You can get mtd-utils package here or mtd-utils source here.
scp usage
scp local_file user@host:/tmp/copy_of_lacal_file
http://www.linux-mips.org/wiki/Adm5120
http://www.linux-mips.org/wiki/ADM5120_switch
http://forum.routerboard.com/viewtopic.php?t=2974
http://forum.routerboard.com/viewtopic.php?t=2979
http://forum.routerboard.com/viewtopic.php?t=2953
http://forum.routerboard.com/viewtopic.php?t=2996
http://forum.routerboard.com/viewtopic.php?p=11645
http://www.answers.com/topic/yaffs
http://wiki.openwrt.org/OpenWrtDocs/Hardware/Mikrotik/RB100
http://freewrt.org/trac/wiki/Documentation/Filesystems/YAFFS2
http://midge.vlad.org.ua/forum/viewtopic.php?t=230
http://lwn.net/Articles/210046/
http://www.mjmwired.net/kernel/Documentation/filesystems/ramfs-rootfs-initramfs.txt
http://www.aleph1.co.uk/yaffsoverview
http://osdir.com/ml/linux.ports.arm.cirrus/2007-02/msg00017.html
http://opensvn.csie.org/s1mp3/s1flash/flash.cpp
http://forum.routerboard.com/viewtopic.php?p=11813&sid=7ea60ea653b0c1ff993588b091a45807
http://balloonboard.org/lurker/list/message/20070103.015008.2a9a33da.en.html
http://lists.infradead.org/pipermail/linux-mtd/2007-May/018102.html
http://osdir.com/ml/linux.ports.arm.cirrus/2007-02/msg00017.html
http://forum.routerboard.com/viewtopic.php?p=11645&sid=b4bf1c44c144c6587960bc9436ac9a9c
http://wookware.org/lurker/list/message/20061215.133930.f6db2e18.en.html
http://mail-index4.netbsd.org/tech-embed/2007/03/08/0000.html
http://www.linux-mtd.infradead.org/faq/general.html
http://www.linux-mips.org/
http://www.openwrt.org/
http://freewrt.org/trac/wiki/Documentation/Hardware/RouterBoard532
http://www.amilda.org/
http://midge.vlad.org.ua/
http://www.molsonrocks.com/?page_id=17
http://www.me2000.net/wiki/index.php/Linux_on_a_Routerboard_from_Scratch
http://wiki.mikrotik.com/wiki/RB500_Linux_SDK
http://pefnos.homelinux.org/pub/routerboard/
http://www.itee.uq.edu.au/~peizhao/linux-stuff/rb500debian.html
http://www.cosam.org/computers/hardware/rb500.html
http://www.routerboard.com/debian/linux-install-sdk-beta1.html
http://artax.karlin.mff.cuni.cz/~zajio1am/texts/debian_sarge_on_rb532.html
http://forum.openwrt.org/
http://forum.amilda.org/
http://midge.vlad.org.ua/forum/
http://forum.routerboard.com/
http://www.student.tue.nl/Q/t.f.a.wilms/adm5120/
http://kegel.com/crosstool/
http://www.seattlewireless.net/index.cgi/NetgearWG602
http://people.zoy.org/~walken/wgt634u/HOWTO.html
http://www.tldp.org/HOWTO/Bootdisk-HOWTO/
There are 2 versions of the board. The latest version of the board has 128 meg NAND memory instead of 64. You can tell this by looking at the chip or running:
"dmesg | grep NAND"
CHIP: HY27US08121M DMESG: NAND device: Manufacturer ID: 0xad, Chip ID: 0x76 (Hynix NAND 64MiB 3,3V 8-bit)
CHIP: HY27UF081G2M DMESG: NAND device: Manufacturer ID: 0xad, Chip ID: 0xf1 (Hynix NAND 128MiB 3,3V 8-bit)
Your sytem may show “Unknown” as the manufacturer. If you have a 128 meg chip you need to have YAFFS2 support which only became available 3 days ago. You need it because it supports the new devices that have larger page sizes.
The older 64 meg device had 512 byte pages with a 16 byte OOB area per page. The new device has pages 4 times the size 2048b size - 64b OOB.
YAFFS1 only support 512b page devices.. ie the older chip.
There is no bootloader on the RB. The bios is the bootloader.
Basically the bios treats the first 4 megs of disk as a 4 meg YAFFS partition. YAFFS is a very simplistic FS that does not really support partitioning. The partition paramaters are usually hard coded into the driver or the loader. Basically a YAFFS partition can consist of just a bunch of sequential sectors.
What happens on boot is that the bios scans the first YAFFS partition (ie the first 4 megs of your device) and runs the first ELF (linux binary) header that it finds.
You could concievably get lilo or grub or whatever to run instead of the kernel and then have it choose a kernel to boot but the issue is that neither lilo nor grub have support for MTD type file structures such as YAFFS or JFFS2. You could run ext2 on the CF card and this would make them plausable but you have to run YAFFS or JFFS2 on the NAND. It is NOT an option.
The best way to select which rootfs to boot from is to create a kernel with the appropriate settings already in it, and replace the kernel on the 4 meg boot “partition”
(to use your compact flash)
#echo root=/dev/cfa2 > kernel-parameters
(to use your onboard YAFFS NAND device )
#echo root=/dev/mtdblock1 > kernel-parameter
(now inject the paramater into the kernel binary)
#mipsel-linux-objcopy --add-section kernparm=kernel-parameters vmlinux
You can only objcopy before you strip, after you strip the kernel you cant objcopy it, the symbols to do that are gone. (Stripping is a way to reduce your kernel size by removing debug symbols. Check “man strip” for more info).
Like I mentioned, the first partitonm on the disk HAS to be a 4 meg YAFFS partition. so that the bios can handle it properly. To update the kernel on a CF or the NAND is a tricky bit of work.
To update the onboard NAND its best you have a CF OS image with YAFFS support (the one available from the routerboard site should do) and then you mount /dev/mtdblock0 on /mnt (or wherever and then overwrite the kernel thats there with
#rm /mnt/kernel #cp vmlinux /mnt/kernel
The compact flash issue is a bit trickier. I normally use the 128 meg image and use Hexworkshop for windows to open the compact flash as a physical disk and then dump the kernel to sector 32 onwards. You can also do this with the linux utility dd with something like
#dd if=vmlinux of=/dev/sda bs=512 seek=32
Note that this method does NOT work for the NAND device as the NAND device may contain physical errors (this is normal) that need to be skipped by the YAFFS driver. NB: using dd on your nand is VERY BAD.
Download the netinstall & routeros-xx.npk unzip the netinstall file run netinstall.exe wine works also quite well
on the routerboard select boot from ethernet & bootp protocol on the netinstall application select the routeros-rb500 package press net booting & select boot server enable, put a free IP from the subnet of your LAN press ok
on the routerboard press letter "x" in order to proceed with net boot you should get the IP you gave above & the net boot will start after the net boot yoy will see a mac address on the window select the mac address and press install when installation is finished, exit the netinstall application and press enter on the routerboard in order to reboot the new routerOS
1. Hardware
The board comes with a MIPS32 4Kc based 175MHz embedded processor, Infineon ADM5120.
There are currently 5 boards in this range:-
1. 112 The original 1xx board, two mini-pci, 16MB RAM, 64MB NAND Flash, one ethernet, no CF 2. 133 Three mini-pci, 32/16MB RAM, 128/64MB NAND Flash, three ethernet, no CF 3. 133c One mini-pci, 32/16MB RAM, 128/64MB NAND Flash, one ethernet, no CF 4. 150 No mini-pci, 32MB RAM, 64MB NAND Flash, five ethernet, no CF 5. 153 Three mini-pci, 32MB RAM, 64MB NAND Flash, give ethernet, one CF
2. Installation
Installing OpenWrt on these boards (apart from the 153) is only possible by using the NetBoot facility. For this you will need a serial connection as console, and an ethernet connection to load the kernel and then download the flash image. You will also need to have BOOTP and TFTPD servers on your machine. This can be done either using independent packages or using DnsMasq. You will also need a Web server.
The minicom settings for a connection using a USB serial port would be:-
# Machine-generated file - use setup menu in minicom to change parameters. pu port /dev/ttyUSB0 pu backspace BS pu baudrate 115200 pu bits 8 pu parity N pu stopbits 1 pu scriptprog /usr/bin/runscript pu minit pu mreset pu mdialpre pu mdialsuf pu mdialpre2 pu mdialsuf2 pu mdialpre3 pu mdialsuf3
Unfortunately you need to build two kernels in order to install this system. The first has a RAMDISK built into it so that you can download it using the Netboot facility and have a working system without a disk, and the second is the one that is going to be installed on the flash and will be your running kernel.
All the building happens under the ADM5120-2.6 target, so the first thing you need to do is to download an SVN copy of OpenWrt Kamikaze, and then run make menuconfig.
As the ADM5120 support is currently under development you need to tell menuconfig that you wish to work with broken targets, you do this in the Advanced Options for Developers section.
Now select the ADM5120-2.6 target. Then in the Target Images section select RAMDISK. This will disable all the other image options.
There is no need to make package selections at this stage as all the packages you will need to install the system are there by default.
Save the configuration and run make (this will take a while).
You should now have a file in the bin directory called openwrt-adm5120-2.6-vmlinux.elf, and this should be copied to your TFTPD directory.
Now you need to build the running image, and for this you will need to run make clean (to get rid of the old settings) and then run make menuconfig again. This time select TAR as the Image type. Once you have completed the configuration you can run make (and once again wait a while).
You can at this stage go through and select the packages that you are actually going to want (although you can always add them later with ipkg).
This time you will find a file in the bin directory called openwrt-adm5120-2.6-rootfs.tgz, and the kernel will be in build_mipsel/linux-2.6.19-adm5120 (or whatever the current kernel is) and will be called vmlinux.elf. Copy these two files into a directory which can be reached by your web server as openwrt-adm5120-2.6-rootfs.tgz and openwrt-adm5120-2.6-vmlinux.
Now you can power up your RB1xx and download the kernel. At this stage you are using the first kernel you produced above.
When you boot the RB1xx, go into the BIOS settings and say that you want to use Netboot rather than using the NAND as the boot source.
When the kernel is booted hardly any of the normal OpenWrt initialisation occurs - you will not find that modules have been loaded or the network configured.
In /sbin however you will find a script called wget2nand which will do the installation for you, using the second kernel and the flash image.
wget2nand takes a single parameter, the URL of the directory into which the tgx and vmlinux files were stored. wget2nand assumes you are still running DnsMasq (or whatever was your Bootp server) and that it will also serve addresses using DHCP.
When you reboot you need to change the BIOS settings back to booting from the NAND.
Once the installation is complete then you can reboot your RouterBoard 1xx card and you should have a running system.
NAND is a certain type of flash chip types. It differs in some points to the somewhat older NOR flash commonly used in all Broadcom devices. See here for more information.
YAFFS was written to satisfy the special needs of NAND flash. Originally JFFS2 was taken as basis, which itself improved (not least in form of JFFS3) to better support NAND flash, too.
The second release of YAFFS especially points to supporting newer NAND flash chips with 2k page size and up to 128MB capacity.
Installing FreeWRT Into RouterBoard's NAND Flash
Installation is done nearly the same way as with CompactFlash. So to get direct access to the NAND flash (to be able to mount it e.g.), there needs to be an already running version of FreeWRT somewhere. It's up to your choice if that's a CompactFlash disk or a NFSRoot for netbooting. You just have to make sure there is enough free space on either medium to hold the RootFS tarball.
After booting into the existing Operating System, just mount the second (i.e. root) partition:
mount /dev/mtdblock1 /mnt
The filesystem type should be selected automatically, in doubt you can also use -t yaffs2. If you're getting errors about unerased or retired blocks, you must erase the flash before use, as the data on it is somehow corrupted.
Then you need to unpack the tarball into the mounted partition. It's your choice if you like to specify the target as parameter to tar, or if you just cd into the dir first. Following is the first method:
tar xvzfp /rootfs-2.6-rb-yaffs2.tar.gz -C /mnt
After unpacking, all there is left to do is executing the script called 'instprep-rb.sh' in the newly created RootFS's topdir. In our example this is as follows:
./mnt/instprep-rb.sh
This script will do a few things at once:
After this is done, you can unmount the partition and reboot. After giving 'boot from NAND' as default boot medium inside RouterBOOT, FreeWRT should come up from flash.
Erasing The NAND Flash
Probably the most simple way of doing this is via RouterBOOT. Besides for version 1.5 (which you can't download anyway), there is a menu option 'format nand' doing the job. Alternatively the binaries 'flash_erase' and 'flash_eraseall', contained in the mtd-utils project work fine, too.
Caveats
Here are some things you can check if your device disagrees with you about how it should behave.
You can simply mount the first partition and check if there is a file named “kernel” (yes, actually it is your kernel). RouterBOOT searches for it with exactly this name in the first partition's filesystem's root directory.
Mount the second flash partition and check the RootFS. E.g. check if there are device nodes in /dev.
If you have a bare RootFS and don't know whether it is for use with NFS, CompactFlash? or YAFFS2, just open the script 'instprep-rb.sh' in the filesystem's topdir. The variable 'MYTARGET' holds the filesystem type the RootFS (and especially it's kernel) is ment for. (The value is written into it at install time.)
YAFFS2 And NAND Quirks
Both memory type and filesystem have some special properties one should be aware of to not getting surprised someday.
Page and erase size: as already mentioned above, page sizes can vary from 512Bytes to 2kBytes. The erase size for large page devices though is 128kBytes. To prevent excessive wear, if less than a full erase block is written to flash and deleted after, the block is not erased immediately. This not done until the whole block is full of invalid data. This gets visible when writing a few small files to disk. Used space (as reported by 'df') increases a lot with the first file (more than it's size), and doesn't increase at all when all other files are written.
Checkpoints: To improve mount time, yaffs2 has a feature called 'checkpoints'. These Checkpoints are blocks of meta information held in the filesystem itself. You could statically reserve a count of blocks for this meta information (by editing the source code ;), but FreeWRT let's this count in/decrease dynamically. So if you write lot's of data to your partition, the overhead increases reasonably (only viewable after remounting, as Checkpoints get written at unmount time). But as more data gets written to disk, these Checkpoints are one after another forgotten, and the space covered by them gets available for normal data.
Links
http://www.linux-mtd.infradead.org/doc/nand.html
http://www.linux-mtd.infradead.org/tech/mtdnand/index.html
http://www.aleph1.co.uk/yaffsoverview
This guide will describe procedures needed to install Debian GNU/Linux distribution on RouterBOARD 500 series computers over network, as well as provide some information needed to use RouterBOARD 500 boards on that GNU/Linux system.
Note that these instruction were tested with Debian 3.0 “Woody” release and might not apply to other releases
Making Debian installer
Kernel image and drivers.tgz
Every architecture has its own rescue.bin floppy image and drivers.tgz. Both of them are used to get kernel with drivers on a system. rescue.bin is a simple ext2 image that contains linux kernel. It is also used as a rescue floppy. drivers.tgz is a tar archive with driver modules. Our MIPS system is not recognised, so it is named “unknown”.
Original files are located at: http://ftp.ee.debian.org/debian/dists/woody/main/disks-mipsel/current/. r3k-kn02 architecture was used as an sample.
To upgrade kernel, rescue.bin should be mounted and the new kernel should be copied over. Note that “root_fs” kernel parameter should be “/dev/cfa2”.
Debian Installer (boot-floppies)
We are using the old woody installer known as boot-floppies. It is contained in root.tgz located at: http://ftp.ee.debian.org/debian/dists/woody/main/disks-mipsel/current/. All of its contents should be copied in to initrd image. initrd should be at least 8Mb (otherwise it won't have enough space).
To create initrd:
dd if=/dev/zero of=initrd bs=1024 count=8192 /sbin/mke2fs -F -b 1024 initrd
Copy all stuff into initrd:
mkdir mnt mount initrd -o loop=/dev/loop0 mnt cd mnt unpack root.tar.gz mv debian-mipsel-root/* . rm -rf debian-mipsel-root
Remove unneeded file:
rm linuxrc
Add /dev/cfa:
mknod dev/cfa b 13 0 mknod dev/cfa1 b 13 1 mknod dev/cfa2 b 13 2 mknod dev/cfa3 b 13 3 mknod dev/cfa4 b 13 4
Remove installation of delo:
sed -i s/delo// usr/lib/debootstrap/scripts/woody
Make initrd.gz
cd .. umount mnt gzip initrd
Compile kernel patched with the provided patch. A congifuration file “.config” should be present in the kernel directory. The kernel patch may have created it under different name, so you might need to rename it.
make ARCH=mips oldconfig vmlinux
take vmlinux and rename it to linuxrc. Then make a boot TFTP image:
echo "root=/dev/ram0" >kernel.params mipsel-linux-uclibc-objcopy --add-section kernparm=kernel.params linuxrc mipsel-linux-uclibc-objcopy --add-section initrd=initrd.gz linuxrc
To make regular boot kernel, take another copy of vmlinux
echo "root=/dev/cfa2" >kernel.params mipsel-linux-uclibc-objcopy --add-section kernparm=kernel.params vmlinux
Then use DHCP & TFTP to make board boot with etherboot into linuxrc and Debian installation can start.
Setting up the Installation Server
First to install the RouterBOARD system, you need to prepare installation server which will provide initial boot image for the device. A BOOTP/DHCP server and a TFTP server must be installed on the installation server. The RouterBOARD should also receive an IP address which will allow it to use DNS and HTTP protocols to access the Internet.
We used the ATFTPd TFTP server, which does not require configuration (except, perhaps, the TFTP root directory), and ISC DHCPd version 3 DHCP server.
The DHCP configuration used to boot up the RouterBOARD computer that has 00:09:22:22:22:00 MAC address on the Ethernet port, which is connected to the 192.168.0.0/24 network:
default-lease-time 21600; max-lease-time 2100;
host rb500 { hardware ethernet 00:09:22:22:22:00; filename "/linuxrc"; fixed-address 192.168.0.10; }
subnet 192.168.0.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; next-server 192.168.0.2; option broadcast-address 192.168.0.255; option routers 192.168.0.1; }
Note that the DHCP and TFTP server itself has the IP address of 192.168.0.2, and the default gateway for the network is 192.168.0.1
You should place the linuxrc file (which you can get at http://www.routerboard.com/debian/linuxrc) in the TFTP root directory, so that the RouterBOARD would be able to download it.
Preparing the RouterBOARD
The board has to be properly powered. We will use the first Ethernet port for booting the device. Serial console cable must be connected, and you will need some kind of terminal emulator program to interact with the RouterBOARD (like HyperTerminal for Windows or minicom for GNU/Linux). The GNU/Linux will be installed on a CompactFlash drive that you should insert in the appropriate connector on the RouterBOARD. Please note that minimal size of the CompactFlash device for a normal GNU/Linux installation is 128MB
You should also configure its BIOS so it could boot from network:
What do you want to configure?
d - boot delay k - boot key s - serial console o - boot device m - memory test u - cpu mode f - try cpu frequency c - keep cpu frequency r - reset configuration g - bios upgrade a - mac addresses p - boot protocol t - do memory testing x - exit setup
your choice: p - boot protocol
Press 'p' and select the booting protocol:
Choose which boot protocol to use: * 1 - bootp protocol
2 - dhcp protocol
your choice: 2 - dhcp protocol
Select '2' for DHCP
Then press 'o' to select boot device:
Select boot device:
e - boot over Ethernet n - boot from NAND
* c - boot from CF
b - boot chosen device
your choice: e - boot over Ethernet
You need to select 'e' here.
Initial installation (first stage)
Now, if the installation server was configured correctly, the “Release Notes” screen should appear on your terminal console. If you do not see the “Release Notes” screen, please check your server configuration (perhaps, log files will be of a help), the linuxrc file and the serial console settings.
Please follow this step-by-step instruction to install the base system on the CompactFlash drive:
Now the first-stage installation ir completed, and you will need to switch the BIOS settings to boot from the newly installed CompactFlash:
What do you want to configure?
d - boot delay k - boot key s - serial console o - boot device m - memory test u - cpu mode f - try cpu frequency c - keep cpu frequency r - reset configuration g - bios upgrade a - mac addresses p - boot protocol t - do memory testing x - exit setup
your choice: o - boot device
Select baud rate for serial console: * e - boot over Ethernet
n - boot from NAND c - boot from CF b - boot chosen device
your choice: c - boot from CF
Configuring base system (second stage)
Now when the packages are installed, some configuration is needed. As the configuration questions depend on the versions of software that will be current when you will be installing it, and also as you might want not to agree to the proposed configuration, there is no step-by-step instructions given for this stage, just some recommendations:
Now you have a working system. Some useful recommendations on how to free up some space and how to install something on this system are given in the next section of this manual
Fine-tuning the system (third stage)
This section describe some steps to get more of your system. These steps are most useful when installing on a small medium (like 128MB CompactFlash).
1. First of all, lets remove some unneeded packages. Run "apt-get remove ppp pppconfig tasksel setserial info nvi pppoe pppoeconf ed fdutils bsdmainutils adduser man-db console-common gettext-base groff-base manpages modconf libreadline4 libgdbmg1". If you do not need telnet, you can also remove "telnet" package. 2. Use "nano /etc/apt/sources.list" to comment out all unneeded apt sources. Lines starting with "deb-src" may probably be commented if you do not want to recompile Debian packages yourself. Also change "stable" to "testing" in this file so that more packages would be available for you (the current stable release does not have many useful packages for the mipsel architecture) 3. Run "apt-get update" for apt to update its package cache (and free up some space). On a 128MB module you should now have about 25 to 30 MB free (check with "df"). If not, try doing "apt-get clean; rm -rf /var/lib/dpkg/*-old". 4. Install debconf-english to get rid of Debian configuratio internationalization ant then install localepurge program which will clean up some more by removing unneeded locales and translated man pages. You can do this with "apt-get install debconf-english; apt-get install localepurge debconf-english". This will upgrade some existing packages as well as install some new ones. Do not select any locales, and choose to remove localized man pages. Run "apt-get clean; rm -rf /var/lib/dpkg/*-old" after installation. 5. Previous update may have left one legacy package, so let's remove it: "apt-get remove libnewt0" 6. You may also want to replace a somehow bloated version of nano with a smaller one: "apt-get remove nano; apt-get install nano-tiny" 7. Now you can install other packages you need (like ftp, ssh, mc, ...). For example, we used the additional "apt-get install ftp ssh mc" command before generating our ready-to-use GNU/Linux images. Do not forget doing "apt-get clean; rm -rf /var/lib/dpkg/*-old" each time after installing packages to free up space used by temporary files and package archives 8. If you have more than 60MB left free (i.e., if you are not using 128MB medium, which will still have only 25MB left after all these magic tricks), you are advised to complete upgrade to the testing release by issuing the "apt-get dist-upgrade" command. Also there is a good apt frontend called aptitude, which you can use to further manage the packages.
If you need to configure network later, please edit file called “/etc/network/interfaces”. The syntax is selfexplanatory, and you will also be able to find many manuals on how to configure it.
Now you have a standard Debian GNU/Linux system with almost maximum free space it is possible to get. Please note that we do not provide support service or training of any kind for this system - you will just have to find all necessary information how to work with this system by yourself.
Using RouterBOARD 500 specific functions
Boot image
The RouterBOOT boot loader can load and execute an ELF image from the selected medium (either onboard NAND, or CompactFlash device). This image must be compiled for “mipsel” (little-endian MIPS) architecture. If you are compiling it on a non-mipsel computer (for example, on an Intel IA-32 PC), you will need a crosscompiler, which you will have to make by yourself (see http://www.mobilab.unina.it/Resources/crosscompilerHOWTO.html, http://www.kegel.com/crosstool/ and Google for more information).
In case the ELF image you want to boot is Linux kernel, you should remember the following:
echo root=/dev/cfa2 > kernel-parameters mipsel-linux-objcopy --add-section kernparm=kernel-parameters vmlinux
Loading ELF image from CompactFlash device
RouterBOOT loads contents of first partition with type 39 (0x27). If there is no such partition, it displays message “CF BOOT FAILURE: kernel partition missing!”. There is no filesystem on this partition, it contains raw ELF image, so it can be copied using the “dd” utility. The partition may have any size if it is correctly stated in the partition table.
Loading ELF image from NAND device
RouterBOOT treats first 0x400000 bytes (4 megabytes) of the onboard NAND chip as a partition with yaffs filesystem. No partition table is stored on NAND, so location and size of this first partition is hardcoded in the RouterBOOT loader. It searches for a regular file in the root directory, named “kernel”. If it is not found, RouterBOOT displays message “kernel not found”, otherwise it prints “loading kernel from nand”. If there is error loading this file, it displays “data is corrupted”.
To access partition that contains kernel:
mount -t yaffs /dev/mtdblock0 /mnt
To access the second NAND partition, that is used by kernel as root filesystem when booting from nand:
mount -t yaffs /dev/mtdblock1 /mnt
Safest way to access NAND is through filesystem. It is not supposed to be accessed by the standard utilities such as “dd” to write directly to /dev/mtd0 and /dev/mtd1, because these utilities do not update ECC, do not check for bad blocks and do not perform other NAND-specific operations. For direct access use “flash_eraseall”, “nanddump” and other utilities from linux-mtd toolkit (http://www.linux-mtd.infradead.org/)
The kernel is in a separate partition because to access files on yaffs partition, you need to scan the whole partition. Yaffs is very fast in this respect, but it still takes time and memory (~32 k for every megabyte). Bigger partition means slower booting. Note that if you compile your own yaffs code (not from the linux kernel patch provided on routerboard.com), you must use the same yaffs compilation flags, especially those related to ECC.
What paremeters does RouterBOOT pass to kernel
RouterBOOT appends some kernel parameters that contain information about board and startup configuration. Here is the meaning of some of them:
Accessing the User LED
There is a “changeLatchU5” function in the patched kernel, which is defined in “linux/arch/mips/rc32434/rb500/rb.c” and declared in “linux/include/asm-mips/rc32434/rb.h”
Accessing the GPIOs
JP1 is connected to GPIO pin 3, S1 to GPIO pin 1. These are also used for serial port, so it should be disabled before reading GPIO state at runtime. For details on GPIO access consult the IDT manual. The same function of the patched kernel used for changing LED states, can be used to disable serial port:
Keywords: mknbi, objcopy, kernparm
1. Build a custom kernel vmlinuz for the unit under test. 2. Create an empty file initrd, the size of the initial RAM disk. 3. Make a Linux file system on initrd. 4. Mount initrd on a temporary directory initrd.d using the loopback device option –o loop. 5. Populate the file system mounted on initrd.d. 6. Unmount initrd, leaving behind the initial RAM disk file initrd. 7. Compress initrd with gzip. 8. Merge the kernel and initial RAM disk into a tagged image file.
dd if=/dev/zero of=/boot/initrd bs=1M count=16 mke2fs -F -m 0 -b 1024 /boot/initrd mkdir /mnt/initrd mount -t ext2 -o loop /boot/initrd /mnt/initrd cp -a /rootfs/* /mnt/initrd/
pushd . cd /mnt/initrd/ mknod dev/null c 1 3 mknod dev/tty c 5 0 mknod dev/console c 5 1 mknod dev/cfa b 13 0 mknod dev/cfa1 b 13 1 mknod dev/cfa2 b 13 2
mknod dev/mtd0 c 90 0
mknod dev/mtd1 c 90 2 mknod dev/mtdblock0 c 31 0 mknod dev/mtdblock1 c 31 1
mknod dev/ram0 b 1 0 mknod dev/ram1 b 1 1 mknod dev/mem c 1 1 mknod dev/kmem c 1 2 mknod dev/zero c 1 5
cd dev ln -s ram0 ramdisk ln -s ../proc/kcore kcore cd ..
chown -R 0:0 * chmod 1777 tmp/ chmod u+s bin/busybox
popd . umount /boot/initrd gzip /boot/initrd
mkelf-linux build_mipsel/linux-2.4-rb/vmlinux --output=kernel --rootdir=/dev/ram0 /boot/initrd.gz
rdev zImage /dev/ram0 mknbi-linux zImage --output=kernel --rootdir=/dev/ram0 /tmp/initrd
mkelf-linux is not working for me, so here is another way:
Kernel compilation and setup
Now we have an initial ramdisk that can be directly linked with our kernel. I am not going to go into great detail here on how to build a kernel for the BE (there is plenty of information on this elsewhere). First cd into the root of your kernel sources and copy the gzipped ramdisk, initrd.gz, to arch/mips/ramdisk/ramdisk.gz.
cp ../initrd.gz arch/mips/ramdisk/ramdisk.gz
Now build the kernel as you would normally and make sure you include the options ramdisk, initial ramdisk, and embed root filesystem ramdisk into the kernel. If you plan on following the PicoGUI tutorial you will also need to add TCP/IP Networking support. You should also make sure that the default ramdisk size is equal to the size of you ramdisk in 1k blocks.
Once you have built the kernel copy the kernel to your BE or compact flash card with the bootloader and bootloader config (cyacecfg.txt) , and make sure your bootloader config has the proper append line (append=console=tty0 console=ttyS0,9600 root=/dev/ram). At this point you may want to hook your BE up to your serial port (if you have the serial cable) and start up minicom or some other terminal program. Start up the bootloader and be amazed!
setkernels.sh
#!/bin/sh echo "Making '$1-cfa2' from '$1' for CF" objcopy --add-section kernparm="root=/dev/cfa2" $1 $1-cfa2 echo "Making '$1-nfs' from '$1' for NFS" objcopy --add-section kernparm="root=/dev/nfs nfsroot=10.1.1.17:/share/debian ip=dhcp" $1 $1-nfs
echo root=/dev/ram0 rw gpio=16375 console=ttyS0,115200 >kernel.params mipsel-linux-uclibc-objcopy --add-section kernparm=kernel.params vmlinux mipsel-linux-uclibc-objcopy --add-section initrd=rootfs.gz vmlinux
strip vmlinux
mipsel-linux-strip vmlinux
find /rootfs | cpio -o -H newc | gzip > initramfs.gz mkimage -n 'Linux 2.6 and initramfs' -A mips -O linux -T multi -C gzip -a 0x00000000 \ -e 0x00000000 -d $(OUTPUT_DIR)/kernel/vmlinux.gz:$(OUTPUT_DIR)/images/initramfs.gz \ $(OUTPUT_DIR)/images/uLinux-initramfs.img
make[5]: Leaving directory `build_mipsel/linux-2.6-rb532/linux-2.6.19.2' mipsel-linux-uclibc-objcopy -O binary -R .reginfo -R .note -R .comment -R .mdebug -S \ build_mipsel/linux-2.6-rb532/linux-2.6.19.2/vmlinux build_mipsel/linux-2.6-rb532/vmlinux mipsel-linux-uclibc-objcopy -R .reginfo -R .note -R .comment -R .mdebug -S \ build_mipsel/linux-2.6-rb532/linux-2.6.19.2/vmlinux build_mipsel/linux-2.6-rb532/vmlinux.elf touch build_mipsel/linux-2.6-rb532/linux-2.6.19.2/.image make[4]: Leaving directory `target/linux/rb532-2.6' make[3]: Leaving directory `target/linux' make -C linux/rb532-2.6/image compile make[3]: Entering directory `target/linux/rb532-2.6/image' cc -o staging_dir_mipsel/bin/patch-cmdline target/linux/rb532-2.6/src/patch-cmdline.c make[3]: Leaving directory `target/linux/rb532-2.6/image' make -C linux/rb532-2.6/image install make[3]: Entering directory `target/linux/rb532-2.6/image' cc -o staging_dir_mipsel/bin/patch-cmdline target/linux/rb532-2.6/src/patch-cmdline.c cat build_mipsel/linux-2.6-rb532/vmlinux | staging_dir_mipsel/bin/lzma e -si -so -eos -lc1 \ -lp2 -pb2 > build_mipsel/linux-2.6-rb532/vmlinux.lzma LZMA 4.32 Copyright (c) 1999-2005 Igor Pavlov 2005-12-09 make -C target/linux/generic-2.6/image/lzma-loader KDIR=build_mipsel/linux-2.6-rb532 \ LOADADDR=0x81000000 KERNEL_ENTRY=0x80101000 RAMSIZE=0x00100000 IMAGE_COPY=1 clean compile make[4]: Entering directory `target/linux/generic-2.6/image/lzma-loader' rm -rf build_mipsel/linux-2.6-rb532/loader-0.05 rm -f build_mipsel/linux-2.6-rb532/loader.elf mkdir build_mipsel/linux-2.6-rb532/loader-0.05 cp -fpR ./src/* build_mipsel/linux-2.6-rb532/loader-0.05/ touch build_mipsel/linux-2.6-rb532/loader-0.05/.prepared cp -fpR build_mipsel/linux-2.6-rb532/vmlinux.lzma \ build_mipsel/linux-2.6-rb532/loader-0.05/vmlinux.lzma PATH="staging_dir_mipsel/usr/sbin:staging_dir_mipsel/usr/bin:staging_dir_mipsel/bin:\ staging_dir_mipsel/usr/sbin:staging_dir_mipsel/usr/bin:staging_dir_mipsel/bin:\ staging_dir_mipsel/usr/sbin:staging_dir_mipsel/usr/bin:staging_dir_mipsel/bin" make -C build_mipsel/linux-2.6-rb532/loader-0.05 \ CC="mipsel-linux-uclibc-gcc" CROSS_COMPILE="mipsel-linux-uclibc-" \ RAMSIZE=0x00100000 \ LOADADDR=0x81000000 \ KERNEL_ENTRY=0x80101000 \ IMAGE_COPY=1 make[5]: Entering directory `build_mipsel/linux-2.6-rb532/loader-0.05' mipsel-linux-uclibc-gcc -fno-builtin -Os -G 0 -ffunction-sections -mno-abicalls -fno-pic \ -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -Wall \ -DRAMSTART=0x80000000 -DRAMSIZE=0x00100000 -DKERNEL_ENTRY=0x80101000 -D_LZMA_IN_CB \ -DLOADADDR=0x81000000 -DIMAGE_COPY=1 -c start.S -o start.o mipsel-linux-uclibc-gcc -fno-builtin -Os -G 0 \ -ffunction-sections -mno-abicalls -fno-pic -mabi=32 -march=mips32 -Wa,-32 -Wa, \ -march=mips32 -Wa,-mips32 -Wa,--trap -Wall -DRAMSTART=0x80000000 -DRAMSIZE=0x00100000 \ -DKERNEL_ENTRY=0x80101000 -D_LZMA_IN_CB -DLOADADDR=0x81000000 -DIMAGE_COPY=1 \ -c decompress.c -o decompress.o mipsel-linux-uclibc-gcc -fno-builtin -Os -G 0 -ffunction-sections -mno-abicalls -fno-pic \ -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -Wall \ -DRAMSTART=0x80000000 -DRAMSIZE=0x00100000 -DKERNEL_ENTRY=0x80101000 -D_LZMA_IN_CB \ -DLOADADDR=0x81000000 -DIMAGE_COPY=1 -c LzmaDecode.c -o LzmaDecode.o sed -e 's,@LOADADDR@,0x81000000,g' -e 's,@ENTRY@,_start,g' lzma.lds.in >lzma.lds mipsel-linux-uclibc-ld -r -b binary --oformat elf32-tradlittlemips -o kernel.o vmlinux.lzma sed -e 's,@LOADADDR@,0x81000000,g' -e 's,@ENTRY@,entry,g' lzma.lds.in >lzma-stage2.lds mipsel-linux-uclibc-ld -static --no-warn-mismatch -e entry -Tlzma-stage2.lds -o temp-lzma.o \ decompress.o LzmaDecode.o kernel.o ipsel-linux-uclibc-objcopy -O binary -R .reginfo \ -R .note -R .comment -R .mdebug -S temp-lzma.o lzma.tmp mipsel-linux-uclibc-ld -no-warn-mismatch -T lzma-data.lds -r -o lzma.o -b binary lzma.tmp \ --oformat elf32-tradlittlemips sed -e 's,@LOADADDR@,0x80101000,g' lzma-copy.lds.in \ > lzma-copy.lds mipsel-linux-uclibc-ld -s -Tlzma-copy.lds -o lzma.elf start.o lzma.o make[5]: Leaving directory `build_mipsel/linux-2.6-rb532/loader-0.05' cp -fpR build_mipsel/linux-2.6-rb532/loader-0.05/lzma.elf \ build_mipsel/linux-2.6-rb532/loader.elf make[4]: Leaving directory `target/linux/generic-2.6/image/lzma-loader' find build_mipsel/root -type f -not -perm +0100 -not -name 'ssh_host*' | xargs -r chmod 0644 find build_mipsel/root -type f -perm +0100 | xargs -r chmod 0755 find build_mipsel/root -type d | xargs -r chmod 0755 mkdir -p build_mipsel/root/tmp chmod 0777 build_mipsel/root/tmp cp -fpR build_mipsel/linux-2.6-rb532/loader.elf bin/openwrt-rb532-2.6-vmlinux make[3]: Leaving directory `target/linux/rb532-2.6/image'