0013 Linux Kernel Slides PDF
0013 Linux Kernel Slides PDF
0013 Linux Kernel Slides PDF
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 1/476
Rights to copy
Your fair use and other rights are in no way affected by the above.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 2/476
Hyperlinks in the document
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 3/476
Free Electrons at a glance
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 4/476
Free Electrons on-line resources
information
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 6/476
Hardware used in this training session
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 7/476
Do not damage your BeagleBone Black!
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 8/476
Shopping list: hardware for this course
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 9/476
Participate!
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 10/476
Practical lab guidelines
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 11/476
Advise: write down your commands!
During practical labs, write down all your commands in a text file.
▶ You can save a lot of time re-using
commands in later labs.
▶ This helps to replay your work if Lab commands
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 12/476
Cooperate!
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 13/476
Command memento sheet
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 16/476
Linux Kernel Introduction
Introduction
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 17/476
Linux Kernel Introduction
Linux features
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 18/476
History
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 19/476
Linux kernel key features
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 20/476
Linux kernel in the system
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 21/476
Linux kernel main roles
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 22/476
System calls
▶ The main interface between the kernel and user space is the
set of system calls
▶ About 300 system calls that provide the main kernel services
▶ File and device operations, networking operations,
inter-process communication, process management, memory
mapping, timers, threads, synchronization primitives, etc.
▶ This interface is stable over time: only new system calls can
be added by the kernel developers
▶ This system call interface is wrapped by the C library, and
user space applications usually never make a system call
directly but rather use the corresponding C library function
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 23/476
Pseudo filesystems
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 24/476
Inside the Linux kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 25/476
Supported hardware architectures
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 26/476
Embedded Linux Kernel Usage
Kernel Usage
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 27/476
Embedded Linux Kernel Usage
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 28/476
Location of kernel sources
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 29/476
Getting Linux sources
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 30/476
Linux kernel size (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 32/476
Practical lab - Downloading kernel source code
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 33/476
Kernel Source Code
Code
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 34/476
Kernel Source Code
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 35/476
Programming language
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 36/476
No C library
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 37/476
Portability
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 38/476
No floating point computation
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 39/476
No stable Linux internal API
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 40/476
Kernel memory constraints
▶ No memory protection
▶ Accessing illegal memory locations result in (often fatal)
kernel oopses.
▶ Fixed size stack (8 or 4 KB). Unlike in user space, there's no
way to make it grow.
▶ Kernel memory can't be swapped out (for the same reasons).
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 41/476
Linux kernel licensing constraints
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 42/476
Proprietary code and the kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 43/476
Advantages of GPL drivers
▶ You don't have to write your driver from scratch. You can
reuse code from similar free software drivers.
▶ You could get free community contributions, support, code
review and testing, though this generally only happens with
code submitted for the mainline kernel.
▶ Your drivers can be freely and easily shipped by others (for
example by Linux distributions or embedded Linux build
systems).
▶ Pre-compiled drivers work with only one kernel version and
one specific configuration, making life difficult for users who
want to change the kernel version.
▶ Legal certainty, you are sure that a GPL driver is fine from a
legal point of view.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 44/476
Advantages of in-tree kernel drivers
▶ Once your sources are accepted in the mainline tree, they are
maintained by people making changes.
▶ Near cost-free maintenance, security fixes and improvements.
▶ Easy access to your sources by users.
▶ Many more people reviewing your code.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 45/476
User space device drivers 1/3
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 46/476
User space device drivers 2/3
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 47/476
User space device drivers 3/3
▶ Advantages
▶ No need for kernel coding skills. Easier to reuse code between
devices.
▶ Drivers can be written in any language, even Perl!
▶ Drivers can be kept proprietary.
▶ Driver code can be killed and debugged. Cannot crash the
kernel.
▶ Can be swapped out (kernel code cannot be).
▶ Can use floating-point computation.
▶ Less in-kernel complexity.
▶ Potentially higher performance, especially for memory-mapped
devices, thanks to the avoidance of system calls.
▶ Drawbacks
▶ Less straightforward to handle interrupts.
▶ Increased interrupt latency vs. kernel code.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 48/476
Kernel Source Code
Linux sources
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 49/476
Linux sources structure 1/5
▶ arch/<ARCH>
▶ Architecture specific code
▶ arch/<ARCH>/mach-<machine>, machine/board specific code
▶ arch/<ARCH>/include/asm, architecture-specific headers
▶ arch/<ARCH>/boot/dts, Device Tree source files, for some
architectures
▶ block/
▶ Block layer core
▶ COPYING
▶ Linux copying conditions (GNU GPL)
▶ CREDITS
▶ Linux main contributors
▶ crypto/
▶ Cryptographic libraries
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 50/476
Linux sources structure 2/5
▶ Documentation/
▶ Kernel documentation. Don't miss it!
▶ drivers/
▶ All device drivers except sound ones (usb, pci...)
▶ firmware/
▶ Legacy: firmware images extracted from old drivers
▶ fs/
▶ Filesystems (fs/ext4/, etc.)
▶ include/
▶ Kernel headers
▶ include/linux/
▶ Linux kernel core headers
▶ include/uapi/
▶ User space API headers
▶ init/
▶ Linux initialization (including init/main.c)
▶ ipc/
▶ Code used for process communication
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 51/476
Linux sources structure 3/5
▶ Kbuild
▶ Part of the kernel build system
▶ Kconfig
▶ Top level description file for configuration parameters
▶ kernel/
▶ Linux kernel core (very small!)
▶ lib/
▶ Misc library routines (zlib, crc32...)
▶ MAINTAINERS
▶ Maintainers of each kernel part. Very useful!
▶ Makefile
▶ Top Linux Makefile (sets arch and version)
▶ mm/
▶ Memory management code (small too!)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 52/476
Linux sources structure 4/5
▶ net/
▶ Network support code (not drivers)
▶ README
▶ Overview and building instructions
▶ REPORTING-BUGS
▶ Bug report instructions
▶ samples/
▶ Sample code (markers, kprobes, kobjects...)
▶ scripts/
▶ Scripts for internal or external use
▶ security/
▶ Security model implementations (SELinux...)
▶ sound/
▶ Sound support code and drivers
▶ tools/
▶ Code for various user space tools (mostly C)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 53/476
Linux sources structure 5/5
▶ usr/
▶ Code to generate an initramfs cpio archive
▶ virt/
▶ Virtualization support (KVM)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 54/476
Kernel Source Code
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 55/476
Cscope
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 56/476
Cscope screenshot
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 58/476
LXR screenshot
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 59/476
Practical lab - Kernel Source Code - Exploring
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 60/476
Kernel Source Code
Kernel configuration
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 61/476
Kernel configuration and build system
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 62/476
Kernel configuration (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 63/476
Kernel configuration (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 64/476
Kernel or module?
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 65/476
Kernel option types
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 66/476
Kernel option dependencies
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 67/476
make xconfig
make xconfig
▶ The most common graphical interface to configure the kernel.
▶ Make sure you read
help -> introduction: useful options!
▶ File browser: easier to load configuration files
▶ Search interface to look for parameters
▶ Required Debian / Ubuntu packages: libqt4-dev g++
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 68/476
make xconfig screenshot
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 69/476
make xconfig search interface
Looks for a keyword in the parameter name. Allows to select or
unselect found parameters.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 70/476
Kernel configuration options
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 71/476
Corresponding .config file excerpt
Options are grouped by sections and are prefixed with CONFIG_.
#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=m
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=y
CONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#
# CONFIG_MSDOS_FS is not set
# CONFIG_VFAT_FS is not set
CONFIG_NTFS_FS=m
# CONFIG_NTFS_DEBUG is not set
CONFIG_NTFS_RW=y
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 72/476
make gconfig
make gconfig
▶ GTK based graphical
configuration interface.
Functionality similar to that
of make xconfig.
▶ Just lacking a search
functionality.
▶ Required Debian packages:
libglade2-dev
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 73/476
make menuconfig
make menuconfig
▶ Useful when no graphics are
available. Pretty convenient
too!
▶ Same interface found in
other tools: BusyBox,
Buildroot...
▶ Required Debian packages:
libncurses-dev
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 74/476
make nconfig
make nconfig
▶ A newer, similar text
interface
▶ More user friendly (for
example, easier to access
help information).
▶ Required Debian packages:
libncurses-dev
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 75/476
make oldconfig
make oldconfig
▶ Needed very often!
▶ Useful to upgrade a .config file from an earlier kernel release
▶ Issues warnings for configuration parameters that no longer
exist in the new kernel.
▶ Asks for values for new parameters (while xconfig and
menuconfig silently set default values for new parameters).
If you edit a .config file by hand, it's strongly recommended to
run make oldconfig afterwards!
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 76/476
Undoing configuration changes
A frequent problem:
▶ After changing several kernel configuration settings, your
kernel no longer works.
▶ If you don't remember all the changes you made, you can get
back to your previous configuration:
$ cp .config.old .config
▶ All the configuration interfaces of the kernel (xconfig,
menuconfig, oldconfig...) keep this .config.old backup
copy.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 77/476
Configuration per architecture
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 78/476
Kernel Source Code
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 79/476
Kernel compilation
▶ make
▶ in the main kernel source directory
▶ Remember to run multiple jobs in parallel if you have multiple
CPU cores. Example: make -j 4
▶ No need to run as root!
▶ Generates
▶ vmlinux, the raw uncompressed kernel image, in the ELF
format, useful for debugging purposes, but cannot be booted
▶ arch/<arch>/boot/*Image, the final, usually compressed,
kernel image that can be booted
▶ bzImage for x86, zImage for ARM, vmImage.gz for Blackfin,
etc.
▶ arch/<arch>/boot/dts/*.dtb, compiled Device Tree files (on
some architectures)
▶ All kernel modules, spread over the kernel source tree, as .ko
files.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 80/476
Kernel installation
▶ make install
▶ Does the installation for the host system by default, so needs
to be run as root. Generally not used when compiling for an
embedded system, as it installs files on the development
workstation.
▶ Installs
▶ /boot/vmlinuz-<version>
Compressed kernel image. Same as the one in
arch/<arch>/boot
▶ /boot/System.map-<version>
Stores kernel symbol addresses
▶ /boot/config-<version>
Kernel configuration for this version
▶ Typically re-runs the bootloader configuration utility to take
the new kernel into account.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 81/476
Module installation
▶ make modules_install
▶ Does the installation for the host system by default, so needs
to be run as root
▶ Installs all modules in /lib/modules/<version>/
▶ kernel/
Module .ko (Kernel Object) files, in the same directory
structure as in the sources.
▶ modules.alias
Module aliases for module loading utilities. Example line:
alias sound-service-?-0 snd_mixer_oss
▶ modules.dep, modules.dep.bin (binary hashed)
Module dependencies
▶ modules.symbols, modules.symbols.bin (binary hashed)
Tells which module a given symbol belongs to.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 82/476
Kernel cleanup targets
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 83/476
Kernel Source Code
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 84/476
Cross-compiling the kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 85/476
Specifying cross-compilation (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 86/476
Specifying cross-compilation (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 87/476
Predefined configuration files
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 88/476
Configuring the kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 89/476
Device Tree
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 91/476
Building and installing the kernel
▶ Run make
▶ Copy the final kernel image to the target storage
▶ can be zImage, vmlinux, bzImage in arch/<arch>/boot
▶ copying the Device Tree Blob might be necessary as well, they
are available in arch/<arch>/boot/dts
▶ make install is rarely used in embedded development, as the
kernel image is a single file, easy to handle
▶ It is however possible to customize the make install behaviour
in arch/<arch>/boot/install.sh
▶ make modules_install is used even in embedded
development, as it installs many modules and description files
▶ make INSTALL_MOD_PATH=<dir>/ modules_install
▶ The INSTALL_MOD_PATH variable is needed to install the
modules in the target root filesystem instead of your host root
filesystem.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 92/476
Booting with U-Boot
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 93/476
Kernel command line
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 94/476
Practical lab - Kernel compiling and booting
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 95/476
Kernel Source Code
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 96/476
Advantages of modules
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 97/476
Module dependencies
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 98/476
Kernel log
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 99/476
Module utilities (1)
▶ modinfo <module_name>
modinfo <module_path>.ko
Gets information about a module: parameters, license,
description and dependencies.
Very useful before deciding to load a module or not.
▶ sudo insmod <module_path>.ko
Tries to load the given module. The full path to the module
object file must be given.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 100/476
Understanding module loading issues
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 101/476
Module utilities (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 102/476
Module utilities (3)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 103/476
Passing parameters to modules
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 104/476
Check module parameter values
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 105/476
Useful reading
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 106/476
Developing Kernel Modules
Modules
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 107/476
Hello Module 1/2
/* hello.c */
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Greeting module");
MODULE_AUTHOR("William Shakespeare");
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 108/476
Hello Module 2/2
▶ __init
▶ removed after initialization (static kernel or module.)
▶ __exit
▶ discarded when module compiled statically into the kernel, or
when module unloading support is not enabled.
▶ Example available on
http://git.free-electrons.com/training-
materials/plain/code/hello/hello.c
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 109/476
Hello Module Explanations
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 110/476
Symbols Exported to Modules 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 111/476
Symbols exported to modules 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 112/476
Module License
▶ Several usages
▶ Used to restrict the kernel functions that the module can use if
it isn't a GPL licensed module
▶ Difference between EXPORT_SYMBOL() and
EXPORT_SYMBOL_GPL()
▶ Used by kernel developers to identify issues coming from
proprietary drivers, which they can't do anything about
(“Tainted” kernel notice in kernel crashes and oopses).
▶ Useful for users to check that their system is 100% free (check
/proc/sys/kernel/tainted)
▶ Values
▶ GPL compatible (see include/linux/license.h: GPL,
GPL v2, GPL and additional rights, Dual MIT/GPL,
Dual BSD/GPL, Dual MPL/GPL)
▶ Proprietary
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 113/476
Compiling a Module
Two solutions
▶ Out of tree
▶ When the code is outside of the kernel source tree, in a
different directory
▶ Advantage: Might be easier to handle than modifications to
the kernel itself
▶ Drawbacks: Not integrated to the kernel
configuration/compilation process, needs to be built separately,
the driver cannot be built statically
▶ Inside the kernel tree
▶ Well integrated into the kernel configuration/compilation
process
▶ Driver can be built statically if needed
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 114/476
Compiling an out-of-tree Module 1/2
all:
<tab>$(MAKE) -C $(KDIR) M=$$PWD
endif
.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 115/476
Compiling an out-of-tree Module 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 117/476
New Driver in Kernel Sources 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 118/476
New Driver in Kernel Sources 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 119/476
Hello Module with Parameters 1/2
/* hello_param.c */
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 120/476
Hello Module with Parameters 2/2
static int __init hello_init(void)
{
int i;
for (i = 0; i < howmany; i++)
pr_alert("(%d) Hello, %s\n", i, whom);
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
module_param(
name, /* name of an already defined variable */
type, /* either byte, short, ushort, int, uint, long, ulong,
charp, bool or invbool. (checked at run time!) */
perm /* for /sys/module/<module_name>/parameters/<param>,
0: no such module parameter value file */
);
/* Example */
static int irq=5;
module_param(irq, int, S_IRUGO);
Modules parameter arrays are also possible with
module_param_array().
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 122/476
Practical lab - Writing Modules
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 123/476
Useful general-purpose kernel APIs
Useful
general-purpose Embedded Linux
Experts
kernel APIs
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 124/476
Memory/string utilities
▶ In include/linux/string.h
▶ Memory-related: memset(), memcpy(), memmove(), memscan(),
memcmp(), memchr()
▶ String-related: strcpy(), strcat(), strcmp(), strchr(),
strrchr(), strlen() and variants
▶ Allocate and copy a string: kstrdup(), kstrndup()
▶ Allocate and copy a memory area: kmemdup()
▶ In include/linux/kernel.h
▶ String to int conversion: simple_strtoul(),
simple_strtol(), simple_strtoull(), simple_strtoll()
▶ Other string functions: sprintf(), sscanf()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 125/476
Linked lists
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 126/476
Linked Lists Examples (1)
▶ From include/linux/atmel_tc.h
/*
* Definition of a list element, with a
* struct list_head member
*/
struct atmel_tc
{
/* some members */
struct list_head node;
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 127/476
Linked Lists Examples (2)
▶ From drivers/misc/atmel_tclib.c
/* Define the global list */
static LIST_HEAD(tc_list);
driver model
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 129/476
Linux device and driver model
Introduction
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 130/476
The need for a device model?
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 131/476
Kernel and Device Drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 132/476
Device Model data structures
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 133/476
Bus Drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 134/476
Linux device and driver model
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 135/476
Example: USB Bus 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 136/476
Example: USB Bus 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 137/476
Example of Device Driver
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 138/476
Device Identifiers
▶ Defines the set of devices that this driver can manage, so that
the USB core knows for which devices this driver should be
used
▶ The MODULE_DEVICE_TABLE() macro allows depmod to extract
at compile time the relation between device identifiers and
drivers, so that drivers can be loaded automatically by udev.
See /lib/modules/$(uname -r)/modules.{alias,usbmap}
.
static struct usb_device_id rtl8150_table[] = {
{ USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8150) },
{ USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX) },
{ USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR) },
{ USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX) },
[...]
{}
};
.MODULE_DEVICE_TABLE(usb, rtl8150_table);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 139/476
Instantiation of usb_driver
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 140/476
Driver (Un)Registration
module_init(usb_rtl8150_init);
.
module_exit(usb_rtl8150_exit);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 143/476
Probe Method
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 144/476
Probe Method Example
.
static int rtl8150_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
rtl8150_t *dev;
struct net_device *netdev;
netdev = alloc_etherdev(sizeof(rtl8150_t));
[...]
dev = netdev_priv(netdev);
tasklet_init(&dev->tl, rx_fixup, (unsigned long)dev);
spin_lock_init(&dev->rx_pool_lock);
[...]
netdev->netdev_ops = &rtl8150_netdev_ops;
alloc_all_urbs(dev);
[...]
usb_set_intfdata(intf, dev);
SET_NETDEV_DEV(netdev, &intf->dev);
register_netdev(netdev);
return 0;
}.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 145/476
The Model is Recursive
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 146/476
Linux device and driver model
Platform drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 147/476
Non-discoverable buses
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 148/476
Platform devices
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 149/476
Implementation of a Platform Driver
▶ The driver implements a struct platform_driver structure
(example taken from drivers/tty/serial/imx.c, simplified)
.
static struct platform_driver serial_imx_driver = {
.probe = serial_imx_probe,
.remove = serial_imx_remove,
.id_table = imx_uart_devtype,
.driver = {
.name = "imx-uart",
.of_match_table = imx_uart_dt_ids,
.pm = &imx_serial_port_pm_ops,
},
.
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 151/476
Platform device instantiation: old style (2/2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 152/476
The Resource Mechanism
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 153/476
Declaring resources (old style)
.
static struct resource imx_uart1_resources[] = {
[0] = {
.start = 0x00206000,
.end = 0x002060FF,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = (UART1_MINT_RX),
.end = (UART1_MINT_RX),
.flags = IORESOURCE_IRQ,
},
};
.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 154/476
Using Resources (old style)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 155/476
platform_data Mechanism (old style)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 156/476
platform_data example 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 157/476
platform_data Example 2/2
▶ The uart_pdata structure was associated to the
struct platform_device structure in the MX1ADS board
file (the real code was slightly more complicated)
.
struct platform_device mx1ads_uart1 = {
.name = "imx-uart",
.dev {
.platform_data = &uart1_pdata,
},
.resource = imx_uart1_resources,
[...]
.
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 159/476
Device Tree example
.
uart0: serial@44e09000 {
compatible = "ti,omap3-uart";
ti,hwmods = "uart1";
clock-frequency = <48000000>;
reg = <0x44e09000 0x2000>;
interrupts = <72>;
status = "disabled";
};
.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 160/476
Device Tree inheritance (1/2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 161/476
Device Tree inheritance (2/2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 162/476
Device Tree: compatible string
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 163/476
Device Tree Resources
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 164/476
Device Tree bindings
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 165/476
sysfs
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 166/476
References
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 167/476
Introduction to the I2C subsystem
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 168/476
What is I2C?
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 169/476
An I2C bus example
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 170/476
The I2C subsystem
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 171/476
Registering an I2C device driver
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 172/476
Registering an I2C device driver: example
.
static const struct i2c_device_id <driver>_id[] = {
{ "<device-name>", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, <driver>_id);
#ifdef CONFIG_OF
static const struct of_device_id <driver>_dt_ids[] = {
{ .compatible = "<vendor>,<device-name>", },
{ }
};
MODULE_DEVICE_TABLE(of, <driver>_dt_ids);
#endif
.
module_i2c_driver(<driver>_driver);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 173/476
Registering an I2C device: non-DT
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 174/476
Registering an I2C device, non-DT example
.
static struct i2c_board_info <board>_i2c_devices[] __initdata = {
{
I2C_BOARD_INFO("cs42l51", 0x4a),
},
};
void board_init(void)
{
/*
* Here should be the registration of all devices, including
* the I2C controller device.
*/
i2c_register_board_info(0, <board>_i2c_devices,
ARRAY_SIZE(<board>_i2c_devices));
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 175/476
Registering an I2C device, in the DT
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 176/476
Registering an I2C device, DT example (1/2)
.
Definition of the I2C controller, sun7i-a20.dtsi file
.
i2c0: i2c@01c2ac00 {
compatible = "allwinner,sun7i-a20-i2c",
"allwinner,sun4i-a10-i2c";
reg = <0x01c2ac00 0x400>;
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&apb1_gates 0>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 177/476
Registering an I2C device, DT example (2/2)
.
Definition of the I2C device, sun7i-a20-bananapi.dts file
.
&i2c0 {
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins_a>;
status = "okay";
axp209: pmic@34 {
reg = <0x34>;
interrupt-parent = <&nmi_intc>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
};
.};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 178/476
probe() and remove()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 179/476
Probe/remove example
.
static int <driver>_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
/* initialize device */
/* register to a kernel framework */
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 180/476
Practical lab - Linux device model for an I2C driver
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 181/476
Communicating with the I2C device: raw API
The most basic API to communicate with the I2C device provides
functions to either send or receive data:
▶ int i2c_master_send(struct i2c_client *client, const
char *buf, int count);
Sends the contents of buf to the client.
▶ int i2c_master_recv(struct i2c_client *client, char
*buf, int count);
Receives count bytes from the client, and store them into buf.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 182/476
Communicating with the I2C device: message transfer
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 183/476
I2C: message transfer example
.
struct i2c_msg msg[2];
int error;
u8 start_reg;
u8 buf[10];
msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].len = 1;
msg[0].buf = &start_reg;
start_reg = 0x10;
msg[1].addr = client->addr;
msg[1].flags = I2C_M_RD;
msg[1].len = sizeof(buf);
msg[1].buf = buf;
error
. = i2c_transfer(client->adapter, msg, 2);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 184/476
SMBus calls
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 185/476
List of SMBus functions
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 186/476
I2C functionality
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 187/476
References
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 188/476
Introduction to pin muxing
muxing
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 189/476
What is pin muxing?
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 190/476
Pin muxing diagram
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 191/476
Pin muxing in the Linux kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 192/476
pinctrl subsystem diagram
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 193/476
Device Tree binding for consumer devices
▶ The devices that require certains pins to be muxed will use
the pinctrl-<x> and pinctrl-names Device Tree properties.
▶ The pinctrl-0, pinctrl-1, pinctrl-<x> properties link to a
pin configuration for a given state of the device.
▶ The pinctrl-names property associates a name to each state.
The name default is special, and is automatically selected by
a device driver, without having to make an explicit pinctrl
function call.
▶ In most cases, the following is sufficient:
i2c@11000 {
pinctrl-0 = <&pmx_twsi0>;
pinctrl-names = "default";
...
};
▶ See
Documentation/devicetree/bindings/pinctrl/pinctrl-
bindings.txt for details.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 194/476
Defining pinctrl configurations
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 195/476
Example on OMAP/AM33xx
▶ On OMAP/AM33xx, the
pinctrl-single driver is used. am33xx_pinmux: pinmux@44e10800 {
i2c0_pins: pinmux_i2c0_pins {
It is common between multiple pinctrl-single,pins = <
SoCs and simply allows to /* i2c0_sda.i2c0_sda */
0x188 (PIN_INPUT_PULLUP | MUX_MODE0)
configure pins by writing a /* i2c0_scl.i2c0_scl */
0x18c (PIN_INPUT_PULLUP | MUX_MODE0)
value to a register. >;
};
▶ In each pin configuration,
};
a pinctrl-single,pins i2c0: i2c@44e0b000 {
value gives a list of pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins>;
(register, value) pairs
status = "okay";
needed to configure the clock-frequency = <400000>;
pins. tps: tps@2d {
reg = <0x2d>;
▶ To know the correct values, };
};
one must use the SoC and
board datasheets.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 196/476
Example on Allwinner SoC
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 197/476
Practical lab - Communicate with the Nunchuk
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 198/476
Kernel frameworks for device drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 199/476
Kernel and Device Drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 200/476
Kernel frameworks for device drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 201/476
Types of devices
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 202/476
Major and minor numbers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 203/476
Devices: everything is a file
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 204/476
Device files examples
Example C code that uses the usual file API to write data to a
serial port
int fd;
fd = open("/dev/ttyS0", O_RDWR);
write(fd, "Hello", 5);
close(fd);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 205/476
Creating device files
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 206/476
Kernel frameworks for device drivers
Character drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 207/476
A character driver in the kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 208/476
From user space to the kernel: character devices
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 209/476
File operations
#include <linux/fs.h>
struct file_operations {
ssize_t (*read) (struct file *, char __user *,
size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *,
size_t, loff_t *);
long (*unlocked_ioctl) (struct file *, unsigned int,
unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*release) (struct inode *, struct file *);
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 210/476
open() and release()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 211/476
read()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 212/476
write()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 213/476
Exchanging data with user space 1/3
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 214/476
Exchanging data with user space 2/3
▶ A single value
▶ get_user(v, p);
▶ The kernel variable v gets the value pointed by the user space
pointer p
▶ put_user(v, p);
▶ The value pointed by the user space pointer p is set to the
contents of the kernel variable v.
▶ A buffer
▶ unsigned long copy_to_user(void __user *to,
const void *from, unsigned long n);
▶ unsigned long copy_from_user(void *to,
const void __user *from, unsigned long n);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 215/476
Exchanging data with user space 3/3
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 216/476
Zero copy access to user memory
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 217/476
unlocked_ioctl()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 218/476
ioctl() example: kernel side
switch (cmd) {
case PHN_SET_REG:
if (copy_from_user(&r, argp, sizeof(r)))
return -EFAULT;
/* Do something */
break;
case PHN_GET_REG:
if (copy_to_user(argp, &r, sizeof(r)))
return -EFAULT;
/* Do something */
break;
default:
return -ENOTTY;
}
return 0; }
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 219/476
Ioctl() Example: Application Side
int main(void)
{
int fd, ret;
struct phm_reg reg;
fd = open("/dev/phantom");
assert(fd > 0);
reg.field1 = 42;
reg.field2 = 67;
return 0;
}
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 220/476
Kernel frameworks for device drivers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 221/476
Beyond character drivers: kernel frameworks
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 222/476
Kernel Frameworks
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 223/476
Example: Framebuffer Framework
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 224/476
Framebuffer driver operations
▶ Here are the operations a framebuffer driver can or must
implement, and define them in a struct fb_ops structure
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 227/476
Driver-specific Data Structure Examples 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 228/476
Driver-specific Data Structure Examples 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 229/476
Link Between Structures 1/4
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 230/476
Link Between Structures 2/4
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 231/476
Link Between Structures 3/4
[...]
[...]
[...]
}
[...]
}
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 232/476
Link Between Structures 4/4
netdev = alloc_etherdev(sizeof(rtl8150_t));
dev = netdev_priv(netdev);
[...]
dev->udev = udev;
dev->netdev = netdev;
[...]
usb_set_intfdata(intf, dev);
SET_NETDEV_DEV(netdev, &intf->dev);
[...]
}
[...]
}
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 233/476
The input subsystem
subsystem
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 234/476
What is input subsystem?
▶ The input subsystem takes care of all the input events coming
from the human user.
▶ Initially written to support the USB HID (Human Interface
Device) devices, it quickly grew up to handle all kind of inputs
(using USB or not): keyboards, mice, joysticks, touchscreens,
etc.
▶ The input subsystem is split in two parts:
▶ Device drivers: they talk to the hardware (for example via
USB), and provide events (keystrokes, mouse movements,
touchscreen coordinates) to the input core
▶ Event handlers: they get events from drivers and pass them
where needed via various interfaces (most of the time through
evdev)
▶ In user space it is usually used by the graphic stack such as
X.Org, Wayland or Android's InputManager.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 235/476
Input subsystem diagram
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 236/476
Input subsystem overview
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 237/476
Input subsystem API 1/3
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 238/476
Input subsystem API 2/3
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 239/476
Input subsystem API 3/3
▶ The events are sent by the driver to the event handler using
input_event(struct input_dev *dev, unsigned int
type, unsigned int code, int value);
▶ The event types are documented in
Documentation/input/event-codes.txt
▶ An event is composed by one or several input data changes
(packet of input data changes) such as the button state, the
relative or absolute position along an axis, etc..
▶ After submitting potentially multiple events, the input core
must be notified by calling:
void input_sync(struct input_dev *dev):
▶ The input subsystem provides other wrappers such as
input_report_key(), input_report_abs(), ...
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 240/476
Polled input subclass
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 241/476
Polled input subsystem API
▶ Allocating/freeing the struct input_polled_dev structure is
done using
▶ input_allocate_polled_device()
▶ input_free_polled_device()
▶ Among the handlers of the struct input_polled_dev only
the poll() method is mandatory, this function polls the
device and posts input events.
▶ The fields id, name, evkey and keybit of the input field
must be initialized too.
▶ If none of the poll_interval fields are filled then the default
poll interval is 500ms.
▶ The device registration/unregistration is done with:
▶ input_register_polled_device(struct input_polled_dev
*dev).
▶ input_unregister_polled_device(struct input_polled_
dev *dev)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 242/476
evdev user space interface
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 244/476
Memory Management
Management
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 245/476
Physical and Virtual Memory
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 246/476
Virtual Memory Organization
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 247/476
Physical / virtual memory mapping
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 248/476
Accessing more physical memory
▶ Only less than 1GB memory addressable directly through
kernel virtual address space
▶ If more physical memory is present on the platform, part of
the memory will not be accessible by kernel space, but can be
used by user space
▶ To allow the kernel to access more physical memory:
▶ Change 1GB/3GB memory split (2GB/2GB)
(CONFIG_VMSPLIT_3G) ⇒ reduces total memory available for
each process
▶ Change for a 64 bit architecture ;-) See
Documentation/x86/x86_64/mm.txt for an example.
▶ Activate highmem support if available for your architecture:
▶ Allows kernel to map parts of its non-directly accessible
memory
▶ Mapping must be requested explicitly
▶ Limited addresses ranges reserved for this usage
▶ See http://lwn.net/Articles/75174/ for useful
explanations
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 249/476
Notes on user space memory
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 250/476
Back to kernel memory
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 251/476
Allocators in the Kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 252/476
Page Allocator
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 253/476
Page Allocator API: Get free pages
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 254/476
Page Allocator API: Free Pages
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 255/476
Page Allocator Flags
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 256/476
SLAB Allocator 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 257/476
SLAB Allocator 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 258/476
Different SLAB Allocators
▶ There are three different, but API compatible,
implementations of a SLAB allocator in the Linux kernel. A
particular implementation is chosen at configuration time.
▶ SLAB: legacy, well proven allocator.
Still the default in most ARM defconfig files.
▶ SLOB: much simpler. More space efficient but doesn't scale
well. Saves a few hundreds of KB in small systems (depends
on CONFIG_EXPERT)
Linux 4.4 on ARM: used in 5 defconfig files
▶ SLUB: more recent and simpler than SLAB, scaling much
better (in particular for huge systems) and creating less
fragmentation.
Linux 4.4 on ARM: used in 0 defconfig files
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 259/476
kmalloc Allocator
▶ The kmalloc allocator is the general purpose memory allocator
in the Linux kernel
▶ For small sizes, it relies on generic SLAB caches, named
kmalloc-XXX in /proc/slabinfo
▶ For larger sizes, it relies on the page allocator
▶ The allocated area is guaranteed to be physically contiguous
▶ The allocated area size is rounded up to the size of the
smallest SLAB cache in which it can fit (while using the SLAB
allocator directly allows to have more flexibility)
▶ It uses the same flags as the page allocator (GFP_KERNEL,
GFP_ATOMIC, GFP_DMA, etc.) with the same semantics.
▶ Maximum sizes, on x86 and arm (see http://j.mp/YIGq6W):
- Per allocation: 4 MB
- Total allocations: 128 MB
▶ Should be used as the primary allocator unless there is a
strong reason to use another one.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 260/476
kmalloc API 1/2
▶ #include <linux/slab.h>
▶ void *kmalloc(size_t size, int flags);
▶ Allocate size bytes, and return a pointer to the area (virtual
address)
▶ size: number of bytes to allocate
▶ flags: same flags as the page allocator
▶ Example: (drivers/infiniband/core/cache.c)
struct ib_update_work *work;
work = kmalloc(sizeof *work, GFP_ATOMIC);
...
kfree(work);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 261/476
kmalloc API 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 262/476
devm_ kmalloc functions
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 263/476
vmalloc Allocator
▶ Kmemcheck
▶ Dynamic checker for access to uninitialized memory.
▶ Only available on x86 so far (Linux 3.17 status), but will help
to improve architecture independent code anyway.
▶ See Documentation/kmemcheck.txt for details.
▶ Kmemleak
▶ Dynamic checker for memory leaks
▶ This feature is available for all architectures.
▶ See Documentation/kmemleak.txt for details.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 265/476
I/O Memory and Ports
Ports
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 266/476
Port I/O vs. Memory-Mapped I/O
▶ MMIO
▶ Same address bus to address memory and I/O devices
▶ Access to the I/O devices using regular instructions
▶ Most widely used I/O method across the different architectures
supported by Linux
▶ PIO
▶ Different address spaces for memory and I/O devices
▶ Uses a special class of CPU instructions to access I/O devices
▶ Example on x86: IN and OUT instructions
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 267/476
MMIO vs PIO
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 268/476
Requesting I/O ports
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 269/476
/proc/ioports example (x86)
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0070-0077 : rtc
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
0376-0376 : ide1
03f6-03f6 : ide0
03f8-03ff : serial
0800-087f : 0000:00:1f.0
...
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 270/476
Accessing I/O ports
▶ Functions to read/write bytes (b), word (w) and longs (l) to
I/O ports:
▶ unsigned in[bwl](unsigned long port)
▶ void out[bwl](value, unsigned long port)
▶ And the strings variants: often more efficient than the
corresponding C loop, if the processor supports such
operations!
▶ void ins[bwl](unsigned port, void *addr,
unsigned long count)
▶ void outs[bwl](unsigned port, void *addr,
unsigned long count)
▶ Examples
▶ read 8 bits
▶ oldlcr = inb(baseio + UART_LCR)
▶ write 8 bits
▶ outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 271/476
Requesting I/O memory
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 272/476
/proc/iomem example
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 273/476
Mapping I/O memory in virtual memory
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 274/476
ioremap()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 276/476
Accessing MMIO devices
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 277/476
Avoiding I/O access issues
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 278/476
/dev/mem
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 279/476
Practical lab - I/O Memory and Ports
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 280/476
The misc subsystem
subsystem
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 281/476
Why a misc subsystem?
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 282/476
Misc subsystem diagram
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 283/476
Misc subsystem API (1/2)
struct miscdevice {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
umode_t mode;
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 284/476
Misc subsystem API (2/2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 285/476
User space API for misc devices
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 286/476
Practical lab - Output-only serial port driver
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 287/476
Processes, scheduling and interrupts
Processes,
scheduling and Embedded Linux
Experts
interrupts
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 288/476
Processes, scheduling and interrupts
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 289/476
Process, thread?
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 290/476
Process, thread: kernel point of view
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 291/476
A thread life
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 292/476
Execution of system calls
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 293/476
Processes, scheduling and interrupts
Sleeping
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 294/476
Sleeping
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 295/476
How to sleep 1/3
wait_queue_head_t queue;
init_waitqueue_head(&queue);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 296/476
How to sleep 2/3
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 297/476
How to sleep 3/3
▶ int wait_event_interruptible_timeout(queue,
condition, timeout);
▶ Same as above, interruptible. Returns 0 if the timeout elapsed,
-ERESTARTSYS if interrupted, positive value if the condition
was met.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 298/476
How to Sleep - Example
ret = wait_event_interruptible
(sonypi_device.fifo_proc_list,
kfifo_len(sonypi_device.fifo) != 0);
if (ret)
return ret;
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 299/476
Waking up!
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 300/476
Exclusive vs. non-exclusive
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 301/476
Sleeping and waking up - Implementation 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 302/476
Sleeping and waking up - Implementation 2/2
▶ wake_up(&queue);
▶ All processes waiting in queue are woken up, so they get
scheduled later and have the opportunity to evaluate the
condition again and go back to sleep if it is not met.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 303/476
Processes, scheduling and interrupts
Interrupt Management
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 304/476
Registering an interrupt handler 1/2
The "managed" API is recommended:
int devm_request_irq(struct device *dev,
unsigned int irq,
irq_handler_t handler,
unsigned long irq_flags,
const char *devname,
void *dev_id);
▶ Register an interrupt handler.
▶ device for automatic freeing at device or module release time.
▶ irq is the requested IRQ channel. For platform devices, use
platform_get_irq() to retrieve the interrupt number.
▶ handler is a pointer to the IRQ handler
▶ irq_flags are option masks (see next slide)
▶ devname is the registered name
▶ dev_id is a pointer to some data. It cannot be NULL as it is used
as an identifier for free_irq() when using shared IRQs.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 305/476
Releasing an interrupt handler
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 306/476
Registering an interrupt handler 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 307/476
Interrupt handler constraints
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 308/476
/proc/interrupts on a Panda board
.
CPU0 CPU1
39: 4 0 GIC TWL6030-PIH
41: 0 0 GIC l3-dbg-irq
42: 0 0 GIC l3-app-irq
43: 0 0 GIC prcm
44: 20294 0 GIC DMA
52: 0 0 GIC gpmc
...
IPI0: 0 0 Timer broadcast interrupts
IPI1: 23095 25663 Rescheduling interrupts
IPI2: 0 0 Function call interrupts
IPI3: 231 173 Single function call interrupts
IPI4: 0 0 CPU stop interrupts
LOC: 196407 136995 Local timer interrupts
.
Err: 0
Note: interrupt numbers shown on the left-most column are virtual numbers
when the Device Tree is used. The real physical interrupt numbers are either
shown as an additional column, or can be seen in
/sys/kernel/debug/irq_domain_mapping.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 309/476
Interrupt handler prototype
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 310/476
Typical interrupt handler's job
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 311/476
Threaded interrupts
In 2.6.30, support for threaded interrupts has been added to the
Linux kernel
▶ The interrupt handler is executed inside a thread.
▶ Allows to block during the interrupt handler, which is often
needed for I2C/SPI devices as the interrupt handler needs to
communicate with them.
▶ Allows to set a priority for the interrupt handler execution,
which is useful for real-time usage of Linux
int devm_request_threaded_irq(
struct device *dev,
unsigned int irq,
irq_handler_t handler, irq_handler_t thread_fn
unsigned long flags, const char *name, void *dev);
▶ handler, ``hard IRQ'' handler
▶ thread_fn, executed in a thread
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 312/476
Top half and bottom half processing
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 313/476
Top half and bottom half diagram
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 314/476
Softirqs
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 315/476
Tasklets
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 316/476
Tasklet Example: simplified atmel_serial.c 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 317/476
Tasklet Example: simplified atmel_serial.c 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 318/476
Workqueues
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 319/476
Interrupt management summary
▶ Device driver
▶ When the device file is first opened, register an interrupt
handler for the device's interrupt channel.
▶ Interrupt handler
▶ Called when an interrupt is raised.
▶ Acknowledge the interrupt
▶ If needed, schedule a tasklet taking care of handling data.
Otherwise, wake up processes waiting for the data.
▶ Tasklet
▶ Process the data
▶ Wake up processes waiting for the data
▶ Device driver
▶ When the device is no longer opened by any process,
unregister the interrupt handler.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 320/476
Practical lab - Interrupts
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 321/476
Concurrent Access to Resources: Locking
Concurrent Access
to Resources: Embedded Linux
Experts
Locking
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 322/476
Sources of concurrency issues
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 323/476
Concurrency protection with locks
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 324/476
Linux mutexes
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 325/476
Locking and Unlocking Mutexes 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 326/476
Locking and Unlocking Mutexes 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 327/476
Spinlocks
▶ Locks to be used for code that is not allowed to sleep
(interrupt handlers), or that doesn't want to sleep (critical
sections). Be very careful not to call functions which can
sleep!
▶ Originally intended for multiprocessor systems
▶ Spinlocks never sleep and keep spinning in a loop until the
lock is available.
▶ Spinlocks cause kernel preemption to be disabled on the CPU
executing them.
▶ The critical section protected by a spinlock is not allowed to
sleep.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 328/476
Initializing Spinlocks
▶ Statically
▶ DEFINE_SPINLOCK(my_lock);
▶ Dynamically
▶ void spin_lock_init(spinlock_t *lock);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 329/476
Using Spinlocks 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 330/476
Using Spinlocks 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 331/476
Spinlock example
spin_lock_irqsave(&port->lock, flags);
/* Do something */
spin_unlock_irqrestore(&port->lock, flags);
}
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 332/476
Deadlock Situations
▶ They can lock up your system. Make sure they never happen!
▶ Don't call a function that can try to get access to the same
lock
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 333/476
Kernel lock validator
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 334/476
Alternatives to Locking
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 335/476
Atomic Variables 1/2
▶ Useful when the shared resource is an integer value
▶ Even an instruction like n++ is not guaranteed to be atomic on
all processors!
▶ Atomic operations definitions
▶ #include <asm/atomic.h>
▶ atomic_t
▶ Contains a signed integer (at least 24 bits)
▶ Atomic operations (main ones)
▶ Set or read the counter:
▶ void atomic_set(atomic_t *v, int i);
▶ int atomic_read(atomic_t *v);
▶ Operations without return value:
▶ void atomic_inc(atomic_t *v);
▶ void atomic_dec(atomic_t *v);
▶ void atomic_add(int i, atomic_t *v);
▶ void atomic_sub(int i, atomic_t *v);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 336/476
Atomic Variables 2/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 337/476
Atomic Bit Operations
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 338/476
Practical lab - Locking
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 339/476
Kernel Debugging
Embedded Linux
Experts
Kernel Debugging
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 340/476
Debugging Using Messages (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 341/476
Debugging Using Messages (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 342/476
pr_debug() and dev_dbg()
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 343/476
Configuring The Priority
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 344/476
DebugFS
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 345/476
DebugFS API
▶ Create a sub-directory for your driver:
▶ struct dentry *debugfs_create_dir(const char *name,
struct dentry *parent);
▶ Expose an integer as a file in DebugFS:
▶ struct dentry *debugfs_create_{u,x}{8,16,32}
(const char *name, mode_t mode, struct dentry *parent,
u8 *value);
▶ u for decimal representation
▶ x for hexadecimal representation
▶ Expose a binary blob as a file in DebugFS:
▶ struct dentry *debugfs_create_blob(const char *name,
mode_t mode, struct dentry *parent,
struct debugfs_blob_wrapper *blob);
▶ Also possible to support writable DebugFS files or customize
the output using the more generic debugfs_create_file()
function.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 346/476
Deprecated Debugging Mechanisms
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 347/476
Using Magic SysRq
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 348/476
kgdb - A Kernel Debugger
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 349/476
Using kgdb 1/2
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 350/476
Using kgdb 2/2
▶ Then also pass kgdbwait to the kernel: it makes kgdb wait for
a debugger connection.
▶ Boot your kernel, and when the console is initialized, interrupt
the kernel with Alt + SysRq + g.
▶ On your workstation, start gdb as follows:
▶ gdb ./vmlinux
▶ (gdb) set remotebaud 115200
▶ (gdb) target remote /dev/ttyS0
▶ Once connected, you can debug a kernel the way you would
debug an application program.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 351/476
Debugging with a JTAG Interface
Two types of JTAG dongles
▶ The ones offering a gdb compatible interface, over a serial port
or an Ethernet connection. gdb can directly connect to them.
▶ The ones not offering a gdb compatible interface are generally
supported by OpenOCD (Open On Chip Debugger):
http://openocd.sourceforge.net/
▶ OpenOCD is the bridge between the gdb debugging language
and the JTAG interface of the target CPU.
▶ See the very complete documentation:
http://openocd.org/documentation/
▶ For each board, you'll need an OpenOCD configuration file
(ask your supplier)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 352/476
More Kernel Debugging Tips
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 353/476
Practical lab - Kernel debugging
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 354/476
Porting the Linux Kernel to an ARM Board
Board
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 355/476
Porting the Linux kernel
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 356/476
Architecture, CPU and Machine
▶ In the source tree, each architecture has its own directory
▶ arch/arm for the ARM architecture
▶ This directory contains generic ARM code
▶ boot, common, configs, kernel, lib, mm, nwfpe, vfp,
oprofile, tools
▶ And many directories for different SoC families
▶ mach-* directories: mach-pxa for PXA CPUs, mach-imx for
Freescale iMX CPUs, etc.
▶ Before the ARM cleanup, these directories contained support
for the SoC family (GPIO, clocks, pinmux, power
management, interrupt controller, etc.) and for the various
boards.
▶ Nowadays, they contain a lot less code, essentially a small
SoC description file, power management and SMP code.
▶ Some CPU types share some code, in directories named
plat-*
▶ Device Tree source files in arch/arm/boot/dts.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 357/476
Before the Device Tree and ARM cleanup
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 358/476
The Device Tree and the ARM cleanup
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 359/476
Adding the support for a new ARM board
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 360/476
Example of the Freescale iMX28 SoCs
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 361/476
Studying the Crystalfontz CFA-10036 platform
▶ Crystalfontz CFA-10036
▶ Uses the Freescale iMX28 SoC, from the
MXS family.
▶ 128MB of RAM
▶ 1 serial port, 1 LED
▶ 1 I2C bus, equipped with an OLED display
▶ 1 SD-Card slot
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 362/476
Crystalfontz CFA-10036 Device Tree, header
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 364/476
Crystalfontz CFA-10036, bus/UART
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 365/476
Crystalfontz CFA-10036 Device Tree, Muxing
led_pins_cfa10036: leds-10036@0 {
reg = <0>;
fsl,pinmux-ids = <
0x3043 /* MX28_PAD_AUART1_RX__GPIO_3_4 */
>;
fsl,drive-strength = <0>;
fsl,voltage = <1>;
fsl,pull-up = <0>;
};
.
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 366/476
Crystalfontz CFA-10036 Device Tree, LED
power {
gpios = <&gpio3 4 1>;
default-state = "on";
};
.
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 367/476
Crystalfontz CFA-10036 Device Tree, SD Card/USB
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 368/476
Crystalfontz CFA-10036 Device Tree, I2C bus
ssd1306: oled@3c {
compatible = "solomon,ssd1306fb-i2c";
pinctrl-names = "default";
pinctrl-0 = <&ssd1306_cfa10036>;
reg = <0x3c>;
reset-gpios = <&gpio2 7 0>;
solomon,height = <32>;
solomon,width = <128>;
solomon,page-offset = <0>;
};
.
};
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 369/476
Crystalfontz CFA-10036 Device Tree, Breakout Boards
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 370/476
Crystalfontz CFA-10036: build the DTB
▶ To ensure that the Device Tree Blob gets built for this board
Device Tree Source, one need to ensure it is listed in
arch/arm/boot/dts/Makefile:
.
dtb-$(CONFIG_ARCH_MXS) += imx28-cfa10036.dtb \
imx28-cfa10037.dtb \
imx28-cfa10049.dtb \
imx28-cfa10055.dtb \
imx28-cfa10056.dtb \
imx28-cfa10057.dtb \
imx28-cfa10058.dtb \
. imx28-evk.dtb
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 371/476
Understanding the SoC support
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 372/476
arch/arm/mach-mvebu/board-v7.c
.
static void __init mvebu_dt_init(void)
{
if (of_machine_is_compatible("marvell,armadaxp"))
i2c_quirk();
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 373/476
Components of the minimal SoC support
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 374/476
Extending the minimal SoC support
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 375/476
Adding device drivers
Once the core pieces of the SoC support have been implemented,
the remaining part is to add drivers for the different hardware
blocks:
▶ Ethernet driver, in
drivers/net/ethernet/marvell/mvneta.c
▶ SATA driver, in drivers/ata/sata_mv.c
▶ I2C driver, in drivers/i2c/busses/i2c-mv64xxx.c
▶ SPI driver, in drivers/spi/spi-orion.c
▶ PCIe driver, in drivers/pci/host/pci-mvebu.c
▶ USB driver, in drivers/usb/host/ehci-orion.c
▶ etc.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 376/476
Power Management
Management
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 377/476
PM Building Blocks
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 378/476
Clock Framework (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 379/476
Clock Framework (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 380/476
Diagram overview of the common clock framework
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 381/476
Clock Framework (3)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 382/476
Clock Framework (4)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 383/476
Suspend and Resume
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 384/476
Board-specific Power Management
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 385/476
arch/arm/mach-cpu/sleep.S
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 386/476
Triggering Suspend
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 387/476
Runtime Power Management
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 388/476
Saving Power in the Idle Loop
▶ The idle loop is what you run when there's nothing left to run
in the system.
▶ Implemented in all architectures in
arch/<arch>/kernel/process.c
▶ Example to read: look for cpu_idle in
arch/arm/kernel/process.c
▶ Each ARM cpu defines its own arch_idle function.
▶ The CPU can run power saving HLT instructions, enter NAP
mode, and even disable the timers (tickless systems).
▶ See also http://en.wikipedia.org/wiki/Idle_loop
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 389/476
Managing Idle
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 390/476
PowerTOP
https://01.org/powertop/
▶ With dynamic ticks, allows to fix parts of kernel code and
applications that wake up the system too often.
▶ PowerTOP allows to track the worst offenders
▶ Now available on ARM cpus implementing CPUidle
▶ Also gives you useful hints for reducing power.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 391/476
Frequency and Voltage Scaling (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 392/476
Frequency and Voltage Scaling (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 393/476
PM Quality Of Service interface
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 394/476
Regulator Framework
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 395/476
BSP Work for a New Board
In case you just need to create a BSP for your board, and your
CPU already has full PM support, you should just need to:
▶ Create clock definitions and bind your devices to them.
▶ Implement PM handlers (suspend, resume) in the drivers for
your board specific devices.
▶ Implement runtime PM handlers in your drivers.
▶ Implement board specific power management if needed
(mainly battery management)
▶ Implement regulator framework hooks for your board if
needed.
▶ All other parts of the PM infrastructure should be already
there: suspend / resume, cpuidle, cpu frequency and voltage
scaling.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 396/476
Useful Resources
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 397/476
The kernel development and contribution process
The kernel
development and
contribution Embedded Linux
Experts
process
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 398/476
The kernel development and contribution process
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 399/476
Until 2.6 (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 400/476
Until 2.6 (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 401/476
Changes since Linux 2.6
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 402/476
Versions since 2.6.0
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 403/476
New development model
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 404/476
New development model - Details
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 405/476
More stability for the kernel source tree
▶ Very difficult to find out the key changes and to get the global
picture out of individual changes.
▶ Fortunately, there are some useful resources available
▶ http://wiki.kernelnewbies.org/LinuxChanges (4.2 and
4.3 are missing)
▶ http://lwn.net
▶ http://linuxfr.org, for French readers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 407/476
The kernel development and contribution process
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 408/476
Solving Issues
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 409/476
Getting Help
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 410/476
Reporting Linux Bugs
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 411/476
How to Become a Kernel Developer?
Recommended resources
▶ See Documentation/SubmittingPatches for guidelines and
http://kernelnewbies.org/UpstreamMerge for very helpful
advice to have your changes merged upstream (by Rik van
Riel).
▶ Watch the Write and Submit your first Linux kernel Patch
talk by Greg. K.H:
http://www.youtube.com/watch?v=LLBrBBImJt4
▶ How to Participate in the Linux Community (by Jonathan
Corbet). A guide to the kernel development process
http://j.mp/tX2Ld6
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 412/476
Contribute to the Linux Kernel (1)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 413/476
Contribute to the Linux Kernel (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 414/476
Configure git send-email
▶ Make sure you already have configured your name and e-mail
address (should be done before the first commit).
▶ git config --global user.name 'My Name'
▶ git config --global user.email [email protected]
▶ Configure your SMTP settings. Example for a Google Mail
account:
▶ git config --
global sendemail.smtpserver smtp.googlemail.com
▶ git config --global sendemail.smtpserverport 587
▶ git config --global sendemail.smtpencryption tls
▶ git config --global sendemail.smtpuser [email protected]
▶ git config --global sendemail.smtppass xxx
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 415/476
Contribute to the Linux Kernel (3)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 416/476
Contribute to the Linux Kernel (4)
▶ Remove previously generated patches
▶ rm 00*.patch
▶ Have git generate patches corresponding to your branch
▶ If your branch is based on mainline
▶ git format-patch master..<your branch>
▶ If your branch is based on a remote branch
▶ git format-patch <remote>/<branch>..<your branch>
▶ You can run a last check on all your patches (easy)
▶ scripts/checkpatch.pl --strict 00*.patch
▶ Now, send your patches to yourself
▶ git send-email --compose --
to [email protected] 00*.patch
▶ If you have just one patch, or a trivial patch, you can remove
the empty line after In-Reply-To:. This way, you won't add
a summary e-mail introducing your changes (recommended
otherwise).
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 417/476
Contribute to the Linux Kernel (5)
▶ Check that you received your e-mail properly, and that it looks
good.
▶ Now, find the maintainers for your patches
scripts/get_maintainer.pl ~/patches/00*.patch
Russell King <[email protected]> (maintainer:ARM PORT)
Nicolas Pitre <[email protected]>
(commit_signer:1/1=100%)
[email protected] (open list:ARM PORT)
[email protected] (open list)
▶ Now, send your patches to each of these people and lists
▶ git send-email --compose --to [email protected]
--to [email protected] --to linux-arm-
[email protected] --to linux-
[email protected] 00*.patch
▶ Wait for replies about your changes, take the comments into
account, and resubmit if needed, until your changes are
eventually accepted.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 418/476
Contribute to the Linux Kernel (6)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 419/476
Kernel Resources
Embedded Linux
Experts
Kernel Resources
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 420/476
Kernel Development News
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 421/476
Useful Reading (1)
Essential Linux Device Drivers, April 2008
▶ http://elinuxdd.com/
▶ By Sreekrishnan Venkateswaran, an
embedded IBM engineer with more than
10 years of experience
▶ Covers a wide range of topics not covered
by LDD: serial drivers, input drivers, I2C,
PCMCIA and Compact Flash, PCI, USB,
video drivers, audio drivers, block drivers,
network drivers, Bluetooth, IrDA, MTD,
drivers in user space, kernel debugging,
etc.
▶ Probably the most wide ranging and
complete Linux device driver book I've
read -- Alan Cox
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 422/476
Useful Reading (2)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 423/476
Useful Reading (3)
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 424/476
Useful Online Resources
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 425/476
International Conferences
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 427/476
Last slides
Embedded Linux
Experts
Last slides
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 428/476
Last slide
Thank you!
And may the Source be with you
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 429/476
Backup slides
Embedded Linux
Experts
Backup slides
free electrons
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 430/476
Backup slides
DMA
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 431/476
DMA Integration
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 432/476
Peripheral DMA
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 433/476
DMA Controllers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 434/476
DMA descriptors
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 435/476
Backup slides
DMA Usage
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 436/476
Constraints with a DMA
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 437/476
DMA Memory Constraints
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 438/476
Memory Synchronization Issues
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 439/476
Linux DMA API
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 440/476
Coherent or Streaming DMA Mappings
▶ Coherent mappings
▶ The kernel allocates a suitable buffer and sets the mapping for
the driver.
▶ Can simultaneously be accessed by the CPU and device.
▶ So, has to be in a cache coherent memory area.
▶ Usually allocated for the whole time the module is loaded.
▶ Can be expensive to setup and use on some platforms.
▶ Streaming mappings
▶ The kernel just sets the mapping for a buffer provided by the
driver.
▶ Use a buffer already allocated by the driver.
▶ Mapping set up for each transfer. Keeps DMA registers free on
the hardware.
▶ The recommended solution.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 441/476
Allocating Coherent Mappings
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 442/476
Setting up streaming mappings
dma_addr_t dma_map_single(
struct device *, /* device structure */
void *, /* input: buffer to use */
size_t, /* buffer size */
enum dma_data_direction /* Either DMA_BIDIRECTIONAL,
* DMA_TO_DEVICE or
* DMA_FROM_DEVICE */
);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 443/476
DMA Streaming Mapping Notes
▶ When the mapping is active: only the device should access the
buffer (potential cache issues otherwise).
▶ The CPU can access the buffer only after unmapping!
▶ Another reason: if required, this API can create an
intermediate bounce buffer (used if the given buffer is not
usable for DMA).
▶ The Linux API also supports scatter / gather DMA streaming
mappings.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 444/476
Backup slides
DMA transfers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 445/476
Starting DMA transfers
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 446/476
DMAEngine Slave API
▶ In order to start a DMA transfer, you need to call the
following functions from your driver
1. Request a channel for exclusive use with
dma_request_channel(), or one of its variants
2. Configure it for our use case, by filling a
struct dma_slave_config structure with various parameters
(source and destination adresses, accesses width, etc.) and
passing it as an argument to dmaengine_slave_config()
3. Start a new transaction with
dmaengine_prep_slave_single() or
dmaengine_prep_slave_sg()
4. Put the transaction in the driver pending queue using
dmaengine_submit()
5. And finally ask the driver to process all pending transactions
using dmaengine_issue_pending()
▶ Of course, this needs to be done in addition to the DMA
mapping seen previously
▶ Some frameworks abstract it away from you, such as SPI and
ASoC
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 447/476
Backup slides
mmap
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 448/476
mmap
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 449/476
/proc/<pid>/maps
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 450/476
mmap Overview
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 451/476
How to Implement mmap - User Space
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 452/476
How to Implement mmap - Kernel Space
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 453/476
remap_pfn_range()
#include <linux/mm.h>
int remap_pfn_range(
struct vm_area_struct *, /* VMA struct */
unsigned long virt_addr, /* Starting user
* virtual address */
unsigned long pfn, /* pfn of the starting
* physical address */
unsigned long size, /* Mapping size */
pgprot_t prot /* Page permissions */
);
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 454/476
Simple mmap implementation
if (remap_pfn_range(vma,
vma->vm_start,
ACME_PHYS >> PAGE_SHIFT,
size,
vma->vm_page_prot))
return -EAGAIN;
return 0;
}
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 455/476
devmem2
▶ http://free-electrons.com/pub/mirror/devmem2.c, by
Jan-Derk Bakker
▶ Very useful tool to directly peek (read) or poke (write) I/O
addresses mapped in physical address space from a shell
command line!
▶ Very useful for early interaction experiments with a device,
without having to code and compile a driver.
▶ Uses mmap to /dev/mem.
▶ Examples (b: byte, h: half, w: word)
▶ devmem2 0x000c0004 h (reading)
▶ devmem2 0x000c0008 w 0xffffffff (writing)
▶ devmem is now available in BusyBox, making it even easier to
use.
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 456/476
mmap Summary
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 457/476
Backup slides
Introduction to Git
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 458/476
What is Git?
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 459/476
Install and Setup
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 460/476
Clone a Repository
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 461/476
Explore the History
▶ git log will list all the commits. The latest commit is the
first.
commit 4371ee353c3fc41aad9458b8e8e627eb508bc9a3
Author: Florian Fainelli <[email protected]>
Date: Mon Jun 1 02:43:17 2009 -0700
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 463/476
Visualize the History: cgit
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 464/476
Update your Repository
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 465/476
Tags
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 466/476
Branches
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 467/476
Branches
▶ Create a branch
▶ git branch <branchname>
▶ Move to this branch
▶ git checkout <branchname>
▶ Both at once (create and switch to branch)
▶ git checkout -b <branchname>
▶ List of local branches
▶ git branch
▶ List of all branches, including remote branches
▶ git branch -a
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 468/476
Making Changes
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 469/476
Sharing Changes: E-mail
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 470/476
Sharing Changes: Your Own Repository
▶ If you do a lot of changes and want to ease collaboration with
others, the best is to have your own public repository
▶ Use a git hosting service on the Internet:
▶ GitLab (http://gitlab.com/)
▶ Open Source server. Proprietary and commercial extensions
available.
▶ GitHub (https://github.com/)
▶ For public repositories. Need to pay for private repositories.
▶ Publish on your own web server
▶ Easy to implement.
▶ Just needs git software on the server and ssh access.
▶ Drawback: only supports http cloning (less efficient)
▶ Set up your own git server
▶ Most flexible solution.
▶ Today's best solutions are gitolite
(https://github.com/sitaramc/gitolite) for the server
and cgit for the web interface
(http://git.zx2c4.com/cgit/about/).
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 471/476
Sharing changes: HTTP Hosting
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 472/476
Tracking Remote Trees
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 473/476
git-gui
http://www.git-scm.com/docs/git-gui
▶ A graphical interface to create and manipulate commits,
replacing multiple git command-line commands.
▶ Not meant for history browsing (opens gitk when needed).
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 475/476
Practical lab - Going further: git
free electrons - Embedded Linux, kernel, drivers and Android - Development, consulting, training and support. http://free-electrons.com 476/476