SlideShare a Scribd company logo
1 of 43
Download to read offline
Team Emertxe
Linux Device Drivers
An Introduction
Introduction
Familiarity Check
●
Good C & Programming Skills
●
Linux & the Filesytem
– Root, User Space Headers & Libraries
●
Files
– Regular, Special, Device
●
Toolchain
– gcc & friends
●
Make & Makefiles
●
Kernel Sources (Location & Building)
The Flow
● Introduction
– Linux kernel Ecosystem
– Kernel Souce Organization
– Command set and Files
– Writing the first driver (Module)
● Character Drivers
– Device files
– Device access from user space (End to End flow)
– Registering the driver
– File Operations and registration
– Data transfer between User and Kernel space
– ioctl
● Memory & Hardware
● Time & Timings
● USB Drivers
● Interrupt Handling
● Block Drivers
● PCI Drivers
● Debugging
The Flow...
●
Introduction
– Linux kernel Ecosystem
– Kernel Souce Organization
– Command set and Files
– Writing the first driver (Module)
●
Character Drivers
– Device files
– Device access from user space (End to End flow)
● Memory & Hardware
● Time & Timings
● USB Drivers
●
Interrupt Handling
●
Block Drivers
● PCI Drivers
● Debugging
Hands-On
●
Your First Driver
●
Character Drivers
– Null Driver
– Memory Driver
– UART Driver for Customized Hardware
●
USB Drivers
– USB Device Hot-plug-ability
– USB to Serial Hardware Driver
●
Filesystem Modules
– VFS Interfacing
– “Pseudo” File System with Memory Files
Linux Driver
Ecosystem
bash gvim X Server gcc firefox
`
`
Process
Management
ssh
Memory
Management
File Systems
Device
Control
Networking
Architecture
Dependent
Code
Character
Devices
Memory
Manager
Filesystem
Types
Block
Devices
Network
Subsystem
IF
Devices
Concurrency
MultiTasking
Virtual
Memory
Files & Dirs:
The VFS
Ttys &
Device Access
Connectivity
CPU Memory
Disks &
CDs
Consoles,
etc
Network
Interfaces
Kernel Source
Organization
Kernel Source
include
net
drivers
block
fs
mm
kernel
arch
char mtd/ide net pci ...usbserial
asm-<arch>linux
arm powerpc sparc x86 ...
The Locations &
Config Files
● Kernel Source Path: /usr/src/linux
● Std Modules Path:
– /lib/modules/<kernel version>/kernel/...
●
Module Configuration: /etc/modprobe.conf
● Kernel Windows:
– /proc
– /sys
●
System Logs: /var/log/messages
The Commands
●
lsmod
●
insmod
●
modprobe
●
rmmod
●
dmesg
●
objdump
●
nm
●
cat /proc/<file>
The Kernel's C
●
ctor & dtor
– init_module, cleanup_module
●
printf
– printk
● Libraries
– <kernel src>/kernel
●
Headers
– <kernel src>/include
The Init Code
static int __init mfd_init(void)
{
printk(KERN_INFO "mfd registered");
...
return 0;
}
module_init(mfd_init);
The Cleanup Code
static void __exit mfd_exit(void)
{
printk(KERN_INFO "mfd deregistered");
...
}
module_exit(mfd_exit);
Usage of printk
● <linux/kernel.h>
● Constant String for Log Level
– KERN_EMERG "<0>" /* system is unusable */
– KERN_ALERT "<1>" /* action must be taken immediately */
– KERN_CRIT "<2>" /* critical conditions */
– KERN_ERR "<3>" /* error conditions */
– KERN_WARNING "<4>" /* warning conditions */
– KERN_NOTICE "<5>" /* normal but significant condition */
– KERN_INFO "<6>" /* informational */
– KERN_DEBUG "<7>" /* debug-level messages */
●
printf like arguments
The Other Basics &
Ornaments
● Headers
– #include <linux/module.h>
– #include <linux/version.h>
– #include <linux/kernel.h>
● MODULE_LICENSE("GPL");
● MODULE_AUTHOR("Emertxe");
● MODULE_DESCRIPTION("First Device Driver");
Building the Module
● Our driver needs
– The Kernel Headers for Prototypes
– The Kernel Functions for Functionality
– The Kernel Build System & the Makefile for Building
●
Two options
– Building under Kernel Source Tree
● Put our driver under drivers folder
● Edit Kconfig(s) & Makefile to include our driver
– Create our own Makefile to do the right invocation
Our Makefile
ifneq (${KERNELRELEASE},)
obj-m += <module>.o
else
KERNEL_SOURCE := <kernel source directory path>
PWD := $(shell pwd)
default:
$(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) clean
endif
Try Out your First Driver
Character Drivers
Major &
Minor Number
● ls -l /dev
● Major is to Driver; Minor is to Device
● <linux/types.h> (>= 2.6.0)
– dev_t: 12 & 20 bits for major & minor
● <linux/kdev_t.h>
– MAJOR(dev_t dev)
– MINOR(dev_t dev)
– MKDEV(int major, int minor)
Registering &
Unregistering
●
Registering the Device Driver
– int register_chrdev_region(dev_t first, unsigned int count,
char *name);
– int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,
unsigned int cnt, char *name);
●
Unregistering the Device Driver
– void unregister_chrdev_region(dev_t first, unsigned int
count);
●
Header: <linux/fs.h>
The file operations
● #include <linux/fs.h>
● struct file_operations
– int (*open)(struct inode *, struct file *);
– int (*release)(struct inode *, struct file *);
– ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
– ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);
– struct module owner = THIS_MODULE; / linux/module.h> */
– loff_t (*llseek)(struct file *, loff_t, int);
– int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long);
User level I/O
●
int open(const char *path, int oflag, ... )
●
int close(int fd);
●
ssize_t write(int fd, const void *buf, size_t nbyte)
●
ssize_t read(int fd, void *buf, size_t nbyte)
●
int ioctl(int d, int request, ...)
– The ioctl() function manipulates the underlying device
parameters of special files.
– The argument d must be an open file descriptor.
– The second argument is a device-dependent request code.
The file &
inode structures
●
struct file
– mode_t f_mode
– loff_t f_pos
– unsigned int f_flags
– struct file_operations *f_op
– void * private_data
●
struct inode
– unsigned int iminor(struct inode *);
– unsigned int imajor(struct inode *);
Registering the
file operations
●
#include <linux/cdev.h>
●
1st way initialization:
– struct cdev *my_cdev = cdev_alloc();
– my_cdev->owner = THIS_MODULE;
– my_cdev->ops = &my_fops;
● 2nd way initialization:
– struct cdev my_cdev;
– cdev_init(&my_cdev, &my_fops);
– my_cdev.owner = THIS_MODULE;
– my_cdev.ops = &my_fops;
Registering the
file operations...
● The Registration
– int cdev_add(struct cdev *cdev, dev_t num,
unsigned int count);
●
The Unregistration
– void cdev_del(struct cdev *cdev);
Registering/Unregistering
Old Way
● Registering the Device Driver
– int register_chrdev(undigned int major, const char *name,
struct file_operations *fops);
● Unregistering the Device Driver
– int unregister_chrdev(undigned int major, const char
*name);
The read flow
struct file
-------------------------
f_count
f_flags
f_mode
-------------------------
f_pos
-------------------------
...
...
ssize_t my_read(struct file *f, char __user *buf, size_t cnt, loff_t *off)
Buffer
(in the driver)
Buffer
(in the
application
or libc)
Kernel Space (Non-swappable) User Space (Swappable)
copy_to_user
The /dev/null
read & write
ssize_t my_read(struct file *f, char __user *buf, size_t cnt, loff_t
*off)
{
...
return read_cnt;
}
ssize_t my_write(struct file *f, char __user *buf, size_t cnt, loff_t
*off)
{
...
return wrote_cnt;
}
The mem device read
ssize_t my_read(struct file *f, char __user *buf, size_t cnt, loff_t
*off)
{
...
if (copy_to_user(buf, from, cnt) != 0)
{
return -EFAULT;
}
...
return read_cnt;
}
The mem device write
ssize_t my_write(struct file *f, char __user *buf, size_t cnt, loff_t
*off)
{
...
if (copy_from_user(to, buf, cnt) != 0)
{
return -EFAULT;
}
...
return wrote_cnt;
}
Dynamic Device Node
& Classes
● Class Operations
– struct class *class_create(struct module *owner, char
*name);
– void class_destroy(struct class *cl);
●
Device into & Out of Class
– struct class_device *device_create(struct class *cl, NULL,
dev_t devnum, NULL, const char *fmt, ...);
– void device_destroy(struct class *cl, dev_t devnum);
The I/O Control API
●
int (*ioctl)(struct inode *, struct file *, unsigned int cmd, unsigned long arg)
●
int (*unlocked_ioctl)(struct file *, unsigned int cmd, unsigned long arg)
●
Command
– <linux/ioctl.h> -> ... -> <asm-generic/ioctl.h>
– Macros
●
_IO, _IOR, _IOW, _IOWR
– Parameters
●
type (Magic character) [15:8]
●
number (index) [7:0]
●
size (param type) [29:16]
The I/O Control API
● Macro Usage
_IO(type, index)
[_IOR | _IOW | _IOWR](type, index,
datatype/size)
Module Parameters
●
<linux/moduleparam.h>
– Macros
● module_param(name, type, perm)
● module_param_array(name, type, num, perm)
● Perm (is a bitmask)
– 0
– S_IRUGO
– S_IWUSR | S_IRUGO
– Loading
● insmod driver.ko name=10
x86 Architecture
A
B
Memory Access
Physical Vs
Virtual Memory
●
The kernel Organizes Physical memory in to pages
– Page size Depends on Arch
● X86-based 4096 bytes
●
On 32-bit X86 system Kernel total Virtual address space
– Total 4GB (pointer size)
– Kernel Configuration Splits 4GB in to
● 3BG Virtual Sp for US
● 1GB Virtual Sp for Kernel
– 128MB KDS
– Virtual Address also called “Logical Address”
Memory Access from
Kernel Space
●
Virtual Address on Physical Address
– #include <linux/gfp.h>
●
unsigned long __get_free_pages(flags, order); etc
●
void free_pages(addr, order); etc
– #include <linux/slab.h>
●
void *kmalloc(size_t size, gfp_t flags);
– GFP_ATOMIC, GFP_KERNEL, GFP_DMA
● void kfree(void *obj);
– #include <linux/vmalloc.h>
● void *vmalloc(unsigned long size);
●
void vfree(void *addr);
Memory Access from
Kernel Space...
●
Virtual Address for Bus/IO Address
– #include <asm/io.h>
● void *ioremap(unsigned long offset, unsigned long size);
● void iounmap(void *addr);
● I/O Memory Access
– #include <asm/io.h>
● unsigned int ioread[8|16|32](void *addr);
● unsigned int iowrite[8|16|32](u[8|16|32] value, void *addr);
●
Barriers
– #include <linux/kernel.h>: void barrier(void);
– #include <asm/system.h>: void [r|w|]mb(void);
Hardware Access
I/O Accesses from
Kernel Space
● I/O Port Access
– #include <asm/io.h>
● unsigned in[b|w|l](unsigned port);
● void out[b|w|l](unsigned [char|short|int] value,
unsigned port);
Hands-On the Hardware

