導航:首頁 > 操作系統 > linux設備驅動開發技術及應用

linux設備驅動開發技術及應用

發布時間:2023-05-22 03:10:12

Ⅰ 如何學習嵌入式linux驅動程序開發求解

2. 編一應用程序,可以用makefile跑起來
3. 學會寫驅動的makefile
4. 寫一簡單char驅動,makefile編譯通過,可以insmod, lsmod, rmmod. 在驅動的init函數里列印hello world, insmod後應該能夠通過dmesg看到輸出。
5. 寫一完整驅a動, 加上read, write, ioctl, polling等各種函數的驅動實現。 在ioctl里完成從用戶空間向內賀畢孫核空間傳遞結構體的實現。
6. 寫一block驅動, 加上read,write,ioctl,poll等各種函數實現。
7. 簡單學習下內存管理, 這個是最難的,明白各種memory alloc的函數實現細節。這是linux開發的基本功。
8. 學習鎖機制的應用,這個不是最難的但是最容易犯錯的,涉及到很多同步和並發的問題。
9. 看內核中實際應用的驅動代碼。 你會發現最基本的你已經知道了, 大的框架都是數悶一樣的, 無非是read, write, ioctl等函數的實現, 但裡麵包含了很多很多細小的實現細節是之前不知道的。 這時候就要考慮到很多禪鏈別的問題而不僅僅是基本功能的實現。例如:凌陽教育嵌入式linux培訓課程的第四階段:嵌入式微處理器及Linux設備驅動開發的學習主要是通過:ARM硬體介面原理,嵌入式Linux設備驅動開發,嵌入式Linux高級驅動程序設計這三大塊深入淺出的學習驅動程序開發。讓學員熟悉Linux的內核機制、驅動程序與用戶級應用程序的介面,掌握系統對設備的並發操作。

Ⅱ Linux設備驅動開發入門與編程實踐的目錄

