一个简单的linux设备驱动和应用测试代码

来源:互联网 发布:3d打鱼源码 编辑:程序博客网 时间:2024/05/17 01:34

1 驱动源文件

2 Makefile

3 应用测试


#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/cdev.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>

#define sddev_MAJOR 200
static unsigned char dev_inc = 0;
static char devbuffer[256];
int dev_open(struct inode *inode,struct file *filp)
{
    if(dev_inc > 0)
        return -ERESTARTSYS;
    dev_inc++;
    return 0;
    
}
int dev_release(struct inode *inode,struct file *filp)
{
    dev_inc--;
    return 0;
    
}
ssize_t dev_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos)
{
    if(copy_to_user(buf,devbuffer,count))
    {
        count = -EFAULT;
        
    }
    return count;
}
ssize_t dev_write(struct file *file,const char __user *buf,size_t count,loff_t *f_pos)
{
    if(copy_from_user(devbuffer + *f_pos, buf, count))
        count = -EFAULT;
    return count;
    
}
void dev_exit_module(void)
{
    unregister_chrdev(sddev_MAJOR,"sddev");
    printk("dev_exit_module!\n");
}


static const struct file_operations dev_fops={
    .owner  = THIS_MODULE,
    .open   = dev_open,
    .write  = dev_write,
    .read   = dev_read,
    .release = dev_release,

};
int dev_init_module(void)
{
    int ret;
    ret = register_chrdev(sddev_MAJOR,"sddev",&dev_fops);
    if(ret < 0)
    {
        printk("Unable to register sddev device driver!\n");
        return ret;
    }
    return 0;
}
module_init(dev_init_module);
module_exit(dev_exit_module);

MODULE_LICENSE("Dual BSD/GPL");


2

ifneq ($(KERNELRELEASE),)
    obj-m := sddev.o
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    
all:
    make -C $(KERNELDIR) M=$(PWD) modules
    
clean:
    rm -f *.ko *.o *.mod.c *.symvers
    
endif

3

#include <stdio.h>
#include <fcntl.h>
int main(void)
{
    int fd;
    int i;
    char data[256];
    int retval;
    fd = open("/dev/sddev",O_RDWR);
    if(fd == -1)
    {
        printf("error open\n");
        exit(-1);
    }
    printf("open /dev/sddev OK!\n");
    
    retval = write(fd, "safwwwwwweeeeeee",16);
    if(retval == -1)
    {
        printf("write error\n");
        exit(-1);
    }
    retval = read(fd, data,16);
    if(retval == -1)
    {
        printf("read error!\n");
        exit(-1);
    }
    
    data[retval]=0;
    printf("read OK! %s\n",data);
    
    close(fd);
    return 0;
    
}





0 0
原创粉丝点击