• Linux 设备驱动程序 字符设备


    已经无法再精简,适合入门。

     1 #include<linux/module.h>
     2 #include<linux/init.h>
     3 
     4 #include<asm/uaccess.h>
     5 #include <linux/types.h>
     6 #include<linux/fs.h>
     7 #include<linux/cdev.h>
     8 struct mengc_dev{
     9         char data[64];
    10         struct cdev cdev;
    11 };
    12 int mengmajor;
    13 struct mengc_dev meng_device;
    14 
    15 void exit_mengc_dev(void)
    16 {
    17         dev_t devno = MKDEV(mengmajor,1);
    18         cdev_del(&meng_device.cdev);
    19         unregister_chrdev_region(devno,1);
    20 }
    21 int meng_open(struct inode*inode,struct file *filep)
    22 {
    23         return 0;
    24 }
    25 int meng_release(struct inode*inode,struct file *filep)
    26 {
    27                 return 0;
    28 }
    29 
    30 ssize_t meng_read(struct file*filep,char __user*buf,size_t count,loff_t*f_ops)
    31 {
    32         if(*f_ops>=strlen(meng_device.data))
    33                 return 0;
    34         if(copy_to_user(buf,meng_device.data,strlen(meng_device.data)))
    35         {
    36                 return -1;
    37         }
    38         *f_ops+=strlen(meng_device.data);
    39         return strlen(meng_device.data);
    40 }
    41 
    42 ssize_t meng_write(struct file*filep,const char __user*buf,size_t count,loff_t*f_ops)
    43 {
    44         if(count>63)
    45                 count=63;
    46         if(copy_from_user(meng_device.data,buf,count))
    47         {
    48                 return -EFAULT;
    49         }
    50         return count;
    51 }
    52 
    53 
    54 struct file_operations meng_fops=
    55 {
    56         .read=meng_read,
    57         .write=meng_write,
    58         .open=meng_open,
    59         .release=meng_release
    60 };
    61 int init_mengc_dev(void)
    62 {
    63         int re;
    64         dev_t dev=0;
    65         re=alloc_chrdev_region(&dev,1,1,"mengcdev");
    66         if(re<0)
    67         {
    68                 printk("meng_devc register failed.
    ");
    69                 return re;
    70         }
    71         mengmajor=MAJOR(dev);
    72         memset(&meng_device,0,sizeof(meng_device));
    73         cdev_init(&meng_device.cdev,&meng_fops);
    74         meng_device.cdev.owner=THIS_MODULE;
    75         meng_device.cdev.ops=&meng_fops;
    76         re=cdev_add(&meng_device.cdev,dev,1);
    77         if(re)
    78         {
    79                 printk("mengdevc add faild.
    ");
    80         }
    81         return 0;
    82 }
    83 module_init(init_mengc_dev);
    84 module_exit(exit_mengc_dev);

    将上面的文件保存成mengcdev.c

    然后在相同目录下建立一个Makefile文件,文件内容如下(只需这一行):

    obj-m :=mengcdev.o

    然后在此目录下执行 make -C /lib/modules/`uname -r`/build/ M=`pwd` 这条命令执行成功的前天是安装了源代码包,具体可以参阅其他资料,Ubuntu只需apt-get install 几个包,Redhat系列只需yuminstall 几个。当然需要有开发环境了,即gcc之类的。

    一旦编译完成即可生成mengcdev.ko 这个模块

    用root插入这个模块 insmod mengcdev.ko

    然后去/proc/device中找相应的设备号 

    cat /proc/devices |grep meng

    如果输出如下:

    248 mengcdev

    则执行 

    mknod /dev/mengcdev c 248 1,注意把248换成实际输出的值

    然后就可以进行测试了  echo hello >/dev/mengcdev

    cat /dev/mengcdev

  • 相关阅读:
    Arcmap软件报错:This application cannot run under a virtual machine arcmapr, 但是你并没有使用虚拟机
    Sql server 2008 作业失败通知邮件配置
    能drag和resize的DIV,目的是做一个类似于数据库视图设计器
    Type.GetType()与System.Web.Compilation.BuildManager.GetType()
    让你的实体字段和页面上的控件映射,自动绑定 ObjectBinding1.0
    利用Log Explor来恢复误用delete 、update了的数据
    破解版果冻手机动画主题for WM5 & WM6
    封装一个图片轮换的web控件
    利用Lucene.net对附件做搜索
    关于TransactionScope分布式事务在Oracle下的运作
  • 原文地址:https://www.cnblogs.com/mengqingzhong/p/3745266.html
Copyright © 2020-2023  润新知