zoukankan      html  css  js  c++  java
  • 简单字符驱动程序mycdev.c

    [root@bogon 桌面]# gedit mycdev.c

    #include
    #include
    #include
    #include
    #include
    #include

    MODULE_AUTHOR("Me");
    MODULE_LICENSE("GPL");

    #define MYCDEV_MAJOR 231 /*给定的主设备号*/
    #define MYCDEV_SIZE 100

    static int mycdev_open(struct inode *inode, struct file *fp)
    {
        return 0;
    }

    static int mycdev_release(struct inode *inode, struct file *fp)
    {
        return 0;
    }

    static ssize_t mycdev_read(struct file *fp, char __user *buf, size_t size, loff_t *pos)
    {
        unsigned long p = *pos;
        unsigned int count = size;
        //char kernel_buf[MYCDEV_SIZE]="This is mycdev!";
        char kernel_buf[MYCDEV_SIZE];
        int i;

        memset(kernel_buf,0,MYCDEV_SIZE);
        memcpy(kernel_buf, "This is mycdev!", MYCDEV_SIZE);

        if(p >= MYCDEV_SIZE)
            return -1;
        if(count > MYCDEV_SIZE)
            count = MYCDEV_SIZE - p;

        if (copy_to_user(buf, kernel_buf, count) != 0) {
            printk("read error! ");
            return -1;
        }

        /*
        for (i = 0; i < count; i++) {
            __put_user(i, buf);//write 'i' from kernel space to user space's buf;
            buf++;
        }
        */

        printk("reader: %d bytes was read... ", count);
        return count;
    }

    static ssize_t mycdev_write(struct file *fp, const char __user *buf, size_t size, loff_t *pos)
    {
        return size;
    }

    /* 填充 mycdev的 file operation 结构*/
    static const struct file_operations mycdev_fops =
    {
        .owner = THIS_MODULE,
        .read = mycdev_read,
        .write = mycdev_write,
        .open = mycdev_open,
        .release = mycdev_release,
    };

    /*模块初始化函数*/
    static int __init mycdev_init(void)
    {
        int ret;
        printk("mycdev module is staring.. ");
        ret=register_chrdev(MYCDEV_MAJOR,"my_cdev",&mycdev_fops); /*注册驱动程序*/
        if(ret<0){
            printk("register failed.. ");
            return 0;
        }else{
            printk("register success.. ");
        }
        return 0;
    }

    /*模块卸载函数*/
    static void __exit mycdev_exit(void)
    {
        printk("mycdev module is leaving.. ");
        unregister_chrdev(MYCDEV_MAJOR,"my_cdev"); /*注销驱动程序*/
    }

    module_init(mycdev_init);
    module_exit(mycdev_exit);



    [root@bogon 桌面]# gedit Makefile

    obj-m:=mycdev.o
    PWD:=$(shell pwd)
    CUR_PATH:=$(shell uname -r)
    KERNEL_PATH:=/usr/src/kernels/$(CUR_PATH)

    all:
        make -C $(KERNEL_PATH) M=$(PWD) modules
    clean:
        make -C $(KERNEL_PATH) M=$(PWD) clean


    [root@bogon 桌面]# gedit mycdev_test.c

    #include
    #include
    #include
    #include
    #include

    int main()
    {
        int testdev;
        int i, ret;
        char buf[15];

        testdev = open("/dev/mycdev", O_RDWR);

        if (-1 == testdev) {
            printf("cannot open file. ");
            exit(1);
        }

        if (ret = read(testdev, buf, 15) <15) {
            printf("read error! ");
            exit(1);
        }

        printf("%s ", buf);

        close(testdev);

        return 0;
    }


    [root@bogon 桌面]# make

    [root@bogon 桌面]# insmod mycdev.ko
    [root@bogon 桌面]# cat /proc/devices
    [root@bogon 桌面]# mknod /dev/mycdev c 231 0
    [root@bogon 桌面]# chmod 777 /dev/mycdev
    [root@bogon 桌面]# gcc mycdev_test.c -o mycdev_test
    [root@bogon 桌面]# ./mycdev_test
    [root@bogon 桌面]# dmesg
    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(1002) | 评论(0) | 转发(13) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    opencv实现连通域
    C Tips:显示点阵汉字的小样例
    协方差的意义
    HashTable类模板_C++
    Java实现 蓝桥杯VIP 算法提高 选择排序
    Java实现 蓝桥杯VIP 算法提高 笨小猴
    Java实现 蓝桥杯VIP 算法提高 笨小猴
    Java实现 蓝桥杯VIP 算法提高 笨小猴
    Java实现 蓝桥杯VIP 算法提高 笨小猴
    Java实现 蓝桥杯VIP 算法提高 笨小猴
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648074.html
Copyright © 2011-2022 走看看