У меня возникла проблема.
Нужно при загрузке ядра выполнить подтягивание линии GPIO 52 к нижнему порогу (уровню). При этом, чтение из порта должно сохранять данную установку.
Выставление режима GPIO_ACTIVE_LOW | GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_DRAIN
пробовал выполнить так:
my-board.dts:
/ {
...
mykey {
compatible = "key";
pinctrl-names = "default";
// pinctrl-0 = <&pinctrl_gpio1_xxx>;
key-gpios = <&gpio1 20 7>;
interrupt-parent = <&gpio1>;
interrupts = <20 IRQ_TYPE_EDGE_FALLING>;
};
...
};
Пробовал ещё так:
/ {
...
gpio_keys {
compatible = "gpio-keys";
key_tab {
label = "tab";
gpios = <&gpio1 20 7>;
gpio-key,wakeup;
debounce-interval = <50>;
linux,code = <15>; /* KEY_TAB */
};
};
...
};
Но линия не опускается по дефолту в ноль.
Помогает так:
#!/usr/bin/python3
def wr(fn, v):
try:
with open(fn, 'wt') as f:
f.write(v)
except OSError as e:
s = repr(e)
print(f'[WARNING] {s}')
DIR='/sys/class/gpio'
NUM='52'
wr(f'{DIR}/unexport', NUM)
wr(f'{DIR}/export', NUM)
wr(f'{DIR}/gpio{NUM}/direction', "out")
wr(f'{DIR}/gpio{NUM}/value', "1")
wr(f'{DIR}/unexport', NUM)
wr(f'{DIR}/export', NUM)
wr(f'{DIR}/gpio{NUM}/direction', "in")
wr(f'{DIR}/gpio{NUM}/edge', "both")
import select
import os
poll = select.poll()
fn = f'{DIR}/gpio{NUM}/value'
TIMEOUT = 3000
f = open(fn, 'rt')
fd = f.fileno()
poll.register(fd, select.POLLPRI)
print('fd =', fd)
poll.poll(TIMEOUT)
v = f.read()
print('v = , v)
k = 0
while True:
events = poll.poll(TIMEOUT)
print('ev =', events)
if events:
for pfd, pev in events:
if pev & select.POLLPRI > 0:
os.lseek(fd, 0, os.SEEK_SET)
v = f.read().strip()
print('v =', v)
poll.unregister(fd)
f.close()
# EOF
, но лишь на короткое время, до первого чтения из порта (при этом, .dts я не правлю)
Подскажите, что делаю не так? Если можно, экспертный совет, без шуток. Документацию по флагам брал из linux-x.x.x/Documentation и читал когда-то «DTS for Dummies». Толковой документации по настройке дерева DTS не понял, где найти. Похоже, что всё зависит от конкретного оборудования, и надо ближе знать электротехнические термины.
P.S. Код не очень красивый, это черновой набросок.