Linux驅動開發入門與實戰(第2版)

Linux驅動開發入門與實戰(第2版)

《Linux驅動開發入門與實戰》(第2版)是2014年2月清華大學出版社出版的圖書,作者是鄭強。

編輯推薦

備受推崇的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

相關詞條

熱門詞條

聯絡我們