●贊譽
推薦序一
推薦序二
前言
章Linux設備驅動概述及開發環境構建
1.1設備驅動的作用
1.2無操作繫統時的設備驅動
1.3有操作繫統時的設備驅動
1.4Linux設備驅動
1.4.1設備的分類及特點
1.4.2Linux設備驅動與整個軟硬件繫統的關繫
1.4.3Linux設備驅動的重點、難點
1.5Linux設備驅動的開發環境構建
1.5.1PC上的Linux環境
1.5.2QEMU實驗平臺
1.5.3源代碼閱讀和編輯
1.6設備驅動HelloWorld:LED驅動
1.6.1無操作繫統時的LED驅動
1.6.2Linux下的LED驅動
第2章驅動設計的硬件基礎
2.1處理器
2.1.1通用處理器
2.1.2數字信號處理器
2.2存儲器
2.3接口與總線
2.3.1串口
2.3.2I2C
2.3.3SPI
2.3.4USB
2.3.5以太網接口
2.3.6PCI和PCIE
2.3.7SD和SDIO
2.4CPLD和FPGA
2.5原理圖分析
2.6硬件時序分析
2.6.1時序分析的概念
2.6.2典型的硬件時序
2.7芯片數據手冊閱讀方法
2.8儀器儀表使用
2.8.1萬用表
2.8.2示波器
2.8.3邏輯分析儀
2.9總結
第3章Linux內核及內核編程
3.1Linux內核的發展與演變
3.2Linux2.6後的內核特點
3.3Linux內核的組成
3.3.1Linux內核源代碼的目錄結構
3.3.2Linux內核的組成部分
3.3.3Linux內核空間與用戶空間
3.4Linux內核的編譯及加載
3.4.1Linux內核的編譯
3.4.2Kconfig和Makefile
3.4.3Linux內核的引導
3.5Linux下的C編程特點
3.5.1Linux編碼風格
3.5.2GNUC與ANSIC
3.5.3do{}while(0)語句
3.5.4goto語句
3.6工具鏈
3.7實驗室建設
3.8串口工具
3.9總結
第4章Linux內核模塊
4.1Linux內核模塊簡介
4.2Linux內核模塊程序結構
4.3模塊加載函數
4.4模塊卸載函數
4.5模塊參數
4.6導出符號
4.7模塊聲明與描述
4.8模塊的使用計數
4.9模塊的編譯
4.10使用模塊“繞開”GPL
4.11總結
第5章Linux文件繫統與設備文件
5.1Linux文件操作
5.1.1文件操作繫統調用
5.1.2C庫文件操作
5.2Linux文件繫統
5.2.1Linux文件繫統目錄結構
5.2.2Linux文件繫統與設備驅動
5.3devfs
5.4udev用戶空間設備管理
5.4.1udev與devfs的區別
5.4.2sysfs文件繫統與Linux設備模型
5.4.3udev的組成
5.4.4udev規則文件
5.5總結
第6章字符設備驅動
6.1Linux字符設備驅動結構
6.1.1cdev結構體
6.1.2分配和釋放設備號
6.1.3f?ile_operations結構體
6.1.4Linux字符設備驅動的組成
6.2globalmem虛擬設備實例描述
6.3globalmem設備驅動
6.3.1頭文件、宏及設備結構體
6.3.2加載與卸載設備驅動
6.3.3讀寫函數
6.3.4seek函數
6.3.5ioctl函數
6.3.6使用文件私有數據
6.4globalmem驅動在用戶空間中的驗證
6.5總結
第7章Linux設備驅動中的並發控制
7.1並發與競態
7.2編譯亂序和執行亂序
7.3中斷屏蔽
7.4原子操作
7.4.1整型原子操作
7.4.2位原子操作
7.5自旋鎖
7.5.1自旋鎖的使用
7.5.2讀寫自旋鎖
7.5.3順序鎖
7.5.4讀復制更新
7.6信號量
7.7互斥體
7.8完成量
7.9增加並發控制後的globalmem的設備驅動
7.10總結
第8章Linux設備驅動中的阻塞與非阻塞I/O
8.1阻塞與非阻塞I/O
8.1.1等待隊列
8.1.2支持阻塞操作的globalfifo設備驅動
8.1.3在用戶空間驗證globalfifo的讀寫
8.2輪詢操作
8.2.1輪詢的概念與作用
8.2.2應用程序中的輪詢編程
8.2.3設備驅動中的輪詢編程
8.3支持輪詢操作的globalfifo驅動
8.3.1在globalfifo驅動中增加輪詢操作
8.3.2在用戶空間中驗證globalfifo設備的輪詢
8.4總結
第9章Linux設備驅動中的異步通知與異步I/O
9.1異步通知的概念與作用
9.2Linux異步通知編程
9.2.1Linux信號
9.2.2信號的接收
9.2.3信號的釋放
9.3支持異步通知的globalfifo驅動
9.3.1在globalfifo驅動中增加異步通知
9.3.2在用戶空間中驗證globalfifo的異步通知
9.4Linux異步I/O
9.4.1AIO概念與GNUC庫AIO
9.4.2Linux內核AIO與libaio
9.4.3AIO與設備驅動
9.5總結
0章中斷與時鐘
10.1中斷與定時器
10.2Linux中斷處理程序架構
10.3Linux中斷編程
10.3.1申請和釋放中斷
10.3.2使能和屏蔽中斷
10.3.3底半部機制
10.3.4實例:GPIO按鍵的中斷
10.4中斷共享
10.5內核定時器
10.5.1內核定時器編程
10.5.2內核中延遲的工作delayed_work
10.5.3實例:秒字符設備
10.6內核延時
10.6.1短延遲
10.6.2長延遲
10.6.3睡著延遲
10.7總結
1章內存與I/O訪問
11.1CPU與內存、I/O
11.1.1內存空間與I/O空間
11.1.2內存
11.2Linux內存管理
11.3內存存取
11.3.1用戶空間內存動態申請
11.3.2內核空間內存動態申請
11.4設備I/O端口和I/O內存的訪問
11.4.1LinuxI/O端口和I/O內存訪問接口
11.4.2申請與釋放設備的I/O端口和I/O內存
11.4.3設備I/O端口和I/O內存訪問流程
11.4.4將設備地址映射到用戶空間
11.5I/O內存靜態映射
11.6DMA
11.6.1DMA與Cache一致性
11.6.2Linux下的DMA編程
11.7總結
2章Linux設備驅動的軟件架構思想
12.1Linux驅動的軟件架構
12.2platform設備驅動
12.2.1platform總線、設備與驅動
12.2.2將globalfifo作為platform設備
12.2.3platform設備資源和數據
12.3設備驅動的分層思想
12.3.1設備驅動核心層和例化
12.3.2輸入設備驅動
12.3.3RTC設備驅動
12.3.4Framebuffer設備驅動
12.3.5終端設備驅動
12.3.6misc設備驅動
12.3.7驅動核心層
12.4主機驅動與外設驅動分離的設計思想
12.4.1主機驅動與外設驅動分離
12.4.2LinuxSPI主機和設備驅動
12.5總結
3章Linux塊設備驅動
13.1塊設備的I/O操作特點
13.2Linux塊設備驅動結構
13.2.1block_device_operations結構體
13.2.2gendisk結構體
13.2.3bio、request和request_queue
13.2.4I/O調度器
13.3Linux塊設備驅動的初始化
13.4塊設備的打開與釋放
13.5塊設備驅動的ioctl函數
13.6塊設備驅動的I/O請求處理
13.6.1使用請求隊列
13.6.2不使用請求隊列
13.7實例:vmem_disk驅動
13.7.1vmem_disk的硬件原理
13.7.2vmem_disk驅動模塊的加載與卸載
13.7.3vmem_disk設備驅動的block_device_operations
13.7.4vmem_disk的I/O請求處理
13.8LinuxMMC子繫統
13.9總結
4章Linux網絡設備驅動
14.1Linux網絡設備驅動的結構
14.1.1網絡協議接口層
14.1.2網絡設備接口層
14.1.3設備驅動功能層
14.2網絡設備驅動的注冊與注銷
14.3網絡設備的初始化
14.4網絡設備的打開與釋放
14.5數據發送流程
14.6數據接收流程
14.7網絡連接狀態
14.8參數設置和統計數據
14.9DM9000網卡設備驅動實例
14.9.1DM9000網卡硬件描述
14.9.2DM9000網卡驅動設計分析
14.10總結
5章LinuxI2C核心、總線與設備驅動
15.1LinuxI2C體繫結構
15.2LinuxI2C核心
15.3LinuxI2C適配器驅動
15.3.1I2C適配器驅動的注冊與注銷
15.3.2I2C總線的通信方法
15.4LinuxI2C設備驅動
15.4.1LinuxI2C設備驅動的模塊加載與卸載
15.4.2LinuxI2C設備驅動的數據傳輸
15.4.3Linux的i2cdev.c文件分析
15.5TegraI2C總線驅動實例
15.6AT24xxEEPROM的I2C設備驅動實例
15.7總結
6章USB主機、設備與Gadget驅動
16.1LinuxUSB驅動層次
16.1.1主機側與設備側USB驅動
16.1.2設備、配置、接口、端點
16.2USB主機控制器驅動
16.2.1USB主機控制器驅動的整體結構
16.2.2實例:ChipideaUSB主機驅動
16.3USB設備驅動
16.3.1USB設備驅動的整體結構
16.3.2USB請求塊
16.3.3探測和斷開函數
16.3.4USB骨架程序
16.3.5實例:USB鍵盤驅動
16.4USBUDC與Gadget驅動
16.4.1UDC和Gadget驅動的關鍵數據結構與API
16.4.2實例:ChipideaUSBUDC驅動
16.4.3實例:LoopbackFunction驅動
16.5USBOTG驅動
16.6總結
7章I2C、SPI、USB驅動架構類比
17.1I2C、SPI、USB驅動架構
17.2I2C主機和外設眼裡的Linux世界
8章ARMLinux設備樹
18.1ARM設備樹起源
18.2設備樹的組成和結構
18.2.1DTS、DTC和DTB等
18.2.2根節點兼容性
18.2.3設備節點兼容性
18.2.4設備節點及label的命名
18.2.5地址編碼
18.2.6中斷連接
18.2.7GPIO、時鐘、pinmux連接
18.3由設備樹引發的BSP和驅動變更
18.4常用的OFAPI
18.5總結
9章Linux電源管理的繫統架構和驅動
19.1Linux電源管理的全局架構
19.2CPUFreq驅動
19.2.1SoC的CPUFreq驅動實現
19.2.2CPUFreq的策略
19.2.3CPUFreq的性能測試和調優
19.2.4CPUFreq通知
19.3CPUIdle驅動
19.4PowerTop
19.5Regulator驅動
19.6OPP
19.7PMQoS
19.8CPU熱插撥
19.9掛起到RAM
19.10運行時的PM
19.11總結
第20章Linux芯片級移植及底層驅動
20.1ARMLinux底層驅動的組成和現狀
20.2內核節拍驅動
20.3中斷控制器驅動
20.4SMP多核啟動以及CPU熱插撥驅動
20.5DEBUG_LL和EARLY_PRINTK的設置
20.6GPIO驅動
20.7pinctrl驅動
20.8時鐘驅動
20.9dmaengine驅動
20.10總結
第21章Linux設備驅動的調試
21.1GDB調試器的用法
21.1.1GDB的基本用法
21.1.2DDD圖形界面調試工具
21.2Linux內核調試
21.3內核打印信息--printk()
21.4DEBUG_LL和EARLY_PRINTK
21.5使用“/proc”
21.6Oops
21.7BUG_ON()和WARN_ON()
21.8strace
21.9KGDB
21.10使用仿真器調試內核
21.11應用程序調試
21.12Linux性能監控與調優工具
21.13總結
內容簡介
對於嵌入式工程師來說,進入更高階段後,學習Linux設備驅動開發無疑就是職業生涯的一次“重生”。這是因為Linux設備驅動開發不僅僅涉及操作繫統的轉換,開發方式的轉換,更重要的是思維上的轉變。對於Linux這樣一個復雜繫統,如何從復雜的代碼中抓住設備驅動開發的關鍵是任何一個Linux設備驅動開發者入門時需要面對的挑戰。除了知識、工具之外,往往還需要思路上的指導。宋寶華編著的《Linux設備驅動開發詳解》不但幫助Linux設備驅動開發的初學者釐清必要的概念,還從具體的實例、設備驅動開發的指導原則循序漸進地引導讀者漸入學習佳境。為了讓讀者能夠達到Linux設備驅動開發的至臻境界,作者更是從軟件工程的角度抽像出設備驅動開發的一般思想。毫無疑問,本書將成為讀者學習Unux設備驅動開發過程中的一座“燈塔”。
前??言Linux從未停歇前進的腳步。Linus Torvalds,世界上最偉大的程序員之一,Linux內核的創始人,Git的締造者,現在仍然在沒日沒夜地合並補丁、升級內核。做技術的人,從來沒有終南捷徑,拼得就是坐冷板凳的傻勁。 這是一個連閱讀都被碎片化的時代,在這樣一個時代,人們趨向於激進、浮躁,內心的不安寧使我們極難靜下心來研究什麼。我見過許多Linux工程師,他們的簡歷上寫著“精通”Linux內核,有多年的工作經驗,而他們的“精通”卻隻是把某個寄存器從0改成1,從1改成0的不斷重復;我也見過許多Linux工程師,他們終日埋頭苦干,敲打著自己的機器和電路板,卻從未冷靜下來思考,並不斷重構和升華自己的知識體繫。 這是要把“牢底”坐穿的程序員,這樣“忙忙碌碌”的程序員,從來都不算是好程序員。 對於優秀的程序員,其最優秀的品質是能夠心平氣和地學習與思考問題,透析代碼背......
"