⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydevice.c

📁 Linux 下的字符驱动程序
💻 C
字号:
#ifndef __KERNEL__
#define __KENEL__
#endif
#ifndef MODULE
#define MODULE
#endif

#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/ioport.h>
int my_major=0; /*设备号*/
static int Device_Open=0;
static char Message[128];
char *Message_Ptr;
/*--------------------my_open----------------------*/
/*--------------------------------------------------*/
int my_open(struct inode *inode, struct file *file)
{   
    static int counter=0;
    printk("<1>device_open(%p,%p) is called\n",inode,file);
    if(Device_Open)
        return  -EBUSY;/*同时只能供一台设备打开*/
    Device_Open++;      /*引用计数加1*/
    sprintf(Message,"this is from my_device,it has been called %d times\n",counter++);
    return 0;
}

/*--------------------my_release-------------------*/
/*--------------------------------------------------*/
int my_release(struct inode *inode, struct file *file)
{
    printk("<1>device_release(%p,%p) is called\n",inode,file);
    Device_Open--;      /*引用计数减1*/
    printk("<1>the device has been released\n");
    return 0;
}

/*--------------------my_read----------------------*/
/*--------------------------------------------------*/
ssize_t my_read(struct file *file,char *buf,int size,loff_t off)
{
    ssize_t bytes_read=0;
    printk("<1>my_read is called,User buffer is %p,size is %d\n",buf,size);

    Message_Ptr=Message;
    while(size&&*Message_Ptr)
    {
        if(put_user(*(Message_Ptr++),buf++))  /*鍐欐暟鎹

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -