Thursday, June 28, 2012

notes about setting up wifi and camera on a raspberry pi

Has a lot of good notes about the task of adding a driver or drivers to a system and getting it going.

copied here because google lost the item and the web site 404's on it.

Setup of motion, RTL8188CUS realtek based wifi & UVC webcam

2 posts
by nf_ » Tue Jun 05, 2012 9:24 pm
Hi all.

Hopefully this will be of interest and help to someone trying to get a uvc webcam and/or realtek wifi dongle working on their rpi.

I hope this is the correct place to post this kind of topic.


I wanted to have a rpi with a wifi dongle & a uvc logitech webcam and motion installed.

Arch, has the webcam modules but unable to get the rpi arch image to
support either of my 2 RTL8188CUS realtek based dongles.

: Belkin surf n150 micro adapter

: Edimax N150 Wireless nano USB Adaptor

Debian, doesn't immediately work with the dongle, but fairly easy to get working using this great

script: viewtopic.php?f=26&t=6256

But.... the default rpi Debian kernel doesn't have the uvc webcam stuff.

So I cant use the script above, because I need to bake in the webcam.

So...these instructions should enable you to have a:

1) debian based distro (custom kernel)

2) wifi working with RTL8188CUS based adapters.
3) logitech webcam working.


What you will need

1 x linux machine
1 x rpi
1 x SD card
Wired network between rpi & linux machine
1 X Realtek based wireless dongle. !DO NOT PLUG IN UNTIL TOLD TO!
1 X Logitech webcam


Getting started..

Prepare SD with the image from

Lots of methods to do this.. take a look at:

Resize SD card if you need to gparted on your linux machine is your friend.


Boot for the first time.

Login as the user you have been given as part of the download for your initial image and change the password

Change your user (pi) password

Code: Select all
  # passwd

Change the root passwd

Code: Select all
  # sudo passwd

Switch to root

Code: Select all
  # su

Enter the password you just changed

Get everything up to date

Code: Select all
  # apt-get update
  # apt-get update [to clear duplicates]
  # apt-get upgrade

At this point I normally (2xpi, 2xpowerAdapters ) get a kernel panic on first upgrade
Just pull plug out and reboot

Login as root this time

Code: Select all
  # apt-get upgrade 

I want a fixed IP on this machine so I can find it when i disconnect the monitor
dont do this if you want the wired to be dhcp


Code: Select all
  # vi /etc/network/interfaces

(of course you could you emacs here)

Change the following line

Code: Select all
    iface eth0 inet dhcp


Code: Select all
   iface eth0 inet static

    address     <---- whatever is applicable to your lan config
    netmask    <---- whatever is applicable to your lan config
    network      <---- whatever is applicable to your lan config
    gateway      <---- whatever is applicable to your lan config

Then to write the file

Code: Select all

Code: Select all
   # ifdown eth0
    # ifup   eth0

* if after the next reboot you lose your ability to resolve hostnames

* i.e. ping --> unknown host
* just add:

Code: Select all
nameserver   (or your favourite DNS server IP address)

* to the bottom of /etc/resolv.conf


To see (or check ) the address assigned to your eth0 network interface

Code: Select all
  # ifconfig

eth0 inet addr, should be either a dhcp address or the one you set in the interfaces file.

Now I want to install Hexxeh/rpi-update tool

From here:

Code: Select all
 # cd
 # mkdir hexxeh
 # cd hexxeh
 # apt-get install ca-certificates
 # apt-get install git

Code: Select all
 # wget -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update
 # rpi-update

Dont worry if you get this:

Code: Select all
 /opt/vc/sbin/vcfiled: error while loading shared libraries: cannot open shared object file: No such file or directory

* Always happens and no one seems worried about it.

Ok..... lets leave our rpi alone for a minute.

On our second linux (Ubuntu in my case) machine