More Related Content

What's hot

Android Security Internals
Android Security InternalsAndroid Security Internals
Android Security InternalsOpersys inc.
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System ServerOpersys inc.
 
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)Nanik Tolaram
 
Learning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessLearning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessNanik Tolaram
 
Linux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKBLinux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKBshimosawa
 
linux device driver
linux device driverlinux device driver
linux device driverRahul Batra
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device driversHoucheng Lin
 
LAS16-402: ARM Trusted Firmware – from Enterprise to Embedded
LAS16-402: ARM Trusted Firmware – from Enterprise to EmbeddedLAS16-402: ARM Trusted Firmware – from Enterprise to Embedded
LAS16-402: ARM Trusted Firmware – from Enterprise to EmbeddedLinaro
 
Linux Kernel Module - For NLKB
Linux Kernel Module - For NLKBLinux Kernel Module - For NLKB
Linux Kernel Module - For NLKBshimosawa
 

What's hot (20)

Android Security Internals
Android Security InternalsAndroid Security Internals
Android Security Internals
 
Basic Linux Internals
Basic Linux InternalsBasic Linux Internals
Basic Linux Internals
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System Server
 
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
 
Embedded Linux Kernel - Build your custom kernel
Embedded Linux Kernel - Build your custom kernelEmbedded Linux Kernel - Build your custom kernel
Embedded Linux Kernel - Build your custom kernel
 