第1章嵌入式Linux系統開發概述
1.1嵌入式系統概述
1.1.1你身邊的嵌入式系統
1.1.2什麼是嵌入式系統
1.1.3嵌入式系統的發展
1.1.4嵌入式系統市場規模
1.1.5嵌入式系統發展趨勢和面臨的挑戰
1.2嵌入式操作系統
1.2.1嵌入式操作系統的特昌蘆點
1.2.2嵌入式操作系統發展概述
1.2.3Linux操作系統特點
1.2.4嵌入式Linux系統的特點
1.2.5國外嵌入式Linux發展現狀
1.2.6國內嵌入式Linux發展現狀
1.3ARM處理器平台介紹
1.3.1嵌入式處理器特點與分類
1.3.2ARM處理器介紹
1.3.3ARM體系結構
1.4嵌入式Linux的體系結構分析
1.4.1嵌入式系統的體系結構
1.4.2硬體抽象層的Linux
1.5基本編輯器vi的使用
1.5.1進入和退出vi
1.5.2vi的基本編輯命令
1.5.3vi的高級編輯命令
1.6高級編輯器Emacs的使用
1.6.1Emacs的啟動與退出
1.6.2Emacs的基本操作
1.6.3Emacs的高級命令
1.7編譯器GCC的使用
1.7.1GCC簡介
1.7.2GCC的編譯過程
1.7.3GCC的常用模式
7.4GCC的常用選項
1.7.5GCC的警告功能
1.8調試器GDB的使用
1.8.1GDB的調試過程
1.8.2GDB的基本命令
1.8.3GDB的高級命令
1.9Make工程陸迅枯管理器
1.9.1Make管理器簡介
1.9.2Makefile的描述規則
1.9.3一個簡單示例
1.9.4Make如何工作
1.9.5指定變數
1.9.6自動推導規則
1.9.7另類風格的Makefile
1.9.8清除工作目錄過程文件
1.10本章小結
第2章嵌入式Linux內核分析與移植
2.1Linux內核版本
2.1.1日新月異的Linux內核版本
2.1.2Linux2.4內核特性
2.1.3Linux2.6內核針對嵌入式系統的改進
2.2Linux操作系統內核結構分析
2.2.1Linux核心源程序的文件組織結構
2.2.2Linux的內核組成
2.2.3Linux內核進程管理工作機制
2.2.4Linux內存管理工作機制
2.2.5Linux虛擬文件系統工作機制
2.2.6進程間通信
2.3搭建嵌入式Linux系統開發環境
2.3.1嵌入式平台介紹
2.3.2嵌入式Linux系統的組成及設計步驟
2.3.3嵌入式Linux開發工具鏈
2.4Linux內核配置基礎
2.4.1Linux內核所支持的配置方式
2.4.2makemenuconfig配置方法
2.4.3Linux2.4內核配置文件config .in介紹
2.4.4Linux2.6內核Kconfig文件的用法
2.4.5Kconfig文件配置實例
2.5Linux內核配置選項
2.5.1Generalsetup
2.5.2Loadablemolesupport
2.5.3Processortypeandfeatures
2.5.4Networkingsupport
2.5.5DeviceDrivers
2.6Linux內核編譯基礎
2.6.1Linux內核編譯基本步驟
2.6.2Rules.make文件用法
2.6.3Makefile配置文件的用法
2.6.4配置、編譯Linux內核命令說明
2.6.5Linux內核配置編譯實例
2.7Linux內核移植
2.7.1Bootloader簡介
2.7.2引導程序原理
2.7.3內核移植及代碼分析
2.7.4VIVI結構分析
2.7.5VIVI移植實現
2.8本章小結
第3章Linux設備驅動程序開發概述
3.1Linux系統設備概述
3.1.1字元設備
3.1.2塊設備
3.1.3網路設備
3.1.4Linux設備驅動程序的共性
3.2設備驅動程序的概念
3.3設備驅動程序與內核的介面
3.4內核為驅動程序提供的支持
3.4.1內存分配函數
3.4.2DMA
3.4.3I/O埠
3.4.4列印函數
3.5主要數據結構
3.5.1structdevicestruct
3.5.2structfileoperations
3.5.3structinode
3.6模塊化的概念
3.7內存管理問題
3.7.1Linux內核對內存的管理方早洞法
3.7.2kmalloc()和kfree()
3.7.3面向頁的分配技術
3.7.4vmalloc()和相關函數
3.8中斷響應和處理
3.8.1中斷處理機制
3.8.2中斷處理的數據結構
3.8.3中斷處理中的3個重要概念
3.8.4申請和釋放中斷
3.8.5自動檢測中斷號
3.8.6快/慢速中斷處理
3.8.7實現中斷處理程序
3.8.8驅動程序下半部的設計
3.8.9安裝共享的處理程序
3.9I/O埠
3.10DMA處理
3.11時間流
3.11.1時鍾的申請與釋放
3.11.2實現延遲
3.11.3任務隊列
3.12編寫、編譯和調試
3.13本章小結
第4章Linux字元設備驅動程序開發
4.1Linux字元設備驅動程序結構
4.2字元設備驅動的相似點
4.3主設備號和次設備號
4.4字元設備驅動程序的組成
4.5字元驅動程序模型
4.6可靠性機制
4.7文件操作
4.8字元設備驅動程序中用到的主要數據結構
4.9字元設備的注冊和注銷
4.10使用內存和讀寫I/O埠
4.11字元設備驅動程序中用到的主要函數
4.12chardevxxx設備的驅動程序設計
4.13Linux2.6內核下的字元設備驅動介紹
4.13.1cdev結構體
4.13.2分配和釋放設備號
4.13.3file_operations結構體
4.13.4字元設備驅動模塊載入與卸載函數
4.13.5字元設備驅動的file_operations結構體中成員
4.14globalmem設備驅動
4.14.1頭文件、宏及設備結構體
4.14.2載入與卸載設備驅動
4.14.3讀寫函數
4.14.4seek函數
4.14.5globalmem的ioctl()函數
4.14.6ioctl()命令
4.14.7預定義命令
4.14.8使用文件私有數據
4.14.9globalmem驅動在用戶空間的驗證
4.15本章小結
第5章基於DSP的PCI圖像採集卡驅動程序
5.1PCI匯流排介紹
5.1.1PCI匯流排概述
5.1.2PCI局部匯流排概述
5.1.3PCI局部匯流排的特點
5.1.4PCI匯流排信號
5.1.5PCI匯流排命令
5.1.6PCI匯流排配置空間
5.1.7PCI匯流排配置過程
5.1.8PCI匯流排的傳輸控制
5.2DSP圖像卡的PCI介面設計
5.2.1系統結構介紹
5.2.2PCI2040的基本特點
5.2.3PCI2040晶元的功能單元
5.2.4PCI2040配置流程
5.2.5PCI匯流排與DSP的介面實現
5.2.6串列E2PROM的初始化
5.3DSP圖像卡驅動程序實例分析
5.3.1主要的數據結構
5.3.2驅動程序流程
5.3.3初始化設備模塊
5.3.4打開設備模塊
5.3.5數據讀寫和控制信息模塊
5.3.6中斷處理模塊
5.3.7釋放設備模塊
5.3.8卸載設備模塊
5.4本章小結
第6章音頻介面設計與Linux驅動程序
6.1嵌入式音頻系統簡介
6.1.1S3C2410微處理器簡介
6.1.2S3C2410微處理器的結構框圖及其特性
6.1.3系統設計概述
6.1.4系統時鍾電路
6.1.5S3C2410存儲控制器介紹
6.1.6SDRAM電路
6.1.7Flash緩沖電路設計
6.1.8NORFlash電路
6.1.9NANDFlash介面電路
6.1.10IIS數字音頻電路
6.1.11串口電路
6.1.12JTAG介面電路
6.1.13LCD和觸摸屏介面電路
6.2UDA1341TS晶元設備驅動程序設計
6.2.1UDA1341TS晶元介紹
6.2.2驅動程序中file_operations數據結構
6.2.3驅動程序的載入和卸載
6.3SOUND驅動的實現
6.3.1SOUND設備的打開和釋放
6.3.2定義SOUND設備的讀寫函數
6.3.3SOUND設備的控制操作處理
6.3.4SOUND設備驅動程序的其他部分
6.3.5Mixer驅動的實現
6.4本章小結
第7章顯示設備介面設計與Linux驅動程序
7.1嵌入式顯示系統簡介
7.2顯示驅動的基礎與原理
7.2.1時序信號
7.2.2TFTLCD的驅動技術
7.2.3TFTLCD驅動電路
7.2.4像素值的屬性
7.2.5像素深度、像素值與顏色的映射關系
7.2.6像素值與顯示內存的映射關系
7.2.7調色板的原理
7.2.8調色板的作用
7.2.9彩色LCD顯示驅動的原理
7.3軟、硬體平台簡介
7.3.1硬體開發平台
7.3.2軟體平台
7.3.3軟體開發環境
7.4基於PXA255的顯示功能的硬體實現
7.4.1PXA255處理器介紹
7.4.2PXA255的LCD控制器的特點
7.4.3LCD控制器的使用
7.4.4LCD控制寄存器配置
7.4.5設定DMA通道
7.4.6Sony彩屏的特性
7.4.7LCD與處理器的硬體連接方案
7.5顯示驅動開發介紹
7.5.1顯示驅動與字元設備的關系
7.5.2顯示驅動的發展
7.5.3當前顯示驅動的不足
7.6基於PXA255的顯示驅動的實現
7.6.1顯示驅動的系統分析
7.6.2驅動上層文件的功能
7.6.3驅動底層文件的功能
7.6.4驅動程序底層文件實現的基礎
7.7基於PXA255的顯示功能的軟體方案
7.7.1上層文件的實現
7.7.2底層文件的實現方案
7.7.3驅動底層文件的實現
7.7.4針對XScale架構中其餘處理器的移植
7.8本章小結
第8章ARMLinux塊設備驅動程序開發
8.1塊設備驅動程序開發概述
8.1.1塊設備特點
8.1.2塊設備基於緩沖區的數據交換
8.1.3塊設備讀寫請求
8.1.4塊設備驅動程序模型
8.1.5基於內存的塊設備驅動程序
8.2Linux塊設備驅動結構
8.2.1block_device_operations結構體
8.2.2gendisk結構體
8.2.3request與bio結構體
8.3塊設備驅動主要函數
8.3.1塊設備驅動程序的注冊與注銷
8.3.2Linux塊設備驅動模塊載入與卸載
8.3.3塊設備的打開與釋放
8.3.4塊設備驅動的ioctl函數
8.3.5塊設備驅動I/O請求處理
8.4RAMDISK驅動開發實例
8.4.1RAMDISK的硬體原理
8.4.2RAMDISK驅動模塊載入與卸載
8.4.3RAMDISK設備驅動block_device_operations及成員函數
8.5IDE硬碟設備驅動開發實例
8.5.1IDE硬碟設備原理
8.5.2IDE硬碟設備驅動block_device_operations及成員函數
8.5.3IDE硬碟設備驅動I/O請求處理
8.5.4在內核中增加對新系統IDE設備的支持
8.6本章小結
第9章嵌入式Linux網路設備驅動程序開發
9.1嵌入式乙太網基礎知識
9.1.1乙太網技術及其嵌入式應用
9.1.2嵌入式系統中主要處理的網路協議
9.1.3ARP(AddressResolutionProtocol)地址解析協議
9.1.4IP(InternetProtocol)網際協議
9.1.5TCP(TransferControlProtocol)傳輸控制協議
9.1.6UDP(UserDatagramProtocol)用戶數據包協議
9.2基於CS8900A晶元的設備驅動設計
9.2.1CS8900A晶元結構
9.2.2CS8900A晶元特性
9.2.3CS8900A晶元工作原理
9.2.4CS8900A晶元工作模式
9.2.5網路設備驅動程序基本結構
9.3基於Linux的網路設備驅動開發常用的數據結構
9.3.1數據結構structnet_device
9.3.2數據結構structsk_buff393
9.4網路驅動程序的實現模式及系統調用方法
9.4.1網路驅動程序的實現模式與模塊化
9.4.2內存獲取與釋放
9.4.3鏈路狀態改變系統調用
9.4.4與網路層交互數據包的函數
9.5網路驅動程序的基本方法
9.5.1網路驅動程序的結構
9.5.2初始化(Initialize)
9.5.3打開(open)
9.5.4關閉(close)
9.5.5發送(hard_start_xmit)
9.5.6接收(reception)
9.5.7中斷處理(interrupt)
9.5.8硬體幀頭(hard_header)
9.5.9地址解析(XARP)
9.5.10參數設置和統計數據
9.5.11多播(set_multicast_list)
9.6本章小結
第10章嵌入式LinuxUSB驅動程序設計基礎
10.1USB匯流排協議背景知識
10.1.1USB協議的產生
10.1.2USB的特點
10.1.3USB的廣泛應用
10.1.4USB在嵌入式設備中的應用
10.1.5計算機常用外部匯流排比較
10.2USB匯流排技術介紹
10.2.1USB系統拓撲結構
10.2.2USB匯流排邏輯結構
10.2.3USB匯流排特性介紹
10.2.4USB匯流排電氣機械特性
10.2.5USB的即插即用特性
10.2.6魯棒性的實現
10.2.7USB電源管理
10.2.8匯流排通道
10.2.9傳輸協議
10.2.10傳輸類型
10.2.11設備框架
10.2.12USB主機協議
10.3LinuxUSB子系統結構
10.3.1文件系統
10.3.2Linux中USB子系統的軟體結構及實現
10.3.3LinuxUSB內核的主要數據結構
10.3.4USB內核函數介面分析
10.4本章小結
第11章USB介面系統軟體設計
11.1USB系統軟體設計概述
11.1.1主機端設備驅動程序
11.1.2主機控制器驅動程序
11.1.3設備端驅動程序
11.1.4數據管道和數據塊結構
11.2USB設備端軟體的開發
11.2.1USB設備通用模塊的軟體開發
11.2.2USB設備協議模塊的軟體開發
11.2.3控制端點處理程序
11.2.4協議層程序
11.3USB主機端軟體開發
11.3.1Linux內核對USB規范的支持
11.3.2USB時序
11.3.3主機控制器驅動程序設計
11.3.4主機控制器的初始化和管理
11.3.5傳輸執行和資源調度
11.3.6主機控制器的中斷處理
11.3.7虛擬根集線器
11.3.8主機控制器驅動程序的任務
11.3.9URB在驅動軟體中運作
11.3.10主機端設備驅動程序
11.4本章小結
第12章OTG驅動功能模塊的設計與實現
12.1OTG概述
12.1.1OTG特性簡介
12.1.2A設備事件
12.1.3B設備事件
12.1.4狀態機
12.1.5SRP
12.1.6HNP
12.2設備模塊的設計與實現
12.2.1USB設備的狀態
12.2.2OTG驅動功能模塊的設計
12.2.3ISP1761結構
12.2.4HAL的設計和實現
12.2.5HCD的設計和實現
12.2.6USBD介面模塊
12.2.7ISP1761讀寫操作模塊
12.2.8HCD初始化模塊
12.2.9中斷管理模塊
12.2.10根集線器模塊
12.2.11數據傳輸模塊
12.2.12設備模塊的設計和實現
12.2.13OTGFSM的設計和實現
12.3本章小結

