Расширение функциональности U-Boot - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно добавить некоторые новые функции в u-boot, например нажать указанную кнопку, чтобы настроить мое устройство, используя мигающий светодиод в качестве ответа устройства. Проблема в том, что я не там, где u-boot начинает выполнять C-код. Какой файл мне следует изменить?

Я использую STM32F429I-Discovery для тестирования и уже установил все, что мне нужно для запуска ядра с помощью buildroot. Один из светодиодов (GPIO_13) постоянно мигает, поэтому я попытался найти код, обеспечивающий такую ​​функциональность. Похоже, что led.c и gpio_led.c должны что-то делать, но их изменение ничего не дает.

Обновление.

Ну, я пытался копаться в триггерах, нопохоже, что изменение файла .dts не влияет на мигание светодиода. При комментировании кода в соответствующем триггере сердцебиения светодиод выключается, однако выбор GPIO отсутствует, поэтому я не могу заменить зеленый светодиод на красный. После перемещения "linux, default-trigger" в GPIO14 в файле .dts я перекомпилирую u-boot и linux с помощью buildroot, но ничего не меняется. Вот мои изменения (я взял некоторый код из stm32f746-disco.c):

stm32f429-disco.dts

/dts-v1/;
#include "stm32f429.dtsi"
#include "stm32f429-pinctrl.dtsi"
#include <dt-bindings/input/input.h>

/ {
    model = "STMicroelectronics STM32F429i-DISCO board";
    compatible = "st,stm32f429i-disco", "st,stm32f429";

    chosen {
        bootargs = "root=/dev/ram";
        stdout-path = "serial0:115200n8";
    };

    memory {
    reg = <0x90000000 0x800000>;
    };

    aliases {
        serial0 = &usart1;
    };

    leds {
        compatible = "st,leds";
        red {
            gpios = <&gpiog 14 0>;
            linux,default-trigger = "heartbeat";
        };
        green {
            gpios = <&gpiog 13 0>;
        };
    };

    gpio_keys {
        compatible = "gpio-keys";
        #address-cells = <1>;
        #size-cells = <0>;
        autorepeat;
        button@0 {
            label = "User";
            linux,code = <KEY_HOME>;
            gpios = <&gpioa 0 0>;
        };
    };

    /* This turns on vbus for otg for host mode (dwc2) */
    vcc5v_otg: vcc5v-otg-regulator {
        compatible = "regulator-fixed";
        gpio = <&gpioc 4 0>;
        regulator-name = "vcc5_host1";
        regulator-always-on;
    };
};

&clk_hse {
    clock-frequency = <8000000>;
};

stm32f429-discovery. с

#include <common.h>
#include <dm.h>
#include <ram.h>
#include <spl.h>
#include <asm/io.h>
#include <asm/armv7m.h>
#include <asm/arch/stm32.h>
#include <asm/arch/gpio.h>
#include <asm/arch/stm32_periph.h>
#include <asm/arch/stm32_defs.h>
#include <asm/gpio.h>

DECLARE_GLOBAL_DATA_PTR;

int dram_init(void)
{
    int rv;
    struct udevice *dev;

    rv = uclass_get_device(UCLASS_RAM, 0, &dev);
    if (rv) {
        debug("DRAM init failed: %d\n", rv);
        return rv;
    }

    if (fdtdec_setup_memory_size() != 0)
        rv = -EINVAL;

    return rv;
}

int dram_init_banksize(void)
{
    fdtdec_setup_memory_banksize();

    return 0;
}

u32 get_board_rev(void)
{
    return 0;
}

int board_early_init_f(void)
{
    return 0;
}

int board_init(void)
{
    gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;

    struct gpio_desc gpio = {};
    int node, offset_node;

    node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "st,leds");
    offset_node = fdt_subnode_offset(gd->fdt_blob, node, "green");
    if (node < 0)
        return -1;

    gpio_request_by_name_nodev(offset_to_ofnode(offset_node), "gpios", 0, &gpio, GPIOD_IS_OUT);

    if (dm_gpio_is_valid(&gpio)) {
        dm_gpio_set_value(&gpio, 1);
    }

    return 0;
}

#ifdef CONFIG_MISC_INIT_R
int misc_init_r(void)
{
    char serialno[25];
    uint32_t u_id_low, u_id_mid, u_id_high;

    if (!env_get("serial#")) {
        u_id_low  = readl(&STM32_U_ID->u_id_low);
        u_id_mid  = readl(&STM32_U_ID->u_id_mid);
        u_id_high = readl(&STM32_U_ID->u_id_high);
        sprintf(serialno, "%08x%08x%08x",
        u_id_high, u_id_mid, u_id_low);
        env_set("serial#", serialno);
    }

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Индикаторы определены в дереве устройств (файл U-Boot arch / arm / dts / stm32f429-disco.dts, файл ядра Linux arch / arm / boot / dts / stm32f429-disco.dts)

        leds {
                compatible = "gpio-leds";
                red {
                        gpios = <&gpiog 14 0>;
                };
                green {
                        gpios = <&gpiog 13 0>;
                        linux,default-trigger = "heartbeat";
                };
        };

В Linux вы можете изменить триггер, записав в соответствующий файл триггера. Это должно быть

/ sys / class / leds / green / trigger

Драйвер U-Boot для GPIO - это drivers / gpio / stm32_gpio.c

Вы можете использовать функциюdm_gpio_set_value () для установки GPIO в качестве входных данных и dm_gpio_get_value () для чтения значения.

Вы можете использовать часть FASTBOOT платы / st / stm32mp1 / stm32mp1.c в качестве шаблона.

0 голосов
/ 18 октября 2019

Вы должны добавить функцию u-boot в файл board.c. Это можно найти по адресу: u-boot / board / stm / stm32f429-discovery / board.c

Возможно, вам придется изменить другие настройки, что можно сделать в файле заголовка. Этот файл можно найти: u-boot / include / configs / stm32f429-discovery.h

...