Linux device drivers
Linux device drivers Linux device drivers
Linux device drivers
 
Embedded Linux on ARM
Embedded Linux on ARMEmbedded Linux on ARM
Embedded Linux on ARM
 
Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)
 
Learning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessLearning AOSP - Android Booting Process
Learning AOSP - Android Booting Process
 
Linux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKBLinux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKB
 
linux device driver
linux device driverlinux device driver
linux device driver
 
Linux Internals - Part I
Linux Internals - Part ILinux Internals - Part I
Linux Internals - Part I
 
Low Level View of Android System Architecture
Low Level View of Android System ArchitectureLow Level View of Android System Architecture
Low Level View of Android System Architecture
 
Embedded Operating System - Linux
Embedded Operating System - LinuxEmbedded Operating System - Linux
Embedded Operating System - Linux
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device drivers
 
Linux Internals - Part II
Linux Internals - Part IILinux Internals - Part II
Linux Internals - Part II
 
Android Audio System
Android Audio SystemAndroid Audio System
Android Audio System
 
LAS16-402: ARM Trusted Firmware – from Enterprise to Embedded
LAS16-402: ARM Trusted Firmware – from Enterprise to EmbeddedLAS16-402: ARM Trusted Firmware – from Enterprise to Embedded
LAS16-402: ARM Trusted Firmware – from Enterprise to Embedded
 