Ⅲ 求《Linux設備驅動開發詳解4.0》全文免費下載百度網盤資源,謝謝~

《Linux設備驅動開發詳解4.0》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1wxaYK87l11FDur15aS6FTQ

?pwd=kn9d 提取碼: kn9d
簡介:Linux設備驅動開發詳解介紹了Linux設備驅動開發理論、框架與實例,詳細說明了自旋鎖、信號量、完成量、中斷頂/底半部、定時器、內存和I/O映射以及非同步通知、阻塞I/O、非阻塞I/O等Linux設備驅動理論,以及字元設備、塊設備、tty設備、I2c設備、LCD設備、音頻設備、USB設備、網路設備、PCI設備等Linux設備驅動架構中各個復雜數據結構和函數的關系,並講解了Linux驅動開發的大量實例,使讀者能夠獨立開發各類Linux設備驅動。

Ⅳ linux驅動開發要有哪些基礎

需要一定的努力才可以學好:
Linux設備驅動是linux內核的一部分,是用來屏蔽硬體細節,為上層提供標准介面的一種技術手段。為了能夠編寫出質量比較高的驅動程序,要求工程師必須具備以下幾個方面的知識:
1、 熟悉處理器的性能
如:處理器的體系結構、匯編語言、工作模式、異常處理等。對於初學者來說,在還不熟悉驅動編寫方法的情況下,可以先不把重心放在這一項上,因為可能因為它的枯燥、抽象而影響到你對設備驅動的興趣。隨著你不斷地熟悉驅動的編寫,你會很自然的意識到此項的重要性。
2、掌握驅動目標的硬體工作原理及通訊協議
如:串口控制器、顯卡控制器、硬體編解碼、存儲卡控制器、I2C通訊、SPI通訊、USB通訊、SDIO通訊、I2S通訊、PCI通訊等。編寫設備驅動的前提就是需要了解設備的操作方法,所以這些內容的重要程度不言而喻。但不是說要把所有設備的操作方法都熟悉了以後才可以寫驅動,你只需要了解你要驅動的硬體就可以了。
一、掌握硬體的控制方法
如:中斷、輪詢、DMA 等,通常一個硬體控制器會有多種控制方法,你需要根據系統性能的需要合理的選擇操作方法。初學階段以實現功能為目的,掌握的順序應該是,輪詢->中斷->DMA。隨著學習的深入,需要綜合考慮系統的性能需求,採取合適的方法。
二、良好的GNU C語言編程基礎
如:C語言的指針、結構體、內存操作、鏈表、隊列、棧、C和匯編混合編程等。這些編程語法是編寫設備驅動的基礎,無論對於初學者還是有經驗者都非常重要。
三、 良好的linux操作系統概念
如:多進程、多線程、進程調度、進程搶占、進程上下文、虛擬內存、原子操作、阻塞、睡眠、同步等概念及它們之間的關系。這些概念及方法在設備驅動里的使用是linux設備驅動區別單片機編程的最大特點,只有理解了它們才會編寫出高質量的驅動。
四、掌握linux內核中設備驅動的編寫介面
如:字元設備的cdev、塊設備的gendisk、網路設備的net_device,以及基於這些基本介面的framebuffer設備的fb_info、mtd設備的mtd_info、tty設備的tty_driver、usb設備的usb_driver、mmc設備的mmc_host等。

