青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天下

記錄修行的印記

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 天下 閱讀(466) 評論(0)  編輯 收藏 引用 所屬分類: kernel & Driver

<2016年5月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品夜色噜噜亚洲a∨ | 中文av一区特黄| 日韩一级不卡| 国产在线观看精品一区二区三区| 噜噜噜噜噜久久久久久91| 99精品国产福利在线观看免费 | 嫩草成人www欧美| 久久亚洲二区| 欧美激情一区二区在线| 亚洲视频一区在线| 久久久精品一区二区三区| 久久xxxx| 久久精品久久99精品久久| 最新高清无码专区| 久久xxxx精品视频| 久久在线免费观看视频| 欧美极品在线播放| 国产伦精品一区二区三区视频孕妇| 国产伦精品一区二区三区免费| 亚洲国产欧美一区二区三区久久 | 美日韩精品免费观看视频| 久久久久久久久伊人| 国产女优一区| 亚洲精品久久久一区二区三区| 麻豆精品精品国产自在97香蕉| 狠狠色香婷婷久久亚洲精品| 91久久久亚洲精品| 久久精品在线免费观看| 欧美激情女人20p| 国产女优一区| 欧美一区二区性| 亚洲一区二区三区精品在线| 亚洲欧美国产另类| 男女精品视频| 国产乱码精品1区2区3区| 午夜精品久久久久久久久久久久久| 午夜欧美大尺度福利影院在线看| 欧美大片一区二区三区| 国产一区二区精品丝袜| 久久久久九九视频| 一个色综合导航| 日韩天堂av| 欧美三级精品| 欧美一区二区精品在线| 久久色在线播放| 亚洲美女精品成人在线视频| 亚洲一区www| 亚洲图片在区色| 久久久久久久一区二区三区| 91久久久在线| 欧美成人在线免费观看| 久久国产直播| 欧美精品尤物在线| 国产综合香蕉五月婷在线| 久久免费高清| 香蕉乱码成人久久天堂爱免费 | 欧美三级欧美一级| 欧美一区在线看| 亚洲欧美国产精品桃花| 91久久精品久久国产性色也91 | 亚洲国产一区视频| 国产午夜久久久久| 欧美视频一区二| 久久综合伊人77777尤物| 久久全国免费视频| 亚洲品质自拍| 亚洲第一狼人社区| 亚洲第一福利在线观看| 欧美午夜精品一区二区三区| 亚洲大胆美女视频| 亚洲激情成人| 亚洲人成在线观看网站高清| 久久一二三区| 午夜精品999| 99国产精品久久久久久久成人热| 国产麻豆综合| 黄网动漫久久久| 欧美日韩在线免费观看| 亚洲精品久久久久| 亚洲深夜福利视频| 狂野欧美一区| 蜜桃av噜噜一区二区三区| 午夜一区二区三视频在线观看 | 亚洲午夜一级| 欧美一区亚洲二区| 亚洲一区二区在线视频| 亚洲精品欧美激情| 伊人久久亚洲影院| 欧美一区中文字幕| 亚洲综合日韩| 久久男女视频| 欧美精品成人91久久久久久久| 国产精品高清网站| 欧美在线三级| 欧美大尺度在线| 欧美日韩一级黄| 欧美精品国产精品| 欧美在线电影| 欧美午夜视频网站| 宅男66日本亚洲欧美视频| 久久久成人网| 亚洲综合视频1区| 欧美日韩麻豆| 亚洲欧美一区二区三区在线| 老司机一区二区三区| 国产精品一二三视频| 亚洲一区二区三区免费观看| 亚洲国产毛片完整版 | 久久精品国产精品 | 久久九九精品| 91久久香蕉国产日韩欧美9色| 欧美在线免费视频| 老鸭窝91久久精品色噜噜导演| 国产精品电影在线观看| 国产三级精品三级| 欧美影院在线| 欧美一级久久| 亚洲啪啪91| 小嫩嫩精品导航| 欧美久久99| 一本一本久久a久久精品综合妖精| 欧美激情精品久久久久久免费印度| 久久成人国产| 六月婷婷久久| 亚洲视频一区二区免费在线观看| 亚洲国产成人精品女人久久久 | 亚洲欧美一区在线| 日韩亚洲国产精品| 久久久精品视频成人| 国内精品一区二区| 老司机午夜精品视频在线观看| 久久亚洲国产精品一区二区| 久久久青草婷婷精品综合日韩| 亚洲欧洲在线一区| 久久只精品国产| 欧美日韩精品一区二区| 国内成+人亚洲+欧美+综合在线| 亚洲永久精品大片| 亚洲精品国产视频| 一区二区三区在线看| 欧美亚洲免费电影| 在线一区二区三区四区五区| 中文一区字幕| 韩国一区电影| 亚洲激情亚洲| 国产婷婷成人久久av免费高清| 久久久国产成人精品| 亚洲综合视频1区| 久久精品国产一区二区三 | 亚洲视频1区| 欧美精品在线观看91| 欧美资源在线| 久久精品水蜜桃av综合天堂| 蜜桃av久久久亚洲精品| 欧美午夜理伦三级在线观看| 亚洲黄色天堂| 国产一区二区三区日韩欧美| 亚洲人成在线播放网站岛国| 国产精品www网站| 亚洲人成网站777色婷婷| 欧美日韩视频一区二区三区| 国产亚洲女人久久久久毛片| 一区二区欧美亚洲| 亚洲精选成人| 欧美日韩亚洲综合| 久久精品论坛| 国产精品乱码一区二三区小蝌蚪| 一区在线视频观看| 亚洲精品久久久久久久久| 亚洲精品免费网站| 欧美日韩在线三区| 一区二区欧美在线| av72成人在线| 国产精品资源在线观看| 亚洲综合色视频| 亚洲天堂成人| 国产精品久久久久一区二区三区 | 精品成人a区在线观看| 欧美日韩国产三区| 国产精品99久久久久久久久| 久久夜色精品国产| 欧美mv日韩mv国产网站app| 国产精品―色哟哟| 99国产精品久久久久老师| 欧美日韩视频| 中文日韩在线| 久久精品夜色噜噜亚洲aⅴ| 欧美国产国产综合| 韩国成人福利片在线播放| 欧美日韩成人综合在线一区二区| 一区二区三区产品免费精品久久75| 欧美在线播放一区| 久久国产精品99精品国产| 国产情人节一区| 欧美中文在线免费| 亚洲成人在线视频网站| 国产精品大片| 亚洲欧美一区二区三区久久| 久久精品国产清高在天天线 | 一本到12不卡视频在线dvd|