裝置驅動模型:
一:驅動初始化
1、分配裝置描述結構
2、初始化裝置描述結構
3、註冊裝置描述結構
4、硬體初始化
二:實現裝置操作
三:驅動登出
一、驅動初始化
在任何乙個驅動模型中,裝置都會用核心中的一種結構來描述,字元驅動的描述:struct cdev
struct cdev;
可以檢視 /dev 目錄下的裝置號
字元裝置檔案 與 字元裝置驅動 通過主裝置號產生聯絡,通過次 裝置號,區別相同的裝置,如串列埠1,和串列埠2
dev_t 型別來定義裝置號,dev_t 實際是32bit unsigned int , 其中高 12bit為主裝置,低20bit 為 次裝置號
dev_t dev = mkdev(主裝置號, 次裝置號) //得到dev_t
主裝置號 = major(dev_t dev)
次裝置號 = minor(dev_t dev)
裝置號-分配
靜態申請:自己選擇乙個數字做為裝置號用 register_chrdev_region 向核心申請使用, 如果 數字已經被占用,則不可以用
動態申請:alloc_chrdev_region 由核心分配
裝置號-登出
在驅動退出時,使用unregister_chrdev_region函式釋放裝置號
裝置操作集 const struct file operations*ops 基本都是函式指標
當應用程式呼叫 open , close, read, write 等時,核心中有一張對映表
比如 應用程式傳遞 open ,核心轉換為 xxopen ,等
而file operations 就是乙個對映表
如: struct file operations dev xops = ;
描述結構
分配: cdev變數
靜態分配: struct cdev mdev;
動態分配: struct cdev *pdev = cdev_alloc();
初始化:
使用cdev_init函式來完成 cdev_init(struct cdev *cdev, const struct file_operations *fops)
引數 cdev:待初始化的cdev結構
fops:裝置對應的操作函式集
註冊:使用cdev_add函式完成 cdev_add(struct cdev *p, dev_t dev, unsigned count)
引數 p:待新增到核心的字元裝置結構
dev: 裝置號
count: 該類裝置的裝置個數
三個操作之後,就登記好了
二、實現裝置操作
裝置操作原型(不可以更改)如:
int (*open) (struct inode *, struct file *);
開啟裝置,響應open系統
int (*release)(struct inode *, struct file *);
關閉裝置,響應close系統呼叫
loff_t (*llseek) (struct file *, loff_t, int)
重定位讀寫指標,響應lseek系統呼叫
ssize_t (*read) (struct file *, char _user*, size_t , loff_t *)
從裝置讀取資料,響應read系統呼叫
ssize_t (*write) (struct file *, const char _user*, size_t, loff_t *)
向裝置寫入資料,響應write 系統呼叫
linux系統中,每乙個開啟檔案,在核心中都會關聯乙個struct file , 它由核心在開啟檔案時建立,在檔案關閉後釋放。
重要成員:
loff_t f_pos /*檔案讀寫指標*/
struct file_operations *f_op /*該檔案所對應的操作*/
struct inode
每乙個存在於檔案系統裡面的檔案都會關聯乙個inode結構,該結構主要用來記錄檔案物理上的資訊。因此,它和代表開啟檔案的file結構是不同的。
乙個檔案沒有開啟時不會關聯file結構,但卻會關聯乙個inode結構。
重要成員:
dev_t i_rdev: 裝置號
open裝置方法是驅動程式用來為以後的操作完成初始化準備工作。在大部分驅動程式中, open完成的工作如下:
1,標明次裝置號
2,啟動裝置
release 方法的作用正好與open相反。 這個裝置有時也稱為close,它應用:
1,關閉裝置。
read 裝置方法通常完成2件事:
1,從裝置中讀取資料(屬於硬體訪問類操作)
2,將讀取到的資料返回給應用程式
ssize_t (*read) (struct file * filp, char _user* buff, size_t count, loff_t *offp)
file: 與字元裝置檔案關聯的file結構指標,由核心建立。
buff: 從裝置讀取到的資料,需要儲存到的位置,由read系統呼叫提供該引數
count:請求傳輸的資料裡,由read系統提供引數
offp:檔案讀寫位置,由核心從file結構中取出後,傳遞進去。
buff 引數是**於使用者空間的指標,這類指標都不用能被核心**直接引用,必須使用專門的函式
int copy_from_user(void *to, const void_user *from, int n)
int copy_to_user(void _user *to, const void *from, int n)
三,驅動登出:
當我們從核心中解除安裝驅動程式的時候,需要使用cdev_del函式完成字元裝置的登出
驅動學習 字元裝置驅動總結
字元裝置是 3 大類裝置 字元裝置 塊裝置和網路裝置 中較簡單的一類裝置,其驅動程式中完成的主要工作是初始化 新增和刪除 cdev 結構體,申請和釋放裝置號,以及填充file operations結構體中的操作函式,實現file operations結構體中的read write 和ioctl 等函...
PHP學習,字元操作
一,確定自己的編譯環境。lamp or wamp。如果是linux的話,中文內容不會因為字元格式問題發生亂碼,而windows的話,需要在html標籤加上 確保瀏覽器解釋不會有亂碼。二,要實現相應的字元控制就需要呼叫相應的函式命令。在php中,函式呼叫還是很方便的,例如rand 三,下面的是一些具體...
Python學習(字元編碼)
python主要識別檔案內容,而不是關心拓展名。字元 機器翻譯 二進位制 字元如何對應特定數字的標準就是字元編碼 ascii gbk unicode utf 8 unicode transformation format 記憶體中使用的編碼是unicode,用空間換時間 程式都需要載入到記憶體才能執...