Ⅳ linux驅動開發 主要要開發哪些驅動

您好:做嵌入式應用的話一般的編程就可以了。那麼嵌入式驅動開發與內核開發的話就需要學習多個方面的知識。我就把這方面的要求給你交流一下:
(一家之言啊,自己多年從事嵌入式開發的一點感悟)
嵌入式驅動開發需要了解的知識大概有以下幾類:
1 嵌入式操作系統驅動框架。每一個操作系統都有自己的構架,應該了解驅動在整個系統中的具體位置與構建驅動程序的主要事項
2 匯流排知識,比如PCI、USB匯流排。
3 晶元知識。驅動其實就是對設備上一些寄存器的配置、CPU與設備本身的通訊以及對不同命令的處理
4 要做好驅動,必須對所使用的CPU體系結構有一個比較深刻的認識
5 C++基本用不上,主要是C和匯編。
6 做驅動最好要懂內核調試(比如說linux)

Ⅵ linux設備驅動有什麼實際應用說詳細一點,它的現狀和發展方向如何

對於一些使用了linux系統的設備,linux設備驅動就為用戶提供了使用外圍設備的方法。

Ⅶ Linux設備驅動的Linux設備驅動的重點、難點

(1)編寫Linux設備驅動要求工程師有非常好的硬體基礎,懂得SRAM、Flash、SDRAM、磁碟的讀寫方式,UART、I2C、USB等設備的介面以及輪詢、中斷、DMA的原理,PCI匯流排的工作方式以及CPU的內存管理單元(MMU)等。
(2) 編寫Linux設備驅動要求工程師有非常好的C語言基礎,能靈活地運用C語言的結構體、指針、函數指針及內存動態申請和釋放等。
(3)編寫Linux設備驅動要求工程師有一定的Linux內核基礎,雖然並不要求工程師對內核各個部分有深入的研究,但至少要明白驅動與內核的介面。尤其是對於塊設備、網路設備、Flash設備、串口設備等復雜設備,內核定義的驅動體系架構本身就非常復雜。
(4) 編寫Linux設備驅動要求工程師有非常好的多任務並發控制和同步的基礎,因為在驅動中會大量使用自旋鎖、互斥、信號量、等待隊列等並發與同步機制。

