import fcntl
import struct
import time
import os
# Структура: 32 байта под строку (имя), uint32 (src), uint32 (dst)
# Формат '32sII' для struct.pack()
def create_endpoint():
ctrl_path = "/dev/rpmsg_ctrl0"
if not os.path.exists(ctrl_path):
print(f"Ошибка: {ctrl_path} не найден")
return
# Вычисляем номер ioctl (_IOW(0xb5, 0x1, struct rpmsg_endpoint_info))
# Магическое число 0xb5 (181), номер команды 1, размер структуры 40 байт
RPMSG_CREATE_EPT_IOCTL = 0x4028b501
# Данные для отправки
name = b"rpmsg-virtual-tty-channel"
src_addr = 30
dst_addr = 30
# Упаковываем данные в бинарную структуру (32 байта под имя + два uint32)
payload = struct.pack("32sII", name, src_addr, dst_addr)
try:
fd = os.open(ctrl_path, os.O_RDWR)
fcntl.ioctl(fd, RPMSG_CREATE_EPT_IOCTL, payload)
print("Эндпоинт успешно создан! Проверьте появление /dev/rpmsg0")
# Удерживаем дескриптор открытым, чтобы ядро не уничтожило эндпоинт
while True:
time.sleep(1000)
except Exception as e:
print(f"Ошибка при создании эндпоинта: {e}")
if __name__ == "__main__":
create_endpoint()