Поворот дисплея в зависимости от HDMI или композитного выхода
Я отредактировал файл config.txt и добавил display_rotate = 1
, чтобы получить портретный дисплей на маленьком 7-дюймовом экране. для меньшего экрана, но когда я подключаю свою малину Pi к телевизору с помощью HDMI, мне нужно, чтобы экран поворачивался на 90 градусов до пейзажного экрана.
Есть ли способ определить, подключен ли HDMI /не подключен и только затем поворачивать дисплей?
3 ответа
Это, безусловно, можно обнаружить. Примером может служить мой скрипт для /etc/rc.local
.
Вопрос в том, можете ли вы сделать что-нибудь полезное с этим, так как код для поворота фреймбуфера запускается в начале процесса загрузки, и вы не можете изменить поворот. Когда я хочу повернуть свой экран, я меняю config.txt
, затем перезагружаюсь. Это некрасиво, но это только добавляет 30 секунд к времени загрузки.
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
# If running headless (i.e. default RCA video)
if /opt/vc/bin/tvservice -s | grep 'NTSC\|PAL'; then
echo $(hostname) is running Headless
/opt/vc/bin/tvservice -s
else
echo $(hostname) is running hdmi
fi
IIRC сигнал «HDMI detect» подключается к одному из контактов GPIO на ядре Broadcom SoC в основе Pi - поэтому должен быть в состоянии обнаружить его состояние, хотя возможно, не через библиотеку wiringPi - tvservice
может дать вам некоторую полезную информацию в сценарии оболочки, с помощью Я думаю , статус -s
или -m
отслеживать аргументы HDMI.
С точки зрения электроники и смотря на стр. 2 схемы Rev2.1, я проследил соединение «HDMI_HPD_P» (контакт 19 - обнаружение горячей замены на разъеме HDMI), чтобы навести M6 BCM2835, который с меткой GPIO46 (и с точки зрения GPIO, нумерация его соседей - это GPIO45, являющийся «PWM1_OUT» и GPIO47, «SD_CARD_DET»), поэтому я чувствую, что вы можете обнаружить состояние вывода с некоторым низкоуровневым кодом «C», работающим как суперпользователь , но было бы гораздо безопаснее попытаться найти существующую библиотеку, которая сделает это таким образом, чтобы минимизировать риски потенциально повреждающих побочных эффектов системы . Например. попытка получить доступ к этому выводу может действительно работать на группе из 8 контактов, и если некоторые из те участвуют в чтении и записи с /на SD-карту, что потенциально может испортить данные на карте.
здесь указано что:
Pi использует сигнал hotplug HDMI, чтобы определить, подключен ли HDMI. Если он не обнаружен, он возвращается к составному.
, что, в свою очередь, предполагает, что существует определенное программное обеспечение для обнаружения изменения статуса hotplug. Но что делает трюк?
@ Предложение SlySven использовать /opt/vc/bin/tvservice -s
попадает в голову гвоздя.
Пример вывода Pi с подключенным HDMI:
состояние 0x12001a [HDMI CEA (16) RGB lim 16: 9], 1920x1080 @ 60.00Hz, прогрессивный
и с отсоединенным кабелем:
состояние 0x120019 [HDMI CEA (16) RGB lim 16: 9], 1920x1080 @ 60.00Hz, прогрессивный
Пришло время взглянуть на tvservice
источник (или, точнее, userland /interface /vmcs_host /vc_hdmi.h). Они удобно предоставляют нам перечисление VC_HDMI_NOTIFY_T, которое, по сути, говорит нам все, что нам нужно знать:
typedef enum {
VC_HDMI_UNPLUGGED = (1 <0), /* Отсоединен кабель HDMI * /
VC_HDMI_ATTACHED = (1 <1), /* Кабель HDMI подключен, но не включен * /
[...]
} VC_HDMI_NOTIFY_T;
Итак, все, что нам нужно сделать, это проверить минимальный бит - если он установлен, кабель отключен. Таким образом, казалось бы, что запуск tvservice -s
и корректный анализ состояния должны включить, чтобы определить, подключен ли HDMI или нет.