內容簡介
隨著半導體技術和晶片技術的飛速發展,能運行嵌入式?Linux系統的?MPU?晶片價格也在不斷降低,ARM?架構?的晶片在手機、工業控制、物聯網、自動駕駛等領域得到了廣泛套用。以前大量使用?MCU?的地方也開始使用嵌入式?Linux地系鐵統刷。卡的閘機、汽車充電樁的操作面板、物聯網網關等都有嵌入式?Linux的身影,各企業對嵌入式?Linux開發?人才的需求也急劇增加。相比單片機開發,嵌入式?Linux開發難度要大很多。尤其是最重要的驅動開發,嵌入式?Linux核心採用面向對象思路設計,且已開發大量驅動框架,開發人員需要掌握這些驅動框架的使用,編寫出符合嵌?入式?Linux要求的驅動。?本書從最基本的點燈程式到網路驅動的編寫,涵蓋了?Linux開發的三大驅動類型:字元設備驅動、塊設備驅動?和網路設備驅動。本書的一大特色就是涵蓋了全設備樹開發,除了最開始的幾個為了講解嵌入式?Linux如何操作?晶片暫存器的例程沒有採用設備樹外,其他的例程都採用設備樹,基本涵蓋了嵌入式?Linux驅?動?開?發?中?的?常?用?外設。本書可作為廣大從事嵌入式開發、物聯網、工業控制開發等工程技術人員的學習和參考用書,也可作為高等學?校計算機、電子、自動化等專業嵌入式系統、微機接口、物聯網等課程的教材。
圖書目錄
目錄
第四篇ARM Linux驅動開發篇
第1章字元設備驅動開發
1.1字元設備驅動簡介
1.2字元設備驅動開發步驟
1.2.1驅動模組的載入和卸載
1.2.2字元設備註冊與註銷
1.2.3實現設備的具體操作函式
1.2.4添加LICENSE和作者信息
1.3Linux設備號
1.3.1設備號的組成
1.3.2設備號的分配
1.4chrdevbase字元設備驅動開發實驗
1.4.1實驗程式編寫
1.4.2編寫測試App
1.4.3編譯驅動程式和測試App
1.4.4運行測試
第2章嵌入式Linux LED燈驅動開發實驗
2.1Linux下LED燈驅動原理
2.1.1地址映射
2.1.2I/O記憶體訪問函式
2.2硬體原理圖分析
2.3實驗程式編寫
2.3.1LED燈驅動程式編寫
2.3.2編寫測試App
2.4運行測試
2.4.1編譯驅動程式和測試App
2.4.2運行測試
第3章新字元設備驅動實驗
3.1新字元設備驅動原理
3.1.1分配和釋放設備號
3.1.2新的字元設備註冊方法
3.2自動創建設備節點
3.2.1mdev機制
3.2.2創建和刪除類
3.2.3創建設備
3.2.4參考示例
3.3設定檔案私有數據
3.4硬體原理圖分析
3.5實驗程式編寫
3.5.1LED燈驅動程式編寫
3.5.2編寫測試App
3.6運行測試
3.6.1編譯驅動程式和測試App
3.6.2運行測試
第4章Linux設備樹
4.1什麼是設備樹
4.2DTS、DTB和DTC
4.3DTS語法
4.3.1.dtsi頭檔案
4.3.2設備節點
4.3.3標準屬性
4.3.4根節點compatible屬性
4.3.5向節點追加或修改內容
4.4創建小型模板設備樹
4.5設備樹在系統中的體現
4.6特殊節點
4.6.1aliases子節點
4.6.2chosen子節點
4.7Linux核心解析DTB檔案
4.8綁定信息文檔
4.9設備樹常用OF操作函式
4.9.1查找節點的OF函式
4.9.2查找父/子節點的OF函式
4.9.3提取屬性值的OF函式
4.9.4其他常用的OF函式
第5章設備樹下的LED燈驅動實驗
5.1設備樹LED驅動原理
5.2硬體原理圖分析
5.3實驗程式編寫
5.3.1修改設備樹檔案
5.3.2LED燈驅動程式編寫
5.3.3編寫測試App
5.4運行測試
5.4.1編譯驅動程式和測試App
5.4.2運行測試
第6章pinctrl和gpio子系統實驗
6.1pinctrl子系統
6.1.1pinctrl子系統簡介
6.1.2I.MX6ULL的pinctrl子系統驅動
6.1.3設備樹中添加pinctrl節點模板
6.2gpio子系統
6.2.1gpio子系統簡介
6.2.2I.MX6ULL的gpio子系統驅動
6.2.3gpio子系統API函式
6.2.4設備樹中添加gpio節點模板
6.2.5與GPIO相關的OF函式
6.3硬體原理圖分析
6.4實驗程式編寫
6.4.1修改設備樹檔案
6.4.2LED燈驅動程式編寫
6.4.3編寫測試App
6.5運行測試
6.5.1編譯驅動程式和測試App
6.5.2運行測試
第7章Linux蜂鳴器實驗
7.1蜂鳴器驅動原理
7.2硬體原理圖分析
7.3實驗程式編寫
7.3.1修改設備樹檔案
7.3.2蜂鳴器驅動程式編寫
7.3.3編寫測試App
7.4運行測試
7.4.1編譯驅動程式和測試App
7.4.2運行測試
第8章Linux並發與競爭
8.1並發與競爭
8.2原子操作
8.2.1原子操作簡介
8.2.2原子整型數據操作API函式
8.2.3原子位操作API函式
8.3自旋鎖
8.3.1自旋鎖簡介
8.3.2自旋鎖API函式
8.3.3其他類型的鎖
8.3.4自旋鎖使用注意事項
8.4信號量
8.4.1信號量簡介
8.4.2信號量API函式
8.5互斥體
8.5.1互斥體簡介
8.5.2互斥體API函式
第9章Linux並發與競爭實驗
9.1原子操作實驗
9.1.1實驗程式編寫
9.1.2運行測試
9.2自旋鎖實驗
9.2.1實驗程式編寫
9.2.2運行測試
9.3信號量實驗
9.3.1實驗程式編寫
9.3.2運行測試
9.4互斥體實驗
9.4.1實驗程式編寫
9.4.2運行測試
第10章Linux按鍵輸入實驗
10.1Linux下按鍵驅動原理
10.2硬體原理圖分析
10.3實驗程式編寫
10.3.1修改設備樹檔案
10.3.2按鍵驅動程式編寫
10.3.3編寫測試App
10.4運行測試
10.4.1編譯驅動程式和測試App
10.4.2運行測試
第11章Linux核心定時器實驗
11.1Linux時間管理和核心定時器簡介
11.1.1核心時間管理簡介
11.1.2核心定時器簡介
11.1.3Linux核心短延時函式
11.2硬體原理圖分析
11.3實驗程式編寫
11.3.1修改設備樹檔案
11.3.2定時器驅動程式編寫
11.3.3編寫測試App
11.4運行測試
11.4.1編譯驅動程式和測試App
11.4.2運行測試
第12章Linux中斷實驗
12.1Linux中斷簡介
12.1.1Linux中斷API函式
12.1.2上半部與下半部
12.1.3設備樹中斷信息節點
12.1.4獲取中斷號
12.2硬體原理圖分析
12.3實驗程式編寫
12.3.1修改設備樹檔案
12.3.2按鍵中斷驅動程式編寫
12.3.3編寫測試App
12.4運行測試
12.4.1編譯驅動程式和測試App
12.4.2運行測試
第13章Linux阻塞和非阻塞I/O實驗
13.1阻塞和非阻塞I/O
13.1.1阻塞和非阻塞簡介
13.1.2等待佇列
13.1.3輪詢
13.1.4Linux驅動下的poll操作函式
13.2阻塞I/O實驗
13.2.1硬體原理圖分析
13.2.2實驗程式編寫
13.2.3運行測試
13.3非阻塞I/O實驗
13.3.1硬體原理圖分析
13.3.2實驗程式編寫
13.3.3運行測試
第14章異步通知實驗
14.1異步通知
14.1.1異步通知簡介
14.1.2驅動中的信號處理
14.1.3應用程式對異步通知的處理
14.2硬體原理圖分析
14.3實驗程式編寫
14.3.1修改設備樹檔案
14.3.2程式編寫
14.3.3編寫測試App
14.4運行測試
14.4.1編譯驅動程式和測試App
14.4.2運行測試
第15章platform設備驅動實驗
15.1Linux驅動的分離與分層
15.1.1驅動的分隔與分離
15.1.2驅動的分層
15.2platform平台驅動模型簡介
15.2.1platform匯流排
15.2.2platform驅動
15.2.3platform設備
15.3硬體原理圖分析
15.4實驗程式編寫
15.4.1platform設備與驅動程式編寫
15.4.2編寫測試App
15.5運行測試
15.5.1編譯驅動程式和測試App
15.5.2運行測試
第16章設備樹下的platform驅動編寫
16.1設備樹下的platform驅動簡介
16.2硬體原理圖分析
16.3實驗程式編寫
16.3.1修改設備樹檔案
16.3.2platform驅動程式編寫
16.3.3編寫測試App
16.4運行測試
16.4.1編譯驅動程式和測試App
16.4.2運行測試
第17章Linux自帶的LED燈驅動實驗
17.1Linux核心自帶LED燈驅動使能
17.2Linux核心自帶LED燈驅動簡介
17.2.1LED燈驅動框架分析
17.2.2module_platform_driver()函式簡介
17.2.3gpio_led_probe()函式簡介
17.3設備樹節點編寫
17.4運行測試
第18章Linux MISC驅動實驗
18.1MISC設備驅動簡介
18.2硬體原理圖分析
18.3實驗程式編寫
18.3.1修改設備樹
18.3.2beep驅動程式編寫
18.3.3編寫測試App
18.4運行測試
18.4.1編譯驅動程式和測試App
18.4.2運行測試
第19章Linux input子系統實驗
19.1input子系統
19.1.1input子系統簡介
19.1.2input驅動編寫流程
19.1.3input_event結構體
19.2硬體原理圖分析
19.3實驗程式編寫
19.3.1修改設備樹檔案
19.3.2按鍵input驅動程式編寫
19.3.3編寫測試App
19.4運行測試
19.4.1編譯驅動程式和測試App
19.4.2運行測試
19.5Linux自帶按鍵驅動程式的使用
19.5.1自帶按鍵驅動程式源碼簡介
19.5.2自帶按鍵驅動程式的使用
第20章Linux PWM驅動實驗
20.1PWM驅動簡介
20.1.1設備樹下的PWM控制器節點
20.1.2PWM子系統
20.1.3PWM驅動源碼分析
20.2PWM驅動編寫
20.2.1修改設備樹
20.2.2使能PWM驅動
20.3PWM驅動測試
第21章Linux LCD驅動實驗
21.1Linux下LCD驅動簡介
21.1.1Framebuffer設備
21.1.2LCD驅動簡介
21.2硬體原理圖分析
21.3LCD驅動程式編寫
21.3.1修改設備樹
21.3.2LCD螢幕背光節點信息
21.4運行測試
21.4.1LCD螢幕基本測試
21.4.2設定LCD作為終端控制台
21.4.3LCD背光調節
21.4.4LCD自動關閉解決方法
第22章Linux RTC驅動實驗
22.1Linux核心RTC驅動簡介
22.2I.MX6U內部RTC驅動分析
22.3RTC時間查看與設定
第23章Linux I2C驅動實驗
23.1Linux I2C驅動框架簡介
23.1.1I2C匯流排驅動
23.1.2I2C設備驅動
23.1.3I2C設備和驅動匹配過程
23.2I.MX6U的I2C適配器驅動分析
23.3I2C設備驅動編寫流程
23.3.1I2C設備信息描述
23.3.2I2C設備數據收發處理流程
23.4硬體原理圖分析
23.5實驗程式編寫
23.5.1修改設備樹
23.5.2AP3216C驅動編寫
23.5.3編寫測試App
23.6運行測試
23.6.1編譯驅動程式和測試App
23.6.2運行測試
第24章Linux SPI驅動實驗
24.1Linux下SPI驅動框架簡介
24.1.1SPI主機驅動
24.1.2SPI設備驅動
24.1.3SPI設備和驅動匹配過程
24.2I.MX6U SPI主機驅動分析
24.3SPI設備驅動編寫流程
24.3.1SPI設備信息描述
24.3.2SPI設備數據收發處理流程
24.4硬體原理圖分析
24.5實驗程式編寫
24.5.1修改設備樹
24.5.2編寫ICM20608驅動
24.5.3編寫測試App
24.6運行測試
24.6.1編譯驅動程式和測試App
24.6.2運行測試
第25章Linux RS232/485/GPS驅動實驗
25.1Linux下UART驅動框架
25.2I.MX6U UART驅動分析
25.3硬體原理圖分析
25.4RS232驅動編寫
25.5移植minicom
25.6RS232驅動測試
25.6.1RS232連線設定
25.6.2minicom設定
25.6.3RS232收發測試
25.7RS485測試
25.7.1RS485連線設定
25.7.2RS485收發測試
25.8GPS測試
25.8.1GPS連線設定
25.8.2GPS數據接收測試
第26章Linux 多點電容觸控螢幕實驗
26.1Linux下電容觸控螢幕驅動框架簡介
26.1.1多點觸摸協定詳解
26.1.2Type A觸摸點信息上報時序
26.1.3Type B觸摸點信息上報時序
26.1.4MT其他事件的使用
26.1.5多點觸摸使用的API函式
26.1.6多點電容觸控螢幕驅動框架
26.2硬體原理圖分析
26.3實驗程式編寫
26.3.1修改設備樹
26.3.2編寫多點電容觸控螢幕驅動
26.4運行測試
26.4.1編譯驅動程式
26.4.2運行測試
26.4.3將驅動添加到核心中
26.5tslib移植與使用
26.5.1tslib移植
26.5.2tslib測試
26.6使用核心自帶的驅動
第27章RGB轉HDMI實驗
27.1RGB轉HMDI簡介
27.2硬體原理圖分析
27.3實驗驅動編寫
27.3.1修改設備樹
27.3.2使能核心自帶的sii902x驅動
27.3.3修改sii902x驅動
27.4RGB轉HDMI測試
第28章Linux音頻驅動實驗
28.1音頻接口簡介
28.1.1為何需要音頻編解碼晶片
28.1.2WM8960簡介
28.1.3I2S匯流排接口
28.1.4I.MX6ULL SAI簡介
28.2硬體原理圖分析
28.3音頻驅動使能
28.3.1修改設備樹
28.3.2使能核心的WM8960驅動
28.4alsalib和alsautils移植
28.4.1alsalib移植
28.4.2alsautils移植
28.5音效卡設定與測試
28.5.1amixer的使用方法
28.5.2音樂播放測試
28.5.3MIC錄音測試
28.5.4Line_in錄音測試
28.6開機自動配置音效卡
28.7alsamixer簡介
第29章Linux CAN驅動實驗
29.1CAN協定簡介
29.1.1何為CAN
29.1.2CAN電氣屬性
29.1.3CAN協定
29.1.4CAN速率
29.1.5I.MX6ULL FlexCAN簡介
29.2硬體原理圖分析
29.3實驗程式編寫
29.3.1修改設備樹
29.3.2使能Linux核心自帶的FlexCAN驅動
29.4FlexCAN測試
29.4.1檢查CAN網卡設備是否存在
29.4.2移植iproute2
29.4.3移植canutils工具
29.4.4CAN通信測試
第30章Linux USB驅動實驗
30.1USB接口簡介
30.1.1什麼是USB
30.1.2USB電氣特性
30.1.3USB拓撲結構
30.1.4什麼是USB OTG
30.1.5I.MX6ULL USB接口簡介
30.2硬體原理圖分析
30.2.1USB HUB原理圖分析
30.2.2USB OTG原理圖分析
30.3USB協定簡介
30.3.1USB描述符
30.3.3USB數據包類型
30.3.4USB傳輸類型
30.3.5USB枚舉
30.4Linux核心自帶HOST實驗
30.4.1USB滑鼠鍵盤測試
30.4.2隨身碟實驗
30.5Linux核心自帶USB OTG實驗
30.5.1修改設備樹
30.5.2OTG主機實驗
30.5.3OTG從機實驗
第31章regmap API實驗
31.1regmap API簡介
31.1.1什麼是regmap
31.1.2regmap驅動框架
31.1.3regmap操作函式
31.1.4regmap_config掩碼設定
31.2實驗程式編寫
31.3運行測試
第32章Linux IIO驅動實驗
32.1IIO子系統簡介
32.1.1iio_dev
32.1.2iio_info
32.1.3iio_chan_spec
32.2IIO驅動框架創建
32.2.1基礎驅動框架建立
32.2.2IIO設備申請與初始化
32.3實驗程式編寫
32.3.1使能核心IIO相關配置
32.3.2ICM20608的IIO驅動框架搭建
32.3.3完善icm20608_read_raw()函式
32.3.4完善icm20608_write_raw()函式
32.4測試應用程式編寫
32.4.1Linux檔案流讀取
32.4.2編寫測試App
32.4.3運行測試
第33章Linux ADC驅動實驗
33.1ADC簡介
33.2ADC驅動源碼簡介
33.2.1設備樹下的ADC節點
33.2.2ADC驅動源碼分析
33.3硬體原理圖分析
33.4ADC驅動編寫
33.4.1修改設備樹
33.4.2使能ADC驅動
33.4.3編寫測試App
33.5運行測試
33.5.1編譯驅動程式和測試App
33.5.2運行測試
第34章Linux 塊設備驅動實驗
34.1什麼是塊設備
34.2塊設備驅動框架
34.2.1block_device結構體
34.2.2gendisk結構體
34.2.3block_device_operations結構體
34.2.4塊設備I/O請求過程
34.3使用請求佇列實驗
34.3.1實驗程式編寫
34.3.2運行測試
34.4不使用請求佇列實驗
34.4.1實驗程式編寫
34.4.2運行測試
第35章Linux 網路驅動實驗
35.1嵌入式網路簡介
35.1.1嵌入式下的網路硬體接口
35.1.2MII/RMII接口
35.1.3MDIO接口
35.1.4RJ45接口
35.1.5I.MX6ULL ENET接口簡介
35.2PHY晶片詳解
35.2.1PHY基礎知識簡介
35.2.2LAN8720A詳解
35.3Linux核心網路驅動框架
35.3.1net_device結構體
35.3.2net_device_ops結構體
35.3.3sk_buff結構體
35.3.4網路NAPI處理機制
35.4I.MX6ULL網路驅動簡介
35.4.1I.MX6ULL網路外設設備樹
35.4.2I.MX6ULL網路驅動源碼簡介
35.4.3fec_netdev_ops操作集
35.4.4Linux核心PHY子系統與MDIO匯流排簡介
35.5網路驅動實驗測試
35.5.1LAN8720 PHY驅動測試
35.5.2通用PHY驅動測試
35.5.3DHCP功能配置
第36章Linux WiFi驅動實驗
36.1WiFi驅動添加與編譯
36.1.1向Linux核心添加WiFi驅動
36.1.2配置Linux核心
36.1.3編譯WiFi驅動
36.1.4驅動載入測試
36.2wireless tools工具移植與測試
36.2.1wireless tools移植
36.2.2wireless tools工具測試
36.3wpa_supplicant移植
36.3.1openssl移植
36.3.2libnl庫移植
36.3.3wpa_supplicant移植
36.4WiFi聯網測試
36.4.1RTL8188 USB WiFi聯網測試
36.4.2RTL8189 SDIO WiFi聯網測試
第37章Linux 4G通信實驗
37.14G網路連線簡介
37.2高新興ME3630 4G模組實驗
37.2.1ME3630 4G模組簡介
37.2.2ME3630 4G模組驅動修改
37.2.3ME3630 4G模組ppp聯網測試
37.2.4ME3630 4G模組ECM聯網測試
37.2.5ME3630 4G模組GNSS定位測試
37.3EC20 4G模組實驗
37.3.1EC20 4G模組簡介
37.3.2EC20 4G模組驅動修改
37.3.3quectelCM移植
37.3.4EC20上網測試