KernelNewbies
  • Comments
  • Immutable Page
  • Menu
    • Navigation
    • RecentChanges
    • FindPage
    • Local Site Map
    • Help
    • HelpContents
    • HelpOnMoinWikiSyntax
    • Display
    • Attachments
    • Info
    • Raw Text
    • Print View
    • Edit
    • Load
    • Save
  • Login

Kernel Hacking

  • Frontpage

  • Kernel Hacking

  • Kernel Documentation

  • Kernel Glossary

  • FAQ

  • Found a bug?

  • Kernel Changelog

  • Upstream Merge Guide

Projects

  • KernelJanitors

  • KernelMentors

  • KernelProjects

Community

  • Why a community?

  • Regional Kernelnewbies

  • Personal Pages

  • Upcoming Events

References

  • Mailing Lists

  • Related Sites

  • Programming Links

Wiki

  • Recent Changes

  • Site Editors

  • Side Bar

  • Tips for Editors

  • Hosted by WikiWall

Navigation

  • RecentChanges
  • FindPage
  • HelpContents

Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

KernelNewbies:
  • IIO_tasks

Welcome to IIO tasks page

This page is dedicated to students applying for GSoC/Outreachy programs.

It also aims to help newcomers getting started with the Industrial IO subsystem, offering pointers to documentation and small tasks.

For GSoC/Outreachy students:

Please use a single email thread for communication. During the application always reply to this thread if you have a question or sending the solution for a task. The email should have the following format:

subject: GSoC IIO project: Your Name

body: <short description of content: e.g Task 01 / Question about the schedule / etc> <the actual email body>

Experimenting with IIO subsystem

For this we will use two kernel modules found in drivers/iio/dummy:

  • iio_dummy.ko - example IIO driver to demonstrate existing functionality

    • core implementation can be found in iio_simple_dummy.c

    • buffer functionality is implemented in iio_simple_dummy_buffer.c

    • events functionality is implemented in iio_simple_dummy_events.c

  • iio_dummy_evgen.ko - generates fake events interrupts to be used by the iio_dummy example driver

    • implementation for this module is in iio_dummy_evgen.c

Dummy modules compilation

You need to select the following config options:

  • CONFIG_IIO_CONFIGFS - for creating the dummy device under configfs

  • CONFIG_IIO_SIMPLE_DUMMY - for building iio_dummy kernel module

    • CONFIG_IIO_SIMPLE_DUMMY_EVENTS, CONFIG_IIO_SIMPLE_DUMMY_BUFFER should be selected for events and buffer functionality.

  • CONFIG_IIO_DUMMY_EVGEN - for building iio_dummy_evgen kernel module

  • Mount the configfs filesystem: read Documentation/iio/iio_configfs.txt

Use the following commands for modules compilation:

  • $ make drivers/iio/dummy/iio_dummy_evgen.ko

  • $ make drivers/iio/dummy/iio_dummy.ko

Use the following commands for module loading:

  • $ insmod iio_dummy_evgen.ko

  • $ insmod iio_dummy.ko

Use the following command to create your dummy device under the configfs filesystem:

  • $  mkdir /config/iio/devices/dummy/my_dummy_device

Task 01:

  • Show that config options for IIO dummy modules were correctly selected
    • send the content of the following command grep IIO .config

Task 02:

  • Show that the modules were successfully loaded.
    • lsmod | grep dummy
    • ls -l /config/iio/devices/dummy/
    • ls -l /sys/bus/iio/devices/iio:device0/
    • ls -l /sys/bus/iio/devices/iio_evgen/

Task 03:

  • Add channels for a 3-axis compass to iio_simple_dummy module.
  • Show that channels were successfully added
    • ls -l /sys/bus/iio/devices/iio:device0/
    • ls -l /sys/bus/iio/devices/iio:device0/scan_elements
    • create a patch with your changes
  • Hints:

    • channel type for a compass is IIO_MAGN
    • users should be able to read raw readings from each axis
    • users should be able to read a shared scale
    • users should be able to access data via a buffer
      • data is unsigned, resolution is 16 bits, storage is 16 bits
    • compass doesn't support events

IIO event monitor

IIO event monitor is an user space example application which reads events from IIO layer and pretty prints the results. Implementation can be found in iio_event_monitor.c under tools/iio/.

Task 04:

Compile iio_event_monitor:

  • compile iio_event_monitor.c to obtain an executable called iio_event_monitor.

  • send us the command(s) used to successfully compile iio_event_monitor.c

Task 05:

Read events using iio_event_monitor

  • run iio_event_monitor without arguments to figure out how it should be used
  • read events from iio_dummy module
  • Hints

    • Events are generated by iio_dummy_evgen via sysfs (look inside /sys/bus/iio/devices/iio_evgen/)
  • send us the commands used to read/generate the events

Generic buffer

Task 06:

Create triggers using configfs interface.

  • read Documentation/iio/iio_configfs.txt in order to create an hrtimer software trigger named t1.
  • where in the sysfs hierarchy does the trigger resides?
  • sends us the commands used to create the trigger

Task 07:

Read samples from buffer generated by the iio_dummy module.

  • compile iio_generic_buffer.c from tools/iio. This program will be used to read data from buffer.
  • have a look at ./iio_generic_buffer -h options. You will use the trigger t1 created with the previous tasks and iio_dummy_part_no for IIO device.

  • send us the full command history

Coding Tasks

Coding Task 1

Send 2 cleanup patches to the linux kernel.

Important:

  • patches should be for code in drivers/staging/
  • use tools like checkpatch.pl, sparse or coccinelle to find cleanups.

Useful links:

  • Outreachy First Patch

  • Greg KH presentation - Send your first patch

Coding Task 2

drivers/staging directory is the place where drivers that aren't yet fit to be merged into the main portion of the kernel for various reasons: code quality, non standard interfaces, etc. Grab a driver from drivers/staging/iio and try to move it into drivers/iio.

Important:

  • read IIO documentation and try to understand why the driver you picked is not yet ready to be merged into drivers/iio.
  • send an email to linux-iio mailing list with your idea for changes to be done in order to move the driver out of staging

Coding Task 3

Each driver that supports both SPI and I2C has the following structure:

  • common part
  • I2C part
  • SPI part

It seems that there is a lot of duplicate/similar code for I2C/SPI parts. Have a look at the following drivers:

  • drivers/iio/accel/mma7455_{core,spi,i2c}.c
  • drivers/iio/pressure/st_pressure{core,spi,i2c}.c
  • drivers/iio/magnetometer/hmc5843{core,spi,i2c}.c

We want to create a common framework for I2C/SPI parts and reuse it for each driver to avoid code duplication.

Important:

* before starting writing the code send an email to linux-iio list presenting your idea on how do you want to solve this in order to get some feedback.

Resources

  • linux-iio mailing list.

  • IIO documentation

  • IIO presentation

For questions please send questions in the format mentioned above to daniel.baluta at nxp dot com or the #linux-iio IRC channel (server irc.oftc.net).

  • MoinMoin Powered
  • Python Powered
  • GPL licensed
  • Valid HTML 4.01