The latest progress of my freeBSD port for CNS21XX and ThinkLink Hot-e was three weeks ago. The CNS21XX network driver and Hot-e network driver was completed. I haven’t touched anything since then because I had to work on weekends at the office. This weekend, I could have continued coding, but I don’t feel like coding, so I did a hardware project: adding serial port and SD card slot to my D-LINK DIR-300 that I bought April last year.
This is not a difficult project, I already added SD/MMC card to my WRT54GL about 2,5 years ago. The difference is that there isn’t much guide about the hardware part (which GPIO pins to solder), and the software part (how to activate the drivers). So here is a short guide to anyone who needs it. Note that I already installed OpenWRT Kamikaze using the guide from: OpenWRT site.
This is what the front side of PCB looks like:
On the bottom right, you can connect a serial port (note: 3.3V, you will need MAX3232 or use a data cable from phone, don’t connect directly). Many guides are already available for connecting serial port (for example: here, here, here, and here), so I wont write about it. Just note that you will use the 3.3V and GND for the SD card mod.
This is what the PCB looks like from the back:
I found the GPIO pins from this posting by guidoa:
1: SES Button Blue led (Enable=ON)
2: WiFi led
3: SES Button Red led (Enable=ON)
4: SES Button (Pressed=01)
6: Reset Button (Pressed=01)
7: Status led (Enable=ON)
I have confirmed it using voltmeter and gpioctl
command line tool. The SES button is the button on the right side of the unit. As far as I know, SES button, and the LEDS (red and blue) are not used by default, the Wifi LED is used to indicate Wifi ON/OFF. So we can use GPIO 1,3,4. We need another one: we can use GPIO 6 or 7. Since The status led is not used, I prefer GPIO 7. You can see the location of the GPIO pins that I used from the above picture.
Now, look at the SD Card Pinout (you can search it in Google, or just look here).
You need to connect SD Pin 4 to to 3.3V (see the serial port above), Pin 3 and 6 to GND. The rest is up to you (we will configure this later in software). This is what I use:
- Pin 2 (Data In/MOSI) to GPIO 4 (SES Button)
- Pin 7 (Data Out/MISO) to GPIO 7 (Status LED)
- Pin 5 in SD Card (CLK) to GPIO 1 (blue LED)
- Pin 1 in SD Card (Chip Select) to GPIO 3 (red LED)
After you solder them, you need to install these packages using opkg: kmod-mmc, kmod-mmc-over-gpio, kmod-mmc-spi, kmod-spi-bitbang, and kmod-spi-gpio. We need to edit /etc/init.d/mmc_over_gpio. The line that you are looking for is the add_device "default"
. There are some numbers in the following order DI, DO, CLK, CS and SPI_MODE. You need to fill in the GPIO that you use for each of that pins and just fill in 0 for SPI_MODE. In my case I edit the line to become: add_device "default" 4 7 1 3 0
.
Now I can start the SD card using: /etc/init.d/mmc_over_gpio start
. You can now mount the card. To remove the card, umount the card and /etc/init.d/mmc_over_gpio stop
. The SD card speed is to slow, I will look on to this later, but for now the speed is enough for me.
This is my final result (I am really lousy at soldering):
Doesn’t look too bad from the outside for the SD Card:
But I made a stupid mistake for the RS232 port. I put the port on the wrong place, and I can not drill for the screw on the right side of the port. Fortunately this is not fatal, I just glued the port to the casing.
Update This is the dmesg log after /etc/init.d/mmc_over_gpio start
gpio-mmc: Failed to request mmc_spi module. mmc_spi spi32765.0: SD/MMC host mmc0, no DMA, no WP, no poweroff gpio-mmc: MMC-Card "default" attached to GPIO pins di=4, do=7, clk=1, cs=3 mmc_spi spi32765.0: can't change chip-select polarity mmc0: new SD card on SPI mmcblk0: mmc0:0000 SD512 495488KiB mmcblk0: p1
Update 9 April 2010 to make it clear, this is the picture of the back side of the pcb after soldering:
Hi, thanks for your explain. I made this how you explain and have Kamikaze (r18961) (latest firmware) but when i do: /etc/mmc_over_gpio start say this error in log:
gpio-mmc: Failed to request mmc_spi module.
mmc_spi spi32764.0: SD/MMC host mmc0, no DMA, no WP, no poweroff
gpio-mmc: MMC-Card “default” attached to GPIO pins di=4, do=7, clk=1, cs=3
mmc_spi spi32764.0: can’t change chip-select polarity
mmc0: error -5 whilst initialising SD card
Any idea? What version of Openwrt you use?
Sorry for my english 🙂
Thanks anyway for this guide!!! 😀
Greetings from Argentina!
Hi Yak,
I am using KAMIKAZE (8.09, r14511), I haven’t upgrade since last year.
I also didn’t get it right the first time, some of the things to check:
– Cable and soldering
– Make sure the SD Card supports SPI. I have an old microSD (64mb) card that doesn’t support SPI mode, after using another card that I have, it works.
– Curently Iam using SD card with small capacity (512 Mb), I don’t know if the driver supports SDHC card or not. So try with SD Card less than 2 Gb.
I have double checked everyhing when I wrote the guide, but I will check my guide again when I got home, to see if there is something wrong in the stuff that I wrote.
Thanks for answer. I use a 2gb MicroSD (TransFlash) SanDisk card with adapter:
[img]http://cellularhaven.com/store/images/2GB_MicroSD.jpg[/img]
I solder this today and flash with same firmware version as you uses.
I update and solder the SD with cables and search for SPI compatibily for this microSD.
Thanks 😉 Excellent blog 😀
I search in many sites and many people say that MicroSD SanDisk dont support SPI mode :S 🙁 do you have any info about this?
Thanks 😉
From Wikipedia, it says thatk all SanDisk cards support SPI mode. I have uploaded the back side of the PCB, and it seems I have written everything correctly.
May be you can post your picture of your work, so I can see/compare?
I was looking for some hacks for the dir 300 and found your side! Awesome hack :D. I will try to do the same with my DIR 300 :).
Greets from germany!
Hey,
i tried the hack today. It works really nice, but i have just a 128mb card :(. However still more than before :D.
To mount the card install:
kmod-fs-vfat
kmod-nls-cp437
kmod-nls-iso8859-1
And mount the card with:
mount -t vfat /dev/mmcblk0p1 /mnt/mmc -o rw
My Firmware: Kamikaze (r16206)
Greets Pablo.
@Pablo
Glad to hear that it works for you 🙂
Hi Yohanes!
I got that Router, too and will try the mod 🙂
By the way, could you please upload your latest linux-patch for the agestar nas? It would be really nice 😉 I am going to try out a few things – Thank you a lot!!!
I’m getting this.
root@OpenWrt:~# /etc/init.d/mmc_over_gpio start
configfs on /config type configfs (rw)
mkdir: cannot create directory ‘/config/gpiommc/default’: No such file or directory
Did I get the soldering wrong or something? Learning how to solder again in one day was quite interesting.
I am using x-wrt Kamikaze, but I don’t think it matters, as I’ve installed all packages.
@anon
can you show me the output of lsmod and dmesg? I think the kernel modules are not loaded or not found.
Wow, that’s a very quick reply 🙂
Here’s for lsmod.
http://pastebin.org/385106
Here’s for dmesg
http://pastebin.org/385107
@anon you don’t have gpiommc, mmc_spi, mmc_block, and mmc_core kernel modules installed
here is the first few lines of my lsmod:
May be you need additional package, or may be you need to compile something by yourself. The easiest is just test with openWRT which has all the modules to check your soldering work, and then back to X-WRT if you prefer it more.
Well… I got the same error using normal OpenWRT . Do I have to compile myself to get those additional modules? Packages won’t do? How did you get it right?
I’ll use dd-wrt just to see if my soldering works, then I’ll go back to openwrt, and try some other things if there’s no easy answer to this.
@anon:
With openwrt, you need to install these packages using opkg: kmod-mmc, kmod-mmc-over-gpio, kmod-mmc-spi, kmod-spi-bitbang, and kmod-spi-gpio. After you install it, these modules should be loaded automatically on boot.
Oh, the problem probably lies because I didn’t reboot. Thanks. I’ll go try tonight.
It’s working great, thanks yohanes! Only thing left is to format and mount…
Just a dumb question: did you use a level converted to install the serial port or not? I couldn’t fine any information on the signal levels of the dir-300.
Thanks
huh… I’m getting
mount: mounting /dev/mmcblk0p1 on /mnt/mmc failed: Invalid argument
all the time… No errors in dmesg, I have no idea what’s the cause. I re-checked soldering three times, I shortened the wires, I even downgraded from 10.03.1rc1 to 8.09.2 to check if it’s working… but no, it isn’t. I can’t mount the card, even though:
gpio-mmc: Failed to request mmc_spi module.
mmc_spi spi32766.0: SD/MMC host mmc0, no DMA, no WP, no poweroff
gpio-mmc: MMC-Card “default” attached to GPIO pins di=4, do=2, clk=1, cs=3
mmc_spi spi32766.0: can’t change chip-select polarity
mmc0: new SD card on SPI
mmcblk0: mmc0:0000 SA02G 1921024KiB
mmcblk0: p1
That means soldering is OK and the card is recognized, right?
fsck results in
root@OpenWrt:/mnt# e2fsck /dev/mmcblk0p1
e2fsck 1.40.11 (17-June-2008)
e2fsck: Superblock invalid, trying backup blocks…
e2fsck: Bad magic number in super-block while trying to open /dev/mmcblk0p1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
Any help would be appreciated, I’d really like to get this working!
The only thing I changed, compared to your tutorial, was instead of using GPIO7, I’m using GPIO2 (because for some reason wifi driver blinks with status led instead of wifi one, lol)
I’ve got the same error.
The problem was that my card had FAT filesystem.
I installed following packages
kmod-fs-vfat
kmod-nls-cp437
kmod-nls-iso8859-1
than I had to reboot the router. Only after this my card mounted by the comand
mount -t vfat /dev/mmcblk0p1 /mnt/card
Yout wrote :
“The SD card speed is to SLOW, I will look on to this later, but for now the speed is enough for me.”
So, what was the problem, Is is still SLOW?
Did you fixed ?
Is It problem with “Failed to request mmc_spi module.”
(that you wrote in “Update” ?)
I’am using Openwrt 10.03.1-rc4 (atheros)
It will work with this version ?
Best Regards!
I have a DIR-300 Revision A1 and when I read this article I was interested in this mod, but I have some questions about this.
First: I Have a 2GB microSD that comes with a Nokia E17 smartphone that I don´t use. I am thinking about use it with an SD adapter. My question is… This microSD is SPI?
Second: Using this mod… Can I use it like an additional amount of RAM to this device?
Third: I need to do the other mod to? The terminal? Or they are independent?
I´m awaiting answers… Sorry about my english…
Thanks…
@aloosek i didn’t do anything with the speed (still slow). It should work with latest openwrt.
@Thiago: (1) usually microSD supports SPI. (2) You can not use it as extra RAM, but use it as swap space (which is like extra RAM). (3) The serial MOD is not related to the SD mod. You can do the serial only or SD only or both.
Just to share my results…
Backfire (10.03.1-rc4, r24045):
GPIO’s have to be configured in /etc/config/mmc_over_gpio
SD which doesn’t work (for me):
– Sandisk 2GB
– PNY 1 GB
SD which does work:
– Hama 2 GB
Speed is really slow. Anyone some suggestions to fix this?
Anyway… Thank you for this hack! As a software guy, I am always lost in hardware hacks ;-)…
Just did the terminal mod today, did it without MAX232 (had a USB cable), works like a charm except that nobody noted that you have to connect Rx->Tx and Tx->Rx, on all schemes it looks like Tx->Tx and Rx->Rx. But anyway. I HAZ A CONSOLE, YAY! <3 I actually connected it using a 3,5 Jack port – it doesn't take as much space as the serial port and looks better.
As for the other mod (SD), I've been using it for around a year now. The problem with it is that sometimes an error occurs on GPIO, the memory card gets corrupt ("unclean") and I have to run e2fsck for it to mount again… really troublesome. What's more, I just updated to 10.03.1-rc4. The data transfer speed in 8.09 was incomparably higher than it is in 10.03.1. I wonder why is this happening? I tried "echoing" 0 to the spi_delay file, but it just stays at 1 whatever I do, any ideas? It's really iritating, it was like 20-40kB/s on 8.09 and now it's under 5kB/s… (slower than turtles)
@Alien, about my question above – the solution was to format the card from router, somehow the ext2 partition format I created using ubuntu is different to the one openwrt creates
I’ve just soldered the sd card onto the dir-300 and mounted a ext2 formatted partition. This seems to work nice but the router keeps restarting when i try to install openvpn onto the card … any idea why this happens?
Very basic question. How do I open the case? This is a version A1 DIR-300.
@Florian: Most likely it runs out of memory. Try to add a swap partition on the sd card (use fdisk to create two partitions etc), use mkswap to format it, then swapon to enable it.
Check if it works using ‘free’ and try to install openvpn again.
I have DIR-600 Rev B2 that in http://www.openwrt.org said that it has the same hardware as DIR-300 has.
This is my linux version Linux
root@OpenWrt:~# uname -a
OpenWrt 2.6.39.4 #3 Thu Sep 15 15:04:32 IRDT 2011 mips GNU/Linux
I installed gpioctl but there is no /dev/gpio folder.
(Error whilst opening /dev/gpio)
root@OpenWrt:~# find / -name gpio*
/overlay/usr/bin/gpioctl
/overlay/usr/lib/opkg/info/gpioctl.list
/overlay/usr/lib/opkg/info/gpioctl.control
/sys/devices/platform/gpio-buttons
/sys/devices/virtual/gpio
/sys/devices/virtual/gpio/gpiochip0
/sys/devices/virtual/gpio/gpiochip24
/sys/devices/virtual/gpio/gpiochip40
/sys/bus/platform/devices/gpio-buttons
/sys/class/gpio
/sys/class/gpio/gpiochip0
/sys/class/gpio/gpiochip24
/sys/class/gpio/gpiochip40
/sys/kernel/debug/gpio
/usr/bin/gpioctl
/usr/lib/opkg/info/gpioctl.list
/usr/lib/opkg/info/gpioctl.control
Any idea ?!
Any help will be appritiated
Works like a charm!
I tried both a FAT and ext2 cards. When a FAT MMC card is used it is important to reboot the router after the relevant modules (listed before by @Pablo) are installed.
Now I have enough space to install and run OpenVPN server on my DIR-300. Yipee!
@yohanes thank you for this post
Is there a way to get this working with DDWRT ? and can i then use it be used a torrent downloader?:S
Can someone please post a proper schematic for a noob?:D Will this run optware?
I have no experience with such things, but do you think that adding a usb port to this router is possible? There are two hardware versions of this router. A1 and B1. I have B1. For witch hardware version is the sd mod?
Did you success adding an usb port ?
Would you share some info ?
hey, I have a question:
can we do like this link for making a serial port for DIR-300 rev.A too?
http://www.myopenrouter.com/article/10811/Hacking-Your-NETGEAR-WGR614L-How-To-Install-A-Serial-Port/
here he uses no converter to make the serial port, he uses a 3.5mm jack to make the serial port.
sorry if my question sounds like I’m a noob 🙂
thanks for your information.
I’m waiting for the answer! 🙂
Hi M.M.M I think yes the serial port works, but dependently the use, I mean for example to connect an Arduino yes works very fine.
Hi !! here im trying to get the serial conexion to work …. not success yet.
Im using the trendnet tu-69 cable.
Already solded the pinout to db9 female cable.
Using putty / minicom … but only get garbage output.
���”��r-{h�����[(9���M�@��u_g���x��BE�2��,�����”���a]a��� ���-����X=�
Mine is a dlink dir300.
I think … if i get some output there is no pinout problem nor voltege levels…
so , it should be a setting problem , I have tryed many configs, would you post yours ??
Hi, try select another speed in the Com Communication, You use a MAX232 right?, Personally I use this hack serial mods for used in Arduino projects, using /dev/cua/1 (Serial port) but if I connect the serial port to the computer and then type for example echo “Hello world” > /dev/cua/1 I don’t received the message, I received characters rare, I think this is a TTL problem, because I don’t use MAX232 for the serial connection.
Sorry, I forget say: Aparently I recieved the same garbage in the output Serial port, but The arduino connection works fine, I mean Directly with Serial port Router (No MAX232). I have a WRT54GL and WRT54G v2.2, and this week I will try with this router (airlink AR430W it’s a DIR-300 Clone). Thanks for the info Yohanes this blog is very cool!