SlideShare a Scribd company logo
IIO, a new kernel subsystem
IIO, a new kernel
subsystem
Maxime Ripard
Free Electrons
c Copyright 2009-2012, Free Electrons.
Creative Commons BY-SA 3.0 license.
Latest update: February 14, 2012.
Document sources, updates and translations:
Corrections, suggestions, contributions and translations are welcome!
Embedded Linux
Developers
Free Electrons
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 1
Outline
IIO, a new kernel subsystem
What is IIO ?
Definition
Current state in the kernel
Getting started
IIO device
IIO channels
Going further : Hardware triggers and buffers
Hardware Triggers
Buffers
Useful Resources
Conclusion
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 3
Maxime Ripard
Embedded Linux engineer and trainer at Free Electrons since
2011
Embedded Linux development: kernel and driver development,
system integration, boot time and power consumption
optimization, etc.
Embedded Linux, Embedded Android and driver development
training, with materials freely available under a Creative
Commons license.
http://free-electrons.com
Contributor to Buildroot, a simple open-source embedded
build system
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 4
Outline
IIO, a new kernel subsystem
What is IIO ?
Definition
Current state in the kernel
Getting started
IIO device
IIO channels
Going further : Hardware triggers and buffers
Hardware Triggers
Buffers
Useful Resources
Conclusion
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 5
IIO
A subsystem for Analog to Digital Converters (ADCs) and
related hardwares (accelerometers, light sensors, gyroscopes),
but also DACs
Can be used on ADCs ranging from a SoC ADC to 100M
samples/sec industrial ADCs
Until recently, mostly focused on user-space abstraction with
no in-kernel API for other drivers
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 6
Current state in the kernel
Developed since 2009 by Jonathan Cameron
Being developed in the staging/ directory until it comes to
an high quality code and a mature API
It is now moving out of staging, one step at a time: first,
basic features, then the support for advanced IIO features.
Already has a lot of different hardware supports and drivers
for them, mostly from Analog Devices Inc, but also drivers for
Texas Instruments, Atmel, etc.
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 7
Outline
IIO, a new kernel subsystem
What is IIO ?
Definition
Current state in the kernel
Getting started
IIO device
IIO channels
Going further : Hardware triggers and buffers
Hardware Triggers
Buffers
Useful Resources
Conclusion
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 8
iio dev structure
Main structure of all IIO drivers
Holds informations about the device and the driver, such as :
How much channels are available on the device ?
What modes can the device operate in ?
What hooks are available for this driver ?
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 9
Allocate a new device
struct iio_dev *idev = iio_allocate_device)
sizeof(struct at91_adc_state));
Allocates a struct iio dev, along with the private data of your
driver
Does all the basic initialisation
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 10
Capture modes
idev->modes = INDIO_DIRECT_MODE;
Defines the mode of operations available for this device, to choose
between :
INDIO DIRECT MODE the device can operate using software
triggers
INDIO BUFFER TRIGGERED the device can use hardware
triggers
INDIO BUFFER HARDWARE the device has a hardware buffer
INDIO ALL BUFFER MODES union of the two above
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 11
IIO infos
static const struct iio_info at91_adc_info = {
.driver_module = THIS_MODULE,
.read_raw = &at91_adc_read_raw,
};
idev->info = &at91_adc_info;
Used to declare the hooks the core can use for this device
Lot of hooks available corresponding to interactions the user
can make through sysfs.
read_raw for example is called to request a value from the
driver. A bitmask allows us to know more precisely which type
of value is requested, and for which channel if needed. It can
be for example either the scale used to convert value returned
to volts or the value in itself.
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 12
Basic design of the driver
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 13
iio channels declaration
struct iio_chan_spec *chan = kmalloc(sizeof(struct iio_chan_spec),
GFP_KERNEL);
chan->type = IIO_VOLTAGE;
chan->indexed = 1;
chan->channel = 1;
chan->scan_type.sign = ’u’;
chan->scan_type.realbits = 10;
chan->scan_type.storagebits = 16;
chan->info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT;
idev->channels = chan;
idev->num_channels = 1;
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 14
Register the device
iio_device_register(idev);
this is sufficient to have a basic IIO device driver
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 15
Userspace API
If we look at /sys/bus/iio/devices/iio:deviceX, we should
have:
$ ls /sys/bus/iio/devices/iio:deviceX
in_voltage0_raw
in_voltage_scale
name
$
reading in voltage0 raw calls the read raw hook, with the
mask set to 0, and the chan argument set with the
iio chan spec structure corresponding to the the channel 0
reading in voltage scale calls the read raw hook, with the
mask set to IIO CHAN INFO SCALE
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 16
Outline
IIO, a new kernel subsystem
What is IIO ?
Definition
Current state in the kernel
Getting started
IIO device
IIO channels
Going further : Hardware triggers and buffers
Hardware Triggers
Buffers
Useful Resources
Conclusion
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 17
Hardware Triggers
IIO exposes API so that we can :
declare any given number of triggers
choose which channels we want enabled for conversions
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 18
Kernel API
static const struct iio_trigger_ops at91_adc_trigger_ops = {
.owner = THIS_MODULE,
.set_trigger_state = &at91_adc_configure_trigger,
};
struct iio_trigger *trig = iio_allocate_trigger("foo");
trig->ops = &at91_adc_trigger_ops;
iio_trigger_register(trig)
Once again, we have hooks to declare
These hooks are this time triggers-specific, so that we can
have a function called when the trigger state changes.
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 19
Poll Function
function triggered at each conversion
called through the functions iio_trigger_poll or
iio_trigger_poll_chained
basically, its job is to feed retrieve data from the device and
feed them into the buffer
IIO uses the IRQ model, so the poll function has the same
prototype than any other IRQ handler.
idev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&at91_adc_trigger_handler,
IRQF_ONESHOT,
idev,
"foo");
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 20
Buffers
doesn’t make much sense to have triggered captures without
a buffer
Buffers and triggers are closely tied together in IIO
2 types of buffers in IIO
One relies on kfifo
The other one is a ring buffer
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 21
Allocate a buffer
in the latest code, if you want to use the IIO ring buffer, boiler
plate code has been added so it’s pretty straightforward.
ret = iio_sw_rb_simple_setup(idev,
&iio_pollfunc_store_time,
&at91_adc_trigger_handler);
Allocate the buffer, allocates the poll function, declares the
device as supporting triggered capture, register the buffer
against the core, etc
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 22
Userspace API 1/3: Set up the capture
If we look at /sys/bus/iio/devices/, we should now have in
addition to iio:deviceX:
$ ls /sys/bus/iio/devices/
iio:device0
trigger0
$ ls /sys/bus/iio/devices/iio:device0
buffer
scan_elements
trigger
$ ls /sys/bus/iio/devices/iio:device0/buffer
enabled length
$ ls /sys/bus/iio/devices/iio:device0/scan_elements
in_voltage0_en
in_voltage0_index
in_voltage0_type
$ ls /sys/bus/iio/devices/trigger0
name
$
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 23
Userspace API 2/3: Start and stop a capture
$ echo 1 > 
/sys/bus/iio/devices/iio:device0/scan_elements/in_voltage0_en
$ echo "foo" > 
/sys/bus/iio/devices/iio:device0/trigger/current_trigger
$ echo 100 > /sys/bus/iio/devices/iio:device0/buffer/length
$ echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable
$ echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable
$ echo "" > 
/sys/bus/iio/devices/iio:device0/trigger/current_trigger
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 24
Userspace API 3/3: Get the capture results
IIO also exposes a character device to get the converted
values: /dev/iio:deviceX
You just have to read in it to get data
Data are organized by chunks
Example: You have 4 channels, plus a timestamp one. All are
enabled except channel 2.
Channels Timestamp
Index 0 1 3
Size in bits 16 16 16 64
There is a program that provides a basic implementation and
a good way to test your driver in the IIO documentation
directory: drivers/staging/iio/Documentation/
generic_buffer.c
# ./generic-buffer -n at91_adc -t at91_adc-dev0-external
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 25
Outline
IIO, a new kernel subsystem
What is IIO ?
Definition
Current state in the kernel
Getting started
IIO device
IIO channels
Going further : Hardware triggers and buffers
Hardware Triggers
Buffers
Useful Resources
Conclusion
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 26
Useful Resources
drivers/staging/iio/Documentation
drivers/staging/iio/iio_simple_dummy.c
http://www.ohwr.org/projects/zio/wiki/Iio
http://www.at91.com/linux4sam/bin/view/Linux4SAM/
IioAdcDriver
linux-iio@vger.kernel.org
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 27
Outline
IIO, a new kernel subsystem
What is IIO ?
Definition
Current state in the kernel
Getting started
IIO device
IIO channels
Going further : Hardware triggers and buffers
Hardware Triggers
Buffers
Useful Resources
Conclusion
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 28
Conclusion
IIO is a nice subsystem to add ADCs and the like support
Still under heavy development, but also really opens to
changes and feedback
Yet reliable enough to be used in production
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 29

