• <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設(shè)備驅(qū)動(dòng)程序?qū)W習(xí)筆記:(1) 字符設(shè)備驅(qū)動(dòng)入門1

             

             

            //這是一個(gè)最簡單的字符設(shè)備驅(qū)動(dòng),入門專用.
            //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



            //創(chuàng)建設(shè)備節(jié)點(diǎn)
            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 天下 閱讀(458) 評論(0)  編輯 收藏 引用 所屬分類: kernel & Driver

            <2013年4月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            国产福利电影一区二区三区久久久久成人精品综合 | 国产精品禁18久久久夂久| 久久一日本道色综合久久| 久久国产色AV免费看| 国产一区二区精品久久岳| 午夜天堂精品久久久久| 亚洲国产二区三区久久| 久久AV高潮AV无码AV| 国产999精品久久久久久| 午夜精品久久久久久久| 久久人妻少妇嫩草AV蜜桃| 久久AV高清无码| 久久久无码精品亚洲日韩京东传媒 | 久久综合给久久狠狠97色| 久久99精品免费一区二区| 国产精品久久久久aaaa| 久久无码AV一区二区三区| 国产精品久久久久久久午夜片| 亚洲精品高清国产一线久久| 伊人伊成久久人综合网777| 国产精品美女久久久免费| 99999久久久久久亚洲| 中文字幕乱码人妻无码久久| 亚洲天堂久久久| 免费精品国产日韩热久久| 久久中文字幕视频、最近更新| 日韩亚洲欧美久久久www综合网| 久久精品国产亚洲av高清漫画 | 日韩一区二区三区视频久久| 国产精品欧美亚洲韩国日本久久| 人妻无码中文久久久久专区| 亚洲国产精品无码久久久蜜芽| 久久精品aⅴ无码中文字字幕不卡| 久久亚洲中文字幕精品一区| 色播久久人人爽人人爽人人片aV| 国产成人无码精品久久久久免费| 久久精品国产秦先生| 国产成人无码精品久久久久免费 | 一本综合久久国产二区| 久久这里都是精品| 久久精品午夜一区二区福利|