1. 程式人生 > >嵌入式Linux驅動初探 虛擬串列埠裝置驅動編寫

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

文章目錄

1.說明

所謂虛擬串列埠裝置意為這個串列埠是虛擬的,不能用來實現與下位機的串列埠收發。但是他可以將從使用者那兒收到的資料,原封不動的回傳給使用者。相當於一個迴環。
這一功能的實現主要是在驅動中實現一個FIFO。驅動接收到使用者資料後,先將之放入FIFO,當用戶需要資料(讀取資料)時,驅動從FIFO中把資料讀出,回傳給使用者。

2 . 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與上面類似。

3.貼程式碼

程式碼有詳細註釋。

//包含必要的標頭檔案
#include <linux/init.h>
#include
<linux/module.h>
#include <linux/fs.h> #include <linux/cdev.h> #include <linux/kfifo.h> //定義主裝置號 和從裝置號 #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 simple Module"); MODULE_ALIAS("Visualport"); /*init a FIFO*/ DEFINE_KFIFO(vsfifo,char,32); /*declare a device*/ static struct cdev vsdev; //下面兩個介面在這裡不是必須的,所以沒必要實現,直接返回即可。 static int vser_open(struct inode* inode,struct file* filp) { return 0; } static int vser_relase(struct inode* inode,struct file* filp) { return 0; } //讀資料,指的是使用者從核心空間讀取資料 static ssize_t vser_read(struct file *filp,char __user *buf,size_t count,loff_t* pos) { unsigned int copied = 0; kfifo_to_user(&vsfifo,buf,count,&copied);//將FIFO裡的資料傳送到使用者空間 return copied; } //從使用者空間傳資料到核心空間的FIFO,從使用者角度就是write static ssize_t vser_write(struct file* filp,const char __user *buf,size_t count,loff_t *pos) { unsigned int copied = 0; /*from user space copy data to kernel space*/ kfifo_from_user(&vsfifo,buf,count,&copied); return copied; } /*relize some file operations */ //這裡是將實現的介面和核心關聯起來,以後在應用層使用open read write 函式就會對應執行核心空間的//vser_open、read 、write 。 static struct file_operations vser_ops = { .owner = THIS_MODULE, .open = vser_open, .release = vser_relase, .read = vser_read, .write = vser_write, }; /*register device*/ static int __init vser_init(void) { int ret; dev_t dev; dev = MKDEV(VSER_MAJOR,VSER_MINOR); //由主從裝置號得到最終裝置號 ret = register_chrdev_region(dev,DEV_CNT,VSER_DEV_NAME); //註冊裝置 if(ret) goto reg_err; //在核心程式設計時習慣用跳轉指令到統一的地方去處理錯誤。 cdev_init(&vsdev,&vser_ops); //初始化裝置,也就是將上面操作檔案的函式實現和裝置關聯起來 vsdev.owner = THIS_MODULE;//相當於c++中的this指標,以後就可以通過這個指標訪問到特定的裝置了 ret = cdev_add(&vsdev,dev,DEV_CNT);//新增裝置 if(ret) goto add_err; printk(KERN_EMERG "init KFIFO driver\n"); return 0; add_err: unregister_chrdev_region(dev,DEV_CNT);//出錯,解除安裝裝置 reg_err: return ret; } static void __exit vser_exit(void) { dev_t dev; dev = MKDEV(VSER_MAJOR,VSER_MINOR); cdev_del(&vsdev); unregister_chrdev_region(dev,DEV_CNT);解除安裝裝置 printk(KERN_EMERG "exit KFIFO \n"); } /*alias*/ module_init(vser_init); //這裡是感受核心這是模組初始化的入口 module_exit(vser_exit);

4.測試

