美文网首页
驱动学习1

驱动学习1

作者: 唐超1994 | 来源:发表于2021-04-17 14:00 被阅读0次

    一、字符设备驱动

    1.添加驱动入口和出口
    module_init();
    module_exit();
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("*****");
    2.实现函数入口和出口
    /函数入口/
    static int __init chrdevbase_init(void)
    {
    int ret;
    printk("chrdevbase init!\r\n");

    /*注册字符设备*/
    ret = register_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME,&chrdevbase_fops);
    return ret;
    

    }

    /函数出口/
    static void __exit chrdevbase_exit(void)
    {
    printk("chrdevbase exit!\r\n");
    unregister_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME);
    /注销字符是被/

    }

    3.实现设备操作函数结构体

    static struct file_operations chrdevbase_fops = {
    .owner = THIS_MODULE,
    .open = chrdevbase_open,
    .read = chrdevbase_read,
    .write = chrdevbase_write,
    .release = chrdevbase_release,
    };
    4.实现对应的函数

    /*
    *打开设备
    */
    static int chrdevbase_open(struct inode *inode, struct file *filp)
    {
    printk("open_chrdevbase!\r\n");
    return 0;
    }

    /*
    *从设备中读取数据
    */
    static ssize_t chrdevbase_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
    {
    printk("Read_chrdevbase!\r\n");
    return 0;
    }

    /*
    *写数据到设备
    */
    static ssize_t chrdevbase_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
    {
    printk("Write_chrdevbase!\r\n");
    return 0;
    }

    /*
    *关闭设备
    */
    static int chrdevbase_release(struct inode *inode, struct file *filp)
    {
    printk("release_chrdevbase!\r\n");
    return 0;
    }

    注:

    1.在使用modprobe加载模块之前,一定要使用depmod.
    2.如果使用了depmod,并且.ko文件也在/lib/module/内核版本 下但还是提示.ko not found in directory。则需要修改指令去掉.ko
    3.如果打印失败,则设置编译内核源码时默认的打印级数。
    echo 8 4 1 7 > /proc/sys/kernel/printk

    相关文章

      网友评论

          本文标题:驱动学习1

          本文链接:https://www.haomeiwen.com/subject/iiqllltx.html