• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            Linux設備驅動程序學習筆記:(1) 字符設備驅動入門1

             

             

            //這是一個最簡單的字符設備驅動,入門專用.
            //scull1.h
            #ifndef _SCULL1_H
            #define _SCULL1_H

            #include 
            <linux/init.h>
            #include 
            <linux/module.h>
            #include 
            <linux/kernel.h>
            #include 
            <linux/types.h>
            #include 
            <linux/fs.h>
            #include 
            <linux/version.h>
            #include 
            <asm/uaccess.h>
            #include 
            <linux/cdev.h>
            #include 
            <linux/mm.h>
            #include 
            <linux/errno.h>


            #define SCULL_MAJOR 0
            #define SCULL_SIZE    0x1000
            #define SCULL_CMD_CLEAR    0x01


            struct scull_dev{
                
            struct cdev cDev;
                
            char   mem[SCULL_SIZE];
            };


            int scull_open(struct inode* inode,struct file* filp);

            ssize_t scull_read(
            struct file *filp, char __user *buf, size_t count,loff_t *f_pos);             

            ssize_t scull_write(
            struct file *filp, const char __user *buf, size_t count,loff_t *f_pos);

            int scull_release(struct inode* inode,struct file* filp);

            #endif






            //scull1.c
            #include "scull1.h"

            MODULE_LICENSE(
            "Dual BSD/GPL");
            MODULE_AUTHOR(
            "Aaron.xu");
            MODULE_DESCRIPTION(
            "hello driver test");
            MODULE_VERSION(
            "0.1");

            static int scull_major = SCULL_MAJOR;
            struct scull_dev mydev;

            struct file_operations scull_fops = 
            {
                .owner     
            = THIS_MODULE,
                .open     
            = scull_open,
                .release 
            = scull_release,
                .read     
            = scull_read,
                .write     
            = scull_write,
            };



            static void scull_setup_cdev(void)
            {
                
            int err;
                dev_t devid 
            = MKDEV(scull_major,0);

                
                cdev_init(
            &mydev.cDev,&scull_fops);
                
                printk(KERN_INFO 
            "&mydev.cDev.ops:%p \n",&mydev.cDev.ops);

                mydev.cDev.owner    
            = THIS_MODULE;
                mydev.cDev.ops        
            = &scull_fops;

                printk(KERN_INFO 
            "&mydev.cDev.ops:%p \n",&mydev.cDev.ops);

                err    
            = cdev_add(&mydev.cDev,devid,1);
                
            if (err!=0)
                {
                    printk(KERN_ERR 
            "cdev_add Error,err:%d \n",err);
                }
            }

            static int scull_init(void)
            {
                
            int err;
                dev_t devid 
            = MKDEV(scull_major,0);

                
            if (scull_major)
                {
                    err 
            = register_chrdev_region(devid,1,"scull1");
                }
                
            else
                {
                    err 
            = alloc_chrdev_region(&devid,0,1,"scull1");
                    scull_major 
            = MAJOR(devid);
                }

                
            if (err !=0 )
                {
                    printk(KERN_ERR 
            "register chrdev region error,err:%d \n",err);
                    
            return err;
                }

                scull_setup_cdev();
                
            return 0;
            }

            static void scull_exit(void)
            {
                cdev_del(
            &mydev.cDev);
                unregister_chrdev_region(MKDEV(scull_major,
            0),1);
            }


            int scull_open(struct inode* inode,struct file* filp)
            {
                filp
            ->private_data = &mydev;
                
            return 0;
            }

            ssize_t scull_read(
            struct file *filp, char __user *buf, size_t count,loff_t *f_pos)               
            {
                unsigned 
            long pos = *f_pos;
                
            int err = 0;
                
            int ret = 0;
                
            struct scull_dev* p_mydev = filp->private_data;

                
            if (pos >= SCULL_SIZE)
                {
                    
            return 0;
                }

                
            if (count > (SCULL_SIZE - pos) )
                {
                    count 
            = SCULL_SIZE - pos;
                }

                err 
            = copy_to_user(buf,p_mydev->mem+pos,count);
                
            if (err !=0 )
                {
                    ret 
            = -EFAULT;
                }
                
            else
                {
                    
            *f_pos += count;
                    ret 
            = count;
                    printk(KERN_INFO 
            "read %d byte(s) from %lu \n",ret,pos);
                }
                
            return ret;
            }

            ssize_t scull_write(
            struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
            {
                unsigned 
            long pos = *f_pos;
                
            int err = 0;
                
            int ret = 0;
                
            struct scull_dev* p_mydev = filp->private_data;

                
            if (pos >= SCULL_SIZE)
                {
                    
            return 0;
                }

                
            if (count > (SCULL_SIZE - pos) )
                {
                    count 
            = SCULL_SIZE - pos;
                }

                err 
            = copy_from_user(p_mydev->mem+pos,buf,count);
                
            if (err !=0 )
                {
                    ret 
            = -EFAULT;
                }
                
            else
                {
                    
            *f_pos += count;
                    ret 
            = count;
                    printk(KERN_INFO 
            "write %d byte(s) from %lu \n",ret,pos);
                }
                
            return ret;
            }

            int scull_release(struct inode* inode,struct file* filp)
            {
                
            return 0;
            }


            module_init(scull_init);
            module_exit(scull_exit);



            //Makefile
            obj-m    +=scull1.o
            KERNELDIR    :
            = /usr/src/linux-headers-2.6.32-5-686
            PWD    :
            =$(shell pwd)
            .PHONY: test clean all
            all:
                $(MAKE) 
            -C $(KERNELDIR) M=$(PWD) modules
            clean:
                rm 
            -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsm *.order *.symvers .tmp_versions

            test:
                insmod .
            /scull1.ko
                rmmod scull1
                dmesg 
            -c



            //創建設備節點
            make_dev_node
            #
            !/bin/bash
            DEVICE
            ="scull1"
            MAJOR
            =`awk "\\$2==\"$DEVICE\" {print \\$1}" /proc/devices`
            cmd
            ="mknod /dev/$DEVICE c $MAJOR 0"
            echo $cmd
            `$cmd`

             

            posted on 2012-11-08 16:04 天下 閱讀(450) 評論(0)  編輯 收藏 引用 所屬分類: kernel & Driver

            <2019年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            242526272812
            3456789

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久精品国产影库免费看 | 国产精品9999久久久久| 色偷偷久久一区二区三区| 国产成年无码久久久免费| 久久久久亚洲AV无码网站| 亚洲国产精品热久久| 日批日出水久久亚洲精品tv| 国产成人精品综合久久久久 | 欧美精品丝袜久久久中文字幕| 无码人妻久久一区二区三区蜜桃| 精品久久久久久无码不卡| 久久精品人成免费| 午夜福利91久久福利| 久久99国产综合精品| 伊人 久久 精品| 99久久精品国产综合一区| 久久亚洲国产成人精品性色| 久久无码人妻精品一区二区三区| 91精品国产乱码久久久久久| 色狠狠久久综合网| 久久毛片免费看一区二区三区| 久久久久久九九99精品| 要久久爱在线免费观看| 亚洲综合婷婷久久| 91久久婷婷国产综合精品青草 | 国产—久久香蕉国产线看观看 | 俺来也俺去啦久久综合网| 久久精品国产亚洲av麻豆蜜芽| 精品国产一区二区三区久久蜜臀| 久久精品中文字幕无码绿巨人| 亚洲国产天堂久久综合| 午夜视频久久久久一区| 精品国产综合区久久久久久 | 国产精品99久久不卡| 久久99国产精品久久99| 国产精品久久久久久久久免费| 伊人久久大香线蕉亚洲| 久久一日本道色综合久久| 无码日韩人妻精品久久蜜桃| 亚洲国产欧美国产综合久久| 一本一道久久a久久精品综合|