Porting Android
Porting AndroidPorting Android
Porting Android
 
Linux Kernel Module - For NLKB
Linux Kernel Module - For NLKBLinux Kernel Module - For NLKB
Linux Kernel Module - For NLKB
 

Viewers also liked

Viewers also liked (20)

Communication Protocols (UART, SPI,I2C)
Communication Protocols (UART, SPI,I2C)Communication Protocols (UART, SPI,I2C)
Communication Protocols (UART, SPI,I2C)
 
Linux systems - Getting started with setting up and embedded platform
Linux systems - Getting started with setting up and embedded platformLinux systems - Getting started with setting up and embedded platform
Linux systems - Getting started with setting up and embedded platform
 
Embedded C
Embedded CEmbedded C
Embedded C
 
File systems for Embedded Linux
File systems for Embedded LinuxFile systems for Embedded Linux
File systems for Embedded Linux
 
Introduction to Embedded Systems
Introduction to Embedded Systems Introduction to Embedded Systems
Introduction to Embedded Systems
 
Data Structures & Algorithm design using C
Data Structures & Algorithm design using C Data Structures & Algorithm design using C
Data Structures & Algorithm design using C
 
Embedded C - Optimization techniques
Embedded C - Optimization techniquesEmbedded C - Optimization techniques
Embedded C - Optimization techniques
 
Emertxe : Linux training portfolio
Emertxe : Linux training portfolioEmertxe : Linux training portfolio
Emertxe : Linux training portfolio
 
Interview preparation workshop
Interview preparation workshopInterview preparation workshop
Interview preparation workshop
 
BusyBox for Embedded Linux
BusyBox for Embedded LinuxBusyBox for Embedded Linux
BusyBox for Embedded Linux
 
Embedded Linux - Building toolchain
Embedded Linux - Building toolchainEmbedded Linux - Building toolchain
Embedded Linux - Building toolchain
 
Linux Internals - Part III
Linux Internals - Part IIILinux Internals - Part III
Linux Internals - Part III
 
Emertxe : Training portfolio
Emertxe : Training portfolioEmertxe : Training portfolio
Emertxe : Training portfolio
 
Resume Preparation - Workshop
Resume Preparation - WorkshopResume Preparation - Workshop
Resume Preparation - Workshop
 
A practical guide to buildroot
A practical guide to buildrootA practical guide to buildroot
A practical guide to buildroot
 
Getting started with BeagleBone Black - Embedded Linux
Getting started with BeagleBone Black - Embedded LinuxGetting started with BeagleBone Black - Embedded Linux
Getting started with BeagleBone Black - Embedded Linux
 
Linux programming - Getting self started
Linux programming - Getting self started Linux programming - Getting self started
Linux programming - Getting self started
 
Linux Internals - Interview essentials 4.0
Linux Internals - Interview essentials 4.0Linux Internals - Interview essentials 4.0
Linux Internals - Interview essentials 4.0
 
Embedded c
Embedded cEmbedded c
Embedded c
 
Linux Programming
Linux ProgrammingLinux Programming
Linux Programming
 

Similar to Embedded Android : System Development - Part II (Linux device drivers)

Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux DevelopersOpersys inc.
 
Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012
Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012
Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012DefCamp
 
Char Drivers And Debugging Techniques
Char Drivers And Debugging TechniquesChar Drivers And Debugging Techniques
Char Drivers And Debugging TechniquesYourHelper1
 