Ⅷ 《Linux設備驅動開發詳解基於最新的Linux4.0內核》pdf下載在線閱讀,求百度網盤雲資源

《Linux設備驅動開發詳解》(宋寶華)電子書網盤下載免費在線閱讀

資源鏈接:

鏈接:https://pan..com/s/1ddjTHycqTk3yYQDr-raoKw

提取碼:evup

書名:Linux設備驅動開發詳解

作者:宋寶華

豆瓣評分:6.5

出版社:機械工業出版社

出版年份:2015-8

頁數:618

內容簡介:

對於嵌入式工程師來說,進入更高階段後,學習Linux設備驅動開發無疑就是職業生涯的一次「重生」。這是因為Linux設備驅動開發不僅僅涉及操作系統的轉換,開發方式的轉換,更重要的是思維上的轉變。對於Linux這樣一個復雜系統,如何從復雜的代碼中抓住設備驅動開發的關鍵是任何一個Linux設備驅動開發者入門時需要面對的挑戰。除了知識、工具之外,往往還需要思路上的指導。本書不但幫助Linux設備驅動開發的初學者釐清必要的概念,還從具體的實例、設備驅動開發的指導原則循序漸進地引導讀者漸入學習佳境。為了讓讀者能夠達到Linux設備驅動開發的至臻境界,作者更是從軟體工程的角度抽象出設備驅動開發的一般思想。毫無疑問,本書將成為讀者學習Linux設備驅動開發過程中的一座「燈塔」。

