EmbisysLabs, a leading Linux Kernel Device Drivers training institute in Bangalore, offers comprehensive courses in Linux Kernel Programming and related technologies. Our curriculum covers Character driver, Block driver, USB host & Gadget driver, PCI driver, Network driver, I2C driver, SPI drivers, Device Tree,Platform device driver, Linux Internals, Kernel Porting, Embedded Linux, Embedded Firmware, RTOS, as well as ARM courses including ARM7, ARM9, Beaglebone, and Raspberry Pi.These courses are designed for freshers and working professionals, with flexible schedules available on both weekdays and weekends in Bangalore, India, enabling learners to gain hands-on, industry-ready skills in embedded systems and Linux kernel development.
CH1: AN INTRO. TO DEVICE DRIVERS
Understanding what device drivers areImportance of drivers in hardware-software interaction
Functions of device drivers: initialization, control, data transfer
Overview of kernel subsystems
Interaction of drivers with kernel modules
Device-Specific Part – hardware communication and protocols
OS-Specific Part – system integration and application interface
Understanding kernel layers and their role in driver development
Overview of kernel models (monolithic, microkernel)
CH2: BUILDING AND RUNNING MODULES
Types of Modules in the kernelWriting Your first kernel module
Module Related Commands
Kernel Module vs Applications
Compiling Modules
Loading and Unloading Modules
Module Parameters
Modules and Exporting Symbols
Hands-On Assignments
Lab1: Write a module for Simple Hello Linux Kernel ModuleLab2: Write a module that can take an integer parameter when it is loaded, It should have a default value when none is specified
Lab3: Write a pair of modules where the second one calls a function in the first one
Lab4: Write a module to pass value during module insertion(command line argument)
Lab5: write a module to check insmod and rmmod not only command, it is Process
CH3: CHARACTER DEVICE DRIVER and ITS IMPLEMENTATION
Allocating and Registering a Character DeviceConcept behind Major and Minor Number
The Internal Representation of Device Numbers
Allocating and Freeing Device Numbers
Exchanging data between user space and kernel space
File Operations Data structure
Driver methods and Function Pointers
Filling the file operations structure
The Cdev Structure, inode Structure, file Structure
Manual Creation of Device Files using mknod()
Automatic Creation of Device Files using devive and class create
Hands-On Assignments
Lab1: Print the major and minor numbers when Registering by Static or Dynamic method.Lab2: Implement a open,write,read and close entry point.
Lab3: Print the major and minor numbers when the device is Opened and keep track of the number of times it has been opened since loading, and print out the counter every time the device is opened.
Lab4: Modify the previous driver so that each opening of the device allocates its own data area, which is freed upon release. Thus data will not be persistent across multiple opens.
Lab5 : Implement a lseek entry point and Keeping track of file position.
Lab6: Dynamical Node Creation,Adapt the previous dynamic registration driver to use udev to create the device node on the fly.
CH4: KERNEL MEMORY ALLOCATION TECHNIQUE
System Memory Layout - Kernel space and User spaceConcept of LOW and HIGH Memory
Kmalloc family allocator
The Flags Argument
Memory zones
vmalloc and Friends
Memory caches
Hands-On Assignments
Lab1:Testing Maximum Memory Allocation ,using kmalloc()Lab2:Testing Maximum Memory Allocation ,using __get_free_pages().
Lab3: Testing Memory Allocation,using vmalloc().
Lab4 :Memory cachesExtend your chararcter driver to allocate the driver's internal buffer by using your own memory cache.Make sure you free any slabs you create.
CH5: ADVANCED CHARACTER DRIVER OPERATIONS
Inpout/Output Control Device (ioctl)User space, the ioctl system call
The ioctl driver method
Generating ioctl command
Choosing the ioctl Commands
Using the ioctl Argument
Hands-On Assignments
Lab1 : Implement a ioctl entry point along with read and write entry point.Lab2 : Implement read and write entry point using ioctl command.
Lab3 : Write a character driver that has three ioctl commands: a)Set the process ID to which signals should be sent. b)Set the signal which should be sent. c)Send the signal.
CH6: KERNEL LOCKING MECHANISM CONCURRENCY AND RACE CONDITION
Concurrency and its ManagementsSemaphores versus Mutexes
Spinlock versus Mutexes
Linux Semaphore Implementation
Introduction to the Semaphore API
Spinlocks Implementation
Introduction to the Spinlock API
Spinlocks and Atomic Context
Hands-On Assignments
Lab1: Mutex Contention -Write three simple modules where the second and third one use a variable exported from the first one.The second (third) module should attempt to lock the mutex and if it is locked, either fail to load or hang until the mutex is available. Lab2: Sempahore Contention -Now do the same thing using semaphores .CH7: INTERRUPT AND INTERRUPT HANDLING
The Definition and Role of InterruptInstalling an Interrupt Handler
The /proc Interface
Implementing a Handler
Handler Arguments and Return Value
Installing a Shared Handler
Hands-On Assignments
Lab1: Write a module that shares its IRQ with your network card. You can generate some network interrupts either by browsing or pinging.Lab2: Extend the previous solution to construct a character driver that shares every possible interrupt with already installed handlers.
Lab3: Mutex Unlocking from an Interrupt. Modify the simple interrupt sharing lab to have a mutex taken out and then released in the interrupt handler.
CH8: TIME, DELAY AND DEFERRED WORK
Top and Bottom HalvesTasklets and Workqueues Mechanisms
Measuring Time Lapses
Using the jiffies Counter
The Timer API
Hands-On Assignments
Lab1: Program based on Kernel Timer APILab2: Program based on Jiffies and HZ
Lab3: Program based on Taklet API
Lab4: Program based on Workqueue API
Lab5: Write a driver that puts launches a kernel timer whenever a write to the device takes place. Pass some data to the driver and have it print out. Have it print out the current->pid field when the timer function is scheduled, and then again when the function is executed.
Lab6: Write a module that launches a periodic kernel timer function; i.e., it should re-install itself.
CH9: UNDERSTANDING USB DEVICE DRIVER
USB device and USB Host Controller OverviewDecoding a USB device section
USB Device detection in Linux kernel
USB Device Basics and usb_device structure
USB Configuration,Interfaces and Endpoint structure
USB Driver types - USB Host and Gadget Driver
Defferents types of data transfers mechanism
USB Driver registration with USB core
Creating usb device node in /Dev using Char Driver
Hands-On Assignments
Lab1:Installing a and writing a simple USB device driver.The driver should register itself with the USB subsystem upon loading and unregister upon unloading.Lab2: Write a USB device driver to print out information about configuration , interfaces and endpoint for a registered usb device.
CH10: USB GADGET DEVICE DRIVER ON BEAGLEBONE
Linux USB Gadget & Host DriversUSB Gadget Driver Mechanism
USB Host Driver Mechanism
USB Core & Hot Plug n Play
USB Gadget Transfer Functions
Integration with a Vertical
Types of USB Device Drivers
Register a composite driver
Structure of usb_composite_driver
Structure of struct usb_function
Hands-On Assignment
Lab1:Beaglebone Black as standard USB Gadget DevicesLab2:First take at a USB Gadget Driver
Lab3:Getting down to the hardware of BBB
Lab4:Creating Interface for USB Gadget Driver
Lab5:Creating Endpoint for USB Gadget Driver
Lab6:LoopBack USB Gadget Device Driver
Lab7:Creating Multiple Interface for USB Gadget Driver
Lab8:Controlling using custom USB Host Driver & App
Lab9:Controlling BBB GPIO LED through USB Drivers
CH11: PCI DEVICE DRIVER AND ITS ROLE
Understanding the x86 processor bus: PCIPCI Core & Programming the PCI
Finding & Interacting with a PCI Device
PCI Bus, Device and Function numbers
Registering & Finding a PCI device
Mapping & Accessing the PCI device regions
Accessing the Configuration Space
Accessing the I/O and Memory Regions
Enabling the PCI Device
Hands-On Assignments
Lab1:Registering the driver with the PCI subsystem.Lab2: Write a module that scans your PCI devices, and gathers information about them.For each found device, read some information from its configuration register.Fields you may wish to obtain could include: PCI_VENDOR_ID, PCI_DEVICE_ID, PCI_REVISION_ID,PCI_INTERRUPT_LINE, PCI_LATENCY_TIMER,PCI_COMMAND.
Lab3: Write a Character based PCI driver to find Information about IRQ Line,Memory region,I/O region,configuration region,prefetchable and non-prefetchable region in BAR.
CH12: MEMORY MAPPING AND DMA
What memory is DMA'ableDMA addressing limitations
Types of DMA mappings
DMA Direction
Hands-On Assignments
Lab1: Write a module that allocates and maps a suitable DMA buffer, and obtains the bus address handle. Do this in three ways: (a)Using dma_alloc_coherent(), (b)Using dma_map_single(), (c)Using a DMA Pool.CH13: BASIC NETWORK DEVICE DRIVER
Registering the Network DriverBuffer Management with skbuffs
Packet Transmission & Reception
Reception using interrupt and poll
Start the network interface’s transmit Queue
Other network operations including statistics
Hands-On Assignments
Lab1: Building a Transmitting Network Driver, Module to include a transmission function.Lab2: Adding Reception, Extend your transmitting device driver to include a reception function
CH14: ADVANVED NETWORK DEVICE DRIVER
Registering with the Linux low level bus interface subsystemAllocating interface descriptor block (net_device)
Device specific structure and initializing media specific fields
Getting device specific structure object pointer
Enabling Network interface card
Getting the Device resources (MMIO and PMIO)
Getting device MAC address
Initialization of device methods in the net_device
Registering net_device object with the kernel
Registering the interrupt handler (ISR)
Allocating Rxring and Txring
Initializing the hardware (network interface card)
Hands-On Assignments
Lab3: Writing the PCI based Network Driver for NIC(Network Interface Card). Programming the Network Device Registers, Implementing the Transmission & Reception with the actual device(NIC) and Setting up the network across computers.CH15: UNDERSTANDING I2C DEVICE DRIVER AND I2C SUBSYSTEM IN LINUX
Overview of I2C protocolwhat is Platform Device and platform Driver
What is use of Platform device & Driver in I2C project Development
Understanding the Linux I2C Framework
Understanding I2C and Character driver fromework
Understanding the I2C Adapter and Algorithm
Understanding the Client Device Driver
What is Device tree Source and Binary
Understanding and Decoding I2C Registers in AM335x SOC (Beaglebone Black)
Hands-On Assignments
Lab1:Development of Platform Device and DriverLab2:Creating I2C node with I2C base Addrees in Device Tree
Lab3:Creating master and Client node in Device Tree
Lab4:Development of I2C and Character driver framework
Lab5:Setting and porting platform specific embedded linux on BBB
Lab6:Writing low level I2C driver
Lab7:Writing I2C Adapter and Client driver
Lab8:Interfacing with I2C Master with Client
Lab9.Development of I2C Driver with help of Platform device driver
CH16: UNDERSTANDING SPI DEVICE DRIVER AND SPI SUBSYSTEM IN LINUX
Overview of SPI protocolwhat is Platform Device and platform Driver
What is use of Platform device & Driver in SPI project Development
Understanding the Linux SPI Framework
Understanding SPI and Character driver framework
Understanding the SPI Adapter and Algorithm
Understanding the Client Device Driver
What is Device tree Source and Binary
Understanding and Decoding SPI Registers in AM335x SOC (Beaglebone Black)
Hands-On Assignment on Embedded Board
Lab1:Development of Platform Device and DriverLab2:Creating SPI node with SPI base Addrees in Device Tree
Lab3:Creating master and Client node in Device Tree
Lab4:Development of SPI and Character driver framework
Lab5:Setting and porting platform specific embedded linux on BBB
Lab6:Writing low level SPI driver
Lab7:Writing SPI Adapter and Client driver
Lab8:Interfacing SPI Master with Client
Lab9.Development of SPI Driver with help of Platform device driver
Why Training in Embisyslabs
Flexible and Convenient time Slots for Classes.Experience and co-operative Trainers
Maximum 6 to 8 Participants in one Batch.
Indivisual Attention to each Participant.
High Quality practical/application Oriented Training.
Repeatation classes will be conducted as required.
Training and Practicals Process
Classes 5-Days a week for Weekdays BatchTheory(1 1⁄2 -2 hrs.) and practical (2hrs.)
OR
Classes 2-Days for a Weekend Batch(Sat & Sun)
Theory(2 1⁄2 -3 hrs) and practical (3hrs.)
✅ Who Can Learn Embedded C Programming?
-
Engineers working in embedded systems, firmware, IoT, or hardware development.
-
Looking to upskill or switch to embedded roles.
-
Anyone interested in Cortex-A Series Processor, Raspberry Pi, robotics, or Emmbedded Linux.
-
Those building automation, sensor-based, or smart device projects.
-
Software developers (e.g., Python, Java, C++) wanting to transition into Embedded Linux Driver development.
-
People from testing, automation, or electronics hardware backgrounds.
-
Involved in Embedded Linux research, IOT, or real-time systems.
-
Writing firmware or custom embedded linux solutions.
-
Familiarity with digital electronics and microcontroller basics.
-
Understanding of number systems (binary, hexadecimal) and logic gates is helpful.
1. Working Professionals.
2. Hobbyists and Makers.
3. Career Changers
4. Researchers & Postgraduate Students.
✅ Pre-requisites (Recommended)
Familiarity with C Programming and Linux Sysytem Programming.
- CH1: AN INTRO. TO DEVICE DRIVERS
- CH2: BUILDING AND RUNNING MODULES
- CH3: CHARACTER DEVICE DRIVER and ITS IMPLEMENTATION
- CH4: KERNEL MEMORY ALLOCATION TECHNIQUE
- CH5: ADVANCED CHARACTER DRIVER OPERATIONS
- CH6: KERNEL LOCKING MECHANISM CONCURRENCY AND RACE CONDITION
- CH7: INTERRUPT AND INTERRUPT HANDLING
- CH8: TIME, DELAY AND DEFERRED WORK
- CH9: UNDERSTANDING USB DEVICE DRIVER
- CH10: USB GADGET DEVICE DRIVER ON BEAGLEBONE
- CH11: PCI DEVICE DRIVER AND ITS ROLE
- CH12: MEMORY MAPPING AND DMA
- CH13: BASIC NETWORK DEVICE DRIVER
- CH14: ADVANVED NETWORK DEVICE DRIVER
- CH15: UNDERSTANDING I2C DEVICE DRIVER AND I2C SUBSYSTEM IN LINUX
- CH16: UNDERSTANDING SPI DEVICE DRIVER AND SPI SUBSYSTEM IN LINUX