gpio_request 原形代码

其原型为 int gpio_request(unsigned gpio, const char *label)先说说其参数,gpio则为你要申请的哪一个管脚,label则是为其取一个名字。其具体实现如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值