作者簡介:

宋寶華,

Linux佈道者,知名嵌入式系統專家,《Essential Linux Device Drivers》譯者。作為最早從事Linux內核與設備驅動研究的專家之一,他在眾多國內外知名企業開展Linux技術培訓。他也是一位活躍的Linux開發者和深度實踐者,為Linux官方內核貢獻了大量的Linux源碼並承擔代碼審核工作。至今已向Linux官方內核提交逾數萬行代碼和幾百個補丁。他的《Linux設備驅動開發詳解》系列書在嵌入式Linux開發者中有口皆碑,是眾多Linux書籍中為數不多的暢銷書。

Ⅸ 如何系統的學習Linux驅動開發

在學習之前一直對驅動開發非常的陌生,感覺有點神秘。不知道驅動開發和普通的程序開發究竟有什麼不同;它的基本框架又是什麼樣的;他的開發環境有什麼特殊的地方;以及怎麼寫編寫一個簡單的字元設備驅動前編譯載入,下面我就對這些問題一個一個的介紹。

一、驅動的基本框架

1.那麼究竟什麼是驅動程序,它有什麼用呢:

l驅動是硬體設備與應用程序之間的一個中間軟體層

l它使得某個特定硬體能夠響應一個定義良好的內部編程介面,同時完全隱蔽了設備的工作細節

l用戶通過一組與具體設備無關的標准化的調用來完成相應的操作

l驅動程序的任務就是把這些標准化的系統調用映射到具體設備對於實際硬體的特定操作上

l驅動程序是內核的一部分,可以使用中斷、DMA等操作

l驅動程序在用戶態和內核態之間傳遞數據

2.Linux驅動的基本框架

3.Linux下設備驅動程序的一般可以分為以下三類

1)字元設備

a)所有能夠象位元組流一樣訪問的設備都通過字元設備來實現

b)它們被映射為文件系統中的節點,通常在/dev/目錄下面

c)一般要包含open read write close等系統調用的實現

2)塊設備

d)通常是指諸如磁碟、內存、Flash等可以容納文件系統的存儲設備。

e)塊設備也是通過文件系統來訪問,與字元設備的區別是:內核管理數據的方式不同

f)它允許象字元設備一樣以位元組流的方式來訪問,也可一次傳遞任意多的位元組。

3)網路介面設備

g)通常它指的是硬體設備,但有時也可能是一個軟體設備(如回環介面loopback),它們由內核中網路子系統驅動,負責發送和接收數據包。

h)它們的數據傳送往往不是面向流的,因此很難將它們映射到一個文件系統的節點上。

二、怎麼搭建一個驅動的開發環境

因為驅動是要編譯進內核,在啟動內核時就會驅動此硬體設備;或者編譯生成一個.o文件,當應用程序需要時再動態載入進內核空間運行。因此編譯任何一個驅動程序都要鏈接到內核的源碼樹。所以搭建環境的第一步當然是建內核源碼樹

1.怎麼建內核源碼樹

a)首先看你的系統有沒有源碼樹,在你的/lib/ moles目錄下會有內核信息,比如我當前的系統里有兩個版本:

#ls /lib/ moles

2.6.15-rc72.6.21-1.3194.fc7

查看其源碼位置:

## ll /lib/moles/2.6.15-rc7/build

lrwxrwxrwx 1 root root 27 2008-04-28 19:19 /lib/moles/2.6.15-rc7/build -> /root/xkli/linux-2.6.15-rc7

發現build是一個鏈接文件,其所對應的目錄就是源碼樹的目錄。但現在這里目標目錄已經是無效的了。所以得自己重新下載

