int globalmem_init(void) { int result; dev_t devno = MKDEV(globalmem_major, 0); if (globalmem_major) result = register_chrdev_region(devno, 1, "globalmem"); else { result = alloc_chrdev_region(&devno, 0, 1, "globalmem"); globalmem_major = MAJOR(devno); } if (result < 0) return result; globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL); if (!globalmem_devp) { result = -ENOMEM; goto fail_malloc; } memset(globalmem_devp, 0, sizeof(struct globalmem_dev)); globalmem_setup_cdev(globalmem_devp, 0); return 0; fail_malloc: unregister_chrdev_region(devno, 1); return result; }
/*设备驱动模块加载函数*/ int globalmem_init(void) { int result; dev_t devno = MKDEV(globalmem_major, 0); /* 申请设备号*/ if (globalmem_major) result = register_chrdev_region(devno, 1, "globalmem"); else /* 动态申请设备号 */ { result = alloc_chrdev_region(&devno, 0, 1, "globalmem"); globalmem_major = MAJOR(devno); } if (result < 0) return result; /* 动态申请设备结构体的内存*/ globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL); if (!globalmem_devp) /*申请失败*/ { result = - ENOMEM; goto fail_malloc; } memset(globalmem_devp, 0, sizeof(struct globalmem_dev)); globalmem_setup_cdev(globalmem_devp, 0); init_MUTEX(&globalmem_devp->sem); /*初始化信号量*/ return 0; fail_malloc: unregister_chrdev_region(devno, 1); return result; }
/* the function of globalmem driver module insmod */ int globalmem_init(void) { int result; dev_t devno = MKDEV(globalmem_major,0); /*apply for char device driver region */ if(globalmem_major) { result = register_chrdev_region(devno,1,"globalmem"); }else{ /*dynamic get major device number*/ result = alloc_chrdev_region(&devno,0,1,"globalmem"); globalmem_major = MAJOR(devno); } if (result < 0) { return result; } /*dynamic apply for memery of the device struct */ globalmem_devp = kmalloc(sizeof (struct globalmem_dev),GFP_KERNEL); if(!globalmem_devp)/* apply failed*/ { result = -ENOMEM; goto fail_malloc; } memset(globalmem_devp,0,sizeof(struct globalmem_dev)); globalmem_setup_cdev(globalmem_devp,0); return 0; fail_malloc:unregister_chrdev_region(devno,1); return result; }
//----------------------------------------------------------------- // FUNCTIONS :The function is used to load the modules //----------------------------------------------------------------- static int globalmem_init(void) {int result; dev_t devno = MKDEV(globalmem_major,0); //使用此宏可以通过主设备号和次设备号生成dev_t if(globalmem_major) { result = register_chrdev_region(devno,1,"globalmem"); //向系统申请设备号 } else //动态申请设备号 { result = alloc_chrdev_region(&devno,0,1,"globalmem"); globalmem_major = MAJOR(devno); } if(result < 0) { return result; //申请失败返回一个负数 } globalmem_devp = kmalloc(sizeof(struct globalmem_dev),GFP_KERNEL); //向内核申请globalmem结构体的内存 if(!globalmem_devp) { result = -ENOMEM; goto fail_malloc; } //globalmem_class = class_create(THIS_MODULE, "globalmem_sys_class"); //if(IS_ERR(globalmem_class)) { //printk("Err: failed in creating class.\n"); //goto fail_malloc; //} /* register your own device in sysfs, and this will cause udev to create corresponding device node */ memset(globalmem_devp,0,sizeof(struct globalmem_dev)); //初始化申请的内存 globalmem_setup_cdev(globalmem_devp,0); //向系统申请添加关于globalmem的cdev //device_create(globalmem_class, NULL, MKDEV(globalmem_major, 0), NULL, "globalmem"); globalmem_class = class_create(THIS_MODULE, "globalmem_sys_class"); if (IS_ERR(globalmem_class)) return PTR_ERR(globalmem_class); globalmem_class_dev = device_create(globalmem_class, NULL, MKDEV(globalmem_major, 0), NULL, "globalmem_dev"); if (unlikely(IS_ERR(globalmem_class_dev))) return PTR_ERR(globalmem_class_dev); printk (KERN_INFO "Registered character driver\n"); printk(KERN_INFO "hello.world1\n"); return 0; fail_malloc:unregister_chrdev_region(devno,1); return result; }
/* 设备驱动模块加载函数 */ int globalmem_init(void) { int result; // 返回值 /* 表示主设备号是globalmem_major, 次设备号是0 */ dev_t devno = MKDEV(globalmem_major, 0); /* 静态申请 */ if (globalmem_major) /* 当指定了主设备号 */ { result = register_chrdev_region(devno, 1, "globalmem"); } else /* 动态分配 */ { /* &devno通过引用来取得返回的设备号(包括主设备和次设备) */ result = alloc_chrdev_region(&devno, 0, 1, "globalmem"); globalmem_major = MAJOR(devno); } if (result < 0) { return result; } /* kmalloc定义在<linux/slab.h> */ /* 动态申请设备结构体用到的全局共享内存 */ globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL); if (!globalmem_devp) /* 申请失败 */ { result = -ENOMEM; goto fail_malloc; } // 初始化globalmem_devp数据(清空) memset(globalmem_devp, 0, sizeof(struct globalmem_dev)); // 自定义的初始化并注册cdev的函数,参数0是次设备号 globalmem_setup_cdev(globalmem_devp, 0); return 0; fail_malloc: /* 分配失败后要还原现场,把已经注册的设备给释放掉 */ unregister_chrdev_region(devno, 1); /* 释放设备号 */ return result; }
int globalmem_init(void) { int result; dev_t devno = MKDEV(globalmem_major,0); if (globalmem_major) result = register_chrdev_region(devno,1,"globalmem"); else { result = alloc_chrdev_region(devno,1,"globalmem"); globalmem_major = MAJOR(devno); } if (result < 0) return result; globalmem_setup_cdev(); return 0; }
static int __init globalmem_init(void) { dev_t devno = MKDEV(globalmem_major, 0); int retval = 0; if (globalmem_major) { retval = register_chrdev_region(devno, 1, GLOBALMEM_NAME); } else { retval = alloc_chrdev_region(&devno, 0, 1, GLOBALMEM_NAME); globalmem_major = MAJOR(devno); } if (retval < 0) { printk(KERN_WARNING"Cannot request major %u\n", globalmem_major); goto out; } retval = globalmem_setup_cdev(devno, 1); if (retval < 0) { printk(KERN_WARNING"Adding device major %u\n", globalmem_major); goto out; } out: return retval; }
/*module loading function*/ static int __init globalmem_init(void) { int ret; dev_t devno; printk("globalmem is starting..\n"); devno = MKDEV(globalmem_major,0); if(globalmem_major) { /*predefined a globalmem's major devno*/ ret = register_chrdev_region(devno, 1, "edsionte_globalmem"); } else { /*not predefined a major devno and then allocate a devno*/ ret = alloc_chrdev_region(&devno, 0, 1, "edsionte_globalmem"); /*get the globalmem's major devno*/ globalmem_major = MAJOR(devno); } if(ret < 1) { return ret; } /*allocate a piece of memory for struct globalmem_dev*/ dev = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL); if(!dev) { ret = -1; goto fail_malloc; } memset(dev, 0, sizeof(struct globalmem_dev)); globalmem_setup_cdev(dev, 0); fail_malloc: unregister_chrdev_region(devno, 1); return ret; }
static int __init globalmem_init(void) { dev_t devno = MKDEV(globalmem_major, 0); int retval = 0; if (globalmem_major) { retval = register_chrdev_region(devno, 1, GLOBALMEM_NAME); } else { retval = alloc_chrdev_region(&devno, 0, 1, GLOBALMEM_NAME); globalmem_major = MAJOR(devno); } if (retval < 0) { printk(KERN_WARNING"Cannot request major %u\n", globalmem_major); goto out; } devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL); if (!devp) { printk(KERN_WARNING"alloc dev kernel memory fail\n"); retval = -ENOMEM; goto fail_malloc; } memset(devp, 0, sizeof(struct globalmem_dev)); retval = globalmem_setup_cdev(devp, 0); if (retval < 0) { printk(KERN_WARNING"Adding device major %u\n", globalmem_major); goto free_resouce; } return 0; free_resource: kfree(devp); fail_malloc: unregister_chrdev_region(devno, 1); out: return retval; }
static int __init globalmem_init(void) { int result; dev_t devno = MKDEV(globalmem_major, 0); if (globalmem_major) result = register_chrdev_region(devno, 1, "globalmem"); else { result = alloc_chrdev_region(&devno, 0, 1, "globalmem"); globalmem_major = MAJOR(devno); } if (result < 0) return result; globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL); if (!globalmem_devp) { result = - ENOMEM; goto fail_malloc; } memset(globalmem_devp, 0, sizeof(struct globalmem_dev)); globalmem_setup_cdev(globalmem_devp, 0); globalmem_class = class_create(THIS_MODULE, "globalmem"); if(IS_ERR(globalmem_class)) { printk(KERN_NOTICE"create globalmem_class failed!"); return -1; } device_create(globalmem_class, NULL, MKDEV(globalmem_major, 0), NULL, "globalmem"); return 0; fail_malloc: unregister_chrdev_region(devno, 1); return result; }