Automotive Grade Linux and systemd
Automotive Grade Linux and systemdAutomotive Grade Linux and systemd
Automotive Grade Linux and systemdAlison Chaiken
 
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Opersys inc.
 
Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Opersys inc.
 
Writing Character driver (loadable module) in linux
Writing Character driver (loadable module) in linuxWriting Character driver (loadable module) in linux
Writing Character driver (loadable module) in linuxRajKumar Rampelli
 
Introduction to char device driver
Introduction to char device driverIntroduction to char device driver
Introduction to char device driverVandana Salve
 
SELinux Kernel Internals and Architecture - FOSS.IN/2005
SELinux Kernel Internals and Architecture - FOSS.IN/2005SELinux Kernel Internals and Architecture - FOSS.IN/2005
SELinux Kernel Internals and Architecture - FOSS.IN/2005James Morris
 
Basis Linux (aan de hand van LPIC-1)
Basis Linux (aan de hand van LPIC-1)Basis Linux (aan de hand van LPIC-1)
Basis Linux (aan de hand van LPIC-1)Peter Martin
 
Lec 10-linux-review
Lec 10-linux-reviewLec 10-linux-review
Lec 10-linux-reviewabinaya m
 
Grub and dracut ii
Grub and dracut iiGrub and dracut ii
Grub and dracut iiplarsen67
 
Leveraging Android's Linux Heritage at AnDevCon IV
Leveraging Android's Linux Heritage at AnDevCon IVLeveraging Android's Linux Heritage at AnDevCon IV
Leveraging Android's Linux Heritage at AnDevCon IVOpersys inc.
 
Open CL For Speedup Workshop
Open CL For Speedup WorkshopOpen CL For Speedup Workshop
Open CL For Speedup WorkshopOfer Rosenberg
 

Similar to Embedded Android : System Development - Part II (Linux device drivers) (20)

Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux Developers
 
Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012
Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012
Hunting and Exploiting Bugs in Kernel Drivers - DefCamp 2012
 
Char Drivers And Debugging Techniques
Char Drivers And Debugging TechniquesChar Drivers And Debugging Techniques
Char Drivers And Debugging Techniques
 
Character drivers
Character driversCharacter drivers
Character drivers
 
Automotive Grade Linux and systemd
Automotive Grade Linux and systemdAutomotive Grade Linux and systemd
Automotive Grade Linux and systemd
 
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
 
Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013
 
Linux kernel modules
Linux kernel modulesLinux kernel modules
Linux kernel modules
 
Writing Character driver (loadable module) in linux
Writing Character driver (loadable module) in linuxWriting Character driver (loadable module) in linux
Writing Character driver (loadable module) in linux
 
Introduction to char device driver
Introduction to char device driverIntroduction to char device driver
Introduction to char device driver
 
SELinux Kernel Internals and Architecture - FOSS.IN/2005
SELinux Kernel Internals and Architecture - FOSS.IN/2005SELinux Kernel Internals and Architecture - FOSS.IN/2005
SELinux Kernel Internals and Architecture - FOSS.IN/2005
 
Driver_linux
Driver_linuxDriver_linux
Driver_linux
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
Basis Linux (aan de hand van LPIC-1)
Basis Linux (aan de hand van LPIC-1)Basis Linux (aan de hand van LPIC-1)
Basis Linux (aan de hand van LPIC-1)
 
An Introduction To Linux
An Introduction To LinuxAn Introduction To Linux
An Introduction To Linux
 
Lec 10-linux-review
Lec 10-linux-reviewLec 10-linux-review
Lec 10-linux-review
 
Understanding The Boot Process
Understanding The Boot ProcessUnderstanding The Boot Process
Understanding The Boot Process
 
Grub and dracut ii
Grub and dracut iiGrub and dracut ii
Grub and dracut ii
 
Leveraging Android's Linux Heritage at AnDevCon IV
Leveraging Android's Linux Heritage at AnDevCon IVLeveraging Android's Linux Heritage at AnDevCon IV
Leveraging Android's Linux Heritage at AnDevCon IV
 
Open CL For Speedup Workshop
Open CL For Speedup WorkshopOpen CL For Speedup Workshop
Open CL For Speedup Workshop
 

More from Emertxe Information Technologies Pvt Ltd

More from Emertxe Information Technologies Pvt Ltd (20)

premium post (1).pdf
premium post (1).pdfpremium post (1).pdf
premium post (1).pdf
 