b)下載並編譯源碼樹

有很多網站上可以下載,但官方網址是:

http://www.kernel.org/pub/linux/kernel/v2.6/

下載完後當然就是解壓編譯了

# tar –xzvf linux-2.6.16.54.tar.gz

#cd linux-2.6.16.54

## make menuconfig (配置內核各選項,如果沒有配置就無法下一步編譯,這里可以不要改任何東西)

#make

如果編譯沒有出錯。那麼恭喜你。你的開發環境已經搭建好了

三、了解驅動的基本知識

1.設備號

1)什麼是設備號呢?我們進系統根據現有的設備來講解就清楚了:

#ls -l /dev/

crwxrwxrwx 1 root root1,3 2009-05-11 16:36 null

crw------- 1 root root4,0 2009-05-11 16:35 systty

crw-rw-rw- 1 root tty5,0 2009-05-11 16:36 tty

crw-rw---- 1 root tty4,0 2009-05-11 16:35 tty0

在日期前面的兩個數(如第一列就是1,3)就是表示的設備號,第一個是主設備號,第二個是從設備號

2)設備號有什麼用呢?

l傳統上,主編號標識設備相連的驅動.例如, /dev/null和/dev/zero都由驅動1來管理,而虛擬控制台和串口終端都由驅動4管理

l次編號被內核用來決定引用哪個設備.依據你的驅動是如何編寫的自己區別

3)設備號結構類型以及申請方式

l在內核中, dev_t類型(在中定義)用來持有設備編號,對於2.6.0內核, dev_t是32位的量, 12位用作主編號, 20位用作次編號.

l能獲得一個dev_t的主或者次編號方式:

MAJOR(dev_t dev); //主要

MINOR(dev_t dev);//次要

l但是如果你有主次編號,需要將其轉換為一個dev_t,使用: MKDEV(int major, int minor);

4)怎麼在程序中分配和釋放設備號

在建立一個字元驅動時需要做的第一件事是獲取一個或多個設備編號來使用.可以達到此功能的函數有兩個:

l一個是你自己事先知道設備號的

register_chrdev_region,在中聲明:

int register_chrdev_region(dev_t first, unsigned int count, char *name);

first是你要分配的起始設備編號. first的次編號部分常常是0,count是你請求的連續設備編號的總數. name是應當連接到這個編號范圍的設備的名子;它會出現在/proc/devices和sysfs中.

l第二個是動態動態分配設備編號

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

使用這個函數, dev是一個只輸出的參數,它在函數成功完成時持有你的分配范圍的第一個數. fisetminor應當是請求的第一個要用的次編號;它常常是0. count和name參數如同給request_chrdev_region的一樣.

5)設備編號的釋放使用

不管你是採用哪些方式分配的設備號。使用之後肯定是要釋放的,其方式如下:

void unregister_chrdev_region(dev_t first, unsigned int count);

6)

2.驅動程序的二個最重要數據結構

1)file_operation

倒如字元設備scull的一般定義如下:
struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open = scull_open,
.release = scull_release,
};

file_operation也稱為設備驅動程序介面

定義在,是一個函數指針的集合.每個打開文件(內部用一個file結構來代表)與它自身的函數集合相關連(通過包含一個稱為f_op的成員,它指向一個file_operations結構).這些操作大部分負責實現系統調用,因此,命名為open, read,等等

2)File

定義位於include/fs.h

struct file結構與驅動相關的成員

lmode_t f_mode標識文件的讀寫許可權

lloff_t f_pos當前讀寫位置

lunsigned int_f_flag文件標志,主要進行阻塞/非阻塞型操作時檢查

lstruct file_operation * f_op文件操作的結構指針

lvoid * private_data驅動程序一般將它指向已經分配的數據

lstruct dentry* f_dentry文件對應的目錄項結構

3.字元設備注冊

1)內核在內部使用類型struct cdev的結構來代表字元設備.在內核調用你的設備操作前,必須編寫分配並注冊一個或幾個這些結構.有2種方法來分配和初始化一個這些結構.

l如果你想在運行時獲得一個獨立的cdev結構,可以這樣使用:

struct cdev *my_cdev = cdev_alloc();

my_cdev->ops = &my_fops;

l如果想將cdev結構嵌入一個你自己的設備特定的結構;你應當初始化你已經分配的結構,使用:

void cdev_init(struct cdev *cdev, struct file_operations *fops);

2)一旦cdev結構建立,最後的步驟是把它告訴內核,調用:

int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

說明:dev是cdev結構, num是這個設備響應的第一個設備號, count是應當關聯到設備的設備號的數目.常常count是1,但是有多個設備號對應於一個特定的設備的情形.

3)為從系統去除一個字元設備,調用:

