CSE 466 Lab 5: Introduction to the iMote2 and Embedded Linux

Introduction

Now that you've worked with a simple 8-bit microcontroller, we'll be exploring more powerful embedded devices. For the rest of the quarter, we'll be using the iMote2, which has a 32-bit, 415 MHz ARMv5 microcontroller (The PXA271), with 32 MB of Flash, and 32 MB of RAM. This microcontroller was designed for use in cell phones and PDAs. This lab will introduce you to the iMote2 platform, and using Linux as an embedded operating system.

WARNINGS!!!

Objectives

In this lab, you will learn:

Suggested Reading and Resources

Part 1: Getting acquainted with the platform

In your kit, you will have three boards:
The iMote2
The Debug Board
The Basic Sensor Board
The debug board features the same USB interface chip you used in lab 4. It lets you tap into the iMote2's serial ports, SPI bus, and I2C bus. In addition, it contains a JTAG interface for programming and debugging the iMote2. We'll be using this board to access the iMote2's console. The Basic Sensor Board contains an accelerometer, light sensor, temperature and humidity sensor, and a general-purpose ADC converter. In this lab, we'll be using the accelerometer.

We've pre-loaded the Linux kernel, the filesystem, and the bootloader (BLOB) on your iMote2 using the JTAG interface. You should be able to follow these directions and log into the iMote2:

  1. Attach your iMote2 to the debug board, and connect the debug board to your computer with a USB cable.
  2. Double-click the uCon iMote2 icon on the desktop.
  3. Press the power button on the iMote2. The tri-color LED should turn white for a second, and then turn blue. You should see the boot sequence in your window.
  4. Once you receive the login prompt, log in with the username root and the password rootme.
UPDATE:
The iMote2s aren't necessarily appearing on COM2. Sometimes they're COM8, sometimes they're COM13. Look at your Device Manager (MyComputer->Properties->Hardware->Device Manager) under "Ports (COM & LPT)". It'll be the higher of the listed USB serial ports. You can use any terminal program (HyperTerm, etc..) to connect to the mote. Settings for terminal program: 115200/8/none/1/none. For some programs you may have to boot the mote first (disconnect power, reconnect power, hit button, right when the LED turns blue) before connecting with a terminal program.

Now that you've logged in to your iMote2, let's compile our first kernel module and user-level application!
  1. Download and unzip the Blink application code to your attu account.
  2. To compile the kernel module, simply run make. This should produce a file called blink.ko, which is the kernel module.
  3. To compile the application, run:

    /cse/courses/cse466/iMote2/cross-compiler/arm/3.4.1/bin/arm-linux-gcc -o blink-app blink-app.c

    This should produce a file called blink-app, which is a user-level utility to set the blink rate.

  4. Copy the files over to the iMote2 using WinSCP3. To do so:

  5. To load your kernel module, run insmod blink.ko on the iMote2 console. For more information on insmod, see the manual page.
  6. In Linux, like all other Unix-like operating systems, devices appear as special files. Devices can either be character devices, which act like infinite streams of bytes, and block devices, which communicate with fixed-size blocks of data. Devices are part of the regular filesystem namespace, usually appearing under the /dev directory. For each device "file," the filesystem contains an entry mapping that "file" to a device number, split into major and minor parts. Major numbers correspond to a particular kind of device, or a driver responsible for that device. Minor numbers correspond to specific instances of those devices, which are managed by a common driver. You can view these major and minor number by running ls -l /dev.

    Since the number of major device numbers is small, well-behaved drivers request a major number when they are inserted into the kernel. Now that the kernel module has been loaded, we need to find out which major device number Linux has assigned to our new device. To do so, run cat /proc/devices. Under "Character devices," you should see a line like 254 blink. In this case, 254 is the major device number. Since we only have one blink device, we use 0 as the minor number. To make a filesystem entry for the blink device, run mknod /dev/blink c 254 0. This creates a character device named /dev/blink that points to device number 254,0. For more information on mknod, see the manual page.

  7. Execute ./blink-app 1 to blink the LED at 1 Hz.
  8. To remove the blink module, execute rmmod blink. For more information on rmmod, see the manual page.

Part 2: Extending the blink module

Now that you've successfully built a kernel module and an application that uses it, let's take a look at how it works. From there, you'll extend the blink module to drive three PWM signals to the tri-color LED (similar to lab 3).

Let's take a look at the blink-mod.c file.

Now, your task is to modify the blink module and application so that you can set the tri-color LED to any color using PWM. Specifically:
  1. Modify the blink kernel module to generate PWM signals to all three LEDs, like you did in lab 3. You should be able independently control each LED’s duty cycle.
  2. Modify blink-app into a user-level application that sets the color output of the tri-color LED. You’ll need to extend the kernel module’s ioctl interface for this.

Part 3: Using the accelerometer

In this part, you'll finish implementing a driver for the accelerometer on the Basic Sensor Board, and write an application that converts accelerometer readings to colors, like in lab 3.
  1. Download the accelerometer skeleton code here. It should contain the following files:
  2. Before getting started, here's some things to note about the skeleton driver:
  3. Implement accel_irq_handler and accel_ioctl in accel.c.
  4. Test your module with the provided accel-dump application.
  5. Create an application that translates the accelerometer readings into color values. You do not need to do any fancy HSV to RGB mapping -- simply using each axis of the accelerometer to control a single color is sufficient.

Part 4: Using the radio

In this part, you'll be introduced to the radio funcionality of the iMote2. We give you all of the radio sending and receiving code, but you have to define your own packet structure.
  1. Download the radio code located here. It should contain the following files:
  2. Using both of your iMote2s, load CntToLedAndRfm onto one of the nodes, and load RfmToCntAndRfm onto the other
  3. Implement a packet structure and modify both applications so that your receiving node will only respond to your sending node. How you structure your packet is up to you, but you must at least use a unique identifier and a node ID.

Part 5: Putting it all together

In this part, you'll combin the elements from Parts 1-4 and add bidirectional communication between your iMote2s.
  1. Using the moduels you've developed above create two programs for you iMote2.
  2. UPDATE: You will use the accelerometer here, not the light sensor. Additionally, your receiving program should monitor its own accelerometer and send a binary result to the sending node. I.E. If the accelerometer is flat, the node should send an ON. If the accelerometer is tilted past some angle (you choose) the node should send an OFF. You only need to implement this for 1 direction (i.e. just turning the node left is fine). You should send the ON/OFF packets at some periodic rate of your choice.
  3. Your sending node should respond to this packet by ceasing to send packets and updating it's own LEDs instead. Once the sending node receives an ON packet, it should resume sending packets and stop updating it's own LEDs.

Deliverables

E-mail a single .zip file containing all requird documents to cse466-tas@cs.washington.edu
For all files turned in, the comments at the top of the file should contain:

  1. Demonstrate your system of sensor to radio to radio to LEDs to a T.A. You can either do this during lab, or during the first 1/2 hour of the next lab.
  2. Turn in a soft copy of your commented C code. You only need to turn in your application for part 5, and any driver code that you modified for any of the parts of the lab.