pos機(jī)一直初始化怎么辦,Linux字符設(shè)備驅(qū)動模型之字符設(shè)備初始化

 新聞資訊  |   2023-05-04 10:03  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于pos機(jī)一直初始化怎么辦,Linux字符設(shè)備驅(qū)動模型之字符設(shè)備初始化的知識,也有很多人為大家解答關(guān)于pos機(jī)一直初始化怎么辦的問題,今天pos機(jī)之家(www.dsth100338.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機(jī)一直初始化怎么辦

pos機(jī)一直初始化怎么辦

因?yàn)長inux字符設(shè)備驅(qū)動主要依賴于struct cdev結(jié)構(gòu),原型為:

所以我們需要對所使用到的結(jié)構(gòu)成員進(jìn)行配置,驅(qū)動開發(fā)所使用到的結(jié)構(gòu)成員分別為:【unsigned int count;】、【dev_t dev;】、【const struct file_operations *ops;】。

開發(fā)流程如下圖:一、字符設(shè)備驅(qū)動初始化

1、分配設(shè)備cdev

Cdev變量的定義可以采用靜態(tài)和動態(tài)兩種方法進(jìn)行分配。靜態(tài)方法直接分配內(nèi)存,而動態(tài)方法隨機(jī)分配內(nèi)存。

靜態(tài)分配cdev:

定義:struct cdev mdev;

mdev即代表相應(yīng)的字符設(shè)備空間地址。

動態(tài)分配cdev:

定義:struct cdev *pdev = cdev_alloc();

pdev即代表對于的字符設(shè)備的空間地址。

2、初始化設(shè)備cdev

Linux內(nèi)核中,字符設(shè)備struct cdev的初始化使用cdev_init。其原型如下:

參數(shù):

cdev:待初始化的struct cdev結(jié)構(gòu)

fops:設(shè)備對應(yīng)的操作函數(shù)集

由原型所要求的參數(shù)可知,需要初始化一個字符設(shè)備,必須根據(jù)申請一個struct cdev結(jié)構(gòu)的空間,然后對其成員進(jìn)行配置。即實(shí)現(xiàn)設(shè)備的操作函數(shù)集、為設(shè)備申請?jiān)O(shè)備號(包括主設(shè)備號和次設(shè)備號)、指定此類型的字符設(shè)備有多少個相同設(shè)備。

3、注冊設(shè)備cdev

Linux內(nèi)核中字符設(shè)備的注冊使用cdev_add函數(shù)來進(jìn)行完成注冊。其原型如下:

其相關(guān)參數(shù)定義為:

p:待添加到內(nèi)核中的字符設(shè)備結(jié)構(gòu),即為struct cdev。

dev:設(shè)備號

count:該類設(shè)備的設(shè)備數(shù)量,各個設(shè)備的區(qū)別體現(xiàn)為從設(shè)備號。

在開發(fā)驅(qū)動時,當(dāng)確定了字符設(shè)備的結(jié)構(gòu),主設(shè)備號和從設(shè)備號、設(shè)備的數(shù)量,就可以使用cdev_add函數(shù)將相應(yīng)的字符設(shè)備添加到Linux內(nèi)核驅(qū)動中進(jìn)行注冊。

4、硬件初始化

關(guān)于硬件的初始化就簡單了。直接根據(jù)所需要操作的字符設(shè)備,閱讀器Datasheet,然后根據(jù)Datasheet進(jìn)行硬件的配置即可。

二、設(shè)備操作和驅(qū)動操作映射

從上圖基本可知,在用戶空間的每一種硬件設(shè)備操作函數(shù),在內(nèi)核空間通用有一個映射操作函數(shù)實(shí)現(xiàn)。

int (*open) (struct inode *, struct file *):打開設(shè)備,響應(yīng)open系統(tǒng)

int (*release) (struct inode *, struct file *):關(guān)閉設(shè)備,響應(yīng)close系統(tǒng)調(diào)用

loff_t (*llseek) (struct file *, loff_t, int):重定位讀寫指針,響應(yīng)lseek系統(tǒng)調(diào)用

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *):從設(shè)備讀取數(shù)據(jù),響應(yīng)read系統(tǒng)調(diào)用

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *):向設(shè)備寫入數(shù)據(jù),響應(yīng)write系統(tǒng)調(diào)用

從以上函數(shù)指針操作方法中可以提取出兩個重要的參數(shù)成員,即為struct file和struct inode。

【struct file】:在Linux系統(tǒng)中,每一個打開的文件,在內(nèi)核中都會對應(yīng)的關(guān)聯(lián)一個struct file結(jié)構(gòu)體,它由內(nèi)核在打開文件時創(chuàng)建,在文件關(guān)閉后釋放。

其非常重要的成員有:

loff_t f_pos /*文件讀寫指針*/

struct file_operations *f_op /*該文件所對應(yīng)的操作*/

