3dwoo大學簡體電腦書店
原子嵌入式Linux驅動開發詳解
( 簡體 字)
作者:左忠凱類別:1. -> 作業系統 -> Linux
出版社:清華大學出版社原子嵌入式Linux驅動開發詳解 3dWoo書號: 56001
詢問書籍請說出此書號!
缺書
NT售價: 845
出版日:8/1/2022
頁數:720
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787302613824 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第一篇Ubuntu操作系統入門
(掃描封底“本書資源”二維碼獲取)
第二篇裸機開發
第1章開發環境搭建
1.1Ubuntu和Windows文件互傳
1.2Ubuntu下NFS和SSH服務開啟
1.2.1NFS服務開啟
1.2.2SSH服務開啟
1.3Ubuntu交叉編譯工具鏈安裝
1.3.1交叉編譯器安裝
1.3.2安裝相關庫
1.3.3交叉編譯器驗證
1.4VisualStudioCode軟件的安裝和使用
1.4.1VisualStudioCode軟件的安裝
1.4.2VisualStudioCode插件的安裝
1.4.3VisualStudioCode新建工程
1.5CH340串口驅動安裝
1.6MobaXterm軟件安裝和使用
1.6.1MobaXterm軟件安裝
1.6.2MobaXterm軟件使用
第2章CortexA7MPCore架構
2.1CortexA7MPCore簡介
2.2CortexA處理器運行模型
2.3CortexA寄存器組
2.3.1通用寄存器
2.3.2程序狀態寄存器
第3章ARM匯編基礎
3.1GNU匯編語法
3.2CortexA7常用匯編指令
3.2.1處理器內部數據傳輸指令
3.2.2存儲器訪問指令
3.2.3壓棧和出棧指令
3.2.4跳轉指令
3.2.5算術運算指令
3.2.6邏輯運算指令



