设置没有 pinctrl-names 的设备树节点时,GPIO 不受控制

问题描述

我正在研究 imx8mm 并使用 Linux 内核 v4.14.98 测试 GPIO。

设备树节点为:

Error - <class 'sqlalchemy.exc.TimeoutError'>: QueuePool limit of size 5 overflow 10 reached,connection timed out,timeout 30
URL: https://url/dataset/dataset1/resource/0797383e-bac0-4114-943b-87c74d2677a9
File '/usr/lib/ckan/default/lib/python2.7/site-packages/weberror/errormiddleware.py',line 171 in __call__
  app_iter = self.application(environ,sr_checker)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/webob/dec.py',line 147 in __call__
  resp = self.call_func(req,*args,**self.kwargs)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/webob/dec.py',line 208 in call_func
  return self.func(req,**kwargs)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/fanstatic/publisher.py',line 234 in __call__
  return request.get_response(self.app)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/webob/request.py',line 1053 in get_response
  application,catch_exc_info=False)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/webob/request.py',line 1022 in call_application
  app_iter = application(self.environ,start_response)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/webob/dec.py',**kwargs)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/fanstatic/injector.py',line 54 in __call__
  response = request.get_response(self.app)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/webob/request.py',start_response)
File '/usr/lib/ckan/default/src/ckan/ckan/config/middleware/pylons_app.py',line 250 in inner
  result = application(environ,start_response)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/beaker/middleware.py',line 73 in __call__
  return self.app(environ,line 156 in __call__
  return self.wrap_app(environ,session_start_response)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/routes/middleware.py',line 131 in __call__
  response = self.app(environ,start_response)
File '/usr/lib/ckan/default/src/ckan/ckan/config/middleware/common_middleware.py',line 80 in __call__
  return self.app(environ,start_response)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/pylons/wsgiapp.py',line 125 in __call__
  response = self.dispatch(controller,environ,line 324 in dispatch
  return controller(environ,start_response)
File '/usr/lib/ckan/default/src/ckan/ckan/lib/base.py',line 212 in __call__
  res = WsgiController.__call__(self,start_response)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/pylons/controllers/core.py',line 221 in __call__
  response = self._dispatch_call()
File '/usr/lib/ckan/default/lib/python2.7/site-packages/pylons/controllers/core.py',line 172 in _dispatch_call
  response = self._inspect_call(func)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/pylons/controllers/core.py',line 107 in _inspect_call
  result = self._perform_call(func,args)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/pylons/controllers/core.py',line 60 in _perform_call
  return func(**args)
File '/usr/lib/ckan/default/src/ckan/ckan/controllers/package.py',line 1123 in resource_read
  return render(template,extra_vars=vars)
File '/usr/lib/ckan/default/src/ckan/ckan/lib/base.py',line 177 in render
  return cached_template(template_name,render_template)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/pylons/templating.py',line 249 in cached_template
  return render_func()
File '/usr/lib/ckan/default/src/ckan/ckan/lib/base.py',line 131 in render_template
  return render_jinja2(template_name,globs)
File '/usr/lib/ckan/default/src/ckan/ckan/lib/base.py',line 88 in render_jinja2
  return template.render(**extra_vars)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/jinja2/environment.py',line 989 in render
  return self.environment.handle_exception(exc_info,True)
File '/usr/lib/ckan/default/lib/python2.7/site-packages/jinja2/environment.py',line 754 in handle_exception
  reraise(exc_type,exc_value,tb)
File '/usr/lib/ckan/default/src/ckanext-fiware_theme_basic/ckanext/fiware_theme_basic/templates/package/resource_read.html',line 1 in top-level template code
  {% ckan_extends %}
TimeoutError: QueuePool limit of size 5 overflow 10 reached,timeout 30

我写了一个驱动程序来测试这个

&iomuxc {
    pinctrl-names = "default";
    
    ...

    imx8mm-evk {    
        pinctrl_gpio_plural: gpiopluralgrp {
            fsl,pins = <
                MX8MM_IOMUXC_GPIO1_IO11_GPIO1_IO11      0x41
            >;
        };
    };
};

...

plural {
    compatible = "gpio-plural";
    /* pinctrl-names = "default"; */   
    pinctrl-0 = <&pinctrl_gpio_plural>;
    reset-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
};

但是,当我将 pinctrl-names 注释为上面显示的设备树时,我无法控制 GPIO 引脚。 GPIO 引脚始终保持高电平。

devicetree.c 中,static int gpio_plural_probe(struct platform_device *pdev) { struct gpio_plural_data *drvdata; drvdata = devm_kzalloc(&pdev->dev,sizeof(*drvdata),GFP_KERNEL); if (drvdata == NULL) return -ENOMEM; drvdata->reset = devm_gpiod_get(&pdev->dev,"reset",GPIOD_OUT_HIGH); if (IS_ERR(drvdata->reset)) { printk("Error: reset not found\n"); return -EINVAL; } gpiod_set_value(drvdata->reset,0); mdelay(100); gpiod_set_value(drvdata->reset,1); mdelay(100); gpiod_set_value(drvdata->reset,1); return 0; } 将替换为 statename 后缀,此处为“0”。但它只是一个常量名称,可以是任何字符串。所以我的问题是为什么我不能在不设置 pinctrl-names 的情况下控制 GPIO 引脚?

解决方法

它不能是任何名称,大多数节点都会有 pinctrl-names = "default";,因为这使 pinctrl-0 成为设备引脚的默认状态。

这实际上非常重要,因为设备核心将在探测设备之前使用它来检索和设置正确的状态,请参阅pinctrl_bind_pins。它确实:

dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_DEFAULT);

其中 PINCTRL_STATE_DEFAULT"default"

然后,它选择状态:

ret = pinctrl_select_state(dev->pins->p,dev->pins->init_state);

如果您不想使用 default 名称,则必须在驱动程序中选择正确的状态。

其他通用状态名称是:

#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"