+ All Categories
Home > Documents > Linux Device Drivers

Linux Device Drivers

Date post: 07-Feb-2016
Category:
Upload: sydney
View: 47 times
Download: 0 times
Share this document with a friend
Description:
Linux Device Drivers. Inroduction. What’s a ‘device-driver’?. A special kind of computer program Intended to control a peripheral device Needs to execute ‘privileged’ instructions Must be integrated into the OS kernel Interfaces both to kernel and to hardware - PowerPoint PPT Presentation
Popular Tags:
24
Linux Device Drivers Inroduction
Transcript
Page 1: Linux Device Drivers

Linux Device Drivers

Inroduction

Page 2: Linux Device Drivers

What’s a ‘device-driver’?

• A special kind of computer program

• Intended to control a peripheral device

• Needs to execute ‘privileged’ instructions

• Must be integrated into the OS kernel

• Interfaces both to kernel and to hardware

• Program-format specific to a particular OS

Page 3: Linux Device Drivers

Linux device-drivers

• A package mainly of ‘service functions’

• The package is conceptually an ‘object’

• But in C this means it’s a ‘struct’

• Specifically: struct file_operations { …; };

• Definition is found in a kernel-header:

‘/usr/src/linux/include/linux/fs.h’

Page 4: Linux Device Drivers

Types of Device-Drivers

• Character drivers:

- the device processes individual bytes

(e.g., keyboard, printer, modem)

• Block drivers:

- the device processes groups of bytes

(e.g., hard disks, CD-ROM drives)

Page 5: Linux Device Drivers

Linux has other driver-types

• Network drivers

• Mouse drivers

• SCSI drivers

• USB drivers

• Video drivers

• ‘Hot-swap’ drivers

• … and others

Page 6: Linux Device Drivers

Linux treats devices as files

• Programmers accustomed to the file API

open(), seek(), read(), write(), close(), ...

• Requires creating a filename in a directory

(special ‘/dev’ directory is for devices)

Page 7: Linux Device Drivers

Driver Identification

• Character/Block drivers: • Use ‘major-number’ to identify the driver• Use ‘minor-numbers’ to distinguish among several devices the same driver controls• Kernel also needs a driver-name• Users need a device-node as ‘interface’

Page 8: Linux Device Drivers

Developing a device-driver

• Clarify your requirements

• Devise a design to achieve them

• Test your design-concept (‘prototype’)

• ‘Debug’ your prototype (as needed)

• Build your final driver in iteratively

• Document your work for future use

Page 9: Linux Device Drivers

‘Open Source’ Hardware

• Some equipment manufactures regard their designs as ‘intellectual property’

• They don’t want to ‘give away’ their info

• They believe ‘secrecy’ is an advantage

• They fear others might copy their designs

• BUT: This hinders systems programmers!

Page 10: Linux Device Drivers

Non-Disclosure Agreements

• Sometimes manufacturers will let ‘trusted’

individuals, or commercial ‘partners’, look

at their design-specs and manuals.

• College professors usually are ‘trusted’

• BUT: Just to be sure, an NDA is required

-- which prevents professors from teaching

students the design-details that they learn.

Page 11: Linux Device Drivers

Advantage of ‘open’ designs

• Microsoft and Apple used to provide lots

of technical information to programmers.

• They wanted to encourage innovations

that made their products more valuable.

• Imagine hundreds of unpaid ‘volunteers’

creating applications for your system!

• BUT: Were they ‘giving away the store’?

Page 12: Linux Device Drivers

Some designs are ‘open’

• The IBM-PC designs were published

• Other companies copied them

• And those companies prospered!

• While IBM lost market-share!

• An unfortunate ‘lesson’ was learned

Page 13: Linux Device Drivers

Standard PC/AT Keyboard

Controlling the three LEDs

Page 14: Linux Device Drivers

References on PC keyboard

• Hans-Peter Messmer, “The Indispensable PC Hardware Book (Third Edition)”, Addison-Wesley (1997), pp. 1007-1030.

• Frank van Gilluwe, “The Undocumented PC (Second Edition)”, Addison-Wesley (1997), pp. 309-390.

Page 15: Linux Device Drivers

8042 Keyboard Controller

• Programming Interface (4 registers):control register (0x64, write-only)

status register (0x64, read-only)

input buffer register (0x60, write-only)

output buffer register (0x60, read-only)

• Device Interface (2 registers + 2 signals):input port register timing signals

output port register interrupt signals

Page 16: Linux Device Drivers

Keyboard Controller’s Status

• Eight individual status-bits (read-only)

• Visible to cpu by using: ‘inb( 0x64 );bit #0: output-buffer full

bit #1: input-buffer full

• Other bits are unimportant for LEDs

Page 17: Linux Device Drivers

Two-Step Sequence

• Step 1: Send command-byte

• Step 2: Send parameter-byte

• If this sequence were to interrupted, then another process might try to send a byte,

causing hardware to perform wrong action!

Page 18: Linux Device Drivers

“Critical Section”

• Code-fragment whose correct functioning depends on it not being interrupted

• Subject to “race conditions” if exclusive access to resourses isn’t assured

Page 19: Linux Device Drivers

On Uniprocessor Systems

• Disable interrupts during “critical section”:

cli(); // do not recognize interrupts

/* critical code-fragment goes here */

sti(); // ok to recognize interrupts

Page 20: Linux Device Drivers

Algorithm for setting LEDs

• Block interrupts (Enter “Critical Section”)

• Wait till controller’s input-buffer empties

• Output the ‘write_LED’ command-byte

• Wait till controller’s input-buffer empties

• Output the LED indicator-byte

• Wait till controller’s input-buffer empties

• Allow interrupts (Leave “Critical Section”)

Page 21: Linux Device Drivers

On Multiprocessor Systems

• Not enough to block interrupts on one cpu

• Must also insure other cpus can’t interfere

Page 22: Linux Device Drivers

Module ‘Boilerplate’

• Must have ‘init_module()’ function

(to ‘register’ service-functions with kernel)

• Must have ‘cleanup_module()’ function

(to ‘unregister’ your service-functions)

Page 23: Linux Device Drivers

More ‘boilerplate’

• Must include certain kernel header-files

(e.g., #include <linux/module.h>)

• Must define certain constants

(e.g., #define __KERNEL__, MODULE)

Page 24: Linux Device Drivers

Rapid Prototyping

• We will be writing lots of modules

• We can ‘automate’ the boilerplate

• We should write a ‘wizard’ program

• It will save us LOTS of time!


Recommended