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

天下

記錄修行的印記

Linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記:(1) 字符設(shè)備驅(qū)動入門1

 

 

//這是一個(gè)最簡單的字符設(shè)備驅(qū)動,入門專用.
//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 天下 閱讀(466) 評論(0)  編輯 收藏 引用 所屬分類: kernel & Driver

<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(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>
            欧美制服第一页| 国产精品视频男人的天堂| 欧美日韩精品免费观看视频| 国产精品你懂得| 在线视频精品一区| 欧美超级免费视 在线| 久久青草欧美一区二区三区| 影音先锋欧美精品| 欧美v日韩v国产v| 欧美日韩国产91| 性欧美1819sex性高清| 久久xxxx精品视频| 亚洲乱码国产乱码精品精可以看| 亚洲日韩欧美视频| 欧美另类专区| 久久精品国产久精国产爱| 久久亚洲免费| 欧美一区二区三区在线观看视频| 久久免费少妇高潮久久精品99| 亚洲品质自拍| 久久福利毛片| 午夜欧美电影在线观看| 欧美不卡在线视频| 亚洲影院免费| 欧美国产一区二区在线观看 | 欧美激情在线观看| 亚洲一区二区不卡免费| 麻豆成人综合网| 另类尿喷潮videofree| 国产精品久久午夜夜伦鲁鲁| 免费看亚洲片| 国产热re99久久6国产精品| 亚洲精品免费网站| 91久久精品国产91久久性色tv| 一本久久a久久精品亚洲| 亚洲国产高清自拍| 玖玖在线精品| 欧美激情亚洲| 最新国产乱人伦偷精品免费网站| 亚洲午夜久久久久久久久电影院| 亚洲日本一区二区三区| 欧美1区视频| 欧美激情视频在线播放| 亚洲精品网站在线播放gif| 久久一区二区三区av| 欧美激情第五页| 亚洲精品色图| 国产精品日韩一区| 久热精品视频在线| 亚洲美女91| 久久国产精品色婷婷| 激情欧美一区二区三区| 六月丁香综合| 亚洲男女自偷自拍图片另类| 久久精品国产亚洲高清剧情介绍| 国产欧美综合一区二区三区| 久久久久国产免费免费| 亚洲国产片色| 先锋影音一区二区三区| 亚洲国产精品一区二区第一页| 欧美.www| 久久福利资源站| 亚洲乱码视频| 猛干欧美女孩| 亚洲图片欧洲图片日韩av| 国产婷婷97碰碰久久人人蜜臀| 久久er99精品| 亚洲欧美激情四射在线日 | 蜜臀久久99精品久久久久久9 | 老司机午夜免费精品视频 | 亚洲综合导航| 亚洲日韩欧美视频| 免费久久精品视频| 老牛国产精品一区的观看方式| 一本色道久久综合狠狠躁篇怎么玩 | 国产亚洲成年网址在线观看| 欧美精品成人一区二区在线观看 | 99热精品在线观看| 91久久中文字幕| 玉米视频成人免费看| 狠狠色香婷婷久久亚洲精品| 亚洲国产清纯| 亚洲福利视频免费观看| 亚洲福利在线视频| 免费日韩成人| 亚洲黄色一区| 中文国产一区| 亚洲欧美日韩综合国产aⅴ| 一区二区三区四区五区在线| 亚洲国产精品女人久久久| 欧美激情精品久久久久久| 欧美aⅴ99久久黑人专区| 亚洲一级在线| 亚洲深夜av| 欧美一区二区在线免费播放| 午夜伦理片一区| 久久黄色网页| 亚洲国产精品久久久久久女王| 91久久久亚洲精品| 亚洲免费在线观看| 欧美激情视频网站| 国产日韩欧美高清免费| 18成人免费观看视频| 亚洲网站在线| 欧美777四色影视在线| 午夜精品国产更新| 欧美日韩国产一区二区三区地区 | 欧美噜噜久久久xxx| 国产主播一区二区三区四区| 1000部精品久久久久久久久| 亚洲新中文字幕| 欧美大片免费| 久久国产精品亚洲va麻豆| 欧美精品日本| 亚洲精品日韩一| 葵司免费一区二区三区四区五区| 日韩午夜在线电影| 欧美激情欧美激情在线五月| 国产精品视频免费在线观看| 亚洲伦理在线观看| 樱桃国产成人精品视频| 亚洲免费在线观看视频| 亚洲电影第三页| 麻豆9191精品国产| 亚洲黄色尤物视频| 亚洲第一在线| 欧美激情一区二区三区在线| 亚洲欧洲日本专区| 亚洲精品黄网在线观看| 欧美日韩视频在线第一区| 亚洲免费高清视频| 在线视频欧美精品| 国产精品日韩一区| 久久久av水蜜桃| 欧美激情视频在线免费观看 欧美视频免费一| 影音先锋另类| 99国产精品久久久久老师| 国产精品区一区| 老司机久久99久久精品播放免费 | 午夜一区在线| 日韩午夜三级在线| 国产精品99久久不卡二区| 国产一区视频在线看| 亚洲欧洲日韩在线| 国产欧美日本一区视频| 美女久久一区| 国产精品一区在线观看| 免费在线观看日韩欧美| 国产精品三上| 亚洲美女福利视频网站| 狠狠色狠色综合曰曰| 亚洲人体大胆视频| 雨宫琴音一区二区在线| 亚洲欧美三级伦理| 亚洲淫片在线视频| 久久夜色精品国产噜噜av| 久久av免费一区| 国产精品爽爽ⅴa在线观看| 日韩视频国产视频| 亚洲六月丁香色婷婷综合久久| 狠狠88综合久久久久综合网| 亚洲视频一区在线| 你懂的一区二区| 老司机免费视频久久| 极品尤物av久久免费看| 欧美在线日韩精品| 久久中文久久字幕| 在线观看一区二区精品视频| 久久久久久久综合狠狠综合| 欧美在线免费观看亚洲| 欧美日韩色婷婷| 欧美第十八页| 欧美国产精品va在线观看| 一区二区在线视频播放| 久久国产精品一区二区| 鲁大师成人一区二区三区| 国产亚洲欧美一区二区| 欧美在线视频免费| 欧美高清在线观看| 亚洲精品欧美| 国产精品一区二区久久久| 久久精品夜夜夜夜久久| 欧美激情第一页xxx| 亚洲欧美高清| 亚洲精品一区二区三区蜜桃久| 欧美日韩免费精品| 久久精品日产第一区二区三区| 亚洲日本va在线观看| 久久精品人人| 午夜在线观看欧美| 日韩午夜av| 亚洲欧洲精品成人久久奇米网| 国产精品男人爽免费视频1| 久久一区二区三区超碰国产精品| 日韩一级精品| 亚洲精品欧美日韩专区| 久久久成人网| 久久精品国产精品| 久久久www成人免费精品| 中文在线资源观看网站视频免费不卡 |