linux 驱动中创建一个设备的例子很多,以下例子是创建多个字符设备的例子,包括驱动部分和测试部分
驱动部分包括 globalmem.c Makefile两个文件:
globalmem.c file:
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#define GLOBALMEM_SIZE 0x1000 //global memory size 4KB
#define MEM_CLEAR 0x1 //clear all the mem
#define GLOBALMEM_MAJOR 350 //globalmem major number
static struct class* globalmem_class0;
static struct class* globalmem_class1;
static int globalmem_major = GLOBALMEM_MAJOR;
struct globalmem_dev{
struct cdev cdev; //cdev struct
unsigned char mem[GLOBALMEM_SIZE]; //global mem
};
struct globalmem_dev* globalmem_devp;
void globalmem_setup_cdev(struct globalmem_dev * dev, int index);
int globalmem_init(void){
int result;
dev_t devno = MKDEV(globalmem_major, 0);
if(globalmem_major){
result = register_chrdev_region(devno, 2, "globalmem");
}else{
result = alloc_chrdev_region(&devno, 0, 2, "globalmem");
globalmem_major = MAJOR(devno);
}
if(result < 0){
return result;
}
globalmem_devp = kmalloc(2 * sizeof(struct globalmem_dev), GFP_KERNEL);
if(!globalmem_devp){
result = -ENOMEM;
goto fail_malloc;
}
memset(globalmem_devp, 0, 2 * sizeof(struct globalmem_dev));
globalmem_setup_cdev(&globalmem_devp[0], 0);
globalmem_setup_cdev(&globalmem_devp[1], 1);
globalmem_class0 = class_create(THIS_MODULE, "globalmem0"); //create file under /sys/class
device_create(globalmem_class0, NULL, MKDEV(globalmem_major, 0), NULL, "globalmem_0"); //globalmem_0 is the name under /dev/
globalmem_class1 = class_create(THIS_MODULE, "globalmem1"); //create fil