\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;
} |