More Related Content

What's hot

BIOS and Secure Boot Attacks Uncovered
BIOS and Secure Boot Attacks UncoveredBIOS and Secure Boot Attacks Uncovered
BIOS and Secure Boot Attacks UncoveredAlex Matrosov
 
Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021
Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021
Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021
Deepak Shankar
 
LCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted FirmwareLCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted Firmware
Linaro
 
Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development
FastBit Embedded Brain Academy
 
Session 8,9 PCI Express
Session 8,9 PCI ExpressSession 8,9 PCI Express
Session 8,9 PCI ExpressSubhash Iyer
 
강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노
chcbaram
 
from Source to Binary: How GNU Toolchain Works
from Source to Binary: How GNU Toolchain Worksfrom Source to Binary: How GNU Toolchain Works
from Source to Binary: How GNU Toolchain Works
National Cheng Kung University
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動
uchan_nos
 
Pcie drivers basics
Pcie drivers basicsPcie drivers basics
Pcie drivers basics
Venkatesh Malla
 
Build your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto projectBuild your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto project
Yen-Chin Lee
 
Bootloaders
BootloadersBootloaders
Bootloaders
Anil Kumar Pugalia
 
Introducing FIDO Device Onboard (FDO)
Introducing  FIDO Device Onboard (FDO)Introducing  FIDO Device Onboard (FDO)
Introducing FIDO Device Onboard (FDO)
FIDO Alliance
 
