1. 程式人生 > >Linux核心學習-misc雜項裝置驅動

Linux核心學習-misc雜項裝置驅動

Linux裡面的misc雜項裝置是主裝置號為10的驅動裝置,它的註冊跟使用比較的簡單,所以比較適用於功能簡單的裝置。

它有自己的裝置結構體:

 struct miscdevice  {
     int minor;
     const char *name;
     const struct file_operations *fops;
     struct list_head list;
     struct device *parent;
     struct device *this_device;
     const char *nodename;
     mode_t mode;
 };
它在標頭檔案linux/miscdevice.h裡面有定義,

其中minor是misc裝置的副裝置號,misc裝置主要依賴minor去區分,如果設定為MISC_DYNAMIC_MINOR則表示系統自動分配未使用的minor

nodename是在/dev下面建立的裝置驅動節點,

fops是驅動主體處理函式入口指標

主要使用到的函式有:

int misc_register(struct miscdevice * misc);
int misc_deregister(struct miscdevice *misc);

misc01.c檔案

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
/////////////////////////////////////////////////
MODULE_LICENSE("Dual BSD/GPL");
int open_state = 0;
/////////////////////////////////////////////////
int misc01_open(struct inode *inode, struct file *filp)
{
    if (open_state == 0)
    {
        open_state = 1;
        printk("misc01 open!\n");
        return 0;
    }
    printk("misc01 has been open!\n");
    return -1;
}

int misc01_release(struct inode *inode, struct file *filp)
{
    if (open_state == 1)
    {
        open_state = 0;
        printk("misc01 release!\n");
        return 0;
    }
    printk("misc01 has not been open yet!\n");
    return -1;
}

ssize_t misc01_read(struct file *filp, char *buf,
        size_t count, loff_t fpos)
{
    printk("misc01 read!\n");
    return 0;
}

ssize_t misc01_write(struct file *filp, char *buf,
        size_t count, loff_t fpos)
{
    printk("misc01 write!\n");
    return 0;
}

int misc01_ioctl(struct inode *inode, struct file *filp,
        unsigned int cmd, unsigned long arg)
{
    printk("ioctl is called!\n");
    printk("cmd:%d arg:%d\n", cmd, arg);
    return 0;
}
/////////////////////////////////////////////////
struct file_operations fops = 
{
    .owner      =   THIS_MODULE,
    .open       =   misc01_open,
    .release    =   misc01_release,
    .write      =   misc01_write,
    .read       =   misc01_read,
    .ioctl      =   misc01_ioctl
};

struct miscdevice dev = 
{
    .minor  =   MISC_DYNAMIC_MINOR,
    .fops    =   &fops,
    .name   =   "misc01",
    .nodename = "misc01_node"
};

int setup_misc01(void)
{
    
    return misc_register(&dev);
}
/////////////////////////////////////////////////
static int __init misc01_init(void)
{
    printk("misc01 init!\n");
    return setup_misc01();
}

static void __exit misc01_exit(void)
{
    printk("misc01 exit!\n");
    misc_deregister(&dev);
}

/////////////////////////////////////////////////
module_init(misc01_init);
module_exit(misc01_exit);


Makefile檔案

#Makefile
obj-m	:=	misc01.o
PWD		:=	$(shell pwd)
K_DIR	:=	/lib/modules/$(shell uname -r)/build

all:
	$(MAKE) -C $(K_DIR) M=$(PWD) modules
clean:
	$(MAKE) -C $(K_DIR) M=$(PWD) clean
test:misc01_test.o
	gcc -o [email protected] {1}lt;


misc01_test.c檔案

#include <stdio.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
/////////////////////////////////////////////////
int main(int argc, char **argv)
{
    int fd;
    fd = open("/dev/misc01_node", O_RDONLY);
    if (fd < 0)
    {
        printf("open /dev/misc01_node failed!\n");
        printf("%s\n", strerror(errno));
        return -1;
    }
    
    printf("open /dev/misc01_node ok!\n");
    if (ioctl(fd, 6) != 0)
    {
        printf("ioctl failed!\n");
        printf("%s\n", strerror(errno));
    }
    else
        printf("ioctl ok!\n");
    close(fd);
    return 0;
}

相關推薦

Linux核心學習misc雜項裝置驅動

