Introduction
============
This document describes in depth how to prepare your D-Link DSM-G600 for installing NetBSD/sandpoint. Be aware that there are two revisions of the G600, which look very similar:
- Revision A, running a 266MHz ARM IXP420
- Revision B, running a 200MHz PowerPC 8241
NetBSD/sandpoint runs on the B revisions only. You can determine the revision by looking on the sticker at the left side of the case, where you should find a line starting with: HW Ver: . The following letter is either an A or a B . |
|
Accessing the serial interface
==============================
We need a serial console to get access to the firmware. That includes
soldering a four-wire ribbon cable and building (or buying) a serial
adapter from the G600's TTL levels to RS232 levels.
Locate the serial port
----------------------
Look out for a connector labeled `J3`, near the battery. You will
usually see four unpopulated pads there. On a few boards there is
already a connector socket mounted, but it is hard to find the
appropriate plug.
Pin number |
Function |
1 |
3.3V |
2 |
TXD |
3 |
RXD |
4 |
GND |
|
|
Attaching a serial cable
------------------------
When there is no socket at `J3` I would suggest to solder a 4-wire
ribbon cable to the pads. Use the red wire to indicate pin 1. You may
attach a plug on the other end of the cable, which can be used to
connect it to an external serial level shifter circuit.
Otherwise you have to find a matching plug for the socket and connect
the serial cable to it. Or desolder the socket.
Connect a serial terminal via a converter
-----------------------------------------
The serial port on the D-Link DSM-G600 is using 3.3V TTL levels, which
have to be converted into regular RS232 levels by a level shifter
circuit. Instructions how to build such a circuit yourself can be found
here:
- [Serial adapter for 3.3V TTL](http://www.netbsd.org/ports/sandpoint/ttl2rs232.html)
Make sure that the layout of the connector fits to the pinout of the
DSM-G600's serial port, as shown above.
Another option is to buy such a converter. There are solutions for a
standard RS232 interface and for an USB interface. Look out for:
- RS232 level shifter / breakout board (MAX3232 based)
- USB to TLL serial level shifter / breakout board (FT232 based)
Now you can connect with any terminal program to the DSM-G600's serial
console. The easiest approach may be to use NetBSD's `tip(1)` command to
make a direct console connection at 9600bps.
# tip console
Note that when using a serial connection via USB you may have to make an
entry for `/dev/ttyU0` in `/etc/remote`.
First time installation
=======================
The altboot bootloader
----------------------
The `altboot(8)` program functions as a bridge between the U-Boot
firmware and the NetBSD kernel startup environment. NAS firmware often
provides no means to boot a kernel from disk or from the network and
doesn't initialize all hardware correctly. We will also use it to pass a
bootinfo list to the kernel.
The `altboot` boot loader has to be loaded and started using the
DSM-G600's firmware, which is `U-Boot 0.2.0`.
U-Boot 0.2.0 (May 26 2005 - 19:38:32)
CPU: MPC8245 V1.2 at 170.503 MHz:
Board: Sandpoint 8245
DRAM: 32 MB
FLASH: FUJI_DL323BE
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
D-Link's U-Boot version is extremely restricted. Probably to keep it
small and to save space for a Linux kernel and ramdisk in the 4MB Flash,
but also to keep the user from hacking it. It does not allow any file
transfer besides replacing the Linux kernel image with another Linux
kernel image, and it doesn't have network support either. We can use
`altboot(8)` to overcome all those restrictions.
Write altboot to Flash
----------------------
The only way to install, or even run, altboot is to make it look like a
Linux kernel U-Boot image and let the firmware boot it instead of Linux.
So this step will overwrite your Linux installation.
To replace the Linux kernel in the Flash ROM we can use the U-Boot
command **loadb k**. This will expect an U-Boot image file to be
transfered over the serial port using `Kermit` protocol.
So the next step is to install `kermit(1)` from `pkgsrc(7)`, or to
compile and install it yourself. To configure Kermit for the file
transfer you have to provide the following commands:
set line /dev/tty00
set speed 9600
set carrier-watch off
set flow-control none
robust
set file type bin
For convenience you can write them into a file which you can pass as an
argument to `kermit`.
Run Kermit and start your DSM-G600. Quickly press a key to prevent
autobooting. Then type **loadb k** to start the file transfer:
=> loadb k
## Ready for binary (kermit) download ...
At this point you have to return to Kermit's command mode by typing
**CTRL-\\** followed by **c**. We have to send the file `altboot.img`, which
is our bootloader in U-Boot image format, faking a Linux kernel.
C-Kermit> send /local/path/to/altboot.img
The transfer may take a few minutes at 9600 bps. When done, let Kermit
reconnect to the NAS by entering **c**. You will see the following output:
## Total Size = 0x000132dc = 78556 Bytes
## Start Addr = 0x00100000
Un-Protect Flash Bank # 1
Erase Kernel from 0xfff10000 to 0xffffffff ... done
Erased 15 sectors
Kernel Size = 78556
Copy to Flash... done
Protect Flash Bank # 1
U-Boot always runs **bootm FFF10000 FFC20000** and there is no way to
change that. So it may be convenient to replace the RAMDisk image at
`0xffc20000` by an empty U-Boot image, like [this](http://www.NetBSD.org/~phx/Sandpoint/dummy.img.gz)
one (do not forget to uncompress it with `gunzip(1)`). Or use **mkubootimage** to
make your own dummy. Write this image to Flash, as shown above, by
entering the command **loadb r**.
Boot the INSTALL kernel with altboot
------------------------------------
Now you can use `altboot` to launch the `netbsd-INSTALL` kernel for
installing NetBSD. You may choose to load it with TFTP or from NFS. For TFTP
you have to enable `tftpd(8)` in `/etc/inetd.conf`, and for NFS there is
a documentation at [The Network File
System](http://www.NetBSD.org/docs/guide/en/chap-net-services.html#chap-net-services-nfs).
But in both cases you have to set up a DHCP server, which is explained
in the [DHCP Howto](http://www.NetBSD.org/docs/network/dhcp.html). An
appropriate `dhcpd.conf` entry could look like this:
host dsmg600 {
hardware ethernet 00:13:46:xx:xx:xx;
fixed-address 192.168.0.103;
next-server 192.168.0.1;
option root-path "/export/dsmg600/root";
}
The `root-path` option is only needed when using NFS and should match
your exported NFS directory. Uncompress `netbsd-INSTALL.gz` from the
NetBSD/sandpoint distribution and copy it into the NFS or TFTP directory.
Reboot or power-cycle your DSM-G600. When `altboot` starts press a key
within two seconds to enter interactive mode.
## Booting image at fff10000 ...
Image Name: altboot
Image Type: PowerPC Linux Kernel Image (unknown compression)
Data Size: 76444 Bytes = 74.7 kB
Load Address: 01000000
Entry Point: 01000000
Verifying Checksum ... OK
OK
## Loading RAMDisk Image at ffc20000 ...
Image Name: dummy
Image Type: PowerPC Linux RAMDisk Image (unknown compression)
Data Size: 0 Bytes = 0 kB
Load Address: 01f00000
Entry Point: 01f00000
Verifying Checksum ... OK
Loading Ramdisk to 01f2f000, end 01f2f000 ... OK
>> NetBSD/sandpoint altboot, revision 1.7 (Sat Apr 9 21:38:08 CEST 2011)
>> D-Link DSM-G600, cpu 198 MHz, bus 99 MHz, 32MB SDRAM
channel 0 present
wd0: DMA LBA 76319 MB
wd0: no disklabel
MAC address 00:13:46:xx:xx:xx
100Mbps-FDX
Hit any key to enter interactive mode: 2
bootargs>
Now you can boot the installation kernel from TFTP with
bootargs> tftp:netbsd-INSTALL
or from NFS:
bootargs> nfs:netbsd-INSTALL
Our bootloader configures the hardware, determines the IP address, loads
the kernel via network and launches it:
loading "netbsd-INSTALL" 5100772+110412=0x4f88b0
entry=0x00090000, ssym=0x00588430, esym=0x005888b0
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2008, 2009, 2010, 2011
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
NetBSD 5.99.48 (INSTALL) #9: Sat Mar 26 20:14:10 CET 2011
frank@compaq.owl.de:/home/frank/netbsd/current/src/sys/arch/sandpoint/compile/obj/INSTALL
total memory = 32768 KB
avail memory = 26136 KB
OpenPIC Version 1.2: Supports 1 CPUs and 26 interrupt sources.
mainbus0 (root)
cpu0 at mainbus0: 8245 (Revision 0.4), ID 0 (primary)
cpu0: HID0 0x90c000, powersave: 1
eumb0 at mainbus0
com0 at eumb0 unit 0: ns16550a, working fifo
com0: console
com0: interrupting at irq 40
ociic0 at eumb0
iic0 at ociic0: I2C bus
strtc0 at iic0 addr 0x68: M41T8x Real-time Clock
satmgr0 at eumb0 unit 1: button manager (dlink)
satmgr0: interrupting at irq 41
pci0 at mainbus0 bus 0
pchb0 at pci0 dev 0 function 0
pchb0: vendor 0x1057 product 0x0006 (rev. 0x12)
ral0 at pci0 dev 13 function 0: vendor 0x1814 product 0x0201 (rev. 0x01)
ral0: interrupting at irq 16
ral0: 802.11 address 00:0f:a3:xx:xx:xx
ral0: MAC/BBP RT2560 (rev 0x04), RF RT2525
ral0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ral0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
ohci0 at pci0 dev 14 function 0: vendor 0x1033 product 0x0035 (rev. 0x43)
ohci0: interrupting at irq 17
ohci0: OHCI version 1.0, legacy support
usb0 at ohci0: USB revision 1.0
ohci1 at pci0 dev 14 function 1: vendor 0x1033 product 0x0035 (rev. 0x43)
ohci1: interrupting at irq 17
ohci1: OHCI version 1.0, legacy support
usb1 at ohci1: USB revision 1.0
ehci0 at pci0 dev 14 function 2: vendor 0x1033 product 0x00e0 (rev. 0x04)
ehci0: interrupting at irq 18
ehci0: companion controllers, 3 ports each: ohci0 ohci1
usb2 at ehci0: USB revision 2.0
stge0 at pci0 dev 15 function 0: Sundance ST-1023 Gigabit Ethernet, rev. 65
stge0: interrupting at irq 19
stge0: Ethernet address 00:13:46:xx:xx:xx
ukphy0 at stge0 phy 24: OUI 0x0009c3, model 0x0008, rev. 0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
acardide0 at pci0 dev 16 function 0: Acard ATP865 Ultra133 IDE Controller (rev. 0x10)
acardide0: using irq 20 for native-PCI interrupt
atabus0 at acardide0 channel 0
atabus1 at acardide0 channel 1
biomask 80000f8 netmask 80000f8 ttymask 80000f8
uhub0 at usb0: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub1 at usb1: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub2 at usb2: vendor 0x1033 EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
wd0 at atabus0 drive 0
wd0:
wd0: 76319 MB, 155061 cyl, 16 head, 63 sec, 512 bytes/sect x 156301488 sectors
boot device: stge0
root on md0a dumps on md0b
root file system type: ffs
erase ^H, werase ^W, kill ^U, intr ^C, status ^T
Terminal type? [vt100]
Just follow the usual procedure to install a NetBSD system.
When the installation is finished the system will automatically boot
into multiuser mode, as `altboot` defaults to boot `wd0a:netbsd`. After
the network is configured you can disconnect the serial cable and close
the case.
Have fun with your mini NetBSD server!
Known Limitations
=================
- No known method for a hardware reboot or shutdown of the board
exists. Therefore rebooting is simulated by jumping through U-Boot's
reset vector. A
poweroff(8)
will just halt the system and flashes the power LED to indicate that
it has to be switched off manually.