Career Transition (1).pdf
Career Transition (1).pdfCareer Transition (1).pdf
Career Transition (1).pdf
 
10_isxdigit.pdf
10_isxdigit.pdf10_isxdigit.pdf
10_isxdigit.pdf
 
01_student_record.pdf
01_student_record.pdf01_student_record.pdf
01_student_record.pdf
 
02_swap.pdf
02_swap.pdf02_swap.pdf
02_swap.pdf
 
01_sizeof.pdf
01_sizeof.pdf01_sizeof.pdf
01_sizeof.pdf
 
07_product_matrix.pdf
07_product_matrix.pdf07_product_matrix.pdf
07_product_matrix.pdf
 
06_sort_names.pdf
06_sort_names.pdf06_sort_names.pdf
06_sort_names.pdf
 
05_fragments.pdf
05_fragments.pdf05_fragments.pdf
05_fragments.pdf
 
04_magic_square.pdf
04_magic_square.pdf04_magic_square.pdf
04_magic_square.pdf
 
03_endianess.pdf
03_endianess.pdf03_endianess.pdf
03_endianess.pdf
 
02_variance.pdf
02_variance.pdf02_variance.pdf
02_variance.pdf
 
01_memory_manager.pdf
01_memory_manager.pdf01_memory_manager.pdf
01_memory_manager.pdf
 
09_nrps.pdf
09_nrps.pdf09_nrps.pdf
09_nrps.pdf
 
11_pangram.pdf
11_pangram.pdf11_pangram.pdf
11_pangram.pdf
 
10_combinations.pdf
10_combinations.pdf10_combinations.pdf
10_combinations.pdf
 
08_squeeze.pdf
08_squeeze.pdf08_squeeze.pdf
08_squeeze.pdf
 
07_strtok.pdf
07_strtok.pdf07_strtok.pdf
07_strtok.pdf
 
06_reverserec.pdf
06_reverserec.pdf06_reverserec.pdf
06_reverserec.pdf
 
05_reverseiter.pdf
05_reverseiter.pdf05_reverseiter.pdf
05_reverseiter.pdf
 

Recently uploaded

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 

Recently uploaded (20)

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 