Linux裡面的misc雜項裝置是主裝置號為10的驅動裝置,它的註冊跟使用比較的簡單,所以比較適用於功能簡單的裝置。它有自己的裝置結構體: struct miscdevice  {     int minor;     const char *name;     const

linux misc device字元雜項裝置驅動程式

雜項裝置也是在嵌入式系統中用得比較多的一種裝置驅動。miscdevice共享一個主裝置號MISC_MAJOR(即10),但次裝置號不同。misc裝置其實就是特殊的字元裝置,主裝置編號採用10,並且可自動生成裝置節點。 雜項裝置作為字元裝置的封裝,為字元裝置提供的簡單的程

linux核心如何定位並呼叫裝置驅動初始化函式

寫過linux驅動程式的人都知道需要將驅動的初始化函式通過module_init註冊,然後在通過menuconfig配置的時候選擇隨核心一起編譯(非模組),系統在啟動的時候就能夠自動呼叫驅動初始化函數了。真是一件神奇的事情! #include <linu

1.2 Linux 雜項裝置驅動模型

在目前的核心版本中,存在三種流行的字元裝置程式設計模型:雜項裝置驅動模型,早期經典標準字元裝置驅動模型, Linux 2.6 標準字元裝置驅動模型。 Linux 系統借鑑了面向物件的思想來管理裝置驅動 ,每一類裝置都都會有定義一個特定的結構體來描述它,這個結構體包含了裝置的

linux misc混雜裝置驅動 .

一. misc結構體 struct miscdevice { int minor; //次裝置號 const char *name; //裝置名 const struct file_operations *fops; //操作函式集 struct list_head list; //連結串列

Linux核心學習之網路裝置

字元裝置、塊裝置、網路裝置是linux中對裝置的三種分類。字元裝置、塊裝置在/dev下是有裝置節點的,而塊裝置是沒有的。對塊裝置的操作是通過一種叫socket的API進行的,這些操作包括了收包(讀)、發包(寫)、設定IP地址等等(IOCTL)。 • 網路裝置的註冊 分配net_device空間,該資料型別表

LINUX核心升級 - 更新網絡卡驅動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux 核心學習過程(1)-硬體特性和核心設計之間的聯絡

該貼用來作為自己學習linux核心的記錄和筆記,很多東西都是自己理解後整理的內容,各位看官若覺得有問題的地方,可以留言或自行查閱。 linux核心在設計的過程中很多都是依據硬體晶片特性來設計,晶片在設計的過程中很多時候需要保持相容性,這樣就留下了很多令人費解的概念,比如分段和分頁機制,

linux核心學習資料連結

1. 核心學習方法,編譯、除錯等常見問題 1.1 關於編譯升級核心到2.6.0的一些問題 作者:ommm         http://linux.chinaunix.net/bbs/thread-281831-1-5.html 1.2 VMWare

Linux核心學習書籍

轉自: https://blog.csdn.net/21aspnet/article/details/6585602 關於核心學習我建議不要上來就讀核心而是先了解核心的構成和特性,然後通過思考發現疑問這時再去讀核心原始碼。即先了解概貌在讀區域性細節。而且核心分成好多部分,不要只是按照順序去讀,應

Linux 核心學習經驗總結

  Linux 核心學習經驗總結   學習核心,每個人都有自己的學習方法,仁者見仁智者見智。以下是我在學習過程中總結出來的東西,對自身來說,我認為比較有效率,拿出來跟大家交流一下。   核心學習,一偏之見;疏漏難免,懇請指正。   為什麼寫這篇部落格   剛開始學核心的時候,不要執著於一個方面,不要專

Linux核心學習筆記(2)—— 程序

來源:《Linux核心設計與實現(第2版)》第三章 Robert Love 知識點很少,蝸牛慢慢爬~~~ 1. 什麼是程序? 程序是處於執行期的程式以及它所包含的資源的總稱。所謂的資源,像開啟的檔案、掛起的訊號、核心內部資料、處理器狀態、地址空間、一

Zynq-Linux移植學習筆記之14-RapidIO驅動開發

在對zynq進行linux驅動開發時,除了需要針對zynq內ARM自帶的控制器適配驅動外,還需要對zynq PL部分的IP核進行驅動開發。對於ARM來說,zynq PL部分的IP核就是一段地址空間,這段地址空間包含了該IP的一系列暫存器,ARM操作該IP核的暫存器也就是

Linux核心移植 part2:uboot裝置樹--生成過程分析

本文從裝置樹軟體控制相關程式碼進行分析,進而理清裝置樹相關的知識。 先放一個裝置樹在記憶體中的結構圖: 分析來源為$(tree)/lib/fdtdec_test.c 一、資料結構 1.1 檔案頭 每個dtb都包含如下結構的檔案頭,用來表示裝

Zynq-Linux移植學習筆記之13-i2c驅動配置

1、 背景介紹 板子上通過I2C匯流排與zynq相連的是三片1848 如上圖所示,zynq通過I2C匯流排與3片CPS-1848交換晶片相連,3片1848晶片的I2C地址分別為2,4,8. 目前zynq上linux I2C驅動採用的是i2c-cadence(driver

linux I-O體系結構和裝置驅動程式

裝置驅動程式模型 基於linux 3.13 sysfs檔案系統 允許使用者態應用程式訪問核心內部資料結構的一種檔案系統。被安裝於/sys目錄下,相應的高層目錄結構如下: block 塊裝置,獨立於所連線的匯流排 devices

Linux核心移植 part2:uboot 裝置樹--基本概念和原始碼介紹

arm uboot的裝置樹原始檔位於arch/arm/dts/目錄下,網路上有很多介紹Linux裝置樹概念的文章,這裡以dts相關的API為切入點,如果都懂了,裝置樹的東西就迎刃而解了。本篇文章首先記錄一些基本知識,下一篇進行原始碼分析。 一、裝置樹檔案基

【原創】IP攝像頭技術縱覽(一)---linux 核心編譯,USB攝像頭裝置識別

IP攝像頭技術縱覽(一)— linux 核心編譯,USB攝像頭裝置識別 開始正文之前先來認識一下我的開發環境: 系統:ubuntu 10.04 開發板:AT91SAM9260 + Linux-2.6.30 USB攝像頭:UVC無驅攝像頭(著手開發時只

linux核心學習筆記------iP選項處理(一)

ip首部分為固定部分和選項部分;固定部分為20個位元組,而選項部分則是變長的,最長不超過40個位元組。選項的格式分為單位元組和多位元組兩種。單位元組只包括一個位元組的選項型別,而多位元組則除一個位元組的型別之外,還包括選項長度以及選項資料。包括以下幾種ip選項: 1、選項列

Linux核心學習實踐之GPIO面板按鍵

說明:本分析基於AM6C平臺Linux3.0.8核心,其他核心版本僅供參考。 一、platform設備註冊的按鍵對映 common/customer/boards/board-m6tv-h32.c