WRT54GL Dual Serial Port and SD Card Mods
The Linksys WRT54GL is a great router. It runs a version of Linux and is very hackable. Since it's open source, a number of third-party firmware versions have sprung up which add signficant functionality beyond what the stock firmware provided. In addition to the software improvements, several hardware modifications can also be done to this router. Two of the most popular are to add dual serial ports as well as an SD card. After these modifications, the router can be used to control external electronics (like in my wifi robot project), and the SD card can be used to add gigabytes of storage capability.
Since the soldering in this mod is not very difficult, this is a good mod to attempt if you're just starting out in electronics and are looking to get some soldering experience. The electronics part is not too difficult, but the result can be very useful to control external electronics or just to have a serial console. There are mechanical case modifications that are required as well, which makes this mod a bit more tricky than just a soldering project.
1. Remove the 'void warranty' sticker!
2. Unscrew the two wifi antennas. The front blue faceplate snaps apart from the black body. It takes some force to seperate them, but they will come apart. Place your thumbs on the blue legs while holding the black body and push on on the blue faceplate to seperate them.
3. After the casing has been removed, remove the screws holding the circuit board to the plastic bottom so that the router PCB is free.
Soldering to the JP2 Header
Locate the JP2 header. The header pinout is as follows:
The router uses 3.3V/GND for it's serial line voltage levels. We need to use a line level convertor that converts the 3.3V/GND to the +/-12V standard for RS232 serial communication. Technically, the right chip to use for this project is a MAX3232, however I've used both the MAX232 and MAX233 chips and they work fine as well. You could use any one of these 3 chips. Currently (January 2010), on Digikey.com, a MAX3232 is $4.19 USD in a DIP package, a MAX232 is $3.31 USD, and a MAX233 is $7.45. The MAX233 is nice because no external capacitors are required (1 decoupling cap is recommended). There are a few variations of these chips, so check the datasheet for your specific part to confirm pin numbers and capacitor values.
Maxim has a great samples program. I've been able to get free samples from them for all of these parts. Just remember, use their parts when your widgets go in to production. =)
Using the schematic diagrams above as a reference, solder the wires to router PCB and wire up the circuit on a breadboard first (very important!). I recommend using wires about 20 cm (~8") in length from the router to your circuit and wires of length 10cm (~4") from the serial connectors to your circuit so you later you'll be able to open and close the router easily without stretching the wires.
At this point you'll want to skip ahead to the software section, install X-WRT and test out your serial ports. It's fine to power the router while it is out of the case, but make sure there are no metal bits lying on your work surface that could short out the board. After confirming that both serial ports are functioning correctly, clean up your wiring and solder your circuit to a prototyping board. I find that twisting related pairs of wires cleans things up considerably. Zip-ties are another option.
If you don't have the correct tools to cut nice holes out of plastic, I've found that using the side of a drill bit (in a drill) works well as a make-shift cutting tool for cutting these holes. The DB9 connectors will (just) fit through the hole, so you can solder the wires before installing the connectors. For attaching the connectors to the router case I grabbed some screw connectors from an old video card, a lock washer, and a #4-40 nut. Using the video card screw connectors allows you to properly screw in serial cables to your DB9 connectors.
To secure the circuit, I bolted it to the top of the router. There's plenty of room for both the router PCB and the new serial circuit. After the connectors are installed, it's a good idea to label the connectors TTS/1 and Console (or TTS/0).
The process described here will test both serial ports using X-WRT, a Linux distribution for the WRT54GL that has a nice web interface. Follow the instructions for installing the openwrt-wrt54g-squashfs.bin image on to your WRT54GL. The exact firmware image is used is here. These serial ports should work fine in other distrbutions as well, but X-WRT is the only one I'm going to cover here.
After installing the firmware image, access the web interface (by default: http://192.168.1.1/). The first screen will ask you to set a new password. Set this password and remember it!
To test TTS/1:
(click for larger image)
It's only a matter of soldering a few more wires to add an SD card to your router. For this mod, my preferred method of attaching the SD card is to buy a micro sd card with an adapter kit and solder wires to the sd card adapter. I've considered other ways of interfacing the sd card, but I've found that this is the cheapest and easiest. Also, the micro sd card is removable, so you can use it in other devices as well. I've read that cards up to 2GB can be used. I haven't tried to use anything larger. This sd card mod will work for other distributions as well (like DD-WRT), but X-WRT is the only distrubtion I'm going to cover here.
This is a completely seperate mod from the dual serial port mod, so can be done without first adding serial ports. However, to test the sd card, X-WRT will need to be installed as described in the dual serial port mod software section.
Start by tinning (adding a small ammount of solder to) the contacts on the sd card. For the wires, I used about 20cm (~8") from an old IDE cable. Tin the stranded wires on both ends. Solder the wires to the sd card adapter. Since both surfaces are tinned, this should be relatively easy. Don't use an excessive ammount of heat or the sd card adapter may be damaged.
We will be using pins 1 -7. Solder the wires from the sd card on to the router pcb as described and pictured below.
After the electrical connections are made, skip ahead to the software section and test the SD card installation. If the SD card responds as expected, it can now be mechanically mounted permanently.
You can mount the sd card wherever you'd like, but I prefer above the Linksys name on the front of the router. Take note that where you choose to mount the sd card does not interfere with the router PCB when the router is put back together.
I used a dremel to cut the slot for the sd card and I used a drill bit as a cutting tool to clean up the edges of the slot. After making sure the sd card fit through, I glued it in place using hot glue.
The process described here will test the sd card and automatically mount it in X-WRT. Depending on how your network is configured, you may need to modify network settings (using the web gui) to allow the router to connect to the internet. If from the router, you can 'ping www.google.com' and get a response, then you're good to go.
Note: you'll have to SSH (using putty or other SSH client software) in to the router. In the following instructions, the # sign indicates a command that you'll need to type at the terminal. Make sure the micro SD card is first inserted in to the sd card adapter.
Install the FAT32 driver:
# ipkg update
# ipkg install kmod-vfat
Check that it is loaded:
Should see an output similar to:
Module Size Used by Tainted: P
vfat 11692 0 (unused)
fat 36840 0 [vfat]
Download and load the sd card driver:
# mkdir temp
# cd temp
# wget http://www.jbprojects.net/articles/wrt54gl_mods/mmc-v1.3.4-gpio2.tgz
# tar zxvf mmc-v1.3.4-gpio2.tgz
# cp ./mmc-v1.3.4-gpio2/mmc-v1.3.4-gpio2/mmc.o /lib/modules/2.4.30/.
# insmod /lib/modules/2.4.30/mmc.o
Check that it's loaded:
Should see (or similar):
[INFO] mmc_hardware_init: initializing GPIOs
[INFO] mmc_card_init: the period of a 380KHz frequency lasts 524 CPU cycles
[INFO] mmc_card_init: powering card on. sending 80 CLK
[INFO] mmc_card_init: 80 CLK sent in 43675 CPU cycles
[INFO] mmc_card_init: resetting card (CMD0)
[INFO] mmc_card_init: doing initialization loop
[INFO] mmc_card_init: card inited successfully in 1642 tries (50655865 CPU cycles).
[INFO] mmc_init: MMC/SD Card ID:
41 34 32 53 44 32 47 42 20 5b 00 05 74 00 96 7b [INFO] Manufacturer ID : 41
[INFO] OEM/Application ID: 42
[INFO] Product name : SD2GB
If you don't see similar output to what is shown above, or see FATAL error messages, then the SD card cannot be read which indicates a wiring problem.
The next few steps involve editting text files. If you don't know how to use vi to edit text files, google it, or check out this tutorial. There's a bit of a learning curve if you've never used it before.
Automatically load the driver on router reboot:
# vi /etc/init.d/S20mmc
echo 9c > /proc/diag/gpiomask
Set the right permissions:
# chmod 755 /etc/init.d/S20mmc
Automatically mount the partition:
# vi /etc/fstab
/dev/mmc/disc0/part1 /mnt/mmc vfat defaults 0 0
Reboot the router.
# df -h
Look for a line similar to:
/dev/mmc/disc0/part1 1.8G 5.4M 1.8G 0% /mnt/mmc
Here are a bunch of related links that I've found informative, helpful, or interesting.
|X-WRT, the Linux distro I'm running on the router (this page tells you how to install)|
|WRT54G Ultimate Hacking Book|
|WRT54G hacking site affiliated with the book|
|Dual serial port mod tutorial|
|SD Card mod tutorial (for DD-WRT)|
|Putty download (SSH Client)|
If you liked the project or write-up, add a comment below or send me an e-mail at .