Didj Enable Networking

From eLinux.org
Revision as of 07:08, 8 July 2011 by Jrspruitt (Talk | contribs)

Jump to: navigation, search

Introduction

This how-to outlines the basic steps to enabling networking via the USB gadget Ethernet driver (g_ether) contained in the LF 2009 sources.

Following the steps contained herein should result in a functioning Ethernet connection and the ability to telnet into the device via USB.

The steps have been tested on Ubuntu 8.04 Hardy Heron (2.6.24 kernel). Similar steps are also known to work on kernel versions up to 2.6.25.

(Note: There may be other more-efficient ways to go about these steps, we can improve this document as those emerge.)

At this time, more-recent kernels than 2.6.25 will not support communications with the this version of g_ether (for Ubuntu users, this means that versions later than Hardy are not working at this time.)

The version of g_ether we are using does not support Windows at this time (due to what seems to be a broken RNDIS implementation in this version of ether.c).

To-dos: Investigate and address enabling g_ether connectivity to hosts running recent linux kernels, Windows, OS X...


Technical Requirements

Console Access

Source Code (Didj-Linux-4222-20090422-1236.tar.gz)

Cartridge


Kernel Configuration

Out of the box, neither networking support nor the PTY devices used by busybox/telnetd are enabled in the stock Didj kernel

To add this support, make a custom kernel.

Making a custom kernel for networking and PTY support

Next you need to configure your kernel using make menuconfig

cd SOURCE_CODE/linux-2.6.20-lf1000
$ make menuconfig

When the menu system launches, enable the following:

  1. Networking
    1. Select: Networking-> Networking Options-> TCP/IP Networking
    2. Make sure its selected if not hit Spacebar to select TCP/IP Networking.
    3. Exit back to the main menu.
  2. USB Ethernet support
    1. Select: Device Drivers-> USB Support-> USB Gadget Support
    2. Hit spacebar to select USB Gadget Support
    3. Select: Ethernet Gadget (with CDC Ethernet support)
    4. Hit Spacebar to configure it as a kernel module <M>. Note: RNDIS support is listed, but it is broken, so deselect it.
    5. Exit up to device drivers
  3. PTY device support (for telnetd)
    1. Select: Device Drivers->Character Drivers->Unix98 PTY Support
    2. Hit Spacebar to select <*>
    3. Select: Device Drivers->Character Drivers->Legacy (BSD) PTY Support
    4. Hit Spacebar to select
    5. If its not already pre-set, set 'Maximum number of legacy PTY in use' at 256
  4. Exit all the way out of the menu application, making sure to save the changes when prompted.


Building Kernel

Set up your Build Environment and from inside the kernel directory linux-2.6-lf1000/

$ ./install.sh

If everything is set up properly, this should fail trying to create some folders, which is after its built the kernel, which is fine, look in your TFTP_PATH directory, and you should see your zImage, which can be used to boot from an SD card or UART for testing purposes.

Didj_Boot_From_UART


Installing g_ether.ko

First, boot the device, connect the USB cable, and mount the device as a drive.

You'll find g_ether.ko in your kernel sources directory tree:

SOURCE_CODE/linux-2.6.20-lf1000/drivers/usb/gadget/g_ether.ko


Copy this to your Didj.

Inserting the g_ether.ko kernel module

First, if its still connected, unmount the /Didj partition from your host.

Then, mount /Didj on your Didj:

On Didj

# usbctl -d mass_storage -a disable
Mounting /dev/mtdblock9 on /Didj as rw

remove the g_file_storage kernel module:

$ rmmod g_file_storage

and install g_ether.ko:

# cd /Didj
# insmod ./g_ether.ko 
ether gadget: using random self ethernet address
usb0: Ethernet Gadget, version: May Day 2005
usb0: using lf1000_udc, OUT ep2-bulk IN ep1-bulk
usb0: MAC 46:ac:79:6e:92:e2
usb0: high speed config #1: 100 mA, Ethernet Gadget, using CDC Ethernet Subset
ether gadget: set_interface ignored!

Set up TCP/IP

With the USB cable still connected to your host, configure an IP address (make sure this is a different subnet from your existing LAN).

On Didj

# ifconfig usb0 10.0.0.2 netmask 255.255.255.0

On Host

$ sudo ifconfig usb0 10.0.0.1 netmask 255.255.255.0

At this point you should be able to ping from one machine to the other.

On Host

$ ping 10.0.0.2

On Didj

# ping 10.0.0.1


Add User

For logging in from remote hosts, you'll need a user. This can cause issues with permissions and what you can do. Some programs may allow root login with some extra configuration.

On Didj

# touch /etc/group
# echo root:x:0:0:root:/root:/ > /etc/passwd
# mkdir /home
# adduser didj
(this will prompt you for a password, can leave blank by hitting return twice, and ignoring the warnings.)


Set up telnetd

Configuring PTY devices – telnetd requires these devices to be configured in order to run.

On Didj

# mkdir --mode=755 /dev/pts
# mknod -m=666 /dev/ptmx c 5 2 
# mount -t devpts none /dev/pts  

Run Telnetd

as a background daemon

# telnetd 

or in the foreground

# telnetd -F

At this point you should be able to telnet from the host to the device.

On Host

$ telnet 10.0.0.2

This should leave you with a command line on your Didj.

Netcat

Note the IP address that you assigned to the Didj, for example 10.0.0.2. To copy a file, for example "./myfile" from your PC to the Didj:

On the Didj, run:

 # nc -p 5600 -l -w 30 > myfile

On the host, run:

 $ nc 10.0.0.2 5600 -w 2 < myfile

When nc exits, you should see the file on the Didj.

Acknowledgments

Many thanks to ca0abinary, doh, jburks, Moogle, PhilKll, zuccini, and many others both in the didj forum and on #Didj for their insight (and patience!).