編輯推薦
備受推崇的Linux經典圖書全面升級,ChinaUnix社區鼎力推薦
全面、系統介紹Linux驅動開發的基礎與核心技術,注重實戰,重點闡述8種典型的設備驅動的開發方法
內容新穎:基於當前流行的Linux2.6.34核心,講解新的驅動設計方法
內容全面:涵蓋Linux驅動開發的基礎知識、核心技術與典型套用
講解詳細:結合典型開發實例與案例講解各個知識點,並力求詳盡和透徹
注重實戰:介紹了看門狗、LCD、觸控螢幕等8種典型設備的驅動開發方法
技巧性強:講解時融入了作者多年的項目開發經驗和實戰技巧
本書是獲得了大量讀者好評的“Linux典藏大系”中的《Linux驅動開發入門與實戰》的第2版。本書由淺入深,全面、系統地介紹了Linux驅動開發技術,並提供了大量實例供讀者實戰演練。另外,作者在實例講解中詳細分析了各種重要的理論知識,讓讀者能夠舉一反三。
本書共分3篇。第1篇介紹了Linux驅動開發概述、嵌入式處理器和開發板簡介、構建嵌入式驅動程式開發環境、構建嵌入式Linux作業系統、構建第一個驅動程式、簡單的字元設備驅動程式等內容;第2篇介紹了設備驅動中的並發控制、設備驅動中的阻塞和同步機制、中斷與時鐘機制、內外存訪問等內容;第3篇介紹了設備驅動模型、RTC實時時鐘驅動程式、看門狗驅動程式、IIC設備驅動程式、LCD設備驅動程式、觸控螢幕設備驅動程式、輸入子系統設計、塊設備驅動程式、USB設備驅動程式等內容。
本書重點突出,涉及面廣,實用性強,從基本知識到核心原理,再到實例開發,幾乎涉及Linux驅動開發的所有重要知識。本書適合所有想學習Linux驅動開發的入門人員閱讀,也適合作為驅動工程師的參考書,對於Linux驅動開發的專業開發人員也有很高的參考價值。
內容簡介
“Linux典藏大系”自2010年陸續出版以來,因其內容豐富、講解細膩、通俗易懂和實用性強等特色而深受廣大讀者的喜愛,長期位居同類圖書銷售排行榜的前列,累計銷量近10萬冊。叢書中部分圖書榮獲51CTO讀書頻道“受讀者喜愛的原創IT技術圖書獎”,還有多種圖書的中文繁體字著作權輸出到了中國台灣地區出版發行。叢書中的多個品種被國內幾十所培訓機構和大中專院校選為教材。叢書的出版還得到了國內Linux領域知名的技術社區ChinaUnix的大力支持。讀者在ChinaUnix社區的論壇上與社區中的Linux愛好者進行了廣泛的交流,取得了良好的學習效果。2014年2月“Linux典藏大系“全新升級版(第2版)正式出版,第2版圖書迎合了Linux技術的發展,全部採用當前流行和穩定的Linux發行版或者相關工具,是Linux愛好者學習Linux的好幫手。
《Linux典藏大系:Linux驅動開發入門與實戰(第2版)》是獲得了大量讀者好評的“Linux典藏大系”中的《Linux驅動開發入門與實戰》的第2版。本.書由淺入深,全面、系統地介紹了Linux驅動開發技術,並提供了大量實例供讀者實戰演練。另外,作者在實例講解中詳細分析了各種重要的理論知識,讓讀者能夠舉一反三。
《Linux典藏大系:Linux驅動開發入門與實戰(第2版)》共分3篇。第1篇介紹了Linux驅動開發概述、嵌入式處理器和開發板簡介、構建嵌入式驅動程式開發環境、構建嵌入式Linux作業系統、構建一個驅動程式、簡單的字元設備驅動程式等內容;第2篇介紹了設備驅動中的並發控制、設備驅動中的阻塞和同步機制、中斷與時鐘機制、內外存訪問等內容;第3篇介紹了設備驅動模型、RTC實時時鐘驅動程式、看門狗驅動程式、IIC設備驅動程式、LCD設備驅動程式、觸控螢幕設備驅動程式、輸入子系統設計、塊設備驅動程式、USB設備驅動程式等內容。
《Linux典藏大系:Linux驅動開發入門與實戰(第2版)》重點突出,涉及面廣,實用性強,從基本知識到核心原理,再到實例開發,幾乎涉及Linux驅動開發的所有重要知識。《Linux典藏大系:Linux驅動開發入門與實戰(第2版)》適合所有想學習Linux驅動開發的入門人員閱讀,也適合作為驅動工程師的參考書,對於Linux驅動開發的專業開發人員也有很高的參考價值。
作者簡介
鄭強,畢業於西南大學,獲碩士學位。長期從事嵌入式系統開發和設計。現任職於某公司的項目主管,先後開發過十幾個大中型項目,涉及GPS定位系統、刷卡系統、指紋識別和手機等產品。工作之餘,熱心於Flash遊戲引擎開發和2D遊戲開發。
圖書目錄
第1篇Linux驅動開發基礎
第1章Linux驅動開發概述 2
1.1Linux設備驅動的基本概念 2
1.1.1設備驅動程式概述 2
1.1.2設備驅動程式的作用 2
1.1.3設備驅動的分類 3
1.2Linux作業系統與驅動的關係 4
1.3Linux驅動程式開發 4
1.3.1用戶態和核心態 4
1.3.2模組機制 5
1.3.3編寫設備驅動程式需要了解的知識 6
1.4編寫設備驅動程式的注意事項 6
1.4.1應用程式開發與驅動程式開發的差異 6
1.4.2GUNC開發驅動程式 7
1.4.3不能使用C庫開發驅動程式 7
1.4.4沒有記憶體保護機制 8
1.4.5小核心棧 8
1.4.6重視可移植性 8
1.5Linux驅動的發展趨勢 9
1.5.1Linux驅動的發展 9
1.5.2驅動的套用 9
1.5.3相關學習資源 9
1.6小結 10
第2章嵌入式處理器和開發板簡介 11
2.1處理器的選擇 11
2.1.1處理器簡述 11
2.1.2處理器的種類 11
2.2ARM處理器 13
2.2.1ARM處理器簡介 14
2.2.2ARM處理器系列 14
2.2.3ARM處理器的套用 16
2.2.4ARM處理器的選型 16
2.2.5ARM處理器選型舉例 19
2.3S3C2440開發板 20
2.3.1S3C2440開發板簡介 20
2.3.2S3C2440開發板的特性 20
2.3.3其他開發板 22
2.4小結 22
第3章構建嵌入式驅動程式開發環境 23
3.1虛擬機和Linux安裝 23
3.1.1在Windows上安裝虛擬機 23
3.1.2在虛擬機上安裝Linux 27
3.1.3設定已分享資料夾 29
3.2代碼閱讀工具SourceInsight 29
3.2.1SourceInsight簡介 30
3.2.2閱讀原始碼 30
3.3小結 33
第4章構建嵌入式Linux作業系統 34
4.1Linux作業系統的介紹 34
4.1.1Linux作業系統 34
4.1.2Linux作業系統的優點 35
4.2Linux核心子系統 36
4.2.1進程管理 36
4.2.2記憶體管理 37
4.2.3檔案系統 37
4.2.4設備管理 38
4.2.5網路功能 38
4.3Linux原始碼結構分析 38
4.3.1arch目錄 38
4.3.2drivers目錄 39
4.3.3fs目錄 39
4.3.4其他目錄 40
4.4核心配置選項 41
4.4.1配置編譯過程 41
4.4.2常規配置 42
4.4.3模組配置 44
4.4.4塊設備層配置 44
4.4.5CPU類型和特性配置 45
4.4.6電源管理配置 47
4.4.7匯流排配置 49
4.4.8網路配置 50
4.4.9設備驅動配置 53
4.4.10檔案系統配置 60
4.5嵌入式檔案系統基礎知識 62
4.5.1嵌入式檔案系統 62
4.5.2嵌入式系統的存儲介質 63
4.5.3JFFS檔案系統 64
4.5.4YAFFS檔案系統 64
4.6構建根檔案系統 64
4.6.1根檔案系統概述 65
4.6.2Linux根檔案系統目錄結構 65
4.6.3BusyBox構建根檔案系統 66
4.7小結 71
第5章構建第一個驅動程式 72
5.1開發環境配置之核心升級 72
5.1.1為什麼升級核心 72
5.1.2核心升級 73
5.1.3makemenconfig的注意事項 75
5.2HelloWorld驅動程式 77
5.2.1驅動模組的組成 77
5.2.2HelloWorld模組 78
5.2.3編譯HelloWorld模組 79
5.2.4模組的操作 81
5.2.5HelloWorld模組載入後檔案系統的變化 82
5.3模組參數和模組之間通信 82
5.3.1模組參數 83
5.3.2模組的檔案格式ELF 83
5.3.3模組之間的通信 84
5.3.4模組之間的通信實例 84
5.4將模組加入核心 88
5.4.1向核心添加模組 88
5.4.2Kconfig 88
5.4.3Kconfig的語法 89
5.4.4套用實例:在核心中新增加add_sub模組 92
5.4.5對add_sub模組進行配置 93
5.5小結 95
第6章簡單的字元設備驅動程式 96
6.1字元設備驅動程式框架 96
6.1.1字元設備和塊設備 96
6.1.2主設備號和次設備號 97
6.1.3申請和釋放設備號 98
6.2初識cdev結構 99
6.2.1cdev結構體 99
6.2.2file_operations結構體 101
6.2.3cdev和file_operations結構體的關係 102
6.2.4inode結構體 102
6.3字元設備驅動的組成 103
6.3.1字元設備載入和卸載函式 103
6.3.2file_operations結構體和其成員函式 104
6.3.3驅動程式與應用程式的數據交換 105
6.3.4字元設備驅動程式組成小結 106
6.4VirtualDisk字元設備驅動 106
6.4.1VirtualDisk的頭檔案、宏和設備結構體 106
6.4.2載入和卸載驅動程式 107
6.4.3cdev的初始化和註冊 108
6.4.4打開和釋放函式 109
6.4.5讀寫函式 110
6.4.6seek()函式 111
6.4.7ioctl()函式 112
6.5小結 113
第2篇Linux驅動開發核心技術
第7章設備驅動中的並發控制 116
7.1並發與競爭 116
7.2原子變數操作 116
7.2.1原子變數操作 116
7.2.2原子整型操作 117
7.2.3原子位操作 119
7.3自旋鎖 120
7.3.1自旋鎖概述 120
7.3.2自旋鎖的使用 120
7.3.3自旋鎖的使用注意事項 122
7.4信號量 122
7.4.1信號量概述 122
7.4.2信號量的實現 123
7.4.3信號量的使用 123
7.4.4自旋鎖與信號量的對比 125
7.5完成量 126
7.5.1完成量概述 126
7.5.2完成量的實現 126
7.5.3完成量的使用 127
7.6小結 128
第8章設備驅動中的阻塞和同步機制 129
8.1阻塞和非阻塞 129
8.2等待佇列 130
8.2.1等待佇列概述 130
8.2.2等待佇列的實現 130
8.2.3等待佇列的使用 130
8.3同步機制實驗 132
8.3.1同步機制設計 132
8.3.2實驗驗證 136
8.4小結 137
第9章中斷與時鐘機制 138
9.1中斷簡述 138
9.1.1中斷的概念 138
9.1.2中斷的巨觀分類 139
9.1.3中斷產生的位置分類 139
9.1.4同步和異步中斷 140
9.1.5中斷小結 140
9.2中斷的實現過程 140
9.2.1中斷信號線(IRQ) 140
9.2.2中斷控制器 141
9.2.3中斷處理過程 141
9.2.4中斷的安裝與釋放 142
9.3按鍵中斷實例 143
9.3.1按鍵設備原理圖 143
9.3.2有暫存器設備和無暫存器設備 144
9.3.3按鍵設備相關連線埠暫存器 144
9.4按鍵中斷實例程式分析 146
9.4.1按鍵驅動程式組成 147
9.4.2初始化函式s3c2440_buttons_init() 147
9.4.3中斷處理函式isr_button() 148
9.4.4退出函式s3c2440_buttons_exit() 149
9.5時鐘機制 149
9.5.1時間度量 149
9.5.2時間延時 150
9.6小結 151
第10章內外存訪問 152
10.1記憶體分配 152
10.1.1kmalloc()函式 152
10.1.2vmalloc()函式 153
10.1.3後備高速快取 155
10.2頁面分配 156
10.2.1記憶體分配 156
10.2.2物理地址和虛擬地址之間的轉換 159
10.3設備I/O連線埠的訪問 160
10.3.1LinuxI/O連線埠讀寫函式 160
10.3.2I/O記憶體讀寫 160
10.3.3使用I/O連線埠 164
10.4小結 166
第3篇Linux驅動開發實用實戰
第11章設備驅動模型 168
11.1設備驅動模型概述 168
11.1.1設備驅動模型的功能 168
11.1.2sysfs檔案系統 169
11.1.3sysfs檔案系統的目錄結構 170
11.2設備驅動模型的核心數據結構 171
11.2.1kobject結構體 171
11.2.2設備屬性kobj_type 175
11.3註冊kobject到sysfs中的實例 179
11.3.1設備驅動模型結構 179
11.3.2kset集合 179
11.3.3kset與kobject的關係 181
11.3.4kset相關的操作函式 182
11.3.5註冊kobject到sysfs中的實例 183
11.3.6實例測試 187
11.4設備驅動模型的三大組件 188
11.4.1匯流排 188
11.4.2匯流排屬性和匯流排方法 191
11.4.3設備 193
11.4.4驅動 195
11.5小結 198
第12章RTC實時時鐘驅動 199
12.1RTC實時時鐘硬體原理 199
12.1.1RTC實時時鐘 199
12.1.2RTC實時時鐘的功能 199
12.1.2RTC實時時鐘的工作原理 201
12.2RTC實時時鐘架構 205
12.2.1載入卸載函式 205
12.2.2RTC實時時鐘的平台驅動 206
12.2.3RTC驅動探測函式 207
12.2.4RTC實時時鐘的使能函式s3c_rtc_enable() 210
12.2.5RTC實時時鐘設定頻率函式s3c_rtc_setfreq() 211
12.2.6RTC設備註冊函式rtc_device_register() 212
12.3RTC檔案系統接口 214
12.3.1檔案系統接口rtc_class_ops 214
12.3.2RTC實時時鐘打開函式s3c_rtc_open() 215
12.3.3RTC實時時鐘關閉函式s3c_rtc_release() 216
12.3.4RTC實時時鐘獲得時間函式s3c_rtc_gettime() 216
12.3.5RTC實時時鐘設定時間函式s3c_rtc_settime() 218
12.3.6RTC驅動探測函式s3c_rtc_getalarm() 219
12.3.7RTC實時時鐘設定報警時間函式s3c_rtc_setalarm() 220
12.3.8RTC設定脈衝中斷使能函式s3c_rtc_setpie() 221
12.3.9RTC時鐘脈衝中斷判斷函式s3c_rtc_proc() 222
12.4小結 222
第13章看門狗驅動程式 223
13.1看門狗硬體原理 223
13.1.1看門狗 223
13.1.2看門狗工作原理 223
13.2平台設備模型 225
13.2.1平台設備模型 226
13.2.2平台設備 226
13.2.3平台設備驅動 228
13.2.4平台設備驅動的註冊和註銷 229
13.2.5混雜設備 230
13.2.6混雜設備的註冊和註銷 231
13.3看門狗設備驅動程式分析 231
13.3.1看門狗驅動程式的一些變數定義 231
13.3.2看門狗模組的載入和卸載函式 232
13.3.3看門狗驅動程式探測函式 233
13.3.4設定看門狗復位時間函式s3c2410wdt_set_heartbeat() 234
13.3.5看門狗的開始函式s3c2410wdt_start()和停止函式
s3c2410wdt_stop() 236
13.3.6看門狗驅動程式移除函式s3c2410wdt_remove() 237
13.3.7平台設備驅動s3c2410wdt_driver中的其他重要函式 237
13.3.8混雜設備的file_operations中的函式 238
13.3.9看門狗中斷處理函式s3c2410wdt_irq() 241
13.4小結 242
第14章IIC設備驅動程式 243
14.1IIC設備的匯流排及其協定 243
14.1.1IIC匯流排的特點 243
14.1.2IIC匯流排的信號類型 244
14.1.3IIC匯流排的數據傳輸 244
14.2IIC設備的硬體原理 244
14.3IIC設備驅動程式的層次結構 246
14.3.1IIC設備驅動的概述 246
14.3.2IIC設備層 247
14.3.3i2c_driver和i2c_client的關係 249
14.3.4IIC匯流排層 249
14.3.5IIC設備層和匯流排層的關係 251
14.3.6寫IIC設備驅動的步驟 251
14.4IIC子系統的初始化 252
14.4.1IIC子系統初始化函式i2c_init() 252
14.4.2IIC子系統退出函式i2c_exit() 253
14.5適配器驅動程式 253
14.5.1s3c2440對應的適配器結構體 253
14.5.2IIC適配器載入函式i2c_add_adapter() 255
14.5.3IDR機制 256
14.5.4適配器卸載函式i2c_del_adapter() 258
14.5.5IIC匯流排通信方法s3c24xx_i2c_algorithm結構體 258
14.5.6適配器的傳輸函式s3c24xx_i2c_doxfer() 260
14.5.7適配器的中斷處理函式s3c24xx_i2c_irq() 263
14.5.8位元組傳輸函式i2s_s3c_irq_nextbyte() 265
14.5.9適配器傳輸停止函式s3c24xx_i2c_stop() 267
14.5.10中斷處理函式的一些輔助函式 268
14.6IIC設備層驅動程式 268
14.6.1IIC設備驅動模組載入和卸載 269
14.6.2探測函式s3c24xx_i2c_probe() 270
14.6.3移除函式s3c24xx_i2c_remove() 272
14.6.4控制器初始化函式s3c24xx_i2c_init() 273
14.6.5設定控制器數據傳送頻率函式s3c24xx_i2c_clockrate() 274
14.7小結 276
第15章LCD設備驅動程式 277
15.1FrameBuffer概述 277
15.1.1FrameBuffer的概念 277
15.1.2FrameBuffer與應用程式的互動 278
15.1.3FrameBuffer顯示原理 278
15.1.4LCD顯示原理 278
15.2FrameBuffer的結構分析 279
15.2.1FrameBuffer架構和其關係 279
15.2.2FrameBuffer驅動程式的實現 280
15.2.3FrameBuffer架構及其關係 281
15.3LCD驅動程式分析 286
15.3.1LCD模組的載入和卸載函式 286
15.3.2LCD驅動程式的平台數據 287
15.3.3LCD模組的探測函式 289
15.3.4移除函式 293
15.4小結 294
第16章觸控螢幕設備驅動程式 295
16.1觸控螢幕設備工作原理 295
16.1.1觸控螢幕設備概述 295
16.1.2觸控螢幕設備的類型 295
16.1.3電阻式觸控螢幕 296
16.2觸控螢幕設備硬體結構 296
16.2.1s3c2440觸控螢幕接口概述 296
16.2.2s3c2440觸控螢幕接口的工作模式 297
16.2.3s3c2440觸控螢幕設備暫存器 297
16.3觸控螢幕設備驅動程式分析 301
16.3.1觸控螢幕設備驅動程式組成 301
16.3.2s3c2440觸控螢幕驅動模組的載入和卸載函式 302
16.3.3s3c2440觸控螢幕驅動模組的探測函式 303
16.3.4觸控螢幕設備配置 305
16.3.5觸控螢幕設備中斷處理函式 307
16.3.6s3c2440觸控螢幕驅動模組的remove()函式 311
16.4測試觸控螢幕驅動程式 312
16.5小結 313
第17章輸入子系統設計 314
17.1input子系統入門 314
17.1.1簡單的實例 314
17.1.2註冊函式input_register_device() 316
17.1.3向子系統報告事件 319
17.2handler註冊分析 324
17.2.1輸入子系統的組成 325
17.2.2input_handler結構體 325
17.2.3註冊input_handler 326
17.2.4input_handle結構體 327
17.2.5註冊input_handle 328
17.3input子系統 329
17.3.1子系統初始化函式input_init() 329
17.3.2檔案打開函式input_open_file() 330
17.4evdev輸入事件驅動分析 331
17.4.1evdev的初始化 331
17.4.2evdev設備的打開 334
17.5小結 336
第18章塊設備驅動程式 337
18.1塊設備簡介 337
18.1.1塊設備總體概述 337
18.1.2塊設備的結構 338
18.2塊設備驅動程式的架構 340
18.2.1塊設備載入過程 340
18.2.2塊設備卸載過程 341
18.3通用塊層 342
18.3.1通用塊層 342
18.3.2alloc_disk()函式對應的gendisk結構體 342
18.3.3塊設備的註冊和註銷 344
18.3.4請求佇列 345
18.3.5設定gendisk屬性中的block_device_operations結構體 346
18.4不使用請求佇列的塊設備驅動 347
18.4.1不使用請求佇列的塊設備驅動程式的組成 347
18.4.2宏定義和全局變數 348
18.4.3載入函式 349
18.4.4卸載函式 350
18.4.5自定義請求處理函式 351
18.4.6驅動的測試 352
18.5I/O調度器 355
18.5.1數據從記憶體到磁碟的過程 355
18.5.2塊I/O請求(bio) 355
18.5.3請求結構(request) 358
18.5.4請求佇列(request_queue) 360
18.5.5請求佇列、請求結構、bio等之間的關係 361
18.5.6四種調度算法 361
18.6自定義I/O調度器 363
18.6.1Virtual_blkdev塊設備的缺陷 363
18.6.2指定noop調度器 363
18.6.3Virtual_blkdev的改進實例 364
18.6.4編譯和測試 365
18.7脫離I/O調度器 365
18.7.1請求佇列中的bio處理函式 365
18.7.2通用塊層函式調用關係 367
18.7.3對Virtual_blkdev塊設備的改進 369
18.7.4編譯和測試 371
18.8塊設備的物理結構 372
18.8.1為Virtual_blkdev塊設備添加分區 372
18.8.2對新的Virtual_blkdev代碼的分析 373
18.8.3編譯和測試 374
18.8.4分區數的計算 376
18.8.5設定Virtual_blkdev的結構 377
18.8.6編譯和測試 379
18.9小結 383
第19章USB設備驅動程式 384
19.1USB概述 384
19.1.1USB概念 384
19.1.2USB的特點 385
19.1.3USB匯流排拓撲結構 386
19.1.4USB驅動總體架構 386
19.2USB設備驅動模型 389
19.2.1USB驅動初探 389
19.2.2USB設備驅動模型 392
19.2.3USB驅動結構usb_driver 394
19.3USB設備驅動程式 398
19.3.1USB設備驅動載入和卸載函式 398
19.3.2探測函式probe()的參數usb_interface 400
19.3.3USB協定中的設備 400
19.3.4端點的傳輸方式 406
19.3.5設定 408
19.3.6探測函式storage_probe() 410
19.4獲得USB設備信息 412
19.4.1設備關聯函式associate_dev() 412
19.4.2獲得設備信息函式get_device_info() 413
19.4.3得到傳輸協定get_transport()函式 415
19.4.4獲得協定信息函式get_protocol() 416
19.4.5獲得管道信息函式get_pipes() 417
19.5資源的初始化 420
19.5.1storage_probe()函式調用過程 420
19.5.2資源獲取函式usb_stor_acquire_resources() 420
19.5.3USB請求塊(urb) 421
19.6控制子執行緒 425
19.6.1控制執行緒 425
19.6.2掃描執行緒usb_stor_scan_thread() 427
19.6.3獲得LUN函式usb_stor_Bulk_max_lun() 428
19.7小結 435