【struct inode】:每一個存在于文件系統(tǒng)里面的文件都會關(guān)聯(lián)一個inode 結(jié)構(gòu),該結(jié)構(gòu)主要用來記錄文件物理上的信息。因此, 它和代表打開文件的file結(jié)構(gòu)是不同的。一個文件沒有被打開時不會關(guān)聯(lián)file結(jié)構(gòu),但是卻會關(guān)聯(lián)一個inode 結(jié)構(gòu)。

在struct inode結(jié)構(gòu)中,dev_t i_rdev尤其重要,表示設(shè)備號。

三、struct file_operations結(jié)構(gòu)常用設(shè)備操作解析

1.open設(shè)備操作

根據(jù)原型可知,open設(shè)備函數(shù)方法是在進(jìn)行開始啟用操作設(shè)備時的初始化工作,與用戶空間的open函數(shù)對應(yīng),通常情況下,open函數(shù)實(shí)現(xiàn):

(1)表明次設(shè)備號

(2)啟用設(shè)備

當(dāng)然,如果在啟用設(shè)備時,不需要任何的準(zhǔn)備操作或者初始化操作,那么open函數(shù)可以為空函數(shù),不實(shí)現(xiàn)。

2.release設(shè)備操作

release函數(shù)方法的作用正好和open函數(shù)方法的作用相反,它在設(shè)備關(guān)閉時用到,與用戶空間的close對應(yīng)。通常用來進(jìn)行關(guān)閉設(shè)備的實(shí)現(xiàn)。如果所操作的設(shè)備在關(guān)閉時不需要其他操作,那么使其為空函數(shù)即可。

3.read設(shè)備操作

read方法主要完成兩件事:

(1)訪問硬件操作,從設(shè)備中讀取數(shù)據(jù)。

(2)將從設(shè)備端讀取到的數(shù)據(jù)返回給用戶空間的應(yīng)用程序read函數(shù)。

其read方法的具體原型可分析如下:

ssize_t (*read) (struct file *filp, char __user *buff, size_t count, loff_t *offp)

參數(shù)分析:

filp:與字符設(shè)備文件關(guān)聯(lián)的file結(jié)構(gòu)指針, 由內(nèi)核創(chuàng)建。

buff : 從設(shè)備讀取到的數(shù)據(jù),需要保存到的位置。由read系統(tǒng)調(diào)用提供該參數(shù)。

count: 請求傳輸?shù)臄?shù)據(jù)量,由read系統(tǒng)調(diào)用提供該參數(shù)。

offp: 文件的讀寫位置,由內(nèi)核從file結(jié)構(gòu)中取出后,傳遞進(jìn)來。

那么實(shí)際上在這里就存在了一個問題,從內(nèi)核空間如何將數(shù)據(jù)返回給用戶空間???

在Linux內(nèi)核中,為從內(nèi)核空間將數(shù)據(jù)返回到用戶空間提供了函數(shù)方法,即為:copy_to_user。其原型如下:

之所以采用copy_to_user函數(shù)的原因是,buff參數(shù)來源于用戶空間的指針,這類指針在內(nèi)核空間中不能直接被內(nèi)核代碼直接引用,所以必須采用拷貝的方式進(jìn)行數(shù)據(jù)的傳遞。具體的操作過程如下圖表示:

4.write設(shè)備操作

write函數(shù)方法也主要完成兩件事:

(1)從應(yīng)用程序提供的地址中取出數(shù)據(jù)到內(nèi)核空間。

(2)訪問硬件設(shè)備,將數(shù)據(jù)寫入到設(shè)備中。

write函數(shù)方法直接對應(yīng)于用戶空間的write函數(shù)。

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)

write函數(shù)方法的參數(shù)基本上和read函數(shù)方法類似,在此不再做解釋。

那么實(shí)際上在此也存在一個問題,如何將數(shù)據(jù)從用戶空間取出到內(nèi)核空間使用???

實(shí)際上Linux內(nèi)核中也提供了相應(yīng)的方法函數(shù),將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間進(jìn)行使用,其方法為:copy_from_user。原型如下:

四、設(shè)備驅(qū)動注銷

當(dāng)內(nèi)核中不再需要使用一個字符設(shè)備時,我們可以在內(nèi)核中將相應(yīng)的設(shè)備驅(qū)動程序進(jìn)行卸載。那么就需要對其字符設(shè)備進(jìn)行注銷。Linux內(nèi)核中為我們提供了cdev_del函數(shù)來完成字符設(shè)備的注銷。其原型如下:

本文為連載內(nèi)容,如覺得不錯,請點(diǎn)個贊吧!

以上就是關(guān)于pos機(jī)一直初始化怎么辦,Linux字符設(shè)備驅(qū)動模型之字符設(shè)備初始化的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機(jī)一直初始化怎么辦的知識,希望能夠幫助到大家!

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://www.dsth100338.com/news/36933.html

你可能會喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。