Использование GPIO-Poweroff на вычислительном модуле Raspberry Pi с DAS U-Boot для отключения блока питания

Я пытался заставить GPIO-Poweroff отключить блок питания платы с помощью GPIO, но, что бы я ни пытался, это никогда не работало. Если я вручную переключаю контакт GPIO, устройство немедленно выключается. Если я возьму Raspbian-Lite и добавлю следующую строку в config.txt, это сработает. Но U-Boot, похоже, игнорирует это. Я использую Raspbian Lite 2017-07-5 с последней основной версией U-Boot: git://git.denx.de/u-boot.git, скомпилированной с помощью rpi_defconfig.

dtoverlay=gpio-poweroff,gpiopin=6,active_low=1

С U-Boot Raspberry Pi загружается и работает нормально, он даже выключается, но никогда не переключает GPIO6. Это оставляет блок питания включенным, и единственный способ исправить это — удерживать кнопку питания не менее 5 секунд. Я знаю, что dt-blob.bin загружается и применяется, так как на плате есть камера, которая работает только с правильным dt-blob.bin.

На данный момент у меня нет идей. Я пытался:

  • Обновление ядра Linux с помощью rpi-update
  • Декомпиляция gpio-poweroff.dtbo и dt-blob.bin. Изменение 0x1a на 0x06 и 0x0 на 0x1 внутри gpio -poweroff.dtbo, объединение их вместе, и это не работает.
  • Вручную выполняя вышеперечисленное и переплетая декомпилированный код.
  • Используя fdt addr и fdt apply внутри boot.scr, чтобы применить его вручную, это не сработало, потому что fdt_overlay_apply FDT_ERR_NOSPACE, и я не мог пройти мимо этого.
  • Клонирую linux и пытаюсь сделать dtsb, target не существует.
  • Клонирование linux/arch/arm/boot/dts, написание MakeFile и компиляция их с моими изменениями приводит к загрузке U-Boot, загрузке Raspbian, но gpio-poweroff не работает.
  • Другие попытки, о которых едва ли стоит упоминать.

Ничто из того, что я пытаюсь, кажется, не работает, и я не уверен, куда двигаться дальше.

Для справки, вот некоторые из используемых файлов:

загрузка.cmd:

#Setting default bootargs
setenv original_bootargs console=ttyS0 console=tty1 rootfstype=ext4 fsck.repair=yes hdmi.audio=0 disp.screen0_output_mode=1920x1080p60:1280x720p60:800x600p60:EDID rootwait panic=10 # console MUST be ttyS0 or it WILL NOT BOOT!

# Identify if we are using partition 2 or 3
if fatload mmc 0:1 ${loadaddr} swap; then echo "Using Partition 3"; setenv partition 3; else echo "Using Partition 2"; setenv partition 2; fi

# Check for recovery
if fatload mmc 0:1 ${loadaddr} recovery; then echo "Using Recovery Partition"; setenv partition 4; fi
#if gpio input 32 || fatload mmc 0:1 ${loadaddr} recovery; then echo "Using Recovery Partition"; setenv partition 4; fi

# Create an empty file to detect boot failures
fatwrite mmc 0:1 ${kernel_addr_r} recovery 0

# Set bootargs
setenv bootargs "${original_bootargs} root=/dev/mmcblk0p${partition}"

# Load the existing Linux kernel into RAM
echo Loading partition ${partition}
ext4load mmc 0:${partition} ${kernel_addr_r} kernel.img
# Boot the kernel we have just loaded
bootz ${kernel_addr_r} - ${fdt_addr}

Не знаю почему, но он загружается с красным и синим местами и с низким разрешением. Скомпилировано с помощью mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "Boot Script" -d boot.cmd boot.scr

конфиг.txt:

# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
#dtparam=audio=on

gpu_mem=128

start_x=1

dtoverlay=gpio-poweroff,gpiopin=6,active_low=1

dtdebug=1

person Matthew    schedule 20.08.2017    source источник
comment
Я обнаружил, что вы можете исправить инвертированные цвета при низком разрешении со следующими аргументами загрузки: bcm2708_fb.fbwidth=1280 bcm2708_fb.fbheight=720 bcm2708_fb.fbswap=1. Измените ширину и высоту на желаемое разрешение.   -  person Matthew    schedule 20.08.2017


Ответы (2)


Итак, я несколько исправил это, скомпилировав свои собственные файлы bcm27***.dtb со следующими конкатенациями после их исходного содержимого:

/ {
    compatible = "brcm,bcm2709";

   power_ctrl: power_ctrl {
       compatible = "gpio-poweroff";
       gpios = <&gpio 6 1>;
   };
};

Однако это полностью сломало GPIO и i2c. Так что это не полное решение. Мой следующий шаг — восстановить исходные файлы и попробовать добавить их в конец dt-blob.bin.

person Matthew    schedule 21.08.2017

Я сделал это, вот ответ:

# Manually apply overlay
setenv fdt_length 50000
setexpr kernel_addr_r ${fdt_addr} + ${fdt_length}
fdt addr ${fdt_addr} # Load the existing tree
fdt boardsetup # Device specific setup
fdt move ${fdt_addr} ${fdt_addr} ${fdt_length} # Resize the loaded fdt to ${fdt_length}
fatload mmc 0:1 ${kernel_addr_r} overlays/gpio-poweroff.dtbo
fdt apply ${kernel_addr_r} # Apply the overlay

Редактирование деревьев устройств по умолчанию и файла dt-blob.bin оказалось бесплодным. Что вам нужно сделать, так это применить оверлей самостоятельно, вручную, внутри uboot.src.

Первый шаг — найти исходный код нужного оверлея и изменить значение по умолчанию на желаемое, вы не можете использовать аргументы оверлея внутри U-Boot.

Перед применением оверлеев нужно увеличить размер загружаемого дерева устройств с помощью fdt move, тогда можно загружать и применять из фата. Если вы хотите применить больше наложений, вам просто нужно добавить дополнительные строки, такие как:

fatload mmc 0:1 ${kernel_addr_r} overlays/rpi-tv.dtbo
fdt apply ${kernel_addr_r} # Apply the overlay

Будьте осторожны, в дереве устройств не заканчивается место!

person Matthew    schedule 21.08.2017
comment
Я уверен, что у вас есть веские причины для использования uboot, но использование dtoverlay=gpio-poweroff тривиально просто в /boot/config.txt — и это работает! :) - person Seamus; 24.04.2021