常见问题解答:STM32MP1如何通过上拉/下拉来初始化“通用GPIO”(控制LED)?
如何在运行时配置和驱动“通用”GPIO一个独立的GPIO(未连接到外围设备)?例如,如何配置LED的内部上拉。背景两个框架可用于配置和控制给定引脚:pinctrl a。。。
例如,如何配置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处伪驱动器将用偏置(内部上拉/下拉)初始化GPIO和GPIOLib将允许更改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=假,
/*严格=真*/
};
)