第4章匯編LED燈實驗
4.1I.MX6UGPIO詳解
4.1.1STM32GPIO回顧
4.1.2I.MX6ULLI/O命名
4.1.3I.MX6ULLI/O復用
4.1.4I.MX6ULLI/O配置
4.1.5I.MX6ULLGPIO配置
4.1.6I.MX6ULLGPIO時鐘使能
4.2硬件原理分析
4.3實驗程序編寫
4.4編譯、下載和驗證
4.4.1編譯代碼
4.4.2創建Makefile文件
4.4.3代碼燒寫
4.4.4代碼驗證
第5章I.MX6U啟動方式詳解
5.1啟動方式選擇
5.1.1串行下載
5.1.2內部BOOT模式
5.2BOOTROM初始化內容
5.3啟動設備
5.4鏡像燒寫
5.4.1IVT和BootData
5.4.2DCD數據
第6章C語言版LED燈實驗
6.1C語言版LED燈簡介
6.2硬件原理分析
6.3實驗程序編寫
6.3.1匯編部分實驗程序編寫
6.3.2C語言部分實驗程序編寫
6.4編譯、下載和驗證
6.4.1編寫Makefile
6.4.2鏈接腳本
6.4.3修改Makefile
6.4.4下載和驗證
第7章模仿STM32驅動開發格式實驗
7.1模仿STM32寄存器定義
7.1.1STM32寄存器定義簡介
7.1.2I.MX6ULL寄存器定義
7.2硬件原理分析
7.3實驗程序編寫
7.4編譯、下載和驗證
7.4.1編寫Makefile和鏈接腳本
7.4.2編譯和下載
第8章官方SDK移植實驗
8.1官方SDK移植簡介
8.2硬件原理分析
8.3實驗程序編寫
8.3.1SDK文件移植
8.3.2創建cc.h文件
8.3.3編寫實驗代碼
8.4編譯、下載和驗證
8.4.1編寫Makefile和鏈接腳本
8.4.2編譯和下載
第9章BSP工程管理實驗
9.1BSP工程管理簡介
9.2硬件原理分析
9.3實驗程序編寫
9.3.1創建imx6ul.h文件
9.3.2編寫led驅動代碼
9.3.3編寫時鐘驅動代碼
9.3.4編寫延時驅動代碼
9.3.5修改main.c文件
9.4編譯、下載和驗證
9.4.1編寫Makefile和鏈接腳本
9.4.2編譯和下載
第10章蜂鳴器實驗
10.1有源蜂鳴器簡介
10.2硬件原理分析
10.3實驗程序編寫
10.4編譯、下載和驗證
10.4.1編寫Makefile和鏈接腳本
10.4.2編譯和下載
第11章按鍵輸入實驗
11.1按鍵輸入簡介
11.2硬件原理分析
11.3實驗程序編寫
11.4編譯、下載和驗證
11.4.1編寫Makefile和鏈接腳本
11.4.2編譯和下載
第12章主頻和時鐘配置實驗
12.1I.MX6ULL時鐘系統詳解
12.1.1系統時鐘來源
12.1.27路PLL時鐘源
12.1.3時鐘樹簡介
12.1.4內核時鐘設置
12.1.5PFD時鐘設置
12.1.6AHB、IPG和PERCLK根時鐘設置
12.2硬件原理分析
12.3實驗程序編寫
12.4編譯、下載和驗證
12.4.1編寫Makefile和鏈接腳本
12.4.2編譯和下載
第13章GPIO中斷實驗
13.1CortexA7中斷系統詳解
13.1.1STM32中斷系統回顧
13.1.2CortexA7中斷系統簡介
13.1.3GIC控制器簡介
13.1.4CP15協處理器
13.1.5中斷使能
13.1.6中斷優先級設置
13.2硬件原理分析
13.3實驗程序編寫
13.3.1移植SDK包中斷相關文件
13.3.2重新編寫start.s文件
13.3.3通用中斷驅動文件編寫
13.3.4修改GPIO驅動文件
13.3.5按鍵中斷驅動文件編寫
13.3.6編寫main.c文件
13.4編譯、下載和驗證
13.4.1編寫Makefile和鏈接腳本
13.4.2編譯和下載
第14章EPIT定時器實驗
14.1EPIT定時器簡介
14.2硬件原理分析
14.3實驗程序編寫
14.4編譯、下載和驗證
14.4.1編寫Makefile和鏈接腳本
14.4.2編譯和下載
第15章定時器按鍵消抖實驗
15.1定時器按鍵消抖簡介
15.2硬件原理分析
15.3實驗程序編寫
15.4編譯、下載和驗證
15.4.1編寫Makefile和鏈接腳本
15.4.2編譯和下載
第16章高精度延時實驗
16.1高精度延時簡介
16.1.1GPT定時器簡介
16.1.2定時器實現高精度延時原理
16.2硬件原理分析
16.3實驗程序編寫
16.4編譯、下載和驗證
16.4.1編寫Makefile和鏈接腳本
16.4.2編譯和下載
第17章UART串口通信實驗
17.1I.MX6ULL串口通信簡介
17.1.1UART簡介
17.1.2I.MX6ULLUART簡介
17.2硬件原理分析
17.3實驗程序編寫
17.4編譯、下載和驗證
17.4.1編寫Makefile和鏈接腳本
17.4.2編譯和下載
第18章串口格式化函數移植實驗
18.1串口格式化函數移植簡介
18.2硬件原理分析
18.3實驗程序編寫
18.4編譯、下載和驗證
18.4.1編寫Makefile和鏈接腳本
18.4.2編譯和下載
第19章DDR3實驗
19.1DDR3內存簡介
19.1.1何為RAM和ROM
19.1.2SRAM簡介
19.1.3SDRAM簡介
19.1.4DDR簡介
19.2DDR3關鍵時間參數
19.3I.MX6ULLMMDC控制器簡介
19.3.1MMDC控制器
19.3.2MMDC控制器信號引腳
19.3.3MMDC控制器時鐘源
19.4ALPHA開發板DDR3L原理圖
19.5DDR3L初始化與測試
19.5.1ddr_stress_tester簡介
19.5.2DDR3L驅動配置
19.5.3DDR3L校準
19.5.4DDR3L超頻測試
19.5.5DDR3L驅動總結
第20章RGBLCD顯示實驗
20.1LCD和eLCDIF簡介
20.1.1LCD簡介
20.1.2eLCDIF接口簡介
20.2硬件原理分析
20.3實驗程序編寫
20.4編譯、下載和驗證
20.4.1編寫Makefile和鏈接腳本
20.4.2編譯和下載
第21章RTC實時時鐘實驗
21.1I.MX6ULLRTC實時時鐘簡介
21.2硬件原理分析
21.3實驗程序編寫
21.3.1修改文件MCIMX6Y2.h
21.3.2編寫實驗程序
21.4編譯、下載和驗證
21.4.1編寫Makefile和鏈接腳本
21.4.2編譯和下載
第22章I2C實驗
22.1I2C和AP3216C簡介
22.1.1I2C簡介
22.1.2I.MX6ULLI2C簡介
22.1.3AP3216C簡介
22.2硬件原理分析
22.3實驗程序編寫
22.4編譯、下載和驗證
22.4.1編寫Makefile和鏈接腳本
22.4.2編譯和下載
第23章SPI實驗
23.1SPI&ICM20608簡介
23.1.1SPI簡介
23.1.2I.MX6ULLECSPI簡介
23.1.3ICM20608簡介
23.2硬件原理分析
23.3實驗程序編寫
23.4編譯、下載和驗證
23.4.1編寫Makefile和鏈接腳本
23.4.2編譯和下載
第24章多點電容觸摸屏實驗
24.1多點電容觸摸屏簡介
24.2硬件原理分析
24.3實驗程序編寫
24.4編譯、下載和驗證
24.4.1編寫Makefile和鏈接腳本
24.4.2編譯和下載
第25章LCD背光調節實驗
25.1LCD背光調節簡介
25.2硬件原理分析
25.3實驗程序編寫
25.4編譯、下載和驗證
25.4.1編寫Makefile和鏈接腳本
25.4.2編譯和下載
第26章ADC實驗
26.1ADC簡介
26.1.1什么是ADC
26.1.2I.MX6ULLADC簡介
26.2硬件原理分析
26.3實驗程序編寫
26.4編譯、下載和驗證
26.4.1編寫Makefile和鏈接腳本
26.4.2編譯和下載
第三篇系統移植
第27章UBoot使用實驗
27.1UBoot簡介
27.2UBoot初次編譯
27.3UBoot燒寫與啟動
27.4UBoot命令使用
27.4.1信息查詢命令
27.4.2環境變量操作命令
27.4.3內存操作命令
27.4.4網絡操作命令
27.4.5EMMC和SD卡操作命令
27.4.6FAT格式文件系統操作命令
27.4.7EXT格式文件系統操作命令
27.4.8NAND操作命令
27.4.9BOOT操作命令
27.4.10其他常用命令
第28章UBoot頂層Makefile詳解
28.1UBoot工程目錄分析
28.2VSCode工程創建
28.3UBoot頂層Makefile分析
28.3.1版本號
28.3.2MAKEFLAGS變量
28.3.3命令輸出
28.3.4靜默輸出
28.3.5設置編譯結果輸出目錄
28.3.6代碼檢查
28.3.7模塊編譯
28.3.8獲取主機架構和系統
28.3.9設置目標架構、交叉編譯器和配置文件
28.3.10調用scripts/Kbuild.include
28.3.11交叉編譯工具變量設置
28.3.12導出其他變量
28.3.13makexxx_defconfig過程
28.3.14Makefile.build腳本分析
28.3.15make過程
第29章UBoot啟動流程詳解
29.1鏈接腳本uboot.lds詳解
29.2UBoot啟動流程解析
29.2.1reset函數源碼詳解
29.2.2lowlevel_init函數詳解
29.2.3s_init函數詳解
29.2.4_main函數詳解
29.2.5board_init_f函數詳解
29.2.6relocate_code函數詳解
29.2.7relocate_vectors函數詳解
29.2.8board_init_r函數詳解
29.2.9run_main_loop函數詳解
29.2.10cli_loop函數詳解
29.2.11cmd_process函數詳解
29.3bootz啟動Linux內核過程
29.3.1images全局變量
29.3.2do_bootz函數
29.3.3bootz_start函數
29.3.4do_bootm_states函數
29.3.5bootm_os_get_boot_func函數
29.3.6do_bootm_linux函數
第30章UBoot移植
30.1NXP官方開發板uboot編譯測試
30.1.1查找NXP官方的開發板默認配置文件
30.1.2編譯NXP官方開發板對應的uboot
30.1.3燒寫驗證與驅動測試
30.2在UBoot中添加自己的開發板
30.2.1添加開發板默認配置文件
30.2.2添加開發板對應的頭文件
30.2.3添加開發板對應的板級文件夾
30.2.4修改UBoot圖形界面配置文件
30.2.5使用新添加的板子配置編譯uboot
30.2.6LCD驅動修改
30.2.7網絡驅動修改
30.2.8其他需要修改的地方
30.3bootcmd和bootargs環境變量
30.3.1環境變量bootcmd
30.3.2環境變量bootargs
30.4uboot啟動Linux測試
30.4.1從EMMC啟動Linux系統
30.4.2從網絡啟動Linux系統
第31章UBoot圖形化配置及其原理
31.1UBoot圖形化配置體驗
31.2menuconfig圖形化配置原理
31.2.1makemenuconfig過程分析
31.2.2Kconfig語法簡介
31.3添加自定義菜單
第32章Linux內核頂層Makefile詳解
32.1Linux內核獲取
32.2Linux內核初次編譯
32.3Linux工程目錄分析
32.4VSCode工程創建
32.5頂層Makefile詳解
32.5.1makexxx_defconfig過程
32.5.2Makefile.build腳本分析
32.5.3make過程
32.5.4builtin.o文件編譯生成過程
32.5.5makezImage過程
第33章Linux內核啟動流程
33.1鏈接腳本vmlinux.lds
33.2Linux內核啟動流程分析
33.2.1Linux內核入口stext
33.2.2__mmap_switched函數
33.2.3start_kernel函數
33.2.4rest_init函數
33.2.5init進程
第34章Linux內核移植
34.1創建VSCode工程
34.2NXP官方開發板Linux內核編譯
34.2.1修改頂層Makefile
34.2.2配置并編譯Linux內核
34.2.3Linux內核啟動測試
34.2.4根文件系統缺失錯誤
34.3在Linux中添加自己的開發板
34.3.1添加開發板默認配置文件
34.3.2添加開發板對應的設備樹文件
34.3.3編譯測試
34.4CPU主頻和網絡驅動修改
34.4.1CPU主頻修改
34.4.2使能8線EMMC驅動
34.4.3修改網絡驅動
34.4.4保存修改后的圖形化配置文件
第35章根文件系統構建
35.1根文件系統簡介
35.2BusyBox構建根文件系統
35.2.1BusyBox簡介
35.2.2編譯BusyBox構建根文件系統
35.2.3向根文件系統添加lib庫
35.2.4創建其他文件夾
35.3根文件系統初步測試
35.4完善根文件系統
35.4.1創建/etc/init.d/rcS文件
35.4.2創建/etc/fstab文件
35.4.3創建/etc/inittab文件
35.5根文件系統其他功能測試
35.5.1軟件運行測試
35.5.2中文字符測試
35.5.3開機自啟動測試
35.5.4外網連接測試
第36章系統燒寫
36.1MfgTool工具簡介
36.2MfgTool工作原理簡介
36.2.1燒寫方式
36.2.2系統燒寫原理
36.3燒寫NXP官方系統
36.4燒寫自制的系統
36.4.1系統燒寫
36.4.2網絡開機自啟動設置
36.5改造自己的燒寫工具
36.5.1改造MfgTool
36.5.2燒寫測試
36.5.3解決Linux內核啟動失敗
嵌入式 Linux涉及的知識點很多,對初學者的基礎要求高,在知識儲備的廣度和深度上都對學習者提出了很高
的要求。大多數轉型嵌入式 Linux開發的朋友都是以前從事單片機開發工作的工程師,因此如何從單片機開發工
程師轉型為嵌入式 Linux開發工程師,這個過程非常重要。
單片機 工 程 師 大 多 數 都 是 在 Windows環 境 下 工 作,使 用 集 成 IDE 編 寫 并 編 譯 代 碼,然 后 在 IDE 上 通 過
DownLoad按鈕一鍵下載代碼到單片機中。至于集成IDE是怎么組織源文件,又是怎么編譯的并不清楚。
本書就以單片機工程最熟悉的“裸機”開發為例,講解如何在 Ubuntu下搭建開發環境,如何使用 VScode編寫程
序,如何使用 make工具編譯源碼。通過這些操作,大家就可以對集成式IDE與開源開發環境有很清晰的認識。當
掌握了開發方式以后,剩下的就是通過大量的裸機案例來加深對I.MX6ULL 這顆芯片的認識,了解各個外設的應
用,為后面學習嵌入式Linux驅動開發打下堅實的基礎。本書后半部分詳細講解了如何移植uboot、Linux內核、根文件
系統,最終在開發板上搭建出一個基礎的嵌入式 Linux系統,后續的嵌入式 Linux驅動開發就在這個小系統上進行。
本書可作為廣大從事嵌入式開發、MCU 開發、物聯網應用開發等工程技術人員的學習和參考用書,也可作為高
等院校計算機、電子、自動化等專業嵌入式系統、微機接口、物聯網、單片機等課程的教材。
本書主要講解嵌入式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操作系統。本書假設大家此前從來沒有接觸過Ubuntu操作系統,因此會有詳細的Ubuntu操作系統安裝、使用教程的講解,幫助大家熟悉開發環境。