將編寫好的程式碼編譯得到驅動模組(拓展名*.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驅動初探 虛擬串列裝置驅動編寫

文章目錄 1.說明 所謂虛擬串列埠裝置意為這個串列埠是虛擬的,不能用來實現與下位機的串列埠收發。但是他可以將從使用者那兒收到的資料,原封不動的回傳給使用者。相當於一個迴環。 這一功能的實現主要是在驅動中實現一個FIFO。驅動接收到使用者資料後,先將之放入FIFO

嵌入式Linux基於Qt開發串列應用

By Toradex秦海 1). 簡介 基於Embedded Linux系統的嵌入式裝置使用跨平臺GUI開發工具Qt來開發嵌入式應用已經非常普遍,本文就以分別通過原生C語言方式和使用Qt QSerialPort控制元件方式來進行RS232/RS485串列埠應用的開發示例。

嵌入式Linux學習筆記(三) 字元型裝置驅動--LED的驅動開發

  在成功構建了一個能夠執行在開發板平臺的系統後,下一步就要正式開始應用的開發(這裡前提是有一定的C語言基礎,對ARM體系的軟/硬體,這部分有疑問可能要參考其它教程),根據需求仔細分解任務,可以發現包含的外設有LED,BEEP,RS232,六軸感測(SPI介面),光環境感測器(I2C),音訊輸出, RTC等,

linux裝置驅動,tty串列程式設計 如何檢視linux串列是否可用?串列名稱等

如何檢視linux下串列埠是否可用?串列埠名稱等? 檢視串列埠是否可用,可以對串列埠傳送資料比如對com1口,echo lyjie126 > /dev/ttyS0 檢視串列埠名稱使用 ls -l /dev/ttyS* 一般情況下串列埠的名稱全部在dev下面,如果你沒

沒有真實串列裝置時使用"虛擬串列驅動"除錯你的串列程式碼

[toc] ## 前言 > 很多時候需要編寫串列埠程式碼,但是又沒有真實串列埠裝置來除錯程式碼。以及本身就是要操作2個串列埠的情況,可以使用“虛擬串列埠驅動”工具方便的除錯程式碼。 > 使用方法就是點選新增埠,此時`“COM1 COM2”`是一組,即對COM1寫資料會讓COM2讀到,對COM2寫資料會讓CO

linux使用USB轉串列驅動設定

【一】、驅動相關說明: 如果直接使用串列埠線,而沒有用到USB轉串列埠裝置,就不需要安裝驅動。 如果使用了USB轉串列埠,一般情況下也不需要安裝驅動了,目前linux系統已經包含了該驅動,可以自動識別,亦可通過以下命令檢視以便確認是否支援。 檢視模組裝載的情況: 引用 lsmod |

WIN7 64位系統 CDC類 虛擬串列驅動無法安裝的解決辦法(2)

(1)最近用STM32使用USB——CDC類出現驅動安裝失敗的情況。 百度了一些網頁,方法很多,大多數是按照如下步驟處理: 首先,確保C:\Windows\System32\drivers\usbser.sys檔案存在; 其次,修改C:\Windows\inf\mdmcpq.inf檔

WIN7 64位系統 CDC類 虛擬串列驅動無法安裝的解決辦法

最近用STM32使用USB——CDC類出現驅動安裝失敗的情況。 百度了一些網頁,方法很多,但是我這裡按如下步驟處理: 首先,確保C:\Windows\System32\drivers\usbser.sys檔案存在; 其次,修改C:\Windows\inf\mdmcpq.inf檔案;

嵌入式ARM在Linux下更改除錯串列

By Toradex秦海 1). 簡介 在基於嵌入式ARM開發產品的時候,有時候由於ARM處理器UART數量的限制,我們需要將系統預設的除錯串列埠列印資訊關閉或者轉移到其他串列埠上面去,本文即演示更改uboot和linux kernel 除錯串列埠的過程示例。   本文所演

WIN7 CDC類 虛擬串列驅動無法安裝的解決辦法

