4.自動生成class和device

第三章里面,我們使用mknod創建設備節點,常規操作是在驅動init的時候就創建好,使用class_create和device_create創建。

#include "asm/uaccess.h"
#include "linux/scatterlist.h"
#include "linux/types.h"
#include <linux/mm.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/mman.h>
#include <linux/random.h>
#include <linux/init.h>
#include <linux/raw.h>
#include <linux/tty.h>
#include <linux/capability.h>
#include <linux/ptrace.h>
#include <linux/device.h>
#include <linux/highmem.h>
#include <linux/backing-dev.h>
#include <linux/shmem_fs.h>
#include <linux/splice.h>
#include <linux/pfn.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/uio.h>
#include <linux/module.h>#include <linux/uaccess.h>#define DEVICE_NAME "hello_device"
static struct class *hello_class;
static struct device *hello_device;
static int major;
#define hello_buf_size 100
static unsigned char hello_buf[hello_buf_size];//ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
//參數含義依次為 要讀取的文件指針 用戶保存數據的buf 讀取數據大小 文件內容的偏移量
static ssize_t hello_read (struct file * filp, char __user *buf, size_t size, loff_t *offset)
{unsigned long len = size > hello_buf_size ? hello_buf_size : size;unsigned long ret = copy_to_user(buf, hello_buf, len);printk("%s %s %d ret = %ld\n", __FILE__, __FUNCTION__, __LINE__, ret);return len;
}//ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
//參數含義依次為 要寫入的文件指針 用戶要寫入的數據buf 寫入數據大小 文件內容的偏移量
static ssize_t hello_write (struct file *filp, const char __user *buf, size_t size, loff_t *offset)
{unsigned long len = size > hello_buf_size ? hello_buf_size : size;unsigned long ret = copy_from_user(hello_buf, buf, len);printk("%s %s %d ret = %ld\n", __FILE__, __FUNCTION__, __LINE__, ret);return len;
}//int (*open) (struct inode *, struct file *);
//參數含義依次為 文件索引節點 文件指針
static int hello_open (struct inode *node, struct file *filp)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}//int (*release) (struct inode *, struct file *);
//參數含義依次為 文件索引節點 文件指針
static int hello_release (struct inode *node, struct file *filp)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0; 
}/*構建file_operations結構體*/
static const struct file_operations hello_fops = {.owner      = THIS_MODULE,.read		= hello_read,.write		= hello_write,.open		= hello_open,.release    = hello_release,
};/*init函數,實現register_chrdev*/
static int __init hello_init(void)
{//數含義依次為 主設備號,如果為0,內核會自動分配一個可用的。設備名,會在/proc/devices中顯示。 file_operations結構體//注冊成功就返回主設備號major = register_chrdev(0, DEVICE_NAME, &hello_fops);//為這個模塊創建一個名為hello的類  在/sys/class/下會生成hello目錄hello_class = class_create(THIS_MODULE, "hello");if (IS_ERR(hello_class)) {pr_err("failed to allocate class\n");return PTR_ERR(hello_class);}//在/sys/class/hello類下創建一個hello設備,同時在/dev/下創建一個hello節點hello_device = device_create(hello_class, NULL, MKDEV(major, 0), NULL, "hello");if (IS_ERR(hello_device)) {pr_err("failed to allocate device\n");return PTR_ERR(hello_device);}printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}/*exit函數unregister_chrdev*/
static void __exit hello_exit(void)
{//先銷毀設備,后銷毀類device_destroy(hello_class, MKDEV(major, 0));class_destroy(hello_class);unregister_chrdev(major, DEVICE_NAME);printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}module_init(hello_init);
module_exit(hello_exit);
//遵循GPL協議
MODULE_LICENSE("GPL");

現在insmod驅動后,就會在/dev/下自動生成hello節點(/dev/hello),/sys/class/下生成hello目錄并在hello目錄下生成一個hello設備的信息目錄(/sys/class/hello/hello)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37751.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【公平鎖 和 非公平鎖】

公平鎖 和 非公平鎖 公平鎖:類似食堂打飯&#xff0c;按照申請鎖的順序來獲取鎖類似廁所蹲坑先來后到 公平鎖就是很公平 在并發環境下每個線程在獲取鎖的同時會先查看此鎖維護的等待隊列&#xff0c;如果為空&#xff0c;或者當前線程是等待就占有鎖&#xff0c;否則就加入到…

20人團隊如何免費使用 Atlassian 云產品?

企業賺錢越來越難&#xff0c;尤其是初創團隊或小型團隊更傾向于使用免費工具支持業務。團隊規模影響協作復雜度&#xff0c;Atlassian 考慮到小團隊的需求&#xff0c;提供了多種選擇。比如&#xff0c;Jira 和 Confluence 的云版本有免費版&#xff0c;包含基本的項目管理功能…

ISP IC/FPGA設計-第一部分-SC130GS攝像頭分析(0)

1.介紹 SC130GS是一款國產的Global shutter CMOS圖像傳感器&#xff0c;最高支持1280Hx1024V240fps的傳輸速率&#xff1b;SC130GS有黑白和彩色款&#xff0c;作為ISP開發選擇彩色的&#xff0c;有效像素窗口為1288Hx1032V&#xff0c;支持復雜的片上操作&#xff0c;選擇他理…

Toshiba東芝TB6612FNG電機驅動IC:釋放性能與多功能性

在嵌入式系統和機器人技術領域&#xff0c;電機控制是一個關鍵方面&#xff0c;對項目的性能和可靠性有著顯著影響。東芝的TB6612FNG電機驅動IC作為一個穩健且多功能的解決方案&#xff0c;在驅動雙直流電機方面脫穎而出&#xff0c;提供了高性能、可靠性和易用性。本文將深入探…

23種設計模式之裝飾者模式

深入理解裝飾者模式 一、裝飾者模式簡介1.1 定義1.2 模式類型1.3 主要作用1.4 優點1.5 缺點 二、模式動機三、模式結構四、 裝飾者模式的實現4.1 組件接口4.2 具體組件4.3 裝飾者抽象類4.4 具體裝飾者4.5 使用裝飾者模式4.6 輸出結果&#xff1a; 五、 應用場景5.1 圖形用戶界面…

排序(堆排序、快速排序、歸并排序)-->深度剖析(二)

前言 前面介紹了冒泡排序、選擇排序、插入排序、希爾排序&#xff0c;作為排序中經常用到了算法&#xff0c;還有堆排序、快速排序、歸并排序 堆排序&#xff08;HeaSort&#xff09; 堆排序的概念 堆排序是一種有效的排序算法&#xff0c;它利用了完全二叉樹的特性。在C語言…

復分析——第9章——橢圓函數導論(E.M. Stein R. Shakarchi)

第 9 章 橢圓函數導論 (An Introduction to Elliptic Functions) The form that Jacobi had given to the theory of elliptic functions was far from perfection; its flaws are obvious. At the base we find three fundamental functions sn, cn and dn. These functio…

商湯上海AI實驗室聯合發布:自動駕駛全棧式高精度標定工具箱(含車、IMU、相機、激光雷達等的標定)

前言 在自動駕駛技術飛速發展的今天&#xff0c;傳感器的精確標定對于確保系統性能至關重要。SensorsCalibration&#xff0c;一個專為自動駕駛車輛設計的標定工具箱&#xff0c;提供了一套全面的解決方案&#xff0c;用于校準包括IMU、激光雷達、攝像頭和雷達在內的多種傳感器…

基于Java平價平價汽車租賃系統設計和實現(源碼+LW+部署講解)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; &#x1f31f;文末獲取源碼數據庫&#x1f31f; 感興趣的可以先收藏起來&#xff0c;…

【python】使用conda管理python項目:conda管理不同項目環境,pip下載最新的包

文章目錄 一. python包管理概述1. miniforge、Miniconda與Anaconda2. conda與pip的區別是什么&#xff1f;3. pip與conda配合使用 二. 使用conda管理不同py環境1. 創建一個環境2. 解決沖突 三. 命令合集1. conda1.1. 常用1.2. 環境管理1.3. 分享環境1.4. 包管理 2. 依賴沒有在c…

《RepViT Revisiting Mobile CNN From ViT Perspective》

期刊&#xff1a;CVPR 年份&#xff1a;2024 代碼&#xff1a;http://https: //github.com/THU-MIG/RepViT 摘要 最近&#xff0c;與輕量級卷積神經網絡(CNN)相比&#xff0c;輕量級視覺Transformer(ViTs)在資源受限的移動設備上表現出了更高的性能和更低的延遲。研究人員已…

無法訪問指向的web服務器(或虛擬主機)的目錄,請檢查網絡設置

微信公眾平臺,進行業務域名、JS接口安全域名、網頁授權域名配置時&#xff0c;遇到的問題中有&#xff1a;無法訪問指向的web服務器&#xff08;或虛擬主機&#xff09;的目錄&#xff0c;請檢查網絡設置&#xff0c;這里簡單記錄一下處理過程。 關于這個問題首先保證下載…

SHELL腳本學習(十四)gawk進階

一、使用變量 gawk支持兩種變量 內建變量自定義變量 1.1 內建變量 1.1.1 字段和記錄分隔符變量 數據字段變量允許使用美元符號 $ 和 位置來引用對應的字段。 $1 對應第一個數據字段&#xff0c;$2對應第二個數據字段&#xff0c;以此類推。 數據字段用字段分隔符劃定。默…

【基于R語言群體遺傳學】-1-哈代溫伯格基因型比例

前言 群體遺傳學是研究生物群體中基因的分布、基因頻率和基因型頻率的維持和變化的學科。它不僅探討遺傳病的發病頻率和遺傳方式&#xff0c;還研究基因頻率和變化的規律&#xff0c;為預防、監測和治療遺傳病提供重要信息。R語言作為一種強大的統計分析工具&#xff0c;在群體…

mybatis實現多表查詢

mybatis高級查詢【掌握】 1、準備工作 【1】包結構 創建java項目&#xff0c;導入jar包和log4j日志配置文件以及連接數據庫的配置文件&#xff1b; 【2】導入SQL腳本 運行資料中的sql腳本&#xff1a;mybatis.sql 【3】創建實體來包&#xff0c;導入資料中的pojo 【4】User…

TypeScript Project References npm 包構建小實踐

npm 包輸出 es/cjs 產物 在開發一個 npm 包時&#xff0c;通常需要同時輸出 ES 模塊和 CommonJS 模塊的產物供不同的構建進行使用。在只使用tsc進行產物編譯的情況下&#xff0c;我們通常可以通過配置兩個獨立的 tsconfig.json 配置文件&#xff0c;并在一個 npm script 中 執…

kubesphere自定義流水線基礎鏡像

背景 需求&#xff1a;在流水線基礎pod中使用python和jinja2模塊來動態渲染部署文件 由于ks提供的基礎鏡像無法滿足以上需求&#xff0c;在ks提供的maven鏡像的基礎上實現 實施 制作鏡像&并推送到private image repo FROM kubesphere/builder-maven:v3.2.0 RUN sed -i…

7.1作業

1.思維導圖 2.在堆區申請兩個長度為32的空間&#xff0c;實現兩個字符串的比較【非庫函數實現】 (1)定義函數&#xff0c;在對區申請空間 兩個申請&#xff0c;主函數需要調用2次 (2)定義函數&#xff0c;實現字符串的輸入 void input(char *p) (3)調用函數實現字符串比較…

BUT000增強字段BAPI結構激活出錯(BUPA_CENTRAL_CI_CHANGE)

導語&#xff1a;BP主數據增強字段&#xff0c;需要使用BAPI&#xff1a;BUPA_CENTRAL_CI_CHANGE進行值寫入&#xff0c;但是在SAP 2023以后的版本&#xff0c;激活會出錯&#xff0c;原因是因為SAP的一個結構同時包含了BUS00_EEW以及BUS00_EEWX兩個結構&#xff0c;導致結構字…