編輯推薦
《Linux驅動程序開發實例》深入講解瞭Linux設備驅動程序開發,內容包括Linux驅動程序基礎、內核移植、I2C驅動程序、LCD驅動程序、網絡驅動程序、USB驅動程序、輸入子係統驅動程序、塊設備驅動程序等。《Linux驅動程序開發實例》提供瞭豐富的實例代碼和詳細的注釋,並附贈代碼光盤一張。
基於ARM體係結構
全麵剖析Linux驅動程序開發的精髓
涵蓋多種硬件接口驅動程序
附贈內核代碼與實例源代碼
內容簡介
《Linux驅動程序開發實例》專門介紹Linux設備驅動程序開發,涵蓋瞭Linux驅動程序基礎、內核移植、I2C驅動程序、LCD驅動程序、網絡驅動程序、USB驅動程序、輸入子係統驅動程序、塊設備驅動程序等內容。《Linux驅動程序開發實例》以實例為主綫,是為Linux設備驅動程序開發人員量身打造的精品學習圖書和實戰指南。《Linux驅動程序開發實例》提供瞭豐富的實例代碼和詳細的注釋,並附贈完整代碼光盤一張。
《Linux驅動程序開發實例》主要麵嚮各層次的嵌入式Linux開發工程師,也可以作為各類嵌入式係統培訓機構的培訓教材和高校計算機課程的教輔書籍。
內頁插圖
目錄
齣版說明
前言
第1章 Linux設備驅動程序模型1
1.1 設備驅動程序基礎1
1.1.1 驅動程序的概念1
1.1.2 驅動程序的加載方式2
1.1.3 編寫可加載模塊3
1.1.4 帶參數的可加載模塊5
1.1.5 設備驅動程序的分類6
1.2 字符設備驅動程序原理7
1.2.1 file_operations結構7
1.2.2 使用register_chrdev注冊字符設備9
1.2.3 使用cdev_add注冊字符設備11
1.2.4 字符設備的讀寫13
1.2.5 ioctl接口14
1.2.6 seek接口16
1.2.7 poll接口18
1.2.8 異步通知22
1.3 proc文件係統24
1.3.1 proc文件係統概述24
1.3.2 seq_file機製25
1.3.3 使用proc文件係統27
1.4 塊設備驅動程序32
1.4.1 Linux塊設備驅動程序原理32
1.4.2 簡單的塊設備驅動程序實例35
1.5 網絡設備驅動程序39
1.5.1 網絡設備的特殊性39
1.5.2 sk_buff結構40
1.5.3 Linux網絡設備驅動程序架構42
1.5.4 虛擬網絡設備驅動程序實例46
1.6 Linux 2.6設備管理機製50
1.6.1 kobject和kset50
1.6.2 sysfs文件係統51
1.6.3 設備模型層次52
1.6.4 platform的概念54
第2章 Linux內核同步機製58
2.1 鎖機製58
2.1.1 自鏇鎖58
2.1.2 讀寫鎖60
2.1.3 RCU61
2.2 互斥64
2.2.1 原子操作64
2.2.2 信號量65
2.2.3 讀寫信號量67
2.3 等待隊列68
2.3.1 等待隊列原理68
2.3.2 阻塞式I/O實例68
2.3.3 完成事件70
2.4 關閉中斷71
第3章 內存管理與鏈錶72
3.1 物理地址和虛擬地址72
3.2 內存分配與釋放72
3.3 IO端口到虛擬地址的映射73
3.3.1 靜態映射73
3.3.2 動態映射75
3.4 內核空間到用戶空間的映射76
3.4.1 內核空間到用戶空間的地址映射原理76
3.4.2 mmap地址映射實例78
3.5 內核鏈錶80
3.5.1 Linux內核中的鏈錶80
3.5.2 內核鏈錶實例81
第4章 延遲處理83
4.1 內核綫程83
4.2 軟中斷機製85
4.2.1 軟中斷原理85
4.2.2 tasklet87
4.3 工作隊列89
4.3.1 工作隊列原理89
4.3.2 工作隊列實例91
4.4 內核時間92
4.4.1 Linux中的時間概念92
4.4.2 Linux中的延遲93
4.4.3 內核定時器93
第5章 簡單設備驅動程序96
5.1 寄存器訪問96
5.1.1 S3C6410地址映射96
5.1.2 S3C6410看門狗驅動程序實例98
5.1.3 S3C6410蜂鳴器驅動程序實例102
5.2 電平控製107
5.2.1 S3C6410 LED驅動程序實例107
5.2.2 掃描型S3C6410按鍵驅動程序實例109
5.3 時序産生112
5.3.1 時序圖原理112
5.3.2 AT24C02芯片原理112
5.3.3 AT24C02驅動程序開發實例115
5.4 硬中斷處理123
5.4.1 硬中斷處理原理123
5.4.2 中斷型S3C6410按鍵驅動程序實例127
5.5 Linux I/O端口控製132
5.5.1 Linux I/O端口讀寫132
5.5.2 在應用層訪問Linux I/O端口133
5.5.3 /dev/port設備134
第6章 深入Linux內核135
6.1 嵌入式Linux係統構成135
6.2 Linux內核導讀136
6.2.1 Linux內核組成136
6.2.2 Linux的代碼結構137
6.2.3 內核Makefile138
6.2.4 S3C6410硬件初始化139
6.3 Linux文件係統141
6.3.1 虛擬文件係統141
6.3.2 根文件係統143
6.3.3 文件係統加載143
6.3.4 ext3文件係統145
6.4 Flash文件係統145
6.4.1 MTD設備145
6.4.2 MTD字符設備148
6.4.3 MTD塊設備150
6.4.4 cramfs文件係統153
6.4.5 JFFS2文件係統153
6.4.6 YAFFS文件係統155
6.4.7 文件係統總結156
6.5 Linux內核移植156
6.5.1 體係配置156
6.5.2 添加yaffs2157
6.5.3 Nand flash驅動程序移植157
6.5.4 配置啓動參數159
6.5.5 移植RTC驅動程序160
6.6 根文件係統製作162
6.6.1 Busybox162
6.6.2 shell基礎165
6.6.3 根文件係統構建實例166
6.7 udev模型167
6.7.1 udev模型原理167
6.7.2 mdev的使用167
第7章 I2C總綫驅動程序169
7.1 Linux的I2C驅動程序架構169
7.1.1 I2C適配器169
7.1.2 I2C算法170
7.1.3 I2C驅動程序結構170
7.1.4 I2C從設備171
7.1.5 i2c-dev設備層171
7.2 Linux I2C驅動程序開發174
7.2.1 S3C2410X的I2C控製器174
7.2.2 S3C2410X的I2C驅動程序分析175
7.3 S3C2410的I2C訪問實例182
7.4 I2C客戶端驅動程序185
第8章 TTY與串口驅動程序190
8.1 TTY概念190
8.2 Linux TTY驅動程序體係190
8.2.1 TTY驅動程序調用關係190
8.2.2 TTY驅動程序原理191
8.3 綫路規程194
8.4 串口驅動程序與TTY196
8.4.1 串口設備驅動程序原理196
8.4.2 S3C6410的串口驅動程序實例199
8.5 TTY應用層202
第9章 網絡設備驅動程序205
9.1 DM9000網卡驅動程序開發205
9.1.1 DM9000原理205
9.1.2 DM9000X驅動程序分析207
9.1.3 DM9000網口驅動程序移植215
9.2 NFS根文件係統搭建219
9.2.1 主機配置219
9.2.2 NFS根文件係統搭建實例220
9.3 netlink Socket224
9.3.1 netlink機製224
9.3.2 netlink應用層編程228
9.3.3 netlink驅動程序實例229
第10章 framebuffer驅動程序232
10.1 Linux framebuffer驅動程序原理232
10.1.1 framebuffer核心數據結構232
10.1.2 framebuffer操作接口234
10.1.3 framebuffer驅動程序的文件接口236
10.1.4 framebuffer驅動程序框架236
10.2 S3C6410 顯示控製器238
10.3 S3C6410 LCD驅動程序實例243
10.4 framebuffer應用層250
10.5 Qt4界麵係統移植251
第11章 輸入子係統驅動程序253
11.1 Linux輸入子係統概述253
11.1.1 input_dev結構253
11.1.2 輸入事件255
11.2 input_handler256
11.2.1 Input Handler層256
11.2.2 常用的Input Handler259
11.3 輸入設備應用層261
11.4 鍵盤輸入設備驅動程序實例262
11.5 event接口267
11.6 觸摸屏驅動程序實例270
11.6.1 S3C6410觸摸屏控製器270
11.6.2 S3C6410觸摸屏驅動程序設計273
11.7 觸摸屏校準282
11.7.1 觸摸屏校準原理282
11.7.2 利用TSLIB庫校準觸摸屏282
第12章 USB驅動程序284
12.1 USB體係概述284
12.1.1 USB係統組成284
12.1.2 USB主機284
12.1.3 USB設備邏輯層次285
12.2 Linux USB驅動程序體係287
12.2.1 USB總體結構287
12.2.2 USB設備驅動程序287
12.2.3 主機控製器驅動程序288
12.2.4 USB請求塊urb289
12.2.5 USB請求塊的填充291
12.3 S3C6410 USB主機控製器驅動程序292
12.3.1 USB主機控製器驅動程序分析292
12.3.2 S3C6410 USB驅動程序加載294
12.4 USB鍵盤設備驅動程序分析296
12.5 USB Gadget驅動程序301
12.5.1 Linux USB Gadget驅動程序301
12.5.2 Linux USB Gadget驅動程序實例302
第13章 音頻設備驅動程序303
13.1 ALSA音頻體係303
13.2 ALSA驅動層API304
13.2.1 聲卡和設備管理304
13.2.2 PCM API304
13.2.3 控製與混音API305
13.2.4 AC97 API306
13.2.5 SOC層驅動307
13.3 ALSA驅動程序實例308
13.3.1 S3C6410的AC97控製單元308
13.3.2 S3C6410聲卡電路原理309
13.3.3 S3C6410的數字音頻接口310
13.3.4 wm9713的數字音頻接口313
13.4 ALSA音頻編程接口316
13.4.1 ALSA PCM接口實例316
13.4.2 ALSA MIDI接口實例320
13.4.3 ALSA mixer接口實例321
13.4.4 ALSA timer接口實例322
第14章 video4linux2視頻驅動程序327
14.1 video4linux2驅動程序架構327
14.1.1 video4linux2驅動程序的注冊327
14.1.2 v4l2_fops接口331
14.1.3 常用的結構332
14.1.4 video4linux2的ioctl函數333
14.2 S3C6410攝像頭驅動程序分析333
14.2.1 電路原理333
14.2.2 驅動程序分析334
14.3 video4linux2應用層實例339
第15章 SD卡驅動程序346
15.1 Linux SD卡驅動程序體係346
15.1.1 SD卡電路原理346
15.1.2 MMC卡驅動程序架構347
15.1.3 MMC卡驅動程序相關結構347
15.1.4 MMC卡塊設備驅動程序350
15.1.5 SD卡主機控製器接口驅動程序356
15.2 S3C6410 SD卡控製器驅動程序分析360
15.2.1 電路原理360
15.2.2 S3C6410 SDHCI驅動程序原理360
15.2.3 SD卡的加載實例364
參考文獻366
精彩書摘
在Linux操作係統中,設備驅動程序對各種設備提供瞭一緻的訪問接口,用戶程序可以像對普通文件一樣對設備文件進行打開和讀寫操作。Linux包含如下3類設備驅動程序:
(1)字符設備
Linux下的字符設備是指發送和接收數據以字符的形式進行的設備。字符設備接口支持麵嚮字符的I/O操作,不經過係統的快速緩存,所以它們負責管理自己的緩衝區結構。字符設備接口隻支持順序存取的有限長度的I/O操作,典型的字符設備包括串行接口、LED燈、鍵盤等設備。
(2)塊設備
塊設備是以塊的方式進行I/0操作的設備。塊設備利用一塊係統內存作緩衝區,如果用戶進程對設備的請求能滿足用戶的要求,就返迴請求的數據,否則調用請求函數來進行實際的I/O操作。塊設備主要是針對磁盤等慢速設備設計的,以免耗費過多的CPU時間來等待響應。塊設備支持隨機存取功能,幾乎可以支持任意位置和任意長度的I/O請求。典型的塊設備包括硬盤、CF卡、SD卡等存儲設備。
(3)網絡設備
Linux操作係統中的網絡設備是一類特殊的設備。Linux的網絡子係統主要基於BSDUNIX的socket機製,在網絡子係統和驅動程序之間定義有專門的數據結構(skbuff)進行數據的傳遞。Linux操作係統支持對發送數據和接收數據的緩存,提供流量控製機製,提供對多種網絡協議的支持。
Linux係統為每個設備分配瞭一個主設備號與次設備號,主設備號唯一地標識瞭設備類型,次設備號標識具體設備的實例。由同一個設備驅動程序控製的所有設備具有相同的主設備號,從設備號則被用來區分具有相同主設備號的不同設備。
前言/序言
深入淺齣,玩轉Linux內核:掌握驅動程序開發的必備利器 這是一本為有誌於深入Linux係統底層、掌握硬件控製精髓的開發者量身打造的實戰指南。本書並非僅停留在理論的堆砌,而是以大量詳實、可運行的驅動程序開發實例為載體,帶您一步步解鎖Linux內核的奧秘,從基礎概念到高級特性,無不涵蓋。我們將一起探索Linux驅動程序開發的方方麵麵,讓您能夠獨立開發、調試,乃至優化各種硬件設備的驅動程序,成為一名閤格的Linux驅動工程師。 為何選擇Linux驅動開發? 在當今高度互聯的物聯網、嵌入式係統以及服務器領域,Linux的統治地位毋庸置疑。而驅動程序,作為連接硬件與操作係統的橋梁,其重要性不言而喻。掌握Linux驅動開發,意味著您擁有瞭直接與硬件交互的能力,能夠為各種嵌入式設備、外圍設備、高性能計算硬件等開發定製化的驅動,實現硬件功能的充分挖掘和性能優化。這不僅是技術深度的體現,更是解決實際工程問題的關鍵所在。 本書將帶您領略怎樣的精彩旅程? 本書內容詳實,結構清晰,從入門到精通,層層遞進,力求為讀者提供一個全麵且深入的學習體驗。 第一篇:驅動開發基石——構建堅實基礎 Linux內核概覽與開發環境搭建: 我們將從宏觀角度審視Linux內核的整體架構,理解其模塊化設計以及內核空間與用戶空間的概念。在此基礎上,詳細指導您如何搭建一套完整的Linux內核開發環境,包括交叉編譯工具鏈的配置、內核源碼的獲取與編譯,以及虛擬機環境的部署,確保您能夠順利地進行後續的驅動開發實踐。 Linux內核模塊編程基礎: 內核模塊是Linux驅動程序最常見的載體。本章將深入講解內核模塊的生命周期管理(加載、卸載)、符號導齣與導入機製、以及模塊參數的設置。您將學習如何編寫簡單的“Hello, World!”內核模塊,並理解其工作原理。 Linux內核對象與數據結構: 瞭解內核常用的數據結構,如鏈錶(list_head)、隊列(kfifo)、原子操作(atomic_t)以及自鏇鎖(spinlock_t)、信號量(semaphore)等同步原語,是編寫健壯驅動程序的基礎。我們將通過實例演示這些數據結構的實際應用,幫助您編寫高效且綫程安全的代碼。 內存管理與頁分配: 驅動程序經常需要動態地分配和管理內存。本章將詳細介紹Linux內核的內存管理機製,包括物理內存分配(kmalloc, vmalloc)、夥伴係統(buddy system)、 slab 分配器等,並闡述如何安全有效地使用這些內存分配函數。 中斷處理機製: 中斷是硬件與CPU通信的重要方式。我們將深入講解中斷的産生、中斷控製器的工作原理、中斷處理函數的編寫與注冊,以及中斷共享等高級話題。通過實際的按鍵中斷、定時器中斷實例,您將完全掌握中斷處理的精髓。 定時器與延遲: 在驅動開發中,精確的定時和延時控製至關重要。本章將介紹內核提供的各種定時器(timer_list)和延遲函數(udelay, mdelay, ssleap_delay),並給齣相應的應用實例,例如周期性任務的調度和硬件操作的時序控製。 第二篇:核心驅動技術——掌握關鍵技能 字符設備驅動開發: 字符設備是Linux中最基礎的設備類型。我們將從零開始,一步步構建一個完整的字符設備驅動,包括設備號的分配、cdev結構體的注冊、file_operations結構體的實現(open, read, write, ioctl等操作),並演示如何在用戶空間通過係統調用訪問該設備。 塊設備驅動開發: 塊設備(如硬盤、U盤)的驅動開發相對復雜,涉及到磁盤調度、I/O請求的處理等。本章將介紹塊設備驅動的基本框架,包括request_queue的創建、blk_init_queue的注冊,以及處理read/write請求的通用塊層(generic block layer)的工作機製。 網絡設備驅動開發: 在連接無處不在的今天,網絡設備驅動的開發顯得尤為重要。我們將深入理解網絡接口(net_device)的結構體,學習如何實現數據包的發送(ndo_start_xmit)和接收(NAPI),以及網卡設備的初始化和配置。 I2C、SPI、I2S等總綫驅動: 許多嵌入式設備通過I2C、SPI、I2S等總綫進行通信。本章將重點講解這些總綫協議的工作原理,並提供相應的驅動開發實例,例如控製傳感器、顯示器等外圍設備。 USB設備驅動開發: USB作為一種通用的外部設備接口,其驅動開發具有廣泛的應用前景。我們將深入分析USB協議棧,學習USB設備枚舉、接口描述、端點(endpoint)的配置,以及URB(USB Request Block)的創建和管理,並開發一個簡單的USB設備驅動。 PCI/PCIe設備驅動開發: 對於高性能硬件,PCI/PCIe接口扮演著關鍵角色。本章將介紹PCI/PCIe設備的配置空間訪問、內存映射I/O(MMIO)、中斷處理,以及DMA(Direct Memory Access)技術的應用,幫助您開發高效的PCI/PCIe設備驅動。 第三篇:高級驅動技巧與實踐——提升工程能力 Linux設備模型(Device Model): 設備模型是Linux內核組織和管理設備的一種強大機製。我們將深入理解kobject、kset、device、driver等核心概念,學習如何利用設備模型統一管理設備資源,實現驅動與設備的解耦。 設備樹(Device Tree): 在現代嵌入式Linux係統中,設備樹扮演著越來越重要的角色。本章將詳細講解設備樹的語法、節點的錶示方法,以及如何編寫和解析設備樹來描述硬件平颱。您將學習如何將設備樹與驅動程序相結閤,實現硬件無關性。 驅動程序的調試與性能優化: 調試是驅動開發過程中不可或缺的一環。我們將介紹內核調試工具(如printk、dynamic debug、ftrace、kdb/kgdb),以及如何利用這些工具定位和解決驅動程序中的bug。同時,還將探討常見的驅動性能瓶頸,並提供相應的優化策略。 Power Management(電源管理): 在功耗敏感的設備中,電源管理至關重要。本章將介紹Linux內核的電源管理框架,包括runtime PM、system suspend/resume等,並指導您如何為驅動程序實現電源管理功能。 用戶空間與內核空間的交互(ioctl,procfs,sysfs): 驅動程序需要與用戶空間應用程序進行交互。本章將深入講解ioctl係統調用、procfs文件係統的創建與使用、sysfs文件係統的動態創建與屬性管理,讓您能夠設計靈活高效的接口。 嵌入式Linux開發實戰: 結閤具體的嵌入式硬件平颱(如ARM架構開發闆),我們將通過多個完整的驅動開發項目,將前麵所學的知識融會貫通。從簡單的GPIO控製到復雜的傳感器驅動,再到網絡通信模塊,讓您在實踐中鞏固技能,提升解決實際問題的能力。 誰適閤閱讀本書? C語言熟練的嵌入式開發者: 如果您熟悉C語言,並且對嵌入式係統有濃厚興趣,希望深入瞭解Linux內核的工作原理。 Linux係統管理員或工程師: 希望進一步提升Linux係統底層的理解深度,能夠獨立開發或維護硬件驅動。 計算機科學、電子工程等相關專業的學生: 對操作係統原理、計算機體係結構有深入學習需求,希望通過實踐掌握Linux驅動開發。 物聯網(IoT)開發者: 需要為各種傳感器、執行器、通信模塊開發定製化的Linux驅動。 對Linux內核刨根問底的技術愛好者: 想要揭開Linux內核神秘麵紗,掌握與硬件交互的終極能力。 本書的獨特價值 本書最大的亮點在於其豐富的實戰案例。我們精選瞭大量在實際開發中常見且有代錶性的驅動程序實例,並提供瞭完整的源代碼,保證讀者能夠直接上手編譯、運行和調試。這些案例涵蓋瞭多種硬件接口和通信協議,能夠滿足不同領域開發者的需求。 此外,本書注重理論與實踐的結閤,在講解每一個技術點時,都輔以相應的代碼示例,幫助讀者將抽象的概念轉化為具體的實現。我們力求用最清晰易懂的語言,將復雜的內核機製娓娓道來。 開啓您的Linux驅動開發之旅 掌握Linux驅動開發,就是掌握瞭與硬件直接對話的能力。本書將為您鋪就一條通往Linux內核深處的道路,讓您能夠自信地麵對各種硬件挑戰,開發齣高性能、高可靠性的驅動程序。立即開始,與我們一同踏上這場激動人心的Linux驅動開發之旅吧!