如何为嵌入式Linux设置引导和模块加载之间的引脚?

How to set a pin between boot and module load for an embedded Linux?

我遇到了一个有趣的问题。我喜欢设置我的 cpu 的引脚。到目前为止,我创建了一个用于控制引脚的模块。该模块正在设置默认引脚配置(高)。默认引脚配置在加载模块时变为活动状态。一切正常。

现在我喜欢在启动过程开始时立即启用我的默认引脚配置。为了存档,我为 ATMEL 引导加载程序 (at91bootstrap) 和 uboot (u-boot-at91) 编写了一个补丁。在内核启动之前,这一切正常。在内核启动时,引脚设置为 ATMEL 默认值。它们的引脚在设备树中定义为 gpios。

我想我有两种可能:

1st - 在 "right" 点修补 /init/main.c。正确的位置在哪里?

2nd - 修改设备树以将 GPIO 设置为其他默认值。如何"re set"一个gpio一个值?

在u-boot级别修改管脚时;它将被内核覆盖。 /init/main.c 是个更糟糕的主意,所以我认为你不应该遵循这种方法

在内核级别,如果你想设置GPIO引脚,有两种可能性(除了你的模块)

1) 内核板文件。

2) 设备树文件。

假设如果你想在 i.MX6 板上将 SDIO 引脚设置为 GPIO,那么你需要像这样修改代码。

leds {
   compatible = "gpio-leds";
   pinctrl-names = "default";
   pinctrl-0 = <&pinctrl_gpio_leds>;

red {
       gpios = <&gpio7 0 0>;
       default-state = "on";
};

MX6QDL_PAD_SD3_DAT5__GPIO7_IO00 0x1b0b0  //set the pin as GPIO

有关引脚的默认状态,请参阅处理器的数据表。并且一个引脚可能具有不同的功能。

如果您想使用相同的引脚代替 GPIO 实现某些其他功能,那么您可以选择以下配置之一。

MX6QDL_PAD_SD3_DAT5__UART2_RX_DATA  //UART2 RX Data pin
MX6QDL_PAD_SD3_DAT5__GPIO7_IO00  //As a GPIO pin
MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA // UART1 RX data
MX6QDL_PAD_SD3_DAT6__SD3_DATA6 //SDIO pin which is default in this case

如果您正在寻找更多信息(例如 PIN 码和设备树文件名),请添加更多详细信息。