1. 程式人生 > >簡單字元裝置驅動示例

簡單字元裝置驅動示例

#include <linux/init.h> //for module_init #include <linux/module.h> //for printk #include <asm-generic/errno-base.h> #include <linux/fs.h> #include <asm-generic/uaccess.h> #include <asm/io.h> #include <linux/cdev.h> #include <linux/device.h> /*定義一個cdev物件*/ struct cdev test_cdev; struct class *test_class; //裝置類 struct device *test_device; //裝置檔案 unsigned int major = 0; unsigned int minor = 0; unsigned int devno = 0; int test_open(struct inode *inode, struct file *file) { printk("%s\n",__FUNCTION__); return 0; } struct file_operations test_fops = { .owner = THIS_MODULE, //屬於本模組 .open = test_open, }; static int test_init(void) { int ret; int errno; /*獲取裝置號*/ devno = MKDEV(major,minor); if(major) { /*1.靜態申請裝置號*/ ret = register_chrdev_region(devno,1,"test-new-driver"); if(ret){ printk("register chrdev region failed\n"); errno = -EBUSY; goto err; } } else { /*動態申請裝置號*/ ret = alloc_chrdev_region(&devno,0,1,"test-new-driver"); if(ret){ printk("register chrdev alloc region failed\n"); errno = -EBUSY; goto err; } } /*初始化一個cdev物件*/ cdev_init(&test_cdev,&test_fops); /*使用(此時真正的註冊進核心地址表)*/ ret = cdev_add(&test_cdev,devno,1); if(ret){ printk("cdev add failed\n"); errno = -EBUSY; goto err1; } /*動態的建立裝置檔案*/ test_class = class_create(THIS_MODULE,"test_module"); if(IS_ERR(test_class)){ printk("class_create failed\n"); errno = PTR_ERR(test_class); goto err2; } /*5.申請建立一個裝置檔案*/ test_device = device_create(test_class,NULL,devno,NULL,"test"); if(IS_ERR(test_device)){ printk("device create failed\n"); errno = PTR_ERR(test_device); goto err3; } return 0; err3: class_destroy(test_class); err2: cdev_del(&test_cdev); err1: unregister_chrdev_region(devno,1); err: return errno; } static void test_exit(void) { device_destroy(test_class,devno); class_destroy(test_class); cdev_del(&test_cdev); unregister_chrdev_region(devno,1); printk("bye!\n"); } module_init(test_init); module_exit(test_exit); MODULE_LICENSE("GPL"); ========================上為驅動,下為應用======================= #include <sys/types.h> #include <stdio.h> int main(int argc,char *argv[]) { int fd; /*開啟檔案*/ fd = open("/dev/test
",O_RDWR); if(fd < 0){ perror("open"); return -1; } printf("\nopen success... [%d]\n",fd); return 0; }

相關推薦

簡單字元裝置驅動示例

#include <linux/init.h> //for module_init #include <linux/module.h> //for printk #include <asm-generic/errno-base.h> #

Linux字元裝置驅動程式的一個簡單示例

一.原始碼: // memdev.c #define MEMDEV_MAJOR 254 /*預設的mem的主裝置號*/ #define MEMDEV_NR_DEVS 2 /*裝置數*/ #define MEMDEV_SIZE 4096 /*mem裝置描述結構體

linux裝置驅動第三篇:寫一個簡單字元裝置驅動

在linux裝置驅動第一篇:裝置驅動程式簡介中簡單介紹了字元驅動,本篇簡單介紹如何寫一個簡單的字元裝置驅動。本篇借鑑LDD中的原始碼,實現一個與硬體裝置無關的字元裝置驅動,僅僅操作從核心中分配的一些記憶體。 下面就開始學習如何寫一個簡單的字元裝置驅動。首先我們來分解一下字元

字元裝置驅動註冊與裝置節點建立----函式講解與程式碼示例

1、字元裝置編號註冊 核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。 (1)register_chrdev 比較老的核心註冊的形式,

程式碼:編寫一個簡單字元裝置驅動——建立多個同類型裝置

編寫同類型多個裝置字元驅動應注意一下幾個問題: 1、申請裝置號alloc_chrdev_region時須指定次裝置號範圍; 2、動態分配裝置空間時同時分配NUM個裝置的空間; 3、根據次裝置號和統一的主裝置號生成針對單個裝置的devno,然後完成cdev_add註冊; 4、

linux裝置驅動第三篇:如何實現簡單字元裝置驅動

在linux裝置驅動第一篇:裝置驅動程式簡介中簡單介紹了字元驅動,本篇簡單介紹如何寫一個簡單的字元裝置驅動。本篇借鑑LDD中的原始碼,實現一個與硬體裝置無關的字元裝置驅動,僅僅操作從核心中分配的一些記憶體。 下面就開始學習如何寫一個簡單的字元裝置驅動。首先我們來分解一下

