所謂虛擬串列埠裝置意為這個串列埠是虛擬的,不能用來實現與下位機的串列埠收發。但是他可以將從使用者那兒收到的資料,原封不動的回傳給使用者。相當於乙個回環。
這一功能的實現主要是在驅動中實現乙個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的大小和演算...