最近用STM32做了個USB轉虛擬串列埠,但是驅動怎麼也安裝不上。因為曾經用清理工具把系統內不用的驅動清理過,所以關鍵的usbser.sys什麼的都沒有,但是下載後新增到系統內還是不行。 百度一番後,找到了解決辦法。 發一個關於cdc comms interface驅動無

cypress虛擬串列(CDC_ACM)在Linux下不出現的問題

網上找的高人帖子: https://community.cypress.com/thread/14010?start=0&tstart=0 關鍵的yidu一段話:, I managed to access the serial port in Linux: - chan

STM32F103 虛擬串列驅動安裝失敗的解決方法

拿到論壇的STM32F303RE的板子後,我的電腦就一直無法安裝Stlink虛擬出來的那個串列埠,只能枚舉出來Stlink下載和模擬U盤的裝置,試了很多方法都不行。因為我的電腦之前還正確安裝過ST的其他系列的片子上USB模擬的虛擬串列埠,而安裝驅動的本質就是使用ST的那個IN

安卓連線串列裝置需要安裝驅動

  連結這時候需要進行模組化的分離那個時期真的算是習以為常了,而且當結點中關鍵元素向右移動了抖動. mmc_schedule_delayed_workhost detect, delay通過hash取模將大檔案分解為多個小檔案後,reuseIdentifier:CellI

Linux/Android系統開發 串列驅動原始碼,FIFO模式

該驅動適用於採用linux和android系統平臺的C/C++串列埠開發。 FIFO傳送模式:建立資料傳送FIFO佇列,在多工資料傳送情境下,既能保證資料傳送任務能夠得到執行,又可解決資料傳送衝突問題。 select接收資料:有效監聽串列埠接收資料,提高執行效率,減少出錯

Linux下USB轉串列驅動

Linux發行版自帶usb to serial驅動,以模組方式編譯驅動,在核心原始碼目錄下執行Make MenuConfig選擇Devces drivers-->USB seupport--> <M>USB Serial Converter support --> <M

WinCE裝置模擬器+虛擬串列+GPS模擬器搭建開發測試環境

所需軟體: 1、WinCE 5.0裝置模擬器 2、虛擬串列埠工具Virtual Serial Port Driver 6.9 3、Virace GPS 模擬器0.3.1chs 模擬環境: COM2:連線WinCE裝置模擬器 COM7:連線GPS模擬器 環境搭建步驟: 1

Linux串列驅動程式(2)-串列驅動程式初始化分析

1、串列埠驅動程式結構分析 對使用者來講,能夠正常使用串列埠肯定是需要實現如下函式的: 1、串列埠裝置檔案的開啟 2、串列埠裝置檔案的初始化 3、串列埠裝置檔案的讀寫 4、串列埠裝置檔案的控制 2、串列埠驅動中重要的資料結構 首先分析一下串列埠讀寫的流程 當用戶讀寫串列埠

ARM Linux下安裝CH341串列驅動

在arm-Linux環境下安裝CH341串列埠驅動需要單獨編譯串列埠的驅動。本人編譯環境Ubuntu 14.04gcc編譯工具arm-linux-gnueabihf-gcc。1.程式碼檢查    檢視核心目錄下 kernel/drivers/usb/serial/ch341.

嵌入式Linux驅動筆記(五)------學習platform裝置驅動

你好!這裡是風箏的部落格, 歡迎和我一起交流。 裝置是裝置,驅動是驅動。 如果把兩個糅合寫一起,當裝置發生變化時,勢必要改寫整個檔案,這是非常愚蠢的做法。如果把他們分開來,當裝置發生變化時,只要改寫裝置檔案即可,驅動檔案巍然不動。 從linux2.

Linux 虛擬串列(可用於在本機上模擬串列進行除錯)

http://blog.sina.com.cn/s/blog_6cb543ef0100x90j.html Python語言: #! /usr/bin/env python#coding=utf-8importptyimportosimportselectdefmkpty