打印

Linux 的gpio_request原型出来

[复制链接]
120|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
\driver\gpio\gpiolib.c文件中声明

int gpio_request(unsigned gpio, const char *label)   

/*unsigned gpio       :  //..请求使用那GPIO进行控制

  const char *label  :  //..压入的描述符。下操作原型

                                  //..#ifdef CONFIG_DEBUG_FS

                                  //.. d->label = label;

                                  //..#endif*/

  */

{   

        struct gpio_desc *desc;//..这个自己看源码   

        struct gpio_chip *chip;  //..这个自己看源码   

        int   status = -EINVAL;   

        unsigned long  flags;  

        spin_lock_irqsave(&gpio_lock, flags);//..屏蔽中断   

        if (!gpio_is_valid(gpio))                       //..判断是否有效,也就是参数的取值范围判断   

             goto done;   

            desc = &gpio_desc[gpio];            

            //..这个是关键gpio_desc为定义的一个全局的数组变量,这个函数的实值也就是,   

            //..用gpio_desc里面的一个变量来表示数组中的这个元素已经被申请了,而这个变量就是下面会看到的desc->flags。   

                chip = desc->chip;//按理说这个这个全局的gpio_desc如果没有初始化的话,这个chip就为空了,随后就直接返回-EINVAL了。   

if (chip == NULL)如果不为空继续往下走   

  goto done;  

if (!try_module_get(chip->owner))   

  goto done;  

/* NOTE:  gpio_request() can be called in early boot,  

  * before IRQs are enabled, for non-sleeping (SOC) GPIOs.  

  */  

if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {  

//这里测试并设置flags的第FLAG_REQUESTED位,如果没有被申请就返回该位的原值0,分析到这儿,也差不多满足了我的个人要求。   

  desc_set_label(desc, label ? : "?");   

  status = 0;   

} else {   

  status = -EBUSY;   

  module_put(chip->owner);   

  goto done;   

}  

if (chip->request) {   

  /* chip->request may sleep */   

  spin_unlock_irqrestore(&gpio_lock, flags);   

  status = chip->request(chip, gpio - chip->base);   

  spin_lock_irqsave(&gpio_lock, flags);  

  if (status < 0) {   

   desc_set_label(desc, NULL);   

   module_put(chip->owner);   

   clear_bit(FLAG_REQUESTED, &desc->flags);   

  }   

}  

done:   

if (status)   

  pr_debug("gpio_request: gpio-%d (%s) status %d\n",   

   gpio, label ? : "?", status);   

spin_unlock_irqrestore(&gpio_lock, flags);   

return status;   

}  

p] view plaincopyprint?

int gpio_request(unsigned gpio, const char *label)   

{   

        struct gpio_desc *desc;//这个自己看源码   

        struct gpio_chip *chip;//这个自己看源码   

        int   status = -EINVAL;   

        unsigned long  flags;  

        spin_lock_irqsave(&gpio_lock, flags);//屏蔽中断   

        if (!gpio_is_valid(gpio))//判断是否有效,也就是参数的取值范围判断   

             goto done;   

        desc = &gpio_desc[gpio];   

        //这个是关键gpio_desc为定义的一个全局的数组变量,这个函数的实值也就是,   

//用gpio_desc里面的一个变量来表示数组中的这个元素已经被申请了,而这个变量就是下面会看到的desc->flags。   

chip = desc->chip;//按理说这个这个全局的gpio_desc如果没有初始化的话,这个chip就为空了,随后就直接返回-EINVAL了。   

if (chip == NULL)如果不为空继续往下走   

  goto done;  

if (!try_module_get(chip->owner))   

  goto done;  

/* NOTE:  gpio_request() can be called in early boot,  

  * before IRQs are enabled, for non-sleeping (SOC) GPIOs.  

  */  

if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {  

//这里测试并设置flags的第FLAG_REQUESTED位,如果没有被申请就返回该位的原值0,分析到这儿,也差不多满足了我的个人要求。   

  desc_set_label(desc, label ? : "?");   

  status = 0;   

} else {   

  status = -EBUSY;   

  module_put(chip->owner);   

  goto done;   

}  

if (chip->request) {   

  /* chip->request may sleep */   

  spin_unlock_irqrestore(&gpio_lock, flags);   

  status = chip->request(chip, gpio - chip->base);   

  spin_lock_irqsave(&gpio_lock, flags);  

  if (status < 0) {   

   desc_set_label(desc, NULL);   

   module_put(chip->owner);   

   clear_bit(FLAG_REQUESTED, &desc->flags);   

  }   

}  

done:   

if (status)   

  pr_debug("gpio_request: gpio-%d (%s) status %d\n",   

   gpio, label ? : "?", status);   

spin_unlock_irqrestore(&gpio_lock, flags);   

return status;   

}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

370

主题

370

帖子

0

粉丝