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

            鏈接

            最新隨筆

            搜索

            最新評論

            伊人久久亚洲综合影院| 亚洲va久久久噜噜噜久久男同| 97久久精品人妻人人搡人人玩| 亚洲va国产va天堂va久久| 久久久久久人妻无码| 久久免费美女视频| 一级做a爰片久久毛片看看| 午夜精品久久久久久99热| 久久九九有精品国产23百花影院| 久久综合久久性久99毛片| 久久久久免费精品国产| 久久天天躁夜夜躁狠狠躁2022 | 欧美大香线蕉线伊人久久| 亚洲国产精品久久66| 国产精品久久久久a影院| 一本久久a久久精品综合夜夜| 一本久久a久久精品综合香蕉| 97久久国产亚洲精品超碰热| 久久只有这精品99| 久久精品中文字幕有码| 久久91综合国产91久久精品| 国产成人综合久久精品红| 国产69精品久久久久99| 九九99精品久久久久久| 亚洲AV无码久久精品蜜桃| 伊人 久久 精品| 久久精品国产精品亜洲毛片 | 亚洲AV伊人久久青青草原| 天天综合久久久网| 久久久精品一区二区三区| 97久久精品人妻人人搡人人玩| 亚洲精品无码久久久久| 亚洲第一极品精品无码久久| 久久夜色精品国产亚洲| 国产精品中文久久久久久久| 一级做a爰片久久毛片看看| 久久露脸国产精品| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久香蕉国产线看观看乱码| 久久精品国产亚洲AV麻豆网站| 性做久久久久久久久老女人|