Device tree
History of Device Tree (DT)
● Sun Microsystems - Open Boot / Open Firmware (1988)
● Used in SPARC systems ○ Uses DT to describe hardware
● IEEE-1275 formalized specification (1994) ○ Documents DT
● Apple adopts Open Firmware on Power Mac 7200 (1995) using DT
● Common Hardware Reference Platform (CHRP) specifies DT
(1995) ● ePAPR specifies DT (2008)
DT in the Linux kernel
● SPARC
○ All systems pass DT so it’s supported for a long time in the kernel
● PowerPC
○ PowerMacs also drove support of DT in the kernel
○ Major reorg in 2005 merging 32-bit/64-bit required all platforms
to use DT
● x86
○ Yes, really. CE4100 Falconfalls uses DT
● ARM
○ Linus’ ultimatum to ARM community
○ All new platforms must use DT to describe hardware
Architechture
ePAPR defines DT
■ a concept called a device tree to describe system
hardware.
■ A device tree is a tree data structure with nodes that
decribe the physical devices in a system.
■ device tree describes device information in the
system that cannot be dynamically detected by a
client.
Device Tree Basics
● Nodes
○ Groupings of properties and child nodes
● Properties
○ Key-Value Pairs
■ Text strings “my string”
■ Cells (32-bit) <0xdeadbeef 11 0xf00d>
■ Binary data [0x01 0x02 0x03 0x04]
■ mixed data, concatenate with a comma
● “my string”, <0xdeadbeef>, [0x04], “your string”
● Phandles
○ Reference to another node
Managing Device Tree Source (DTS)
● DTS files found in arch/foo/boot/dts/ on ARM, MIPS, PowerPC, and
MicroBlaze
● A DTS file is compiled into a Device Tree Blob (DTB)
○ The resulting DTB is passed to the kernel at boot
○ All devices are created using the contents of the DTB.
● DTS files may include other files
Managing Device Tree Source (DTS)
● DTS files found in arch/foo/boot/dts/ on ARM, MIPS,
PowerPC, and MicroBlaze
● A DTS file is compiled into a Device Tree Blob (DTB)
○ The resulting DTB is passed to the kernel at boot
○ All devices are created using the contents of the DTB.
● DTS files may include other files
BeagleBone
White/Black
DTS/DTSI
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
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’
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)
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)
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’
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