LINUX 设备驱动 (一)

来源:互联网 发布:西北师范知行学院贴吧 编辑:程序博客网 时间:2024/06/04 19:17
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.oelsePWD  := $(shell pwd)KVER := $(shell uname -r)KDIR := /lib/modules/$(KVER)/buildall:$(MAKE) -C $(KDIR) M=$(PWD) modulesclean: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 make2: sudo mknod /dev/chr_dev c MAJOR(主设备号) MINOR(次设备号)3: gcc main.c4 ./a.out5 dmesg




1 0
原创粉丝点击