3) 合理的裸機例程

學習嵌入式Linux驅動開發建議大家先學習裸機開發(如果學習過STM32,則可以跳過裸機學習),Linux驅動開發非常煩瑣。要想進行Linux驅動開發,必須要先移植uboot,然后移植Linux系統和根文件系統到開發平臺上。而uboot又是一個超大的裸機綜合例程,因此如果沒有學習過裸機例程,那么uboot移植會有困難,尤其是要修改uboot代碼時。STM32基本都是裸機開發,在集成IDE下編寫代碼,可以使用ST公司提供的庫。但是在Ubuntu下編寫I.MX6ULL裸機例程就沒有這么方便了,沒有MDK和IAR這樣的IDE,所有的一切都需要自己搭建,本書提供的視頻會有詳細的講解。本書還提供了數十個裸機例程,由淺入深,涵蓋了大部分常用的功能,比如I/O輸入輸出、中斷、串口、定時器、DDR、LCD、I2C等。學習完裸機例程以后就對I.MX6ULL這顆CPU非常熟悉了,再去學習Linux驅動開發就很輕松了。

4) uboot、Linux和根文件系統移植

學習完裸機例程以后就是Linux驅動開發了,但是在進行Linux驅動開發之前要先在使用的開發板平臺上移植好uboot、Linux和根文件系統。這是Linux驅動開發的第一個攔路虎,因此本書和相應的視頻會著重講解uboot/Linux和根文件系統的移植。

