linux字元設備-自動創建設備號和設備節點

来源:http://www.cnblogs.com/love-linux/archive/2016/02/21/5205751.html
-Advertisement-
Play Games

Linux字元設備-自動創建設備號和設備節點 先寫一個自動分配字元設備號和設備節點的例子及APP 手動安裝步驟: Insmod my_char_dev.ko 不需要再安裝設備節點 然後是測試app ./my_char_dev_app 1 1 #include <linux/module.h> 2 #


Linux字元設備-自動創建設備號和設備節點

 

先寫一個自動分配字元設備號和設備節點的例子及APP

手動安裝步驟:

Insmod my_char_dev.ko

 

不需要再安裝設備節點

 

然後是測試app

./my_char_dev_app 1

 

 1 #include <linux/module.h>
 2 #include <linux/init.h>
 3 #include <linux/io.h>
 4 #include <linux/fs.h>
 5 #include <asm/device.h>  //下麵這三個頭文件是由於動態創建需要加的
 6 #include <linux/device.h>
 7 #include <linux/cdev.h>
 8 #include "my_cdev.h"
 9 struct cdev cdev;
10 dev_t devno;//這裡是動態分配設備號和動態創建設備結點需要用到的
11 struct class *cdev_class;
12 
13 int my_cdev_open(struct inode *node,struct file *filp)
14 {
15     printk("my_cdev_open sucess!\n");
16     return 0;
17 }
18 
19 long my_cdev_ioctl(struct file *filp ,unsigned int cmd ,unsigned long arg)
20 {
21     switch(cmd)
22     {
23         case LED_ON:
24             printk("LED_ON is set!\n");
25             return 0;
26         case LED_OFF:
27             printk("LED_OFF is set!\n");
28             return 0;
29         default :
30             return -EINVAL;
31     }
32 }
33 
34 struct file_operations my_cdev_fops=
35 {
36     .open = my_cdev_open,
37     .unlocked_ioctl = my_cdev_ioctl,
38 
39 };
40 
41 static int my_cdev_init(void)
42 {
43     int ret;
44     /**動態分配設備號*/
45     ret = alloc_chrdev_region(&devno,0,1,"my_chardev");
46     if(ret)
47     {
48         printk("alloc_chrdev_region fail!\n");
49         unregister_chrdev_region(devno,1);
50         return ret;
51     }
52     else
53     {
54         printk("alloc_chrdev_region sucess!\n");
55     }
56     /**描述結構初始化*/
57     cdev_init(&cdev,&my_cdev_fops);
58     /**描述結構註冊*/
59     ret = cdev_add(&cdev,devno,1);
60     if(ret)
61     {
62         printk("cdev add fail.\n");
63         unregister_chrdev_region(devno,1);
64         return ret;
65     }
66     else
67     {
68         printk("cdev add sucess!\n");
69     }
70 
71     cdev_class = class_create(THIS_MODULE,"my_chardev");
72     if(IS_ERR(cdev_class))
73     {
74         printk("Create class fail!\n");
75         unregister_chrdev_region(devno,1);
76         return -1;
77     }
78     else
79     {
80         printk("Create class sucess!\n");
81     }
82 
83     device_create(cdev_class,NULL,devno,0,"my_chardev");
84     
85     return 0;
86 }
87 static void my_cdev_exit(void)
88 {
89     device_destroy(cdev_class,devno);
90     class_destroy(cdev_class);
91     cdev_del(&cdev);
92     unregister_chrdev_region(devno,1);
93     printk("my_cdev_exit sucess!\n");
94 }
95 module_init(my_cdev_init);
96 module_exit(my_cdev_exit);
97 MODULE_LICENSE("GPL");
98 MODULE_AUTHOR("YF");
99 MODULE_DESCRIPTION("YF Driver");

 

1 #ifndef __MY_CDEV_H__
2 #define __MY_CDEV_H__
3 
4 #define LED_MAGIC 'L'
5 #define LED_ON _IO(LED_MAGIC,0)
6 #define LED_OFF _IO(LED_MAGIC,1)
7 
8 #endif

 

 1 #include <sys/stat.h>
 2 #include <sys/types.h>
 3 #include <sys/ioctl.h>
 4 #include <fcntl.h>
 5 #include <stdio.h>
 6 #include "my_cdev.h"
 7 
 8 int main(int argc,char *argv[])
 9 {
10     int fd;
11     int cmd;
12     if(argc < 2)
13     {
14         printf("Please enter secend param!\n");
15         return 0;
16     }
17     cmd = atoi(argv[1]);
18     fd = open("/dev/my_chardev",O_RDWR);
19     if(fd < 0)
20     {
21         printf("Open dev/my_chardev fail!\n");
22         close(fd);
23         return 0;
24     }
25     switch(cmd)
26     {
27         case 1:
28             ioctl(fd,LED_ON);
29             break;
30         case 2:
31             ioctl(fd,LED_OFF);
32             break;
33         default:
34             break;
35     }
36     close(fd);
37     return 0;
38 }

 

1 obj-m := my_char_dev.o
2 KDIR := /home/win/dn377org/trunk/bcm7252/linux/
3 all:
4     make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
5 clean:
6     rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網路協議分析 1. 網路模型 2. 協議分析 2.1協議架構 2. 2 乙太網協議格式 2. 3 IP協議格式 2. 4 TCP協議格式 2. 5 UDP協議格式
  • ## 下麵命令都是以root用戶執行 ## 查看內核版本 uname -a # Debian 3.2.0-4 x86_64 ## 版本太低了
  • 1.配置email及name git config --global user.email "[email protected]" git config --global user.name "jaxGu" 2.生成密鑰: $ ssh-keygen -t rsa -C “guxuelon
  • 原文鏈接:http://blog.csdn.net/johnnycode/article/details/40624403 本學習主要針對 Centos 7.0.1406 版本進行學習整理! 如果你使用 VirtualBox 配置 Centos 那麼請參考我的這篇文章 Centos 7 學習之靜態I...
  • Linux(Fedora)下NodeJs升級最新版本(制定版本) 首先安裝n模塊: npm install -g n 升級node.js到最新穩定版 n stable 升級node.js到制定版本 n v0.10.26
  • 我們在前面的devicenode_linux_module.c文件上添加代碼,首先將文件名devicenode_linux_module.c改為leds.c。 先處理一下編譯文件Makefile,如下圖所示,將devicenode_linux_module改為leds。
  • 本系統是10月5日最新完整版本的Windows10 安裝版鏡像,win10正式版,更新了重要補丁,提升應用載入速度,微軟和百度今天宣佈達成合作,百度成為win10 Edge瀏覽器中國預設主頁和搜索引擎,系統增加了搜狗輸入法,安裝過程需要用戶手動創建個人賬戶等步驟,為保證系統的穩定性,win10為未激
  • Linux混雜字元設備 混雜設備驅動模型 混雜設備概念 在Linux系統中,存在一類字元設備,它們擁有相同的主設備號(10),但次設備號不同,我們稱這類設備為混雜設備(miscdevice)。所有的混雜設備形成一個鏈表,對設備訪問時內核根據次設備號查找到相應的混雜設備。 1.設備描述 Linux中使
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...