zoukankan      html  css  js  c++  java
  • 最简单的字符设备驱动gobalvar

    最简单的字符设备驱动gobalvar

    drv:

    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/fs.h>
    #include <asm/uaccess.h>
    MODULE_LICENSE("GPL");

    #define MAJOR_NUM 1024 //主设备号

    static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
    static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);

    static int global_var = 0; //"globalvar"设备的全局变量


    static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
    {
    if (copy_to_user(buf, &global_var, sizeof(int))){ //将global_var从内核空间复制到用户空间
    return - EFAULT;

    }
    printk("globalvar_read enter ,the data is %d\n",global_var);
    return sizeof(int);
    }

    static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
    {
    if (copy_from_user(&global_var, buf, sizeof(int))){//将用户空间的数据复制到内核空间的global_var
    return - EFAULT;

    }
    printk("globalvar_write enter ,the data is %d\n",global_var);
    return sizeof(int);
    }

    //初始化字符设备驱动的file_operations结构体
    struct file_operations globalvar_fops =

    {
    //read: globalvar_read, write: globalvar_write,
    .write = globalvar_write,

    .read =globalvar_read,
    };

    static int __init globalvar_init(void){
    int ret;

    ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops); //注册设备驱动
    if (ret){

    printk("globalvar register failure");
    }
    else{
    printk("globalvar register success");
    }
    return ret;
    }
    //注销设备驱动
    static void __exit globalvar_exit(void)

    {
    unregister_chrdev(MAJOR_NUM, "globalvar");
    }
    module_init(globalvar_init);
    module_exit(globalvar_exit);


    对应的app:

    #include <stdio.h>
    #include <sys/stat.h> //获得文件的属性,它可以返回一个结构,里面包含文件全部属性
    #include <fcntl.h> //设备驱动程序接口是由结构说明,它定义在fcntl.h中
    #include <sys/types.h> //类型 clock_t,dev_t,off_t,ptrdiff,size_t,ssize_t,time_t

    void main(void)
    {
    int fd, num;

    fd = open("/dev/globalvar", O_RDWR, S_IRUSR | S_IWUSR);
    if (fd != -1 ){

    read(fd, &num, sizeof(int));
    printf("The globalvar is %d\n", num);

    printf("Please input the num written to globalvar\n");
    scanf("%d", &num);
    write(fd, &num, sizeof(int));

    read(fd, &num, sizeof(int));
    printf("The globalvar is %d\n", num);

    close(fd);
    }else{
    printf("Device open failure\n");
    }
    }


    对应的加载脚本:

    # !/bin/sh
    insmod /home/project/ddr3/ddr3_globalvartest/drv/globalvar.ko

    mknod /dev/globalvar c 1024 0
    ../app/app
    dmesg -c


    卸载脚本:

    # !/bin/sh

    rmmod globalvar
    dmesg -c
    #killall -9 app


    原理既不多做作介绍了,很简单。

  • 相关阅读:
    一行Haskell语句打印勾股数
    给孩子增加学习生物的兴趣,买了个显微镜
    实现求n个随机数和为sum的haskell程序
    用haskell实现的八皇后程序
    桥牌笔记:第一墩决定成败
    读书笔记:父母离去前要做的55件事
    LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项
    LINQ to SQL系列四 使用inner join,outer join
    Asp.Net 4.0 新特性 系列 之一 从页面标记<%%>说起
    使用javascript自动标记来自搜索结果页的关键字
  • 原文地址:https://www.cnblogs.com/fishoneseaatblog/p/2361612.html
Copyright © 2011-2022 走看看