【豐富實驗內容】
【完整Linux系統燒錄】→嵌入式Linux開發環境架設、CortexA7架構及ARM組合語言
→MX6U、STM32之LED燈、啟動方式
→C語言版本LED燈、STM32驅動開發
→SDK移植、BSP專案管理、蜂嗚器、按鍵輸入實驗
→主頻和時脈設定、GPI中斷實驗、EPIT計時、高精度延遲時間
→UART及序列埠格式移植、DDR3實驗
→RGB LCD顯示、RTC即時時脈、I2C實驗、SPI實驗
→多點電容觸控式螢實驗,LCD背光調節、ADC實驗
→u-boot使用、Makefile詳解、啟動流程、u-boot移植、圖形化原理
→Linux Makefile詳解、核心啟動流程、核心移植
→Linux root檔案系統建置(BusyBox)
本書一共分兩篇,每篇對應一個不同的階段。第一篇主要是基本常識及最重要的裸機開發,從本篇正式開始開發板的學習。透過數十個裸機常式來幫助讀者了解I.MX6ULL這顆CPU,為以後的Linux驅動開發做準備。讀者可以掌握在Ubuntu下進行ARM開發的方法。第二篇則是系統移植,講解如何將uboot、Linux和root檔案系統移植到開發板上,為後面的Linux驅動開發做準備。把uboot、Linux核心和root檔案系統都在開發板上移植好以後,就可以開始Linux驅動開發了。
Linux最重要的三大類驅動程式,包括字元裝置驅動、區塊裝置驅動和網路裝置驅動,本書都有完整的範例說明,是從事內嵌式Linux開發者最想看到的內容。
作者簡介:
左忠凱(左盟主)
正點原子Linux總監,十年嵌入式開發工作經驗,主要研究方向為ARM內核的MCU以及MPU的開發工作,參與多款Cortex-A/M內核芯片的研發。擁有豐富的RTOS以及嵌入式Linux開發經驗,參與編寫並出版多本嵌入式開發書籍,並且錄製了大量的嵌入式學習影片,深受廣大讀者好評。
作者序
前言
本書主要講解嵌入式Linux中的驅動開發,也會涉及裸機開發的內容,相信大部分讀者和作者經歷一樣,以前從事過微控制器開發的工作,比如51或STM32等。微控制器開發很難接觸到更高層次的系統方面的知識,用到的系統都很簡單,比如μC/OS、FreeRTOS等,這些作業系統都使用一個Kernel,如果需要網路、檔案系統、GUI等就需要開發者自行移植。而移植又是非常痛苦的一件事情,而且移植完成以後的穩定性也無法保證。即使移植成功,後續的開發工作也比較煩瑣,因為不同的元件其API操作函數都不同,沒有一個統一的標準,使用起來學習成本比較高。這時候一個功能完整的作業系統就顯得尤為重要: 具有統一的標準,提供完整的多工管理、儲存管理、裝置管理、檔案管理和網路等。Linux就是這樣一個系統,這樣的系統還有很多,比如Windows、macOS、UNIX等。本書講解Linux,而Linux開發可以分為底層驅動開發和應用程式開發,本書講解的是Linux驅動開發,主要使用過STM32導向的開發者。平心而論,如果此前只會51微控制器開發,筆者不建議直接上手Linux驅動開發,因為51微控制器和Linux驅動開發的差異太大。筆者建議在學習嵌入式Linux驅動開發之前一定要學習STM32這種Cortex-M核心的MCU,因為STM32這樣的MCU其內部資源和可以執行Linux的CPU差不多,如果會STM32,則上手Linux驅動開發就會容易很多。筆者就是此前做了4年STM32開發工作,然後轉做Linux驅動開發,整個過程比較順暢。
鑑於當前STM32非常流行,學習者多,如何幫助STM32學習者順利地轉入Linux驅動開發有以下幾點需要注意。
1) 選取合適的CPU
理論上來講,如果ST公司有可以執行的Linux的晶片那再好不過了,因為大家對STM32很熟悉,但是在撰寫本書時,ST公司尚沒有可以執行Linux的CPU。Linux驅動開發入門的CPU一定不能複雜,比如像三星的Exynos 4412、Exynos 4418等,這些CPU性能很強大,帶有GPU,支援硬體視訊解碼,可以執行Android。但是正是它們的性能過於強大,功能過於繁雜,所以不適合Linux驅動開發入門。一款外接裝置和STM32H7這樣的MCU相似的CPU就非常適合Linux入門,三星的S3C2440就非常合適,但是S3C2440早已停產了,學了以後工作上又用不到,又得學習其他的CPU,有點浪費時間。筆者花了不少時間終於找到了一款合適的CPU,那就是NXP的I.MX6ULL。I.MX6ULL就是一款可以跑Linux的STM32,外接裝置功能和STM32相似,如果此前學習過STM32,那麼會非常容易上手I.MX6ULL。而且I.MX6ULL可以正常出貨,這是一款工業級的CPU,是三星S3C2440、S3C6410產品替代的絕佳之選,學習完I.MX6ULL以後,在工作中就可以直接使用了。本書選取正點原子的I.MX6U-ALPHA開發板,其他廠商的I.MX6ULL開發板也可以參考本書。
2) 開發環境講解
STM32的開發都是在Windows系統下進行的,使用MDK或IAR這樣的整合IDE,但是嵌入式Linux驅動開發需要的主機是Linux平台的,也就是必須先在自己的電腦上安裝Linux系統。Linux系統發行版本有Ubuntu、CentOS、Fdeora、Debian等。本書使用Ubuntu作業系統。
3) 合理的裸機常式
學習嵌入式Linux驅動開發建議大家先學習裸機開發(如果學習過STM32,則可以跳過裸機學習),Linux驅動開發非常煩瑣。要想進行Linux驅動開發,必須要先移植uboot,然後移植Linux系統和root檔案系統到開發平台上。而uboot又是一個超大的裸機綜合常式,因此如果沒有學習過裸機常式,那麼uboot移植會有困難,尤其是要修改uboot程式時。STM32基本都是裸機開發,在整合IDE下撰寫程式,可以使用ST公司提供的函數庫。但是在Ubuntu下撰寫I.MX6ULL裸機常式就沒有這麼方便了,沒有MDK和IAR這樣的IDE,所有的一切都需要自己架設,本書提供了詳細的講解。本書還提供了數十個裸機常式,由淺入深,涵蓋了大部分常用的功能,比如I/O輸入輸出、中斷、序列埠、計時器、DDR、LCD、I2C等。學習完裸機常式以後就對I.MX6ULL這顆CPU非常熟悉了,再去學習Linux驅動開發就很輕鬆了。
4) uboot、Linux和root檔案系統移植
學習完裸機常式以後就是Linux驅動開發了,但是在進行Linux驅動開發之前要先在使用的開發板平台上移植好uboot、Linux和root檔案系統。這是Linux驅動開發的第一個攔路虎,因此本書和對應的視訊會著重講解uboot/Linux和root檔案系統的移植。
5) 嵌入式Linux驅動開發
當我們把uboot、Linux核心和root檔案系統都在開發板上移植好以後,就可以開始Linux驅動開發了。Linux驅動有3大類: 字元裝置驅動、區塊裝置驅動和網路裝置驅動。對於這3大類內容,本書都有詳細的講解,並且配有數十個對應的教學常式,從最簡單的點燈到最後的網路裝置驅動。
前言
本書主要講解嵌入式Linux中的驅動開發,也會涉及裸機開發的內容,相信大部分讀者和作者經歷一樣,以前從事過微控制器開發的工作,比如51或STM32等。微控制器開發很難接觸到更高層次的系統方面的知識,用到的系統都很簡單,比如μC/OS、FreeRTOS等,這些作業系統都使用一個Kernel,如果需要網路、檔案系統、GUI等就需要開發者自行移植。而移植又是非常痛苦的一件事情,而且移植完成以後的穩定性也無法保證。即使移植成功,後續的開發工作也比較煩瑣,因為不同的元件其API操作函數都不同,沒有一個統一的標準,使用起來學習成本比較...
目錄
第一篇裸機開發
第1章開發環境架設
1.1Ubuntu和Windows檔案互傳
1.2Ubuntu下NFS和SSH服務開啟
1.3Ubuntu交叉編譯工具鏈安裝
1.4Visual Studio Code軟體的安裝和使用
1.5CH340序列埠驅動安裝
1.6MobaXterm軟體安裝和使用
第2章Cortex-A7 MPCore架構
2.1Cortex-A7 MPCore簡介
2.2Cortex-A處理器執行模型
2.3Cortex-A暫存器組
第3章ARM組合語言基礎
3.1GNU組合語言語法
3.2Cortex-A7常用組合語言指令
第4章組合語言LED燈實驗
4.1I.MX6U GPIO詳解
4.2硬體原理分析
4.3實驗程式撰寫
4.4編譯、下載和驗證
第5章I.MX6U啟動方式詳解
5.1啟動方式選擇
5.2BOOT ROM初始化內容
5.3啟動裝置
5.4鏡像燒錄
第6章C語言版LED燈實驗
6.1C語言版LED燈簡介
6.2硬體原理分析
6.3實驗程式撰寫
6.4編譯、下載和驗證
第7章模仿STM32驅動開發格式實驗
7.1模仿STM32暫存器定義
7.2硬體原理分析
7.3實驗程式撰寫
7.4編譯、下載和驗證
第8章官方SDK移植實驗
8.1官方SDK移植簡介
8.2硬體原理分析
8.3實驗程式撰寫
8.4編譯、下載和驗證
第9章BSP專案管理實驗
9.1BSP專案管理簡介
9.2硬體原理分析
9.3實驗程式撰寫
9.4編譯、下載和驗證
第10章蜂鳴器實驗
10.1主動蜂鳴器簡介
10.2硬體原理分析
10.3實驗程式撰寫
10.4編譯、下載和驗證
第11章按鍵輸入實驗
11.1按鍵輸入簡介
11.2硬體原理分析
11.3實驗程式撰寫
11.4編譯、下載和驗證
第12章主頻和時脈設定實驗
12.1I.MX6ULL時脈系統詳解
12.2硬體原理分析
12.3實驗程式撰寫
12.4編譯、下載和驗證
第13章GPIO中斷實驗
13.1Cortex-A7中斷系統詳解
13.2硬體原理分析
13.3實驗程式撰寫
13.4編譯、下載和驗證
第14章EPIT計時器實驗
14.1EPIT計時器簡介
14.2硬體原理分析
14.3實驗程式撰寫
14.4編譯、下載和驗證
第15章計時器按鍵消抖實驗
15.1計時器按鍵消抖簡介
15.2硬體原理分析
15.3實驗程式撰寫
15.4編譯、下載和驗證
第16章高精度延遲時間實驗
16.1高精度延遲時間簡介
16.2硬體原理分析
16.3實驗程式撰寫
16.4編譯、下載和驗證
第17章UART序列埠通訊實驗
17.1I.MX6ULL序列埠通訊簡介
17.2硬體原理分析
17.3實驗程式撰寫
17.4編譯、下載和驗證
第18章序列埠格式化函數移植實驗
18.1序列埠格式化函數移植簡介
18.2硬體原理分析
18.3實驗程式撰寫
18.4編譯、下載和驗證
第19章DDR3實驗
19.1DDR3記憶體簡介
19.2DDR3關鍵時間參數
19.3I.MX6ULL MMDC控制器簡介
19.4ALPHA開發板DDR3L原理圖
19.5DDR3L初始化與測試
第20章RGB LCD顯示實驗
20.1LCD和eLCDIF簡介
20.2硬體原理分析
20.3實驗程式撰寫
20.4編譯、下載和驗證
第21章RTC即時時脈實驗
21.1I.MX6ULL RTC即時時脈簡介
21.2硬體原理分析
21.3實驗程式撰寫
21.4編譯、下載和驗證
第22章I2C實驗
22.1I2C和AP3216C簡介
22.2硬體原理分析
22.3實驗程式撰寫
22.4編譯、下載和驗證
第23章SPI實驗
23.1SPI & ICM-20608簡介
23.2硬體原理分析
23.3實驗程式撰寫
23.4編譯、下載和驗證
第24章多點電容觸控式螢幕實驗
24.1多點電容觸控式螢幕簡介
24.2硬體原理分析
24.3實驗程式撰寫
24.4編譯、下載和驗證
第25章LCD背光調節實驗
25.1LCD背光調節簡介
25.2硬體原理分析
25.3實驗程式撰寫
25.4編譯、下載和驗證
第26章ADC實驗
26.1ADC簡介
26.2硬體原理分析
26.3實驗程式撰寫
26.4編譯、下載和驗證
第二篇系統移植
第27章U-Boot使用實驗
27.1U-Boot簡介
27.2U-Boot初次編譯
27.3U-Boot燒錄與啟動
27.4U-Boot命令使用
第28章U-Boot頂層Makefile詳解
28.1U-Boot專案目錄分析
28.2VSCode專案建立
28.3U-Boot頂層Makefile分析
第29章U-Boot啟動流程詳解
29.1連結指令稿u-boot.lds詳解
29.2U-Boot啟動流程解析
29.3bootz啟動Linux核心過程
第30章U-Boot移植
30.1NXP官方開發板uboot編譯測試
30.2在U-Boot中增加自己的開發板
30.3bootcmd和bootargs環境變數
30.4uboot啟動Linux測試
第31章U-Boot圖形化設定及其原理
31.1U-Boot圖形化設定體驗
31.2menuconfig圖形化設定原理
31.3增加自訂選單
第32章Linux核心頂層Makefile詳解
32.1Linux核心獲取
32.2Linux核心初次編譯
32.3Linux專案目錄分析
32.4VSCode專案建立
32.5頂層Makefile詳解
第33章Linux核心啟動流程
33.1連結指令稿vmlinux.lds
33.2Linux核心啟動流程分析
第34章Linux核心移植
34.1建立VSCode專案
34.2NXP官方開發板Linux核心編譯
34.3在Linux中增加自己的開發板
34.4CPU主頻和網路驅動修改
第35章root檔案系統建構
35.1root檔案系統簡介
35.2BusyBox建構root檔案系統
35.3root檔案系統初步測試
35.4完善root檔案系統
35.5root檔案系統其他功能測試
第36章系統燒錄
36.1MfgTool工具簡介
36.2MfgTool工作原理簡介
36.3燒錄NXP官方系統
36.4燒錄自製的系統
36.5改造自己的燒錄工具
第一篇裸機開發
第1章開發環境架設
1.1Ubuntu和Windows檔案互傳
1.2Ubuntu下NFS和SSH服務開啟
1.3Ubuntu交叉編譯工具鏈安裝
1.4Visual Studio Code軟體的安裝和使用
1.5CH340序列埠驅動安裝
1.6MobaXterm軟體安裝和使用
第2章Cortex-A7 MPCore架構
2.1Cortex-A7 MPCore簡介
2.2Cortex-A處理器執行模型
2.3Cortex-A暫存器組
第3章ARM組合語言基礎
3.1GNU組合語言語法
3.2Cortex-A7常用組合語言指令
第4章組合語言LED燈實驗
4.1I.MX6U GPIO詳解
4.2硬體原理分析
4.3實驗程式撰寫
4.4編譯、下載和驗證
第5章I....