예제 #1
0
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;
}
예제 #3
0
/* 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;  
}
예제 #5
0
파일: globalmem.c 프로젝트: Akagi201/akcode
/* 设备驱动模块加载函数 */
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;
}
예제 #6
0
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;
	
}
예제 #7
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;
}
예제 #8
0
/*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;
}
예제 #9
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;
	}
	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;
}
예제 #10
0
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;
}