gpio_request

news/2024/7/10 18:04:00 标签: struct, module, null, 测试
 

今天再次学习SD卡驱动,遇到pgio_request这个函数,始终不知道其什么意思,看了几遍源代码才有了点感觉。现将其关键部分再此说明一下,以备自己以后复习,或是路客参考。

 

一般gpio_request封装了mem_request(),起保护作用,最后要调用mem_free之类的。主要是告诉内核这地址被占用了。当其它地方调用同一地址的gpio_request就会报告错误,该地址已被申请。在/proc/mem应该会有地址占用表描述。
这种用法的保护作用前提是大家都遵守先申请再访问,有一个地方没遵守这个规则,这功能就失效了。好比进程互斥,必需大家在访问临界资源的时候都得先获取锁一样,其中一个没遵守约定,代码就废了。


 

其原型为 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;
}


http://www.niftyadmin.cn/n/729623.html

相关文章

边充电边联网方案(POE或交换机输入,解决无线网络延迟高等问题)

目前直播行业的兴起&#xff08;带货&#xff0c;游戏&#xff09;&#xff0c;网络卡顿以及延迟问题成为一个比较棘手的问题&#xff08;目前很多主播用的都是手机直播&#xff0c;基本上都是用手机网络或者WiFi&#xff09;毕竟再好的无线都避免不了网络延迟这一弊端&#xf…

小米扫地机器人参数以及芯片参数

扫地机器人&#xff0c;顾名思义&#xff0c;可以扫地的机器人&#xff01;扫地机器人的基础功能就是扫地和吸尘了&#xff0c;扫地和吸尘是两个不同的概念&#xff1b;吸尘&#xff0c;就是将灰尘吸干净&#xff0c;这个功能很早之前&#xff0c;吸尘器就做的很好了&#xff0…

Linux驱动开发必看:详解神秘内核

http://blog.chinaunix.net/space.php?uid17008081&doblog&id2838611 IT168 技术文档】在开始步入Linux设备驱动程序的神秘世界之前&#xff0c;让我们从驱动程序开发人员的角度看几个内核构成要素&#xff0c;熟悉一些基本的内核概念。我们将学习内核定时器、同步机制…

共享充电宝方案原理,具体部件组成以及主控MUC参数

随着科技的不断发展以及手机的普及&#xff0c;现在越来越多的人群离不开手机了&#xff0c;然而在出门在外的情况下手机将无法避免的出现电量不足的情况&#xff0c;尤其是对于一些电量不足恐惧症的人来说看到电量见底将会毫无安全感。 近几年&#xff0c;共享经济崛起&#…

筋膜枪方案原理简介以及主控MCU参数分享

筋膜枪&#xff0c;也称深层肌筋膜冲击仪&#xff0c;筋膜枪是一种软组织康复工具&#xff0c;通过高频率冲击放松身体的软组织。 筋膜枪可以理解为民用版的DMS&#xff08;电动深层肌肉刺激仪&#xff09;&#xff0c;在使用时振动频率会有所变化&#xff0c;基本作用与DMS差不…

“G”“E”“H”“T”信号完美解释

移动用户&#xff1a;   手机的网络图标有这三种&#xff1a;“G&#xff0c;E&#xff0c;H   G&#xff1a;全称&#xff1a;gprs既传输速率理论的峰值为114Kbps&#xff0c;这是早其的无线网络传输方式。   E&#xff1a;全称&#xff1a;EDGE既传输速率在峰值可以达到…

TWS耳机充电仓方案分享

蓝牙无线耳机是近两年比较热门的一款产品&#xff0c;其技术实现是基于蓝牙芯片技术的发展&#xff0c;工作原理为通过手机蓝牙连接主耳机&#xff0c;再由主耳机通过无线方式快速连接副耳机&#xff0c;实现真正的蓝牙左右声道无线分离使用。不连接从音箱时&#xff0c;主音箱…

虚拟键盘驱动程序

这个是很久之前我就想解决的问题了 以前开发板上的按键&#xff0c;都不是真正意义上&#xff0c;近似USB键盘的效果&#xff0c;根本不能作为Qt等图形界面的输入 看ELDD终于讲到了input子系统 从图中可以看出&#xff0c;靠直接读写 /dev/input/ 目录下的设备节点是不合理的&a…