Linux Kernel Slides
Linux Kernel Slides
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 1/473
Rights to copy
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 2/473
Hyperlinks in the document
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 3/473
Free Electrons at a glance
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 4/473
Free Electrons on-line resources
information
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 6/473
Hardware used in this training session
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 7/473
Do not damage your BeagleBone Black!
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 8/473
Shopping list: hardware for this course
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 9/473
Participate!
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 10/473
Practical lab guidelines
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 11/473
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 - Development, consulting, training and support. http://free-electrons.com 12/473
Cooperate!
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 13/473
Command memento sheet
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 16/473
Linux Kernel Introduction
Introduction
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 17/473
Linux Kernel Introduction
Linux features
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 18/473
History
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 19/473
Linux kernel key features
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 20/473
Linux kernel in the system
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 21/473
Linux kernel main roles
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 22/473
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 - Development, consulting, training and support. http://free-electrons.com 23/473
Pseudo filesystems
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 24/473
Inside the Linux kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 25/473
Supported hardware architectures
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 26/473
Embedded Linux Kernel Usage
Kernel Usage
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 27/473
Embedded Linux Kernel Usage
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 28/473
Location of kernel sources
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 29/473
Getting Linux sources
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 30/473
Linux kernel size (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 31/473
Linux kernel size (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 32/473
Practical lab - Downloading kernel source code
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 33/473
Kernel Source Code
Code
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 34/473
Kernel Source Code
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 35/473
Programming language
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 36/473
No C library
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 37/473
Portability
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 38/473
No floating point computation
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 39/473
No stable Linux internal API
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 40/473
Kernel memory constraints
▶ No memory protection
▶ The kernel doesn't try to recover from attemps to access
illegal memory locations. It just dumps oops messages on the
system console.
▶ Fixed size stack (8 or 4 KB). Unlike in user space, no
mechanism was implemented to make it grow.
▶ Swapping is not implemented for kernel memory either.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 41/473
Linux kernel licensing constraints
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 42/473
Proprietary code and the kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 43/473
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 - Development, consulting, training and support. http://free-electrons.com 44/473
Advantages of in-tree kernel drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 45/473
User space device drivers 1/3
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 46/473
User space device drivers 2/3
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 47/473
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 - Development, consulting, training and support. http://free-electrons.com 48/473
Kernel Source Code
Linux sources
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 49/473
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 - Development, consulting, training and support. http://free-electrons.com 50/473
Linux sources structure 2/5
▶ Documentation/
▶ Kernel documentation sources
Also available on https://www.kernel.org/doc/
(includes functions prototypes and comments extracted from
source code).
▶ 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
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 51/473
Linux sources structure 3/5
▶ include/uapi/
▶ User space API headers
▶ init/
▶ Linux initialization (including init/main.c)
▶ ipc/
▶ Code used for process communication
▶ 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...)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 52/473
Linux sources structure 4/5
▶ MAINTAINERS
▶ Maintainers of each kernel part. Very useful!
▶ Makefile
▶ Top Linux Makefile (sets arch and version)
▶ mm/
▶ Memory management code (small too!)
▶ net/
▶ Network support code (not drivers)
▶ README
▶ Overview and building instructions
▶ samples/
▶ Sample code (markers, kprobes, kobjects, bpf...)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 53/473
Linux sources structure 5/5
▶ scripts/
▶ Executables 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, example: perf)
▶ usr/
▶ Code to generate an initramfs cpio archive
▶ virt/
▶ Virtualization support (KVM)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 54/473
Kernel Source Code
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 55/473
Cscope
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 56/473
Cscope screenshot
▶ https://github.com/free-electrons/elixir
▶ Generic source indexing tool and code browser. Inspired by
the LXR project (Linux Cross Reference).
▶ Web server based, very easy and fast to use
▶ Very easy to find the declaration, implementation or usage of
symbols
▶ Supports C and C++
▶ Supports huge code projects such as the Linux kernel
▶ Takes a little time and patience to setup (configuration,
indexing, web server configuration)
▶ You don't need to set up Elixir by yourself. Use our
http://elixir.free-electrons.com server!
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 58/473
Elixir screenshot
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 59/473
Practical lab - Kernel Source Code - Exploring
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 60/473
Kernel Source Code
Kernel configuration
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 61/473
Kernel configuration and build system
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 62/473
Kernel configuration (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 63/473
Kernel configuration (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 64/473
Kernel or module?
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 65/473
Kernel option types
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 66/473
Kernel option dependencies
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 67/473
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: qt5-default g++
pkg-config
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 68/473
make xconfig screenshot
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 69/473
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 - Development, consulting, training and support. http://free-electrons.com 70/473
Kernel configuration options
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 71/473
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 - Development, consulting, training and support. http://free-electrons.com 72/473
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 - Development, consulting, training and support. http://free-electrons.com 73/473
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 - Development, consulting, training and support. http://free-electrons.com 74/473
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 - Development, consulting, training and support. http://free-electrons.com 75/473
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 - Development, consulting, training and support. http://free-electrons.com 76/473
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 - Development, consulting, training and support. http://free-electrons.com 77/473
Configuration per architecture
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 78/473
Kernel Source Code
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 79/473
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
(Kernel Object) files.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 80/473
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 for debugging purposes
(obsolete: such information is usually stored in the kernel
itself)
▶ /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 - Development, consulting, training and support. http://free-electrons.com 81/473
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, modules.aliases.bin
Aliases for module loading utilities. Used to find drivers for
devices. Example line:
alias usb:v066Bp20F9d*dc*dsc*dp*ic*isc*ip*in* asix
▶ modules.dep, modules.dep.bin
Module dependencies
▶ modules.symbols, modules.symbols.bin
Tells which module a given symbol belongs to.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 82/473
Kernel cleanup targets
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 83/473
Kernel Source Code
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 84/473
Cross-compiling the kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 85/473
Specifying cross-compilation (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 86/473
Specifying cross-compilation (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 87/473
Predefined configuration files
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 88/473
Configuring the kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 89/473
Device Tree
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 91/473
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 - Development, consulting, training and support. http://free-electrons.com 92/473
Booting with U-Boot
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 93/473
Kernel command line
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 94/473
Practical lab - Kernel compiling and booting
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 95/473
Kernel Source Code
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 96/473
Advantages of modules
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 97/473
Module dependencies
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 98/473
Kernel log
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 99/473
Module utilities (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 100/473
Understanding module loading issues
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 101/473
Module utilities (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 102/473
Module utilities (3)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 103/473
Passing parameters to modules
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 105/473
Useful reading
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 106/473
Developing Kernel Modules
Modules
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 107/473
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 - Development, consulting, training and support. http://free-electrons.com 108/473
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 - Development, consulting, training and support. http://free-electrons.com 109/473
Hello Module Explanations
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 110/473
Symbols Exported to Modules 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 111/473
Symbols exported to modules 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 112/473
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 - Development, consulting, training and support. http://free-electrons.com 113/473
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 - Development, consulting, training and support. http://free-electrons.com 114/473
Compiling an out-of-tree Module 1/2
all:
<tab>$(MAKE) -C $(KDIR) M=$$PWD
endif
.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 115/473
Compiling an out-of-tree Module 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 117/473
New Driver in Kernel Sources 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 118/473
New Driver in Kernel Sources 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 119/473
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 - Development, consulting, training and support. http://free-electrons.com 120/473
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 - Development, consulting, training and support. http://free-electrons.com 122/473
Practical lab - Writing Modules
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 123/473
Useful general-purpose kernel APIs
Useful
general-purpose Embedded Linux
Experts
kernel APIs
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 124/473
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 - Development, consulting, training and support. http://free-electrons.com 125/473
Linked lists
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 126/473
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 - Development, consulting, training and support. http://free-electrons.com 127/473
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 - Development, consulting, training and support. http://free-electrons.com 129/473
Linux device and driver model
Introduction
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 130/473
The need for a device model?
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 131/473
Kernel and Device Drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 132/473
Device Model data structures
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 133/473
Bus Drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 134/473
Linux device and driver model
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 135/473
Example: USB Bus 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 136/473
Example: USB Bus 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 137/473
Example of Device Driver
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 138/473
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 - Development, consulting, training and support. http://free-electrons.com 139/473
Instantiation of usb_driver
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 140/473
Driver (Un)Registration
module_init(usb_rtl8150_init);
.
module_exit(usb_rtl8150_exit);
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 143/473
Probe Method
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 144/473
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 - Development, consulting, training and support. http://free-electrons.com 145/473
The Model is Recursive
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 146/473
Linux device and driver model
Platform drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 147/473
Non-discoverable buses
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 148/473
Platform devices
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 149/473
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 - Development, consulting, training and support. http://free-electrons.com 151/473
Platform device instantiation: old style (2/2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 152/473
The Resource Mechanism
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 153/473
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 - Development, consulting, training and support. http://free-electrons.com 154/473
Using Resources (old style)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 155/473
platform_data Mechanism (old style)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 156/473
platform_data example 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 157/473
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 - Development, consulting, training and support. http://free-electrons.com 159/473
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 - Development, consulting, training and support. http://free-electrons.com 160/473
Device Tree inheritance (1/2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 161/473
Device Tree inheritance (2/2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 162/473
Device Tree: compatible string
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 163/473
Device Tree Resources
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 164/473
Device Tree bindings
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 166/473
References
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 167/473
Introduction to the I2C subsystem
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 168/473
What is I2C?
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 169/473
An I2C bus example
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 170/473
The I2C subsystem
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 171/473
Registering an I2C device driver
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 172/473
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 - Development, consulting, training and support. http://free-electrons.com 173/473
Registering an I2C device: non-DT
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 174/473
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 - Development, consulting, training and support. http://free-electrons.com 175/473
Registering an I2C device, in the DT
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 176/473
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 - Development, consulting, training and support. http://free-electrons.com 177/473
Registering an I2C device, DT example (2/2)
.
Definition of the I2C device,
sun7i-a20-olinuxino-micro.dts file
.
&i2c0 {
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins_a>;
status = "okay";
axp209: pmic@34 {
compatible = "x-powers,axp209";
reg = <0x34>;
interrupt-parent = <&nmi_intc>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
interrupt-controller;
#interrupt-cells = <1>;
};
};
.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 178/473
probe() and remove()
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 179/473
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 - Development, consulting, training and support. http://free-electrons.com 180/473
Practical lab - Linux device model for an I2C driver
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 181/473
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 - Development, consulting, training and support. http://free-electrons.com 182/473
Communicating with the I2C device: message transfer
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 183/473
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 - Development, consulting, training and support. http://free-electrons.com 184/473
SMBus calls
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 185/473
List of SMBus functions
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 186/473
I2C functionality
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 187/473
References
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 188/473
Introduction to pin muxing
muxing
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 189/473
What is pin muxing?
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 190/473
Pin muxing diagram
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 191/473
Pin muxing in the Linux kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 192/473
pinctrl subsystem diagram
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 193/473
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 - Development, consulting, training and support. http://free-electrons.com 194/473
Defining pinctrl configurations
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 195/473
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 - Development, consulting, training and support. http://free-electrons.com 196/473
Example on Allwinner SoC
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 197/473
Practical lab - Communicate with the Nunchuk
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 198/473
Kernel frameworks for device drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 199/473
Kernel and Device Drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 200/473
Kernel frameworks for device drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 201/473
Types of devices
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 202/473
Major and minor numbers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 203/473
Devices: everything is a file
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 204/473
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 - Development, consulting, training and support. http://free-electrons.com 205/473
Creating device files
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 206/473
Kernel frameworks for device drivers
Character drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 207/473
A character driver in the kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 208/473
From user space to the kernel: character devices
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 209/473
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 - Development, consulting, training and support. http://free-electrons.com 210/473
open() and release()
▶ int foo_open(struct inode *i, struct file *f)
▶ Called when user space opens the device file.
▶ Only implement this function when you do something
special with the device at open() time.
▶ struct inode is a structure that uniquely represents a file in
the system (be it a regular file, a directory, a symbolic link, a
character or block device)
▶ struct file is a structure created every time a file is opened.
Several file structures can point to the same inode structure.
▶ Contains information like the current position, the opening
mode, etc.
▶ Has a void *private_data pointer that one can freely use.
▶ A pointer to the file structure is passed to all other
operations
▶ int foo_release(struct inode *i, struct file *f)
▶ Called when user space closes the file.
▶ Only implement this function when you do something
special with the device at close() time.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 211/473
read()
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 212/473
write()
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 213/473
Exchanging data with user space 1/3
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 214/473
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 - Development, consulting, training and support. http://free-electrons.com 215/473
Exchanging data with user space 3/3
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 216/473
Zero copy access to user memory
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 217/473
unlocked_ioctl()
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 218/473
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 - Development, consulting, training and support. http://free-electrons.com 219/473
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 - Development, consulting, training and support. http://free-electrons.com 220/473
Kernel frameworks for device drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 221/473
Beyond character drivers: kernel frameworks
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 222/473
Kernel Frameworks
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 223/473
Example: Framebuffer Framework
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 224/473
Framebuffer driver operations
▶ Here are the operations a framebuffer driver can or must
implement, and define them in a struct fb_ops structure
Device-managed allocations
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 227/473
Device managed allocations
▶ The probe() function is typically responsible for allocating a
significant number of resources: memory, mapping I/O
registers, registering interrupt handlers, etc.
▶ These resource allocations have to be properly freed:
▶ In the probe() function, in case of failure
▶ In the remove() function
▶ This required a lot of failure handling code that was rarely
tested
▶ To solve this problem, device managed allocations have been
introduced.
▶ The idea is to associate resource allocation with the
struct device, and automatically release those resources
▶ When the device disappears
▶ When the device is unbound from the driver
▶ Functions prefixed by devm_
▶ See Documentation/driver-model/devres.txt for details
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 228/473
Device managed allocations: memory allocation example
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 229/473
Kernel frameworks for device drivers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 230/473
Driver-specific Data Structure
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 231/473
Driver-specific Data Structure Examples 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 232/473
Driver-specific Data Structure Examples 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 233/473
Links between structures 1/4
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 234/473
Links between structures 2/4
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 235/473
Links between structures 3/4
[...]
[...]
[...]
}
[...]
}
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 236/473
Links 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 - Development, consulting, training and support. http://free-electrons.com 237/473
The input subsystem
subsystem
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 238/473
What is the 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 - Development, consulting, training and support. http://free-electrons.com 239/473
Input subsystem diagram
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 240/473
Input subsystem overview
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 241/473
Input subsystem API 1/3
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 242/473
Input subsystem API 2/3
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 243/473
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 - Development, consulting, training and support. http://free-electrons.com 244/473
Polled input subclass
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 245/473
Polled input subsystem API
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 246/473
evdev user space interface
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 248/473
Memory Management
Management
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 249/473
Physical and Virtual Memory
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 250/473
Virtual Memory Organization
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 251/473
Physical / virtual memory mapping
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 252/473
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 the 1GB/3GB memory split to 2GB/2GB or 1GB/3GB
(CONFIG_VMSPLIT_2G or CONFIG_VMSPLIT_1G) ⇒ reduce total
user 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 - Development, consulting, training and support. http://free-electrons.com 253/473
Notes on user space memory
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 254/473
Back to kernel memory
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 255/473
Allocators in the Kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 256/473
Page Allocator
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 257/473
Page Allocator API: Get free pages
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 258/473
Page Allocator API: Free Pages
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 259/473
Page Allocator Flags
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 260/473
SLAB Allocator 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 261/473
SLAB Allocator 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 262/473
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 - Development, consulting, training and support. http://free-electrons.com 263/473
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 - Development, consulting, training and support. http://free-electrons.com 264/473
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 - Development, consulting, training and support. http://free-electrons.com 265/473
kmalloc API 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 266/473
devm_ kmalloc functions
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 267/473
vmalloc Allocator
▶ Kmemcheck
▶ Dynamic checker for access to uninitialized memory.
▶ Only available on x86 so far (Linux 4.9 status), but will help to
improve architecture independent code anyway.
▶ See dev-tools/kmemcheck for details.
▶ Kmemleak
▶ Dynamic checker for memory leaks
▶ This feature is available for all architectures.
▶ See dev-tools/kmemleak for details.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 269/473
I/O Memory and Ports
Ports
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 270/473
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 - Development, consulting, training and support. http://free-electrons.com 271/473
MMIO vs PIO
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 272/473
Requesting I/O ports
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 273/473
/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 - Development, consulting, training and support. http://free-electrons.com 274/473
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 - Development, consulting, training and support. http://free-electrons.com 275/473
Requesting I/O memory
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 276/473
/proc/iomem example
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 277/473
Mapping I/O memory in virtual memory
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 278/473
ioremap()
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 280/473
Accessing MMIO devices
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 281/473
Avoiding I/O access issues
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 282/473
/dev/mem
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 283/473
Practical lab - I/O Memory and Ports
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 284/473
The misc subsystem
subsystem
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 285/473
Why a misc subsystem?
▶ The kernel offers a large number of frameworks covering a
wide range of device types: input, network, video, audio, etc.
▶ These frameworks allow to factorize common functionality
between drivers and offer a consistent API to user space
applications.
▶ However, there are some devices that really do not fit in any
of the existing frameworks.
▶ Highly customized devices implemented in a FPGA, or other
weird devices for which implementing a complete framework is
not useful.
▶ The drivers for such devices could be implemented directly as
raw character drivers (with cdev_init() and cdev_add()).
▶ But there is a subsystem that makes this work a little bit
easier: the misc subsystem.
▶ It is really only a thin layer above the character driver API.
▶ Another advantage is that devices are integrated in the Device
Model (device files appearing in devtmpfs, which you don't
have with raw character devices).
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 286/473
Misc subsystem diagram
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 287/473
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 - Development, consulting, training and support. http://free-electrons.com 288/473
Misc subsystem API (2/2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 289/473
User space API for misc devices
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 290/473
Practical lab - Output-only serial port driver
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 291/473
Processes, scheduling and interrupts
Processes,
scheduling and Embedded Linux
Experts
interrupts
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 292/473
Processes, scheduling and interrupts
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 293/473
Process, thread?
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 294/473
Process, thread: kernel point of view
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 295/473
A thread life
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 296/473
Execution of system calls
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 297/473
Processes, scheduling and interrupts
Sleeping
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 298/473
Sleeping
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 299/473
How to sleep 1/3
▶ Must declare a wait queue, which will be used to store the list
of threads waiting for an event
▶ Dynamic queue declaration:
▶ Typically one queue per device managed by the driver
▶ It's convenient to embed the wait queue inside a per-device
data structure.
▶ Example from drivers/net/ethernet/marvell/mvmdio.c:
struct orion_mdio_dev {
...
wait_queue_head_t smi_busy_wait;
};
struct orion_mdio_dev *dev;
...
init_waitqueue_head(&dev->smi_busy_wait);
▶ Static queue declaration:
▶ Using a global variable when a global resource is sufficient
▶ DECLARE_WAIT_QUEUE_HEAD(module_queue);
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 300/473
How to sleep 2/3
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 301/473
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 - Development, consulting, training and support. http://free-electrons.com 302/473
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 - Development, consulting, training and support. http://free-electrons.com 303/473
Waking up!
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 304/473
Exclusive vs. non-exclusive
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 305/473
Sleeping and waking up - Implementation
The scheduler doesn't keep
evaluating the sleeping condition!
▶ wait_event(queue, cond);
The process is put in the
TASK_UNINTERRUPTIBLE
state.
▶ 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.
See include/linux/wait.h for
implementation details.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 306/473
Processes, scheduling and interrupts
Interrupt Management
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 307/473
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);
▶ 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 (for /proc/interrupts)
▶ dev_id is an opaque pointer. It can typically be used to pass
a pointer to a per-device data structure. It cannot be NULL as
it is used as an identifier for freeing interrupts on a shared line.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 308/473
Releasing an interrupt handler
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 309/473
Registering an interrupt handler 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 310/473
Interrupt handler constraints
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 311/473
/proc/interrupts on Raspberry Pi 2 (ARM, Linux 4.1)
.
CPU0 CPU1 CPU2 CPU3
16: 0 0 0 0 ARMCTRL 16 Edge bcm2708_fb dma
32: 1660065960 0 0 0 ARMCTRL 32 Edge dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1
49: 0 0 0 0 ARMCTRL 49 Edge 3f200000.gpio:bank0
50: 0 0 0 0 ARMCTRL 50 Edge 3f200000.gpio:bank1
65: 77339 0 0 0 ARMCTRL 65 Edge 3f00b880.mailbox
66: 2 0 0 0 ARMCTRL 66 Edge VCHIQ doorbell
75: 1 0 0 0 ARMCTRL 75 Edge
77: 825261 0 0 0 ARMCTRL 77 Edge DMA IRQ
82: 819926 0 0 0 ARMCTRL 82 Edge mmc0
83: 6 0 0 0 ARMCTRL 83 Edge uart-pl011
96: 0 0 0 0 ARMCTRL 96 Edge arch_timer
97: 45040705 26523650 16191929 47339273 ARMCTRL 97 Edge arch_timer
FIQ: usb_fiq
IPI0: 0 0 0 0 CPU wakeup interrupts
IPI1: 0 0 0 0 Timer broadcast interrupts
IPI2: 34944338 35870609 37410637 12127900 Rescheduling interrupts
IPI3: 9 10 9 11 Function call interrupts
IPI4: 3 3 1 1 Single function call interrupts
IPI5: 0 0 0 0 CPU stop interrupts
IPI6: 0 0 0 0 IRQ work interrupts
IPI7: 0 0 0 0 completion 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 can be seen
in /sys/kernel/debug/irq_domain_mapping.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 312/473
Interrupt handler prototype
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 313/473
Typical interrupt handler's job
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 314/473
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 - Development, consulting, training and support. http://free-electrons.com 315/473
Top half and bottom half processing
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 316/473
Top half and bottom half diagram
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 317/473
Softirqs
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 318/473
Tasklets
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 319/473
Tasklet Example: drivers/crypto/atmel-sha.c 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 322/473
Interrupt management summary
▶ Device driver
▶ In the probe() function, for each device, use
devm_request_irq() to 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 per-device tasklet taking care of handling
data.
▶ Wake up processes waiting for the data on a per-device queue
▶ Device driver
▶ In the remove() function, for each device, the interrupt
handler is automatically unregistered.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 323/473
Practical lab - Interrupts
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 324/473
Concurrent Access to Resources: Locking
Concurrent Access
to Resources: Embedded Linux
Experts
Locking
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 325/473
Sources of concurrency issues
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 327/473
Linux mutexes
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 328/473
Locking and Unlocking Mutexes 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 329/473
Locking and Unlocking Mutexes 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 330/473
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 - Development, consulting, training and support. http://free-electrons.com 331/473
Initializing Spinlocks
▶ Statically
▶ DEFINE_SPINLOCK(my_lock);
▶ Dynamically
▶ void spin_lock_init(spinlock_t *lock);
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 332/473
Using Spinlocks 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 333/473
Using Spinlocks 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 334/473
Spinlock example
spin_lock_irqsave(&port->lock, flags);
/* Do something */
spin_unlock_irqrestore(&port->lock, flags);
}
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 335/473
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 - Development, consulting, training and support. http://free-electrons.com 336/473
Kernel lock validator
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 337/473
Alternatives to Locking
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 338/473
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 - Development, consulting, training and support. http://free-electrons.com 339/473
Atomic Variables 2/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 340/473
Atomic Bit Operations
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 341/473
Practical lab - Locking
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 342/473
Kernel Debugging
Embedded Linux
Experts
Kernel Debugging
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 343/473
Debugging Using Messages (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 344/473
Debugging Using Messages (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 345/473
pr_debug() and dev_dbg()
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 346/473
Configuring The Priority
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 347/473
DebugFS
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 348/473
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 - Development, consulting, training and support. http://free-electrons.com 349/473
Deprecated Debugging Mechanisms
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 350/473
Using Magic SysRq
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 351/473
kgdb - A Kernel Debugger
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 352/473
Using kgdb 1/2
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 353/473
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 - Development, consulting, training and support. http://free-electrons.com 354/473
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 - Development, consulting, training and support. http://free-electrons.com 355/473
More Kernel Debugging Tips
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 356/473
Practical lab - Kernel debugging
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 357/473
Porting the Linux Kernel to an ARM Board
Board
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 358/473
Porting the Linux kernel
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 359/473
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 - Development, consulting, training and support. http://free-electrons.com 360/473
Before the Device Tree and ARM cleanup
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 361/473
The Device Tree and the ARM cleanup
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 362/473
Adding the support for a new ARM board
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 363/473
Studying the Crystalfontz CFA-10036 platform
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 364/473
Crystalfontz CFA-10036 Device Tree, header
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 366/473
Crystalfontz CFA-10036, bus/UART
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 367/473
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 - Development, consulting, training and support. http://free-electrons.com 368/473
Crystalfontz CFA-10036 Device Tree, LED
power {
gpios = <&gpio3 4 1>;
default-state = "on";
};
.
};
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 369/473
Crystalfontz CFA-10036 Device Tree, SD Card/USB
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 370/473
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 - Development, consulting, training and support. http://free-electrons.com 371/473
Crystalfontz CFA-10036 Device Tree, Breakout Boards
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 372/473
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 - Development, consulting, training and support. http://free-electrons.com 373/473
Understanding the SoC support
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 374/473
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 - Development, consulting, training and support. http://free-electrons.com 375/473
Components of the minimal SoC support
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 376/473
Extending the minimal SoC support
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 377/473
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 - Development, consulting, training and support. http://free-electrons.com 378/473
Porting the Linux kernel: further reading
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 379/473
Power Management
Management
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 380/473
PM Building Blocks
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 381/473
Clock Framework (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 382/473
Clock Framework (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 383/473
Diagram overview of the common clock framework
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 384/473
Clock Framework (3)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 385/473
Clock Framework (4)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 386/473
Suspend and Resume
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 387/473
Triggering Suspend
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 388/473
Runtime Power Management
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 389/473
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 - Development, consulting, training and support. http://free-electrons.com 390/473
Managing Idle
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 391/473
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 - Development, consulting, training and support. http://free-electrons.com 392/473
Frequency and Voltage Scaling (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 393/473
Frequency and Voltage Scaling (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 394/473
Regulator Framework
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 395/473
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 - Development, consulting, training and support. http://free-electrons.com 396/473
Useful Resources
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 397/473
The kernel development and contribution process
The kernel
development and
contribution Embedded Linux
Experts
process
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 398/473
The kernel development and contribution process
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 399/473
Until 2.6 (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 400/473
Until 2.6 (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 401/473
Changes since Linux 2.6
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 402/473
Versions since 2.6.0
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 403/473
New development model
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 404/473
More stability for the kernel source tree
The official list of changes for each Linux release is just a huge list
of individual patches!
commit aa6e52a35d388e730f4df0ec2ec48294590cc459
Author: Thomas Petazzoni <[email protected]>
Date: Wed Jul 13 11:29:17 2011 +0200
Very difficult to find out the key changes and to get the global
picture out of individual changes.
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 406/473
What's new in each Linux release? (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 407/473
The kernel development and contribution process
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 408/473
Getting help and reporting bugs
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 - Development, consulting, training and support. http://free-electrons.com 410/473
Contribute to the Linux Kernel (1)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 411/473
Contribute to the Linux Kernel (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 412/473
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 - Development, consulting, training and support. http://free-electrons.com 413/473
Contribute to the Linux Kernel (3)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 414/473
Contribute to the Linux Kernel (4)
▶ Remove previously generated patches
▶ rm 00*.patch
▶ Have git generate patches corresponding to your branch
(assuming it is the current branch)
▶ If your branch is based on mainline
▶ git format-patch master
▶ If your branch is based on a remote branch
▶ git format-patch <remote>/<branch>
▶ Make sure your patches pass checkpatch.pl checks:
▶ 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 - Development, consulting, training and support. http://free-electrons.com 415/473
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 - Development, consulting, training and support. http://free-electrons.com 416/473
Contribute to the Linux Kernel (6)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 417/473
Kernel Resources
Embedded Linux
Experts
Kernel Resources
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 418/473
Kernel Development News
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 419/473
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 - Development, consulting, training and support. http://free-electrons.com 420/473
Useful Reading (2)
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 421/473
Useful Online Resources
▶ Kernel documentation
▶ https://kernel.org/doc/
▶ Linux kernel mailing list FAQ
▶ http://vger.kernel.org/lkml/
▶ Complete Linux kernel FAQ
▶ Read this before asking a question to the mailing list
▶ Kernel Newbies
▶ http://kernelnewbies.org/
▶ Glossary, articles, presentations, HOWTOs, recommended
reading, useful tools for people getting familiar with Linux
kernel or driver development.
▶ Kernel glossary
▶ http://kernelnewbies.org/KernelGlossary
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 422/473
International Conferences
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 423/473
Continue to learn after the course
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 424/473
Last slides
Embedded Linux
Experts
Last slides
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 425/473
Last slide
Thank you!
And may the Source be with you
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 426/473
Backup slides
Embedded Linux
Experts
Backup slides
Free Electrons
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 427/473
Backup slides
DMA
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 428/473
DMA Integration
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 429/473
Peripheral DMA
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 430/473
DMA Controllers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 431/473
DMA descriptors
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 432/473
Backup slides
DMA Usage
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 433/473
Constraints with a DMA
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 434/473
DMA Memory Constraints
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 435/473
Memory Synchronization Issues
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 436/473
Linux DMA API
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 437/473
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 - Development, consulting, training and support. http://free-electrons.com 438/473
Allocating Coherent Mappings
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 439/473
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 - Development, consulting, training and support. http://free-electrons.com 440/473
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 - Development, consulting, training and support. http://free-electrons.com 441/473
Backup slides
DMA transfers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 442/473
Starting DMA transfers
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 443/473
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 dma_async_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 - Development, consulting, training and support. http://free-electrons.com 444/473
Backup slides
mmap
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 445/473
mmap
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 446/473
/proc/<pid>/maps
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 447/473
mmap Overview
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 448/473
How to Implement mmap - User Space
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 449/473
How to Implement mmap - Kernel Space
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 450/473
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 - Development, consulting, training and support. http://free-electrons.com 451/473
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 - Development, consulting, training and support. http://free-electrons.com 452/473
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 - Development, consulting, training and support. http://free-electrons.com 453/473
mmap Summary
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 454/473
Backup slides
Introduction to Git
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 455/473
What is Git?
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 456/473
Install and Setup
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 457/473
Clone a Repository
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 458/473
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 - Development, consulting, training and support. http://free-electrons.com 460/473
Visualize the History: cgit
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 461/473
Update your Repository
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 462/473
Tags
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 463/473
Branches
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 464/473
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 - Development, consulting, training and support. http://free-electrons.com 465/473
Making Changes
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 466/473
Sharing Changes: E-mail
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 467/473
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 - Development, consulting, training and support. http://free-electrons.com 468/473
Sharing changes: HTTP Hosting
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 469/473
Tracking Remote Trees
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 470/473
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 - Development, consulting, training and support. http://free-electrons.com 472/473
Practical lab - Going further: git
Free Electrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 473/473