程式碼:編寫一個簡單字元裝置驅動(自動建立裝置檔案)

說明: (1)該篇在上篇的基礎上實現了自動建立裝置檔案的功能; (2)自動建立檔案主要用到了class_create()、device_create()兩個函式,宣告在inclue/linux/device.h裡; (3)裝置檔案的建立和銷燬放在模組載入和解除安裝函式中;

字元裝置驅動程式的三種寫法

驅動工程師如何去寫驅動程式? 要看原理圖。確定如何去操作硬體。 對於點亮led燈來說,確定引腳,檢視晶片手冊,確定如何去操作引腳,要設定哪些暫存器,如何設定這些暫存器才可以讓這個引腳輸出高電平或者低電平。 寫驅動程式 驅動程式起封裝作用,如何封裝。應用程式要操作硬體需要o

rk3399平臺下的字元裝置驅動

最近在搞一款瑞芯微平臺的板子,型號:rk3399 ,這幾天剛剛上手,前幾天一直在搞環境,熟悉這個板子,這個板子跑的Android7.1的系統。在網上開到這塊的東西不是很多,自己也想做個記錄。然後,開始吧:我目前用的板子是葡萄雨科技的,因為這家公司給的資料 很少,之前一直在熟悉這個板子的目錄結構,

基礎 字元裝置驅動框架

  #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <lin

字元裝置驅動(二)按鍵點燈

目錄 字元裝置驅動(二)按鍵點燈 資料互動 實體地址訪問 查詢方式按鍵 測試 title: 字元裝置驅動(二)按鍵點燈 tags: linux date: 2018-11-21 18:06:37 toc: true --- 字元裝置驅動(二)按

字元裝置驅動(一)框架

目錄 字元裝置驅動(一)框架 命令速記 框架結構 資料結構 介面實現 驅動註冊 驅動解除安裝 程式設計 (一)手動建立主裝置號 (二)自動分配主裝置號 (三)自

字元裝置驅動(三)中斷框架

目錄 字元裝置驅動(三)中斷框架 引入 彙編處理 拷貝向量表 向量表巨集解析 跳轉函式 C函式處理 asm_do_IRQ __set_irq_handler s3c24

字元裝置驅動(五)按鍵優化休眠

目錄 字元裝置驅動(五)按鍵優化 按鍵值讀取 休眠讀取 程式設計 測試 title: 字元裝置驅動(五)按鍵優化 tags: linux date: 2018-11-23 17:56:57 toc: true ---

字元裝置驅動(四)按鍵中斷

目錄 字元裝置驅動(四)按鍵中斷 硬體IO 程式設計 中斷配置 中斷關閉 中斷函式 共享中斷號 測試 完整的程式 title: 字元裝置驅動(四)按鍵中斷 tags: linu

《5.linux驅動開發-第3部分-5.3.字元裝置驅動高階》

《5.linux驅動開發-第3部分-5.3.字元裝置驅動高階》 第一部分、章節目錄 5.3.1.註冊字元裝置驅動新介面1 5.3.2.註冊字元裝置驅動新介面2 5.3.3.註冊字元裝置驅動新介面3 5.3.4.註冊字元裝置驅動新介面4 5.3.5.字元裝置驅動註冊程式碼分析1 5.3.6

《5.linux驅動開發-第2部分-5.2.字元裝置驅動基礎》

《5.linux驅動開發-第2部分-5.2.字元裝置驅動基礎》 第一部分、章節目錄 5.2.1.開啟驅動開發之路 5.2.2.最簡單的模組原始碼分析1 5.2.3.最簡單的模組原始碼分析2 5.2.4.最簡單的模組原始碼分析3 5.2.5.用開發板來除錯模組 5.2.6.字元裝置驅動工作

字元裝置驅動(七)按鍵非同步通知

目錄 按鍵驅動方式對比 程序間發訊號 目標 如何讓驅動通知應用 程式編寫 驅動程式 應用程式 完整程式碼如下 測試 title: 字元裝置驅動(七)按鍵非同步通知 tags: linux date: 2018-11-24 16:39:

字元裝置驅動(六)按鍵poll機制

title: 字元裝置驅動(六)按鍵poll機制 tags: linux date: 2018-11-23 18:57:40 toc: true --- 字元裝置驅動(六)按鍵poll機制 引入 在字元裝置驅動(五)按鍵休眠中的App中雖然使用了休眠,但是如果Read沒有返回的話會一直死等,類似阻塞

20 字元裝置驅動相關的函式和引數及實現(虛擬檔案)

字元裝置驅動相關的函式和引數及實現(虛擬檔案) 使用者程序呼叫函式順序: open ---> kernel ---> cdev.ops->open(..) read ---> kernel ---> cdev.ops->read(