您的位置:首页 > 运维架构 > Linux

LINUX 设备驱动 (一)

2016-12-29 16:09 218 查看
syw_char.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>

static struct cdev chr_dev;
static dev_t ndev;

static int chr_open(struct inode* nd, struct file* filp)
{
int major ;
int minor;

major = MAJOR(nd->i_rdev);
minor = MINOR(nd->i_rdev);

printk(" syw chr_open, major = %d, minor = %d\n", major, minor);
return 0;
}

static ssize_t chr_read(struct file* filp, char __user* u, size_t sz, loff_t* off)
{
printk("syw hr_read process!\n");
return 0;
}

struct file_operations chr_ops = {
.owner = THIS_MODULE,
.open = chr_open,
.read = chr_read
};

static int demo_init(void)
{
int ret;

cdev_init(&chr_dev, &chr_ops);
ret = alloc_chrdev_region(&ndev, 0, 1, "chr_dev");
if(ret < 0 )
{
return ret;
}

printk("demo_init(): major = %d, minor = %d\n", MAJOR(ndev), MINOR(ndev));
ret = cdev_add(&chr_dev, ndev, 1);
if(ret < 0)
{
return ret;
}

return 0;
}

static void demo_exit(void)
{
printk("demo_exit process!\n");
cdev_del(&chr_dev);
unregister_chrdev_region(ndev, 1);
}

module_init(demo_init);
module_exit(demo_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("sywuestc@sina.cn");
MODULE_DESCRIPTION("A simple device example!");


Makefile

fneq ($(KERNELRELEASE),)
obj-m := syw_char.o

else
PWD  := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.*  Module.*
endif


测试代码:main.c

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

#define CHAR_DEV_NAME "/dev/chr_dev"

int main()
{
int ret;
int fd;
char buf[32];

fd = open(CHAR_DEV_NAME, O_RDONLY | O_NDELAY);
if(fd < 0)
{
printf("open failed!\n");
return -1;
}

read(fd, buf, 32);
close(fd);

return 0;
}

编译步骤

1: sudo make
2: sudo mknod /dev/chr_dev c MAJOR(主设备号) MINOR(次设备号)
3: gcc main.c
4 ./a.out
5 dmesg
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: