## page was renamed from IIO cleanup These tasks are for you to get familiar with the IIO subsystem. For IIO related questions you can join #linux-iio IRC channel (server irc.oftc.net). Please email your solutions to daniel.baluta at intel dot com. Your email should have the subject '''Task XX: Short task description''' = Experimenting with IIO subsystem = For this we will use two kernel modules found in {{{drivers/staging/iio}}}: * {{{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}}} * {{{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}}} == Dummy modules compilation == You need to select the following config options: * {{{CONFIG_IIO_DUMMY_EVGEN}}} - for building {{{iio_dummy_evgen}}} kernel module * {{{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. Use the following commands for modules compilation: * {{{$ make drivers/staging/iio/iio_dummy_evgen.ko}}} * {{{$ make drivers/staging/iio/iio_dummy.ko}}} Use the following commands for module loading: * {{{$ insmod iio_dummy_evgen.ko}}} * {{{$ insmod iio_dummy.ko}}} Task 01: * Show that the modules were successfully loaded. * lsmod * ls -l /sys/bus/iio/devices/ * ls -l /sys/bus/iio/devices/iio:device0/ * ls -l /sys/bus/iio/devices/iio_evgen/ Task 02: * 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/}}}. [[BR]] Task 03: 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 04: 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 05: Create triggers using configfs interface. * read Documentation/iio/iio_configfs.txt in order to create a software trigger named t1. * where in the sysfs hierarchy does the trigger resides? * sends us the commands used to create the trigger Task 06: Read samples from buffer generated by the iio_dummy module. * compile generic_buffer.c from tools/iio. This program will be used to read data from buffer. * have a look at ./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 = Small coding tasks inside the IIO subsystem = Before starting to work on a task make sure that: * you got at least 10 patches and 2 patch series accepted by Greg. * you claimed the task, sending an email to mentor at the top of the page Coding task 1: * Remove ''device'' member from drivers global data using regmap because that can be retrieved with regmap API. * See the following example {{{ --- a/drivers/iio/pressure/bmp280.c +++ b/drivers/iio/pressure/bmp280.c @@ -69,7 +69,6 @@ #define BMP280_SOFT_RESET_VAL 0xB6 struct bmp280_data { - struct i2c_client *client; struct mutex lock; struct regmap *regmap; @@ -150,11 +149,12 @@ static s32 bmp280_compensate_temp(struct bmp280_data *data, int ret; s32 var1, var2; __le16 buf[BMP280_COMP_TEMP_REG_COUNT / 2]; + struct device *dev = regmap_get_device(data->regmap); ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_TEMP_START, buf, BMP280_COMP_TEMP_REG_COUNT); if (ret < 0) { - dev_err(&data->client->dev, + dev_err(&dev, "failed to read temperature calibration parameters\n"); return ret; } }}}