• <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

            <2012年1月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久综合给合久久国产免费| 久久综合狠狠色综合伊人| 久久性生大片免费观看性| 性欧美大战久久久久久久| 人妻无码αv中文字幕久久琪琪布| 亚洲精品无码专区久久久| 国产V亚洲V天堂无码久久久| 精品久久久久久无码国产| 国产成人精品久久| 国产精品热久久无码av| 国产精品99久久久精品无码| 国产精品免费久久久久影院| 狠狠色丁香久久婷婷综合| 91精品国产91热久久久久福利| 一本色道久久88综合日韩精品| 久久精品成人免费看| 91麻豆国产精品91久久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久亚洲AV无码网站| 精品久久久久久国产免费了| 久久精品国产清高在天天线| 青青久久精品国产免费看| 久久精品国产半推半就| 久久Av无码精品人妻系列| 色8激情欧美成人久久综合电| 伊人久久大香线蕉精品| 国产精品九九九久久九九| 久久久久亚洲AV片无码下载蜜桃| 人妻少妇精品久久| 大美女久久久久久j久久| 久久精品国产亚洲AV无码娇色 | 狠狠久久综合伊人不卡| 久久精品9988| 午夜不卡888久久| 香蕉久久夜色精品国产小说| 2021久久精品国产99国产精品| 亚洲日本va中文字幕久久| 久久频这里精品99香蕉久| 久久亚洲日韩看片无码| 2021国产精品午夜久久| 亚洲国产精品成人久久|