| 
 
| \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(&quot;gpio_request: gpio-%d (%s) status %d\n&quot;,
 
 gpio, label ? : &quot;?&quot;, 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 ? : &quot;?&quot;);
 
 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(&quot;gpio_request: gpio-%d (%s) status %d\n&quot;,
 
 gpio, label ? : &quot;?&quot;, status);
 
 spin_unlock_irqrestore(&gpio_lock, flags);
 
 return status;
 
 }
 | 
 |