文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>主次设备号的使用实例

主次设备号的使用实例

时间:2010-05-20  来源:jianyuehan

1.驱动编译 make 生成minor.ko驱动目标程序 2.生成设备文件 mknode /dev/minor_write c 240 1 mknode /dev/minor_read c 240 2 3.生成测试程序 cc test.c -o test 4.加载驱动程序并测试 insmod minor.ko ./test   驱动程序源码 #include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#define MINOR_DEV_NAME      "minordev"
#define MINOR_DEV_MAJOR     240
#define MINOR_WRITE_ADDR    0x0378
#define MINOR_READ_ADDR     0x0379
int minor0_open(struct inode *inode,struct file *file)
{
    printk("call minor0 open!\n");
    return 0;
}
ssize_t minor0_write(struct file *file,const char *buf,size_t count,loff_t *f_ops)
{
    printk("device file-write operation!\n");
/*  unsigned char status;
    int loop;
        for (loop = 0;loop<count; loop++){
                get_usr(status,(char *) buf);
                outb(status,MINOR_WRITE_ADDR);
        }
        return count;
*/
    return 0;
}
int minor0_close(struct inode *inode,struct file *file)
{
    printk("call minor0 close\n");
    return 0;
}
int minor1_open(struct inode *inode,struct file *file)
{
    printk("call minor1 open!\n");
    return 0;
}
ssize_t minor1_read(struct file *file,char *buf,size_t count,loff_t *f_ops)
{
    printk("device file-read operation!\n");
/*  unsigned char status;
    int loop;
        for (loop = 0;loop<count; loop++) {
                status = inb(MINOR_READ_ADDR);
                put_usr(status,(char *) &buf[loop]);
    }
        return count;
*/
    return 0;
}
int minor1_close(struct inode *inode,struct file *file)
{
    printk("call minor1 close\n");
    return 0;
}
struct file_operations minor0_fops={
    .owner  = THIS_MODULE,
    .write  = minor0_write,
    .open   = minor0_open,
    .release = minor0_close
};
struct file_operations minor1_fops={
    .owner  = THIS_MODULE,
    .read   = minor1_read,
    .open   = minor1_open,
    .release = minor1_close
};
int minor_open(struct inode *inode,struct file *filp)
{
    printk("call minor open\n");
    switch(MINOR(inode->i_rdev))
    {
    case 1: filp->f_op=&minor0_fops;break;
    case 2: filp->f_op=&minor1_fops;break;
    default: return -ENXIO;
    }
    if (filp->f_op && filp->f_op->open)
        return filp->f_op->open(inode,filp);
    return 0;
}
struct file_operations minor_fops={
    .owner  =THIS_MODULE,
    .open   =minor_open,
};
int __init int_init(void)
{
    int ret;
    ret=register_chrdev(MINOR_DEV_MAJOR,MINOR_DEV_NAME,&minor_fops);
    if (ret < 0) {
    printk(KERN_INFO"minor device register failed!\n");
    return ret;
    }
    else {
    printk(KERN_INFO"minor device register successed!\n");
    }
    return 0;
}
void __exit void_exit(void)
{
    unregister_chrdev(MINOR_DEV_MAJOR,MINOR_DEV_NAME);
    printk(KERN_INFO"minor device unregister successed!\n");
}

module_init(int_init);
module_exit(void_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Savant Pan");
MODULE_DESCRIPTION("minor device  driver example");
    Makefile文件源码 ifneq ($(KERNELRELEASE),)
obj-m :=minor.o
else
PWD := $(shell pwd)
KVR := $(shell uname -r)
#for your destination kernel versinon
#KERNELDIR =/home/savant/kernel/linux-2.6.24/
#for your pc kernel version
KERNELDIR =/lib/modules/$(KVR)/build/
all:
 $(MAKE) -C $(KERNELDIR) M=$(PWD)  modules
clean:
 rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
endif
  测试程序源码 #include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#define READ_DEV_PATH "/dev/minor_read"
#define WRITE_DEV_PATH "/dev/minor_write"
int main()
{
    int read_dev,write_dev;
    unsigned char buff[128];
    int loop;
    printf("starting...!\n");
    read_dev=open(READ_DEV_PATH,O_RDWR|O_NDELAY);
    if (read_dev < 0) {
        printf("read device file open failed!\n");
        perror("err");
        exit(1);
    } else {
        printf("read device file open successfully!\n");
    }
        printf("write device file open!\n");
        write_dev=open(WRITE_DEV_PATH,O_RDWR|O_NDELAY);
        if (write_dev < 0) {
                printf("write device file open failed!\n");
        perror("err");
        close(read_dev);
                exit(1);
        } else {
                printf("write device file open successfully!\n");
        }
/*  printf("wait... input\n");
    while(1) {
        if(read(read_dev,buff,1) == 1) {
            printf("read data [%02X]\n",buff[0]&0xFF);
            if(!(buff[0]&0x10)) break;
     }
    }
    printf("input ok...\n");
*/
    printf("led flashing...\n");
    for(loop=0;loop<2;loop++) {
        buff[0]=0xFF;
        write(write_dev,buff,1);
        sleep(1);
        buff[0]=0x00;
        write(write_dev,buff,1);
        sleep(1);
    }
    close(read_dev);
    close(write_dev);
    return 0;
}
相关阅读 更多 +
排行榜 更多 +
边境检察最后区域手机版下载

边境检察最后区域手机版下载

角色扮演 下载
酋长你别跑手游下载

酋长你别跑手游下载

休闲益智 下载
心动漫画app下载官方版

心动漫画app下载官方版

浏览阅读 下载