= 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: = 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: * [[https://kernelnewbies.org/Outreachyfirstpatch | Outreachy First Patch]] * [[https://www.youtube.com/watch?v=LLBrBBImJt4 | 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 = * [[http://vger.kernel.org/vger-lists.html#linux-iio | linux-iio]] mailing list. * [[https://www.kernel.org/doc/html/v4.12/driver-api/iio/index.html | IIO documentation]] * [[https://events.static.linuxfound.org/sites/events/files/slides/lceu15_baluta.pdf | 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).