嵌入式Linux驅動初探 虛擬串列埠裝置驅動編寫

2021-09-01 20:49:11 字數 2823 閱讀 5177

所謂虛擬串列埠裝置意為這個串列埠是虛擬的,不能用來實現與下位機的串列埠收發。但是他可以將從使用者那兒收到的資料,原封不動的回傳給使用者。相當於乙個回環。

這一功能的實現主要是在驅動中實現乙個fifo。驅動接收到使用者資料後,先將之放入fifo,當使用者需要資料(讀取資料)時,驅動從fifo中把資料讀出,回傳給使用者。

fifo在核心空間已經實現好了,只需要呼叫對應的巨集 和函式即可:

define_kfifo

(fifo, type, size)

kfifo_from_user

(fifo, from, len, copied)

kfifo_to_user

(fifo, to, len, copied)

define_kfifo是用於初始化乙個fifo,名字叫fifo,fifo裡的資料型別為type,fifo大小為size。

kfifo_from_user用於從使用者(應用層)獲取資料並放入fifo,fifo為初始化好的fifo,from為資料,len為資料長度,copied用於返回實際拷貝進fifo的資料的長度。

kfifo_to_user用於從從fifo中取出資料,to為返回的資料指標,fifo,len和copied與上面類似。

**有詳細注釋。

//包含必要的標頭檔案

#include

#include

#include

#include

#include

//定義主裝置號 和從裝置號

#define vser_major 256

#define vser_minor 0

#define dev_cnt 1

#define vser_dev_name "vser"

module_license

("dual bsd/gpl");

module_author

("mr.zhong <[email protected]>");

module_description

("a ****** module");

module_alias

("visualport");

/*init a fifo*/

define_kfifo

(vsfifo,

char,32

);/*declare a device*/

static

struct cdev vsdev;

//下面兩個介面在這裡不是必須的,所以沒必要實現,直接返回即可。

static

intvser_open

(struct inode* inode,

struct file* filp)

static

intvser_relase

(struct inode* inode,

struct file* filp)

//讀資料,指的是使用者從核心空間讀取資料

static ssize_t vser_read

(struct file *filp,

char __user *buf,size_t count,loff_t* pos)

//從使用者空間傳資料到核心空間的fifo,從使用者角度就是write

static ssize_t vser_write

(struct file* filp,

const

char __user *buf,size_t count,loff_t *pos)

/*relize some file operations */

//這裡是將實現的介面和核心關聯起來,以後在應用層使用open read write 函式就會對應執行核心空間的//vser_open、read 、write 。

static

struct file_operations vser_ops =

;/*register device*/

static

int __init vser_init

(void

)static

void __exit vser_exit

(void

)/*alias*/

module_init

(vser_init)

;//這裡是感受核心這是模組初始化的入口

module_exit

(vser_exit)

;

將編寫好的**編譯得到驅動模組(拓展名*.ko)。

然後載入模組到核心:

sudo insmod virtualport.ko
然後檢視裝置是否載入:

cat /proc/devices |

grep vser

可以看到裝置已經載入到核心,主裝置號為256。

然後在/dev目錄下新建節點,並傳送資料,操作流程如下:

$ mknod /dev/vser0 c 256 0

$ echo

"hello driver"

> vser0

$ cat vser0

hello drives

從上面返回的資料可知,驅動實現了使用者向fifo傳送資料,並且在使用者需要的時候將資料原封不動的返回給使用者。

嵌入式linux字元裝置驅動

arm linux 驅動 抵岸科技 1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name ...

嵌入式linux字元裝置驅動

1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name 函式通過已知的裝置號first來註冊...

嵌入式linux之NOR FLASH驅動

flash 儲存器介面還有兩個標準 cfi和jedec。cfi為公共flash介面 common flash inte ce 用來幫助程式從flash晶元中獲取操作方式資訊,而不用在程式中硬編碼flash的id。jedec用來幫助程式讀取flash的製造商id和裝置id,以確定flash的大小和演算...