5) 嵌入式Linux驅動開發

當我們把uboot、Linux內核和根文件系統都在開發板上移植好以后,就可以開始Linux驅動開發了。Linux驅動有3大類: 字符設備驅動、塊設備驅動和網絡設備驅動。對于這3大類內容,本書都有詳細的講解,并且配有數十個相應的教學例程,從最簡單的點燈到最后的網絡設備驅動。

本書一共分三篇,每篇對應一個不同的階段。

第一篇: Ubuntu操作系統入門(為節省篇幅,掃描封底“本書資源”二維碼獲取)

本篇主要講解Ubuntu操作系統的使用,不涉及任何嵌入式方面的知識,全部是在計算機上完成的,只要安裝好Ubuntu操作系統即可。

第二篇: 裸機開發(第1~26章)

從本篇正式開始開發板的學習,本篇通過數十個裸機例程來幫助大家了解I.MX6ULL這顆CPU,為以后的Linux驅動開發做準備。通過本篇,大家可以掌握在Ubuntu下進行ARM開發的方法。

第三篇: 系統移植(第27~36章)

本篇講解如何將uboot、Linux和根文件系統移植到我們的開發板上,為后面的Linux驅動開發做準備。

通過上面三篇的學習,大家能掌握嵌入式Linux驅動的開發流程,本書旨在引導大家入門Linux驅動開發,更加深入地研究就需要大家在實踐中不斷地總結經驗,并與理論結合,祝愿大家學習順利。

作者2022年8月
pagetop