linux字符設備驅動學習筆記3

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                《常識》
¥應用程序----->系統內核----->設備驅動----->硬件設備
¥設備驅動既是系統內核的下屬,又是硬件設備的老大。 
¥在inux系統中用一個文件來代表一個設備。這個文件就叫設備文件。設備驅動的責任是將應用程序對設備文件
的打開、讀、寫、定位等操作轉化爲對硬件設備的打開、讀、寫、定位等操作。而對於任何硬件設備,應用程序
只需利用這些基本操作就可以完全控制它!
¥編寫linux設備驅動需要的知識結構:
1、40%的設計模式相關知識。設計模式是系統內核限定的,做別人的下屬就得按照別人的規矩辦事。
2、30%的內核工作原理相關知識。內核是你領導,領會領導意圖才能把事情辦好。
3、30%的硬件相關知識。控制好硬件是你的的本質工作,你得把你的小弟管理好.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
***********************************************************華麗的分割線***************************************************************

學習往往從模仿開始,拿到一個驅動程序該怎麼去分析呢?
1、分析模塊加載函數;
2、分析設備操作方法函數(一般先從open方法開始,release方法結束);
3、分析模塊卸載函數;

***********************************************************華麗的分割線***************************************************************
ioctl方法
-------------------------------------------------------------------------------------------------------
什麼是ioclt方法?它的作用是什麼?
ioclt是類似於read,write等的文件操作方法。大部分驅動出了具備讀寫設備的能力外,還需要具備對硬件控制的能力。例如要求設備報告錯誤信息,改變波特率,這些操作常常是通過ioctl方法實現的。
-------------------------------------------------------------------------------------------------------
設備的每個操作方法通常對應着一個系統調用,ioctl方法對應的系統調用的原型是什麼?
在用戶空間,使用ioctl系統調用來控制設備,原型如下:
     int ioctl(int fd,unsigned long cmd,...)
原型中的點表示這是一個可選的參數,存在與否依賴於控制命令(第二個參數)是否涉及到與設備的數據交互。
-------------------------------------------------------------------------------------------------------
驅動ioctl方法的原型又是怎麼樣的?
  int (*ioctl)(struct inode ”*inode,struct file *filp,unsigned int cmd,unsigned long arg)
cmd 參數從用戶空間傳下來,可選的參數arg以unsigned long的形式傳遞,不管它是一個整數或一個指針。如果cmd命令不涉及數據傳輸,則第三個參數arg的值無任何意義。
-------------------------------------------------------------------------------------------------------
如何實現ioctl?
1、定義命令:爲了防止對錯誤的設備使用了正確的命令,命令號在系統範圍內是唯一的。ioclt命令編碼被劃分爲幾個位段,include/asm/ioctl.h中定義了這些字段:類型(幻數),序號,傳送方向,參數大小。documentation/ioctl-number.txt文件中羅列了在內核中已經使用了的幻數。
2.實現命令:返回值-ioctl函數的實現通常是根據命令執行的一個switch語句。但是,當命令號不能匹配任何一個設備所支持的命令時,通常返回-EINVAL;參數-如果是一個整數,可以直接使用,如果是指針,我們必須確保這個用戶地址是有效的,因此使用前需要進行檢查:int access_ok(int type,const void *addr,unsigned long size)【type-VERIFY_READ、RERIFY_WRITE用來表明是讀用戶內存還是寫用戶內存;addr-用戶內存地址;size-操作的長度】
-------------------------------------------------------------------------------------------------------
ioclt命令的各個字段的含義是什麼?
定義ioctl命令的正確方法是使用4個位段,他們定義在<linux/ilctl.h>中:
type:幻數(類型),表明那個設備的命令,在參考了ioctl-number.txt之後選出8位寬。一把選用一個字符。
number:序號,表明設備命令中的第幾個,8位寬。
direction:數據的傳送方向,可能的值是_IOC_NONE(沒有數據傳輸),_IOC_READ(從設備讀),IOC_WRITE(寫入設備)
size:用戶數據的大小。
內核提供了一系列的紅來幫助定義命令:
_IO(type,nr):沒有參數的命令
_IOR(type,nr,datatype):從驅動中讀數據
_IOW(type,nr,datatype):寫數據到驅動
_IOWR(type,nr,datatype):雙向傳送,type和number成員作爲參數傳遞
***********************************************************華麗的分割線***************************************************************

本人享有博客文章的版權,轉載請標明出處:http://blog.csdn.net/qingyu2431

發佈了22 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章