如何在运行时配置和驱动“通用”GPIO一个独立的GPIO(未连接到外围设备)?
例如,如何配置LED的内部上拉。
 

出身背景
两个框架可用于配置和控制给定引脚:钳夹GPIOLib公司。它们是根据引脚使用情况选择的:

·         钳夹主要用于引脚受控by内部外围设备Pinctrl可处理接点配置,并允许将特定特征指定给接点。Pinctrl概述文章概述了Pinctrl框架。
·         GPIOLib公司当引脚(通用GPIO)需要在运行时动态控制(GPIO)。GPIOLib用于通过控制引脚软件这个GPIOLib概述文章概述了GPIOLib框架。

今天GPIO动态重新配置pinctrl与GPIO Sysfs(/sys/class/GPIO/gpioxx)已弃用,现在的替代方案是GPI奥利
 
答复
为此,用户必须在现有设备驱动程序的节点中添加GPIO属性(或创建st,如下例所示的伪设备驱动器)通过GPIOLib弯曲初始化和控制“通用GPIO”。

->https://wiki.st.com/stm32mpu/wiki/GPIO_device_tree_configuration
例如:带有“foo”设备驱动程序,该驱动程序在启用内部上拉的情况下初始化GPIO,
在foo设备驱动程序代码中:

gpiod_get(&pdev->dev,“作用“,GPIOD_OUT);

设备树:

foo_设备{

。。。

作用-gpios=<&gpiob 5 GPIO_ACTIVE_HIGH|GPIO_PULL_UP>;

。。。

};


GPIO库使用示例:

https://wiki.st.com/stm32mpu/wiki/How_to_control_a_GPIO_in_userspace
https://wiki.st.com/stm32mpu/wiki/How_to_control_a_GPIO_in_kernel_space


在<2.0.0的OpenSTLinux生态系统中,无法使用上述GPIOLib通过带标志的内部上拉/下拉来初始化GPIOGPIO公司_拉动_UP或 GPIO公司_拉动_向下)
相反,我们在禁用严格模式的情况下使用pinctrl绑定和pintcrl(严格模式是禁止在两个不同的位置配置引脚(以避免双重分配)。
在探针a处伪驱动器将用偏置(内部上拉/下拉)初始化GPIOGPIOLib将允许更改GPIO输出状态高或低
查找在DK2板上使用GPIOA14完成的示例

工作区/sources/linux-stm32mp/arch/arm/boot/dts/stm32mp157-pinctrl.dtsi

社会科学委员会{

pinctrl:pin-controller@50002000{

 

keyleds_pins_a:keyleds_pin s_a-0{

引脚{

引脚复用器=<STM32_pinmux('A',14,GPIO)>;

                                                           偏置上拉;

驱动推拉;

转换速率=<0>;

};

};

 

工作区/sources/linux-stm32mp/arch/arm/boot/dts/stm32mp157a-dk1.dts

/{

发光二极管阵列4{

兼容=“st,dummy”;

pinctrl names=“默认”;

pinctrl-0=<&keyleds_pins_a>;

status=“正常”;

};

 

B创建垃圾驱动程序

#包括<linux/module.h>

#包括<linux/of_device.h>

#包括<linux/kernel.h>

#包括<linux/delay.h>

#包括<linux/gpio/consumer.h>

#包括<linux/platform_device.h>

 

 

静态int gpio_init_probe(结构平台设备*pdev)

{

 

printk(KERN_INFO“GPIO example init\n”);

 

return(0);

}

 

静态int gpio_exit_move(结构平台设备*pdev)

{

printk(KERN_INFO“GPIO示例退出\n”);

 

return(0);

}

 

/*该结构与设备树匹配*/

/*如果它与DT的兼容字段不匹配,则不会发生任何事情*/

_device_id的静态结构dummy_match[]={

{.compatible=“st,dummy”},

{/*结束节点*/}

};

 

静态结构platform_driver dummy_driver={

.probe=gpio_init_probe,

.remove=gpio_exit_move,

.驱动程序={

.name=“dummy_driver”,

.owner=THIS_MODULE,

.of_match_table=dummy_match,

}

};

 

模块_平台_驱动程序(dummy_driver);

 

MODULE_AUTHOR(“意法半导体”);

MODULE_DESCRIPTION(“带pinctrl配置的Gpio示例”);

模块许可证(“GPL”);

MODULE_ALIAS(“平台:dummy_driver”);

 

***

开机后

***

命令:more/sys/kernel/debug/pinctrl/soc\:pin-controller@50002000/销钉

引脚14(PA14):输入-高-浮动

命令:gpioinfo gpiochip0

第14行:未命名的未使用输入有效高位

 

***

通过GPIOlib引导激活:

命令:gpioset gpiochip0 14=0板上的绿色led亮起

***

引脚14(PA14):输出-低速-推拉-浮动-低速

         注册号:     :模式-外径(或内径)  -打字法  -小狗  -  鱼籽

第14行:未命名的未使用输出活动高

 

****

探针:modprobe dummy_device

****

引脚14(PA14):输入-高电平-上拉

第14行:未命名的未使用输出活动高

 

***

通过GPIOlib引导激活:

命令:gpioset gpiochip0 14=0板上的绿色led亮起

***

引脚14(PA14):输出-低位-推拉-使突然终止-低速

第14行:未命名的未使用输出活动高

 

(要禁用严格模式:

workspace/sources/linux-stm32mp/drivers/pinchtrl/stm32/pincttrl-stm32.c

静态常量结构pinmux_ops stm32_pmx_ops={

.get_functions_count=stm32_pmx_get_funcs_cnt,

.get_function_name=stm32_pmx_get_func_name,

.get_function_groups=stm32_pmx_get_func_groups,

.set_ mux=stm32_pmx_set_,

.gpio_set_direction=stm32_pmx_gpio_set_direction,

/*补丁GPIOLib*/

.sstrict=假,

/*严格=真*/

};

)