void cdev_del(struct cdev *dev);

4.open和release

Ⅹ 求助,linux字元設備驅動開發

一、Linux device driver 的概念系統調用是操作系統內核和應用程序之間的介面,設備驅動程序是操作系統內核和機器硬體之間的介面.設備驅動程序為應用程序屏蔽了硬體的細節,這樣在應用程判梁序看來,硬體設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬體設備進行操作.設備驅動程序是內核的一部分,它完成以下的功能:
1、對設備初始化和釋放;
2、把數據從內核傳送到硬體和從硬體讀取數據;
3、讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據;
4、檢測和處理設備出現的錯誤.
在Linux操作系統下枯鬧有三類主要的設備文件類型,一是字元設備,二是塊設備,三是網路設備.字元設備和塊設備的主要區別是:在對字元設備發出讀/寫請求時,實際的硬體I/O一般就緊接著發生了,塊設備則不然,它利用一塊系統內存作緩沖區,當用戶進程對設備請求能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際的I/O操作.塊設備是主要針對磁碟等慢速設備設計的,以免耗費過多的CPU時間來等待.
已經提到,用戶進程是通過設備文件來與實際的硬體打交道.每個設備文件都都有其文件屬性(c/b),表示是字元設備還是塊設備?另外每個文件都有兩個設備號,第一個是主設備號,標識驅動程序,第二個是從設備號,標識使用同一個設備驅動程序的不同的硬體設備,比如有兩個軟盤,就可以用從設備號來區分他們.設備文件的的主設備號必須與設備驅動程序在登記時申請的主設備號一致,否則用戶進程將無法訪問到驅動程序.
最後必須提到的是,在用戶進程調用驅動程序時,系統進入核心態,這時不再是搶先式調度.也就是說,系統必須在你的驅動程序的子函數返回後才能進行其他的工作.如果你的驅動程序陷入死循環,不幸的是你只有重新啟動機器了,然後就是漫長的fsck.
二、實例剖析
我們來寫一個最簡單的字元設備驅動掘敗運程序.雖然它什麼也不做,但是通過它可以了解Linux的設備驅動程序的工作原理.把下面的C代碼輸入機器,你就會獲得一個真正的設備驅動程序.
由於用戶進程是通過設備文件同硬體打交道,對設備文件的操作方式不外乎就是一些系統調用,如 open,read,write,close…, 注意,不是fopen, fread,但是如何把系統調用和驅動程序關聯起來呢?這需要了解一個非常關鍵的數據結構:
STruct file_operatiONs {
int (*seek) (struct inode * ,struct file *, off_t ,int);
int (*read) (struct inode * ,struct file *, char ,int);
int (*write) (struct inode * ,struct file *, off_t ,int);
int (*readdir) (struct inode * ,struct file *, struct dirent * ,int);
int (*select) (struct inode * ,struct file *, int ,select_table *);
int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);
int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);
int (*open) (struct inode * ,struct file *);
int (*release) (struct inode * ,struct file *);
int (*fsync) (struct inode * ,struct file *);
int (*fasync) (struct inode * ,struct file *,int);
int (*check_media_change) (struct inode * ,struct file *);
int (*revalidate) (dev_t dev);
}
這個結構的每一個成員的名字都對應著一個系統調用.用戶進程利用系統調用在對設備文件進行諸如read/write操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然後讀取這個數據結構相應的函數指針,接著把控制權交給該函數.這是linux的設備驅動程序工作的基本原理.既然是這樣,則編寫設備驅動程序的主要工作就是編寫子函數,並填充file_operations的各個域.
下面就開始寫子程序.
#include

閱讀全文

與linux設備驅動開發技術及應用相關的資料

熱點內容
照片怎麼轉換成pdf 瀏覽:129
女生學編程好嗎 瀏覽:236
目前絕地求生怎麼看伺服器地址大全 瀏覽:825
論人類不平等的起源pdf 瀏覽:436
壓縮機螺桿加工 瀏覽:368
怎麼把網站伺服器設置在境外 瀏覽:162
單片機編程取反 瀏覽:897
51單片機課程設計課題 瀏覽:900
手機淘寶登錄怎麼加密碼 瀏覽:486
linux快捷方式圖標 瀏覽:38
陽光車險的app叫什麼名字 瀏覽:462
購買單片機的器件時需要給商家啥 瀏覽:535
並行編譯技術的發展 瀏覽:550
阿里雲伺服器安裝管理 瀏覽:551
java手機開發教程 瀏覽:675
我的世界怎麼刪除伺服器數據 瀏覽:672
linux內存子系統 瀏覽:973
加密思維幣 瀏覽:691
魅族訪客文件夾 瀏覽:53
添加的文件夾怎麼找 瀏覽:618