内核采用结构体struct pinctrl_dev来表示一个控制器,所有的pinctrl_dev会形成链表,链表头就是pinctrldev_list,在函数pinctrl_gpio_request内部,会调用函数pinctrl_get_device_gpio_range来根据GPIO号,遍历链表pinctrldev_list来查找该GPIO口对应的pinctrl_dev,当然这部分工作均是由系统来维护,我们只需知道整个框架,并如何...
int(*gpio_request_enable) (structpinctrl_dev *pctldev,structpinctrl_gpio_range *range, unsigned offset);--选择mux中的GPIO功能。void(*gpio_disable_free) (structpinctrl_dev *pctldev,structpinctrl_gpio_range *range, unsigned offset);int(*gpio_set_direction) (structpinctrl_dev *pctldev,structpinc...
我们编写GPIO驱动程序时,所设置chip->request函数,一般直接调用gpiochip_generic_request,它导致Pinctrl把引脚复用为GPIO功能。 gpiochip_generic_request(struct gpio_chip *chip, unsigned offset) pinctrl_request_gpio(chip->gpiodev->base + offset) ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &rang...
int (*gpio_request_enable) (struct pinctrl_dev *pctldev, struct pinctrl_gpio_range *range, unsigned offset); void (*gpio_disable_free) (struct pinctrl_dev *pctldev, struct pinctrl_gpio_range *range, unsigned offset); int (*gpio_set_direction) (struct pinctrl_dev *pctldev, struct pinctrl...
(2) 驱动中调用 pinctrl_get / devm_pinctrl_get 接口,获得一个struct pinctrl类型的handle指针,此函数调用如下: pinctrl_get create_pinctrl//drivers/pinctrl/core.cpinctrl_dt_to_map//drivers/pinctrl/devicetree.cdt_to_map_one_config pctlops->dt_node_to_map ...
pinctrl 子系统和 gpio 子系统虽然难度不大,但在内核里的使用率非常高,本文争取一次性把相关内容介绍一遍。 pinctrl 数据结构 使用struct pinctrl_desc 抽象一个 pin controller,该结构的定义如下: struct pinctrl_desc { const char *name; const struct pinctrl_pin_desc *pins; ...
pinctrl subsystem会维护一个gpio number到pin number的map(gpio range),将gpio subsystem传来的gpio number转换为pin number之后,调用struct pinmux_ops中有关的回调函数即可: gpio ranges 当gpio driver 需要使用某一个 gpio 的时候,可以在 struct gpio_chip 的 request 函数中,调用 pinctrl core 提供的 pinctrl_...
pinctrl_gpio_range *range, unsigned offset);//在特定引脚上释放 GPIO 复用 int (*gpio_set_direction) (struct pinctrl_dev *pctldev, struct pinctrl_gpio_range *range, unsigned offset, bool input);//根据 GPIO 配置为输入或输出而进行不同的配置 bool strict;//不允许将同一引脚同时用于 GPIO 和其他...
pctldev = of_pinctrl_get(pinspec.np); // 根据gpio-ranges的第1个参数找到pctldev // 增加映射关系 /* npins != 0: linear range */ ret = gpiochip_add_pin_range(chip, pinctrl_dev_get_devname(pctldev), pinspec.args[0], pinspec.args[1], ...
pinctrl 子系统和 gpio 子系统虽然难度不大,但在内核里的使用率非常高,本文争取一次性把相关内容介绍一遍。 pinctrl 数据结构 使用struct pinctrl_desc 抽象一个 pin controller,该结构的定义如下: structpinctrl_desc{ constchar*name; conststructpinctrl_pin_desc*pins; ...