(A lot of this next bit sourced from here:

Code: Select all
  # sudo apt-get install gcc-4.6-arm-linux-gnueabi
  # sudo apt-get install git-core 
  # cd 
  # mkdir raspberrypi
  # cd raspberrypi
  # git clone
  # cd linux
  # sudo ln -s  /usr/bin/arm-linux-gnueabi-gcc-4.6 /usr/bin/arm-linux-gnueabi-gcc
  # cp arch/arm/configs/bcmrpi_cutdown_defconfig .config
  # make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
  # make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k

Depending on your machine this might take a while.

(You can use -j flag if you have multi-core see notes on above url
you might have to press ENTER a lot)

This will have create a kernel image in: /home/yourUser/raspberrypi/linux/arch/arm/boot/

called: "zImage"
Now we need to copy it to our pi

* back on the pi....

Code: Select all
  # apt-get install sshfs
  # cd /mnt
  # mkdir linux
  # sshfs yourUserName@yourLinuxMachineIPorHostname:/home/yourUser/raspberrypi/linux linux

You can check it mounted okay by:

Code: Select all
  # df -kh

* will show you that /mnt/linux is mounted to yourLinuxMachines linux directory

Code: Select all
# cd linux
  # make modules_install
  # cd /boot
  # cp kernel.img /root/backup-original-kernel.img    

Now copy your new kernel over....

Code: Select all
  # cp /mnt/linux/arch/arm/boot/zImage kernel.img

You can check it worked by doing this....

Code: Select all
 # diff kernel.img /root/backup-original-kernel.img
  Binary files kernel.img and /root/backup-original-kernel.img differ

Fingers crossed

Now to get the wireless driver working........

Back on your Linux Machine.

Code: Select all
  # cd
  # cd raspberrypi
  # mkdir wifi

Grab the UNIX (Linux) RTL8192CU driver package from
its a long url... but this shortLink should get you there....
the file should be called something like this:

* Save the downloaded zip file in the wifi directory you just created

*! there must be a way of building this on the pi but I could not get it to work.
*! annoying as it means I cant use the install script.

Code: Select all
  # cd
  # cd raspberrypi/wifi
  # unzip
  # cd RTL8188C_8192C_8192D_USB_linux_v3.4.2_3727.20120404
  # cd driver
  # tar -zxvf rtl8188C_8192C_8192D_usb_linux_v3.4.2_3727.20120404.tar.gz
  # cd rtl8188C_8192C_8192D_usb_linux_v3.4.2_3727.20120404/
  # make KSRC=/home/yourUserName/raspberrypi/linux/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k
  # ls -ltrh

[you will now see you have a brand spanking new]


kernel module, that has been compiled to work with the kernel you prepared earlier.

Back to the rPi

Code: Select all
 # cd /mnt
 # mkdir wifi
 # sshfs yourUserName@yourLinuxMachineIPorHostname:/home/yourUser/raspberrypi/wifi wifi
 # cd /mnt/wifi/RTL8188C_8192C_8192D_USB_linux_v3.4.2_3727.20120404/driver/rtl8188C_8192C_8192D_usb_linux_v3.4.2_3727.20120404
 # cp 8192cu.ko /root
 # cd
 # install -p -m 644 8192cu.ko /lib/modules/3.1.9+/kernel/drivers/net/wireless/

Blacklist bad module

Code: Select all
 # echo 'blacklist rtl8192cu' >> /etc/modprobe.d/blacklist.conf
 # echo >> /etc/network/interfaces   <--- put a blank line at the bottom of our interfaces file.
 # echo "allow-hotplug wlan0" >> /etc/network/interfaces   <---- if we want to allow hotplug of our adapter
 # echo >> /etc/network/interfaces
 # echo 'auto wlan0' >> /etc/network/interfaces   <-- create an entry for our wlan0
 # echo >> /etc/network/interfaces
 # echo 'iface wlan0 inet dhcp' >> /etc/network/interfaces  <-- we can change this to static if it works.
 # echo 'wpa-ssid "putYourSSIDhere" ' >> /etc/network/interfaces   <--- this is the name of your wireless Lan.
 # echo 'wpa-psk  "putYourWirelassPasswordHere" ' >> /etc/network/interfaces
 # echo '8192cu' >> /etc/modules
 # depmod -a

Ok NOW plug in your wifi usb adapter..

Code: Select all
 # iwconfig

You should see something like this......

Code: Select all
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"YourWifiNetworkName"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.462 GHz  Access Point: XX:YY:ZZ:AA:BB:CC 
          Bit Rate:150 Mb/s   Sensitivity:0/0 
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=94/100  Signal level=44/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Code: Select all
 # ifconfig

Should give you something like this

Code: Select all
wlan0     Link encap:Ethernet  HWaddr XX:YY:ZZ:AA:BB:CC 
          inet addr:  Bcast:  Mask:
          RX packets:304 errors:0 dropped:310 overruns:0 frame:0
          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:52965 (51.7 KiB)  TX bytes:4064 (3.9 KiB)

Back on your linuxMachine

Code: Select all
# ping
64 bytes from icmp_seq=0 ttl=64 time=0.993 ms

Lets reboot and make sure it all works then.....

Code: Select all
# reboot

Ok... the goal of this for me is a rpi with wifi, camera and motion so actually I need to set
the wifi address to be static so I can connect to it, otherwise it will keep changing and without
a keyboard and screen attached it will be a pain.

Login to your rpi as root (or just prefix all commands with sudo, up to you.)

Code: Select all
   # vi /etc/network/interfaces

change the following line

Code: Select all
    iface wlan0 inet dhcp


Code: Select all

    iface wlan0 inet static
    address     <---- whatever is applicable to your lan config, not an address handed by your dhcp server
    netmask    <---- whatever is applicable to your lan config
    network      <---- whatever is applicable to your lan config
    gateway      <---- whatever is applicable to your lan config

Then to write the file

Code: Select all

Code: Select all
    # ifdown wlan0
    # ifup   wlan0
    # ifconfig

This should give you something like this

Code: Select all
wlan0     Link encap:Ethernet  HWaddr XX:YY:ZZ:AA:BB:CC 
          inet addr:  Bcast:  Mask: 

Back on your linux machine open a terminal window and

Code: Select all
 # ssh root@9192.168.0.81

* enter your password

Code: Select all
## hostname

OK all good, we dont need a screen or keyboard anymore.

Now unplug the keyboard from the rpi, we will need the usb for your webcam.
Plug your webcam in

Code: Select all
 # dmesg  (in your terminal window)

You should see something like this...

Code: Select all
usb 1-1.2: new high speed USB device number 6 using dwc_otg
usb 1-1.2: New USB device found, idVendor=046d, idProduct=0825
usb 1-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=2
usb 1-1.2: SerialNumber: AB81D3F0
Linux video capture interface: v2.00
uvcvideo: Found UVC 1.00 device <unnamed> (046d:0825)
input: UVC Camera (046d:0825) as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input2
usbcore: registered new interface driver uvcvideo
USB Video Class driver (1.1.1)
6:3:1: cannot set freq 16000 to ep 0x86
6:3:2: cannot set freq 24000 to ep 0x86
6:3:3: cannot set freq 32000 to ep 0x86
6:3:4: cannot set freq 48000 to ep 0x86
usbcore: registered new interface driver snd-usb-audio
rtw_set_ps_mode(): Busy Traffic , Leave 802.11 power save..
rtl8192c_set_FwPwrMode_cmd(): Mode = 0, SmartPS = 0

* I have tried this with the following webcams...
* logitech c120
* logitech c160

* lets see if a video device has been created.

Code: Select all
# ls -ltrh /dev/video*
crw-rw---- 1 root video 81, 0 Jun  4 18:42 /dev/video0

* ok good.
* almost there..

Install motion

Code: Select all
# apt-get install motion
# apt-get install uvcdynctrl
# apt-get install guvcview
# vi /etc/motion/motion.conf

Change: webcam_localhost on --> webcam_localhost off <--- this means we will be able to see the camera stream from other machines
Change: videodevice /dev/video0 To whatever video device was shown by ls -ltrh /dev/video*

Optional (but these are my settings):
Change: width 320 --> width 640 This will depend on your camera model.
Change: height 240 --> height 480
Change: framerate 25 --> ... nFramerate
Change: webcam_maxrate 25 --> ... camMaxrate
Change: output_normal on --> off , Im happy just to have the avi I can always jpeg split later if i want

Code: Select all
:wq!   <--- Save your settings and exit.

Lets try it.

Code: Select all
# motion 

All done.


Hopefully this will be of use or interest to others, its quite long so if you spot any mistakes
feel free to point them out.

I have read a lot of web pages trying to get all this to work, and Im sure I will have forgotten
the authors of some.

But…thanks and credit to those below :

MrEngman --- viewtopic.php?f=26&t=6256
everyone who wrote this: ... on=history

Cian's Blog ---
Hexxeh ---
Kenneth Lavrsen -- for maintaining motion.