Embedded Android : System Development - Part II (Linux device drivers)

  • 1. Team Emertxe Linux Device Drivers An Introduction
  • 3. Familiarity Check ● Good C & Programming Skills ● Linux & the Filesytem – Root, User Space Headers & Libraries ● Files – Regular, Special, Device ● Toolchain – gcc & friends ● Make & Makefiles ● Kernel Sources (Location & Building)
  • 4. The Flow ● Introduction – Linux kernel Ecosystem – Kernel Souce Organization – Command set and Files – Writing the first driver (Module) ● Character Drivers – Device files – Device access from user space (End to End flow) – Registering the driver – File Operations and registration – Data transfer between User and Kernel space – ioctl ● Memory & Hardware ● Time & Timings ● USB Drivers ● Interrupt Handling ● Block Drivers ● PCI Drivers ● Debugging
  • 5. The Flow... ● Introduction – Linux kernel Ecosystem – Kernel Souce Organization – Command set and Files – Writing the first driver (Module) ● Character Drivers – Device files – Device access from user space (End to End flow) ● Memory & Hardware ● Time & Timings ● USB Drivers ● Interrupt Handling ● Block Drivers ● PCI Drivers ● Debugging
  • 6. Hands-On ● Your First Driver ● Character Drivers – Null Driver – Memory Driver – UART Driver for Customized Hardware ● USB Drivers – USB Device Hot-plug-ability – USB to Serial Hardware Driver ● Filesystem Modules – VFS Interfacing – “Pseudo” File System with Memory Files
  • 7. Linux Driver Ecosystem bash gvim X Server gcc firefox ` ` Process Management ssh Memory Management File Systems Device Control Networking Architecture Dependent Code Character Devices Memory Manager Filesystem Types Block Devices Network Subsystem IF Devices Concurrency MultiTasking Virtual Memory Files & Dirs: The VFS Ttys & Device Access Connectivity CPU Memory Disks & CDs Consoles, etc Network Interfaces
  • 8. Kernel Source Organization Kernel Source include net drivers block fs mm kernel arch char mtd/ide net pci ...usbserial asm-<arch>linux arm powerpc sparc x86 ...
  • 9. The Locations & Config Files ● Kernel Source Path: /usr/src/linux ● Std Modules Path: – /lib/modules/<kernel version>/kernel/... ● Module Configuration: /etc/modprobe.conf ● Kernel Windows: – /proc – /sys ● System Logs: /var/log/messages
  • 11. The Kernel's C ● ctor & dtor – init_module, cleanup_module ● printf – printk ● Libraries – <kernel src>/kernel ● Headers – <kernel src>/include
  • 12. The Init Code static int __init mfd_init(void) { printk(KERN_INFO "mfd registered"); ... return 0; } module_init(mfd_init);
  • 13. The Cleanup Code static void __exit mfd_exit(void) { printk(KERN_INFO "mfd deregistered"); ... } module_exit(mfd_exit);
  • 14. Usage of printk ● <linux/kernel.h> ● Constant String for Log Level – KERN_EMERG "<0>" /* system is unusable */ – KERN_ALERT "<1>" /* action must be taken immediately */ – KERN_CRIT "<2>" /* critical conditions */ – KERN_ERR "<3>" /* error conditions */ – KERN_WARNING "<4>" /* warning conditions */ – KERN_NOTICE "<5>" /* normal but significant condition */ – KERN_INFO "<6>" /* informational */ – KERN_DEBUG "<7>" /* debug-level messages */ ● printf like arguments
  • 15. The Other Basics & Ornaments ● Headers – #include <linux/module.h> – #include <linux/version.h> – #include <linux/kernel.h> ● MODULE_LICENSE("GPL"); ● MODULE_AUTHOR("Emertxe"); ● MODULE_DESCRIPTION("First Device Driver");
  • 16. Building the Module ● Our driver needs – The Kernel Headers for Prototypes – The Kernel Functions for Functionality – The Kernel Build System & the Makefile for Building ● Two options – Building under Kernel Source Tree ● Put our driver under drivers folder ● Edit Kconfig(s) & Makefile to include our driver – Create our own Makefile to do the right invocation
  • 17. Our Makefile ifneq (${KERNELRELEASE},) obj-m += <module>.o else KERNEL_SOURCE := <kernel source directory path> PWD := $(shell pwd) default: $(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) modules clean: $(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) clean endif
  • 18. Try Out your First Driver
  • 20. Major & Minor Number ● ls -l /dev ● Major is to Driver; Minor is to Device ● <linux/types.h> (>= 2.6.0) – dev_t: 12 & 20 bits for major & minor ● <linux/kdev_t.h> – MAJOR(dev_t dev) – MINOR(dev_t dev) – MKDEV(int major, int minor)
  • 21. Registering & Unregistering ● Registering the Device Driver – int register_chrdev_region(dev_t first, unsigned int count, char *name); – int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int cnt, char *name); ● Unregistering the Device Driver – void unregister_chrdev_region(dev_t first, unsigned int count); ● Header: <linux/fs.h>
  • 22. The file operations ● #include <linux/fs.h> ● struct file_operations – int (*open)(struct inode *, struct file *); – int (*release)(struct inode *, struct file *); – ssize_t (*read)(struct file *, char __user *, size_t, loff_t *); – ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *); – struct module owner = THIS_MODULE; / linux/module.h> */ – loff_t (*llseek)(struct file *, loff_t, int); – int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long);
  • 23. User level I/O ● int open(const char *path, int oflag, ... ) ● int close(int fd); ● ssize_t write(int fd, const void *buf, size_t nbyte) ● ssize_t read(int fd, void *buf, size_t nbyte) ● int ioctl(int d, int request, ...) – The ioctl() function manipulates the underlying device parameters of special files. – The argument d must be an open file descriptor. – The second argument is a device-dependent request code.
  • 24. The file & inode structures ● struct file – mode_t f_mode – loff_t f_pos – unsigned int f_flags – struct file_operations *f_op – void * private_data ● struct inode – unsigned int iminor(struct inode *); – unsigned int imajor(struct inode *);
  • 25. Registering the file operations ● #include <linux/cdev.h> ● 1st way initialization: – struct cdev *my_cdev = cdev_alloc(); – my_cdev->owner = THIS_MODULE; – my_cdev->ops = &my_fops; ● 2nd way initialization: – struct cdev my_cdev; – cdev_init(&my_cdev, &my_fops); – my_cdev.owner = THIS_MODULE; – my_cdev.ops = &my_fops;
  • 26. Registering the file operations... ● The Registration – int cdev_add(struct cdev *cdev, dev_t num, unsigned int count); ● The Unregistration – void cdev_del(struct cdev *cdev);
  • 27. Registering/Unregistering Old Way ● Registering the Device Driver – int register_chrdev(undigned int major, const char *name, struct file_operations *fops); ● Unregistering the Device Driver – int unregister_chrdev(undigned int major, const char *name);
  • 28. The read flow struct file ------------------------- f_count f_flags f_mode ------------------------- f_pos ------------------------- ... ... ssize_t my_read(struct file *f, char __user *buf, size_t cnt, loff_t *off) Buffer (in the driver) Buffer (in the application or libc) Kernel Space (Non-swappable) User Space (Swappable) copy_to_user
  • 29. The /dev/null read & write ssize_t my_read(struct file *f, char __user *buf, size_t cnt, loff_t *off) { ... return read_cnt; } ssize_t my_write(struct file *f, char __user *buf, size_t cnt, loff_t *off) { ... return wrote_cnt; }
  • 30. The mem device read ssize_t my_read(struct file *f, char __user *buf, size_t cnt, loff_t *off) { ... if (copy_to_user(buf, from, cnt) != 0) { return -EFAULT; } ... return read_cnt; }
  • 31. The mem device write ssize_t my_write(struct file *f, char __user *buf, size_t cnt, loff_t *off) { ... if (copy_from_user(to, buf, cnt) != 0) { return -EFAULT; } ... return wrote_cnt; }
  • 32. Dynamic Device Node & Classes ● Class Operations – struct class *class_create(struct module *owner, char *name); – void class_destroy(struct class *cl); ● Device into & Out of Class – struct class_device *device_create(struct class *cl, NULL, dev_t devnum, NULL, const char *fmt, ...); – void device_destroy(struct class *cl, dev_t devnum);
  • 33. The I/O Control API ● int (*ioctl)(struct inode *, struct file *, unsigned int cmd, unsigned long arg) ● int (*unlocked_ioctl)(struct file *, unsigned int cmd, unsigned long arg) ● Command – <linux/ioctl.h> -> ... -> <asm-generic/ioctl.h> – Macros ● _IO, _IOR, _IOW, _IOWR – Parameters ● type (Magic character) [15:8] ● number (index) [7:0] ● size (param type) [29:16]
  • 34. The I/O Control API ● Macro Usage _IO(type, index) [_IOR | _IOW | _IOWR](type, index, datatype/size)
  • 35. Module Parameters ● <linux/moduleparam.h> – Macros ● module_param(name, type, perm) ● module_param_array(name, type, num, perm) ● Perm (is a bitmask) – 0 – S_IRUGO – S_IWUSR | S_IRUGO – Loading ● insmod driver.ko name=10
  • 38. Physical Vs Virtual Memory ● The kernel Organizes Physical memory in to pages – Page size Depends on Arch ● X86-based 4096 bytes ● On 32-bit X86 system Kernel total Virtual address space – Total 4GB (pointer size) – Kernel Configuration Splits 4GB in to ● 3BG Virtual Sp for US ● 1GB Virtual Sp for Kernel – 128MB KDS – Virtual Address also called “Logical Address”
  • 39. Memory Access from Kernel Space ● Virtual Address on Physical Address – #include <linux/gfp.h> ● unsigned long __get_free_pages(flags, order); etc ● void free_pages(addr, order); etc – #include <linux/slab.h> ● void *kmalloc(size_t size, gfp_t flags); – GFP_ATOMIC, GFP_KERNEL, GFP_DMA ● void kfree(void *obj); – #include <linux/vmalloc.h> ● void *vmalloc(unsigned long size); ● void vfree(void *addr);
  • 40. Memory Access from Kernel Space... ● Virtual Address for Bus/IO Address – #include <asm/io.h> ● void *ioremap(unsigned long offset, unsigned long size); ● void iounmap(void *addr); ● I/O Memory Access – #include <asm/io.h> ● unsigned int ioread[8|16|32](void *addr); ● unsigned int iowrite[8|16|32](u[8|16|32] value, void *addr); ● Barriers – #include <linux/kernel.h>: void barrier(void); – #include <asm/system.h>: void [r|w|]mb(void);
  • 42. I/O Accesses from Kernel Space ● I/O Port Access – #include <asm/io.h> ● unsigned in[b|w|l](unsigned port); ● void out[b|w|l](unsigned [char|short|int] value, unsigned port);