Curso microcontroladores pic no mp lab 8
Curso microcontroladores pic no mp lab 8Curso microcontroladores pic no mp lab 8
Curso microcontroladores pic no mp lab 8
RogerMasters
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
Nobuhiro Iwamatsu
 
OSEK / VDX
OSEK / VDXOSEK / VDX
OSEK / VDX
JOLLUSUDARSHANREDDY
 
강좌 03 개발환경 구축
강좌 03 개발환경 구축강좌 03 개발환경 구축
강좌 03 개발환경 구축
chcbaram
 
Pci express transaction
Pci express transactionPci express transaction
Pci express transaction
y38y38
 

What's hot (20)

BIOS and Secure Boot Attacks Uncovered
BIOS and Secure Boot Attacks UncoveredBIOS and Secure Boot Attacks Uncovered
BIOS and Secure Boot Attacks Uncovered
 
Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021
Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021
Compare Performance-power of Arm Cortex vs RISC-V for AI applications_oct_2021
 
LCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted FirmwareLCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted Firmware
 
Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development
 
Session 8,9 PCI Express
Session 8,9 PCI ExpressSession 8,9 PCI Express
Session 8,9 PCI Express
 
강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노
 
from Source to Binary: How GNU Toolchain Works
from Source to Binary: How GNU Toolchain Worksfrom Source to Binary: How GNU Toolchain Works
from Source to Binary: How GNU Toolchain Works
 
Linux Porting
Linux PortingLinux Porting
Linux Porting
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動
 
Pcie drivers basics
Pcie drivers basicsPcie drivers basics
Pcie drivers basics
 
Build your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto projectBuild your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto project
 
USB 3.0
USB 3.0USB 3.0
USB 3.0
 
Bootloaders
BootloadersBootloaders
Bootloaders
 
Introducing FIDO Device Onboard (FDO)
Introducing  FIDO Device Onboard (FDO)Introducing  FIDO Device Onboard (FDO)
Introducing FIDO Device Onboard (FDO)
 
Curso microcontroladores pic no mp lab 8
Curso microcontroladores pic no mp lab 8Curso microcontroladores pic no mp lab 8
Curso microcontroladores pic no mp lab 8
 
APB
APBAPB
APB
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
OSEK / VDX
OSEK / VDXOSEK / VDX
OSEK / VDX
 
강좌 03 개발환경 구축
강좌 03 개발환경 구축강좌 03 개발환경 구축
강좌 03 개발환경 구축
 
Pci express transaction
Pci express transactionPci express transaction
Pci express transaction
 

Similar to 127 iio a-new-subsystem

Inria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoT
Inria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoTInria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoT
Inria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoT
Stéphanie Roger
 
Os Grossupdated
Os GrossupdatedOs Grossupdated
Os Grossupdatedoscon2007
 
TDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux EmbarcadoTDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux Embarcado
tdc-globalcode
 
How to Choose a Software Update Mechanism for Embedded Linux Devices
How to Choose a Software Update Mechanism for Embedded Linux DevicesHow to Choose a Software Update Mechanism for Embedded Linux Devices
How to Choose a Software Update Mechanism for Embedded Linux Devices
Leon Anavi
 
Linux day 2016 Yocto Project
Linux day 2016 Yocto ProjectLinux day 2016 Yocto Project
Linux day 2016 Yocto Project
Marco Cavallini
 
Kernel Recipes 2014 - Supporting a new ARM platform: the Allwinner example
Kernel Recipes 2014 - Supporting a new ARM platform: the Allwinner exampleKernel Recipes 2014 - Supporting a new ARM platform: the Allwinner example
Kernel Recipes 2014 - Supporting a new ARM platform: the Allwinner example
Anne Nicolas
 
Kernel Recipes 2013 - ARM support in the Linux kernel
Kernel Recipes 2013 - ARM support in the Linux kernelKernel Recipes 2013 - ARM support in the Linux kernel
Kernel Recipes 2013 - ARM support in the Linux kernel
Anne Nicolas
 
Kernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using BuildrootKernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using Buildroot
Anne Nicolas
 
Userspace drivers-2016
Userspace drivers-2016Userspace drivers-2016
Userspace drivers-2016
Chris Simmonds
 
OWF12/PAUG Conf Days Android system development, maxime ripard, free electrons
OWF12/PAUG Conf Days Android system development, maxime ripard, free electronsOWF12/PAUG Conf Days Android system development, maxime ripard, free electrons
OWF12/PAUG Conf Days Android system development, maxime ripard, free electronsParis Open Source Summit
 
Run Qt on Linux embedded systems using Yocto
Run Qt on Linux embedded systems using YoctoRun Qt on Linux embedded systems using Yocto
Run Qt on Linux embedded systems using Yocto
Marco Cavallini
 
Kotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptxKotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptx
takshilkunadia
 
180 nm Tape out experience using Open POWER ISA
180 nm Tape out experience using Open POWER ISA180 nm Tape out experience using Open POWER ISA
180 nm Tape out experience using Open POWER ISA
Ganesan Narayanasamy
 
Iit roorkee 2021
Iit roorkee 2021Iit roorkee 2021
Iit roorkee 2021
Vaibhav R
 
Quick and Easy Device Drivers for Embedded Linux Using UIO
Quick and Easy Device Drivers for Embedded Linux Using UIOQuick and Easy Device Drivers for Embedded Linux Using UIO
Quick and Easy Device Drivers for Embedded Linux Using UIO
Chris Simmonds
 
The Fundamentals of Internet of Everything Connectivity
The Fundamentals of Internet of Everything ConnectivityThe Fundamentals of Internet of Everything Connectivity
The Fundamentals of Internet of Everything Connectivity
Qualcomm Developer Network
 
Linux internals v4
Linux internals v4Linux internals v4
Linux internals v4
Liran Ben Haim
 
Petazzoni device-tree-dummies
Petazzoni device-tree-dummiesPetazzoni device-tree-dummies
Petazzoni device-tree-dummiesAlex Cherny
 
Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...
Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...
Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...
IOSR Journals
 
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B KuteUnit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Tushar B Kute
 

Similar to 127 iio a-new-subsystem (20)

Inria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoT
Inria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoTInria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoT
Inria Tech Talk : RIOT, l'OS libre pour vos objets connectés #IoT
 
Os Grossupdated
Os GrossupdatedOs Grossupdated
Os Grossupdated
 
TDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux EmbarcadoTDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux Embarcado
 
How to Choose a Software Update Mechanism for Embedded Linux Devices
How to Choose a Software Update Mechanism for Embedded Linux DevicesHow to Choose a Software Update Mechanism for Embedded Linux Devices
How to Choose a Software Update Mechanism for Embedded Linux Devices
 
Linux day 2016 Yocto Project
Linux day 2016 Yocto ProjectLinux day 2016 Yocto Project
Linux day 2016 Yocto Project
 
Kernel Recipes 2014 - Supporting a new ARM platform: the Allwinner example
Kernel Recipes 2014 - Supporting a new ARM platform: the Allwinner exampleKernel Recipes 2014 - Supporting a new ARM platform: the Allwinner example
Kernel Recipes 2014 - Supporting a new ARM platform: the Allwinner example
 
Kernel Recipes 2013 - ARM support in the Linux kernel
Kernel Recipes 2013 - ARM support in the Linux kernelKernel Recipes 2013 - ARM support in the Linux kernel
Kernel Recipes 2013 - ARM support in the Linux kernel
 
Kernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using BuildrootKernel Recipes 2013 - Easy rootfs using Buildroot
Kernel Recipes 2013 - Easy rootfs using Buildroot
 
Userspace drivers-2016
Userspace drivers-2016Userspace drivers-2016
Userspace drivers-2016
 
OWF12/PAUG Conf Days Android system development, maxime ripard, free electrons
OWF12/PAUG Conf Days Android system development, maxime ripard, free electronsOWF12/PAUG Conf Days Android system development, maxime ripard, free electrons
OWF12/PAUG Conf Days Android system development, maxime ripard, free electrons
 
Run Qt on Linux embedded systems using Yocto
Run Qt on Linux embedded systems using YoctoRun Qt on Linux embedded systems using Yocto
Run Qt on Linux embedded systems using Yocto
 
Kotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptxKotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptx
 
180 nm Tape out experience using Open POWER ISA
180 nm Tape out experience using Open POWER ISA180 nm Tape out experience using Open POWER ISA
180 nm Tape out experience using Open POWER ISA
 
Iit roorkee 2021
Iit roorkee 2021Iit roorkee 2021
Iit roorkee 2021
 
Quick and Easy Device Drivers for Embedded Linux Using UIO
Quick and Easy Device Drivers for Embedded Linux Using UIOQuick and Easy Device Drivers for Embedded Linux Using UIO
Quick and Easy Device Drivers for Embedded Linux Using UIO
 
The Fundamentals of Internet of Everything Connectivity
The Fundamentals of Internet of Everything ConnectivityThe Fundamentals of Internet of Everything Connectivity
The Fundamentals of Internet of Everything Connectivity
 
Linux internals v4
Linux internals v4Linux internals v4
Linux internals v4
 
Petazzoni device-tree-dummies
Petazzoni device-tree-dummiesPetazzoni device-tree-dummies
Petazzoni device-tree-dummies
 
Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...
Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...
Implementation of Cmos Camera Device Driver and Wifi Technology on S3c2440 Us...
 
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B KuteUnit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
 

Recently uploaded

Natural birth techniques - Mrs.Akanksha Trivedi Rama University
Natural birth techniques - Mrs.Akanksha Trivedi Rama UniversityNatural birth techniques - Mrs.Akanksha Trivedi Rama University
Natural birth techniques - Mrs.Akanksha Trivedi Rama University
Akanksha trivedi rama nursing college kanpur.
 
Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46
Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46
Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46
MysoreMuleSoftMeetup
 
Azure Interview Questions and Answers PDF By ScholarHat
Azure Interview Questions and Answers PDF By ScholarHatAzure Interview Questions and Answers PDF By ScholarHat
Azure Interview Questions and Answers PDF By ScholarHat
Scholarhat
 
JEE1_This_section_contains_FOUR_ questions
JEE1_This_section_contains_FOUR_ questionsJEE1_This_section_contains_FOUR_ questions
JEE1_This_section_contains_FOUR_ questions
ShivajiThube2
 
BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...
BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...
BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...
Nguyen Thanh Tu Collection
 
Digital Artifact 2 - Investigating Pavilion Designs
Digital Artifact 2 - Investigating Pavilion DesignsDigital Artifact 2 - Investigating Pavilion Designs
Digital Artifact 2 - Investigating Pavilion Designs
chanes7
 
Model Attribute Check Company Auto Property
Model Attribute  Check Company Auto PropertyModel Attribute  Check Company Auto Property
Model Attribute Check Company Auto Property
Celine George
 
How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17
Celine George
 
The Diamond Necklace by Guy De Maupassant.pptx
The Diamond Necklace by Guy De Maupassant.pptxThe Diamond Necklace by Guy De Maupassant.pptx
The Diamond Necklace by Guy De Maupassant.pptx
DhatriParmar
 
Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...
Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...
Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...
Dr. Vinod Kumar Kanvaria
 
The Accursed House by Émile Gaboriau.pptx
The Accursed House by Émile Gaboriau.pptxThe Accursed House by Émile Gaboriau.pptx
The Accursed House by Émile Gaboriau.pptx
DhatriParmar
 
The approach at University of Liverpool.pptx
The approach at University of Liverpool.pptxThe approach at University of Liverpool.pptx
The approach at University of Liverpool.pptx
Jisc
 
South African Journal of Science: Writing with integrity workshop (2024)
South African Journal of Science: Writing with integrity workshop (2024)South African Journal of Science: Writing with integrity workshop (2024)
South African Journal of Science: Writing with integrity workshop (2024)
Academy of Science of South Africa
 
Advantages and Disadvantages of CMS from an SEO Perspective
Advantages and Disadvantages of CMS from an SEO PerspectiveAdvantages and Disadvantages of CMS from an SEO Perspective
Advantages and Disadvantages of CMS from an SEO Perspective
Krisztián Száraz
 
Introduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp NetworkIntroduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp Network
TechSoup
 
Pride Month Slides 2024 David Douglas School District
Pride Month Slides 2024 David Douglas School DistrictPride Month Slides 2024 David Douglas School District
Pride Month Slides 2024 David Douglas School District
David Douglas School District
 
1.4 modern child centered education - mahatma gandhi-2.pptx
1.4 modern child centered education - mahatma gandhi-2.pptx1.4 modern child centered education - mahatma gandhi-2.pptx
1.4 modern child centered education - mahatma gandhi-2.pptx
JosvitaDsouza2
 
The Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collectionThe Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collection
Israel Genealogy Research Association
 
S1-Introduction-Biopesticides in ICM.pptx
S1-Introduction-Biopesticides in ICM.pptxS1-Introduction-Biopesticides in ICM.pptx
S1-Introduction-Biopesticides in ICM.pptx
tarandeep35
 
CACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdfCACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdf
camakaiclarkmusic
 

Recently uploaded (20)

Natural birth techniques - Mrs.Akanksha Trivedi Rama University
Natural birth techniques - Mrs.Akanksha Trivedi Rama UniversityNatural birth techniques - Mrs.Akanksha Trivedi Rama University
Natural birth techniques - Mrs.Akanksha Trivedi Rama University
 
Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46
Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46
Mule 4.6 & Java 17 Upgrade | MuleSoft Mysore Meetup #46
 
Azure Interview Questions and Answers PDF By ScholarHat
Azure Interview Questions and Answers PDF By ScholarHatAzure Interview Questions and Answers PDF By ScholarHat
Azure Interview Questions and Answers PDF By ScholarHat
 
JEE1_This_section_contains_FOUR_ questions
JEE1_This_section_contains_FOUR_ questionsJEE1_This_section_contains_FOUR_ questions
JEE1_This_section_contains_FOUR_ questions
 
BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...
BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...
BÀI TẬP BỔ TRỢ TIẾNG ANH GLOBAL SUCCESS LỚP 3 - CẢ NĂM (CÓ FILE NGHE VÀ ĐÁP Á...
 
Digital Artifact 2 - Investigating Pavilion Designs
Digital Artifact 2 - Investigating Pavilion DesignsDigital Artifact 2 - Investigating Pavilion Designs
Digital Artifact 2 - Investigating Pavilion Designs
 
Model Attribute Check Company Auto Property
Model Attribute  Check Company Auto PropertyModel Attribute  Check Company Auto Property
Model Attribute Check Company Auto Property
 
How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17
 
The Diamond Necklace by Guy De Maupassant.pptx
The Diamond Necklace by Guy De Maupassant.pptxThe Diamond Necklace by Guy De Maupassant.pptx
The Diamond Necklace by Guy De Maupassant.pptx
 
Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...
Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...
Exploiting Artificial Intelligence for Empowering Researchers and Faculty, In...
 
The Accursed House by Émile Gaboriau.pptx
The Accursed House by Émile Gaboriau.pptxThe Accursed House by Émile Gaboriau.pptx
The Accursed House by Émile Gaboriau.pptx
 
The approach at University of Liverpool.pptx
The approach at University of Liverpool.pptxThe approach at University of Liverpool.pptx
The approach at University of Liverpool.pptx
 
South African Journal of Science: Writing with integrity workshop (2024)
South African Journal of Science: Writing with integrity workshop (2024)South African Journal of Science: Writing with integrity workshop (2024)
South African Journal of Science: Writing with integrity workshop (2024)
 
Advantages and Disadvantages of CMS from an SEO Perspective
Advantages and Disadvantages of CMS from an SEO PerspectiveAdvantages and Disadvantages of CMS from an SEO Perspective
Advantages and Disadvantages of CMS from an SEO Perspective
 
Introduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp NetworkIntroduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp Network
 
Pride Month Slides 2024 David Douglas School District
Pride Month Slides 2024 David Douglas School DistrictPride Month Slides 2024 David Douglas School District
Pride Month Slides 2024 David Douglas School District
 
1.4 modern child centered education - mahatma gandhi-2.pptx
1.4 modern child centered education - mahatma gandhi-2.pptx1.4 modern child centered education - mahatma gandhi-2.pptx
1.4 modern child centered education - mahatma gandhi-2.pptx
 
The Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collectionThe Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collection
 
S1-Introduction-Biopesticides in ICM.pptx
S1-Introduction-Biopesticides in ICM.pptxS1-Introduction-Biopesticides in ICM.pptx
S1-Introduction-Biopesticides in ICM.pptx
 
CACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdfCACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdf
 

127 iio a-new-subsystem

  • 1. IIO, a new kernel subsystem IIO, a new kernel subsystem Maxime Ripard Free Electrons c Copyright 2009-2012, Free Electrons. Creative Commons BY-SA 3.0 license. Latest update: February 14, 2012. Document sources, updates and translations: Corrections, suggestions, contributions and translations are welcome! Embedded Linux Developers Free Electrons Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 1
  • 2. Outline IIO, a new kernel subsystem What is IIO ? Definition Current state in the kernel Getting started IIO device IIO channels Going further : Hardware triggers and buffers Hardware Triggers Buffers Useful Resources Conclusion Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 3
  • 3. Maxime Ripard Embedded Linux engineer and trainer at Free Electrons since 2011 Embedded Linux development: kernel and driver development, system integration, boot time and power consumption optimization, etc. Embedded Linux, Embedded Android and driver development training, with materials freely available under a Creative Commons license. http://free-electrons.com Contributor to Buildroot, a simple open-source embedded build system Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 4
  • 4. Outline IIO, a new kernel subsystem What is IIO ? Definition Current state in the kernel Getting started IIO device IIO channels Going further : Hardware triggers and buffers Hardware Triggers Buffers Useful Resources Conclusion Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 5
  • 5. IIO A subsystem for Analog to Digital Converters (ADCs) and related hardwares (accelerometers, light sensors, gyroscopes), but also DACs Can be used on ADCs ranging from a SoC ADC to 100M samples/sec industrial ADCs Until recently, mostly focused on user-space abstraction with no in-kernel API for other drivers Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 6
  • 6. Current state in the kernel Developed since 2009 by Jonathan Cameron Being developed in the staging/ directory until it comes to an high quality code and a mature API It is now moving out of staging, one step at a time: first, basic features, then the support for advanced IIO features. Already has a lot of different hardware supports and drivers for them, mostly from Analog Devices Inc, but also drivers for Texas Instruments, Atmel, etc. Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 7
  • 7. Outline IIO, a new kernel subsystem What is IIO ? Definition Current state in the kernel Getting started IIO device IIO channels Going further : Hardware triggers and buffers Hardware Triggers Buffers Useful Resources Conclusion Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 8
  • 8. iio dev structure Main structure of all IIO drivers Holds informations about the device and the driver, such as : How much channels are available on the device ? What modes can the device operate in ? What hooks are available for this driver ? Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 9
  • 9. Allocate a new device struct iio_dev *idev = iio_allocate_device) sizeof(struct at91_adc_state)); Allocates a struct iio dev, along with the private data of your driver Does all the basic initialisation Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 10
  • 10. Capture modes idev->modes = INDIO_DIRECT_MODE; Defines the mode of operations available for this device, to choose between : INDIO DIRECT MODE the device can operate using software triggers INDIO BUFFER TRIGGERED the device can use hardware triggers INDIO BUFFER HARDWARE the device has a hardware buffer INDIO ALL BUFFER MODES union of the two above Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 11
  • 11. IIO infos static const struct iio_info at91_adc_info = { .driver_module = THIS_MODULE, .read_raw = &at91_adc_read_raw, }; idev->info = &at91_adc_info; Used to declare the hooks the core can use for this device Lot of hooks available corresponding to interactions the user can make through sysfs. read_raw for example is called to request a value from the driver. A bitmask allows us to know more precisely which type of value is requested, and for which channel if needed. It can be for example either the scale used to convert value returned to volts or the value in itself. Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 12
  • 12. Basic design of the driver Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 13
  • 13. iio channels declaration struct iio_chan_spec *chan = kmalloc(sizeof(struct iio_chan_spec), GFP_KERNEL); chan->type = IIO_VOLTAGE; chan->indexed = 1; chan->channel = 1; chan->scan_type.sign = ’u’; chan->scan_type.realbits = 10; chan->scan_type.storagebits = 16; chan->info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT; idev->channels = chan; idev->num_channels = 1; Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 14
  • 14. Register the device iio_device_register(idev); this is sufficient to have a basic IIO device driver Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 15
  • 15. Userspace API If we look at /sys/bus/iio/devices/iio:deviceX, we should have: $ ls /sys/bus/iio/devices/iio:deviceX in_voltage0_raw in_voltage_scale name $ reading in voltage0 raw calls the read raw hook, with the mask set to 0, and the chan argument set with the iio chan spec structure corresponding to the the channel 0 reading in voltage scale calls the read raw hook, with the mask set to IIO CHAN INFO SCALE Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 16
  • 16. Outline IIO, a new kernel subsystem What is IIO ? Definition Current state in the kernel Getting started IIO device IIO channels Going further : Hardware triggers and buffers Hardware Triggers Buffers Useful Resources Conclusion Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 17
  • 17. Hardware Triggers IIO exposes API so that we can : declare any given number of triggers choose which channels we want enabled for conversions Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 18
  • 18. Kernel API static const struct iio_trigger_ops at91_adc_trigger_ops = { .owner = THIS_MODULE, .set_trigger_state = &at91_adc_configure_trigger, }; struct iio_trigger *trig = iio_allocate_trigger("foo"); trig->ops = &at91_adc_trigger_ops; iio_trigger_register(trig) Once again, we have hooks to declare These hooks are this time triggers-specific, so that we can have a function called when the trigger state changes. Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 19
  • 19. Poll Function function triggered at each conversion called through the functions iio_trigger_poll or iio_trigger_poll_chained basically, its job is to feed retrieve data from the device and feed them into the buffer IIO uses the IRQ model, so the poll function has the same prototype than any other IRQ handler. idev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time, &at91_adc_trigger_handler, IRQF_ONESHOT, idev, "foo"); Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 20
  • 20. Buffers doesn’t make much sense to have triggered captures without a buffer Buffers and triggers are closely tied together in IIO 2 types of buffers in IIO One relies on kfifo The other one is a ring buffer Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 21
  • 21. Allocate a buffer in the latest code, if you want to use the IIO ring buffer, boiler plate code has been added so it’s pretty straightforward. ret = iio_sw_rb_simple_setup(idev, &iio_pollfunc_store_time, &at91_adc_trigger_handler); Allocate the buffer, allocates the poll function, declares the device as supporting triggered capture, register the buffer against the core, etc Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 22
  • 22. Userspace API 1/3: Set up the capture If we look at /sys/bus/iio/devices/, we should now have in addition to iio:deviceX: $ ls /sys/bus/iio/devices/ iio:device0 trigger0 $ ls /sys/bus/iio/devices/iio:device0 buffer scan_elements trigger $ ls /sys/bus/iio/devices/iio:device0/buffer enabled length $ ls /sys/bus/iio/devices/iio:device0/scan_elements in_voltage0_en in_voltage0_index in_voltage0_type $ ls /sys/bus/iio/devices/trigger0 name $ Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 23
  • 23. Userspace API 2/3: Start and stop a capture $ echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage0_en $ echo "foo" > /sys/bus/iio/devices/iio:device0/trigger/current_trigger $ echo 100 > /sys/bus/iio/devices/iio:device0/buffer/length $ echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable $ echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable $ echo "" > /sys/bus/iio/devices/iio:device0/trigger/current_trigger Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 24
  • 24. Userspace API 3/3: Get the capture results IIO also exposes a character device to get the converted values: /dev/iio:deviceX You just have to read in it to get data Data are organized by chunks Example: You have 4 channels, plus a timestamp one. All are enabled except channel 2. Channels Timestamp Index 0 1 3 Size in bits 16 16 16 64 There is a program that provides a basic implementation and a good way to test your driver in the IIO documentation directory: drivers/staging/iio/Documentation/ generic_buffer.c # ./generic-buffer -n at91_adc -t at91_adc-dev0-external Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 25
  • 25. Outline IIO, a new kernel subsystem What is IIO ? Definition Current state in the kernel Getting started IIO device IIO channels Going further : Hardware triggers and buffers Hardware Triggers Buffers Useful Resources Conclusion Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 26
  • 27. Outline IIO, a new kernel subsystem What is IIO ? Definition Current state in the kernel Getting started IIO device IIO channels Going further : Hardware triggers and buffers Hardware Triggers Buffers Useful Resources Conclusion Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 28
  • 28. Conclusion IIO is a nice subsystem to add ADCs and the like support Still under heavy development, but also really opens to changes and feedback Yet reliable enough to be used in production Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 29