From 9bac224a5355ae09977ba5b85209aa33d3869c25 Mon Sep 17 00:00:00 2001 From: embeddev Date: Sat, 14 Mar 2026 16:39:49 +0300 Subject: [PATCH] vault backup: 2026-03-14 16:39:49 --- Linux/Linux - Commands.md | 38 ++++--- Linux/Linux SBC - Hardware.md | 129 +++++++++++++++++++---- Linux/Programm/GPIO Kernel control.md | 0 Linux/Programm/GPIO Userspace control.md | 81 -------------- 4 files changed, 133 insertions(+), 115 deletions(-) delete mode 100644 Linux/Programm/GPIO Kernel control.md delete mode 100644 Linux/Programm/GPIO Userspace control.md diff --git a/Linux/Linux - Commands.md b/Linux/Linux - Commands.md index a7da4cf..2b1b3e3 100644 --- a/Linux/Linux - Commands.md +++ b/Linux/Linux - Commands.md @@ -6,37 +6,38 @@ Модель платы под которую создан **device tree**: ``` bash cat /proc/device-tree/model +``` + Дерево устройств, которое kernel получил от GPU +``` bash +ls /proc/device-tree/ +``` +Вывод устройств, которые kernel создал на основе DT +```bash +ls /sys/bus/platform/devices +``` +Просмотр загруженных модулей +```bash +lsmod ``` -`` - модель платы для которой device tree создан -`ls /proc/device-tree/` - дерево устройств, которое kernel получил от GPU -`ls /sys/bus/platform/devices` - вывод устройств, которые kernel создал на основе DT -`lsmod` - просмотр загруженных модулей - ## Commands - System - Параметры которое передает GPU при загрузке системы ``` bash vcgencmd get_config int ``` - Просмотр версии системы ``` bash cat /etc/os-release ``` - Просмотр всех активных физических адресов устройств в системе ``` bash cat /proc/iomem ``` ## SSH -1. Настройка доступа по ключу с использованием `./ssh/config` - 1. Сгенерировать ключ (на локальном хосте) - 1. ``` - ``` - `ssh-keygen -t ed25519` +1. Настройка доступа по ключу с использованием файла `./ssh/config` + 1. Сгенерировать ключ (на локальном хосте) `ssh-keygen -t ed25519` - Приватный ключ: `~/.ssh/id_ed25519` - Публичный ключ: `~/.ssh/id_ed25519.pub` 2. Добавить `pub` ключ на сервер (_`~/.ssh/authorized_keys`_) @@ -58,9 +59,16 @@ cat /proc/iomem 2. 5900+ (VNC) 3. 22 (SSH) 4. 80 / 443 (HTTP/HTTPS) +2. Используемые команды: + +```bash +ssh-keygen -t ed25519 +``` ## Network -1. Проверка маршрута следования трафика. - 1. `traceroute ` +Проверка маршрута следования трафика. +``` bash +traceroute +``` diff --git a/Linux/Linux SBC - Hardware.md b/Linux/Linux SBC - Hardware.md index f8c307e..0e7b5cf 100644 --- a/Linux/Linux SBC - Hardware.md +++ b/Linux/Linux SBC - Hardware.md @@ -1,36 +1,127 @@ -#linux #GPIO #i2c #spi #hardware +#linux #GPIO #i2c #spi #hardware #userspase #libgpiod -Все устройства в Linux живут тут: -`/dev` +Контроль и управление периферией в Linux +Все устройства в Linux живут тут: `/dev` ## GPIO -#userspase #libgpiod Полезная информация: https://devdotnet.org/post/rabota-s-gpio-v-linux-chast-6-biblioteka-libgpiod/ Способы управления: -1. **User Space** - прямой доступ к регистрам, минуя медленные системные вызовы. Посредством открытия `/dev/mem` и мапирование базового адреса GPIO. +1. Userspace driver -прямое управление +2. Libgpiod - управление через библиотеку +3. +#### User Space +Прямой доступ к регистрам, минуя медленные системные вызовы. +Посредством открытия `/dev/mem` и мапирование базового адреса GPIO. ==Подводные камни:== 1. Обход GPIO Subsystem 2. Нет контроля конкуренции (может управлять несколько процессов) 3. Можно сломать драйвер 4. Нет безопасности + +```cpp title:userspace_gpio_control.cpp -2. **libgpiod** (Library General Purpose Input/Output device) - Библиотека и набор утилит в Linux для управления пинами GPIO (ввод/вывод общего назначения) через символьные устройства (`/dev/gpiochip*`) или контроллеры GPIO - 1. Установка: - sudo apt-get update - sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod - 2. Проверка корректности установки: - pkg-config --cflags --libs libgpiod - 3. Состав: - 1. **gpiodetect** - 2. **gpioinfo** - 3. **gpioset** - 4. **gpioget** - 4. Компиляция: - g++ -o gpio_control gpio_control.cpp -lgpiod - 5. API для Python и C/C++ +#include // вывод сообщений +#include // открытие файлов +#include // mmap и munmap +#include // usleep и close +#include // perror +#include // для uint32_t +/* +1. Userspace драйвер GPIO. +Управление GPIO Raspberry Pi через mmap обеспечивает прямой доступ к регистрам периферии, +минуя медленные системные вызовы. Это реализуется через открытие /dev/mem, +мапирование базового адреса GPIO +*/ + +#define GPIO_BASE 0x3F200000 // физический адрес начала блока регистров GPIO на SoC BCM2835 +#define BLOCK_SIZE 4096 // Размер отображ. памяти Регистры GPIO занимают 41 байт, но мы отображаем целую страницу для простоты. +#define TIME_SLEEP 500000 // Время задержки в микросекундах + +int main() { +// открытие спец.файла физической памяти. Флаги - чтение и запись + отключение кэширования + int mem_fd = open("/dev/mem", O_RDWR | O_SYNC); + // Если не удалось открыть - вывод ошибки + if (mem_fd < 0) { + perror("open"); + return 1; + } + +/* +Отображение памяти регистров в виртуальное адресное пространство +mmap создаёт отображение физической памяти, начиная с адреса GPIO_BASE, размером BLOCK_SIZE, в виртуальную память процесса. +NULL – ядро само выбирает адрес для отображения. +BLOCK_SIZE – количество байт. +PROT_READ | PROT_WRITE – разрешено чтение и запись. +MAP_SHARED – изменения видны другим процессам и синхронизируются с файлом (важно для доступа к реальной памяти). +mem_fd – файловый дескриптор /dev/mem. +GPIO_BASE – смещение в файле (физический адрес). +*/ + void* gpio_map = mmap( + NULL, + BLOCK_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED, + mem_fd, + GPIO_BASE + ); + + if (gpio_map == MAP_FAILED) { + perror("mmap"); + return 1; + } + +// Указатель приводится к типу volatile uint32_t*, чтобы: +// Обращаться к памяти 32-битными словами. +// volatile запрещает компилятору оптимизировать обращения, т.к. значения регистров могут меняться аппаратно. + volatile uint32_t* gpio = (volatile uint32_t*)gpio_map; + + // GPIO17 = бит 21 в GPFSEL1 + gpio[1] &= ~(7 << 21); // очистить + gpio[1] |= (1 << 21); // output + + while (true) { + gpio[7] = (1 << 17); // set + usleep(TIME_SLEEP); + gpio[10] = (1 << 17); // clear + usleep(TIME_SLEEP); + } + // освобождение ресурсов, при выходе + munmap(gpio_map, BLOCK_SIZE); + close(mem_fd); +} +``` + +#### libgpiod - library control +Library General Purpose Input/Output device - Библиотека и набор утилит в Linux для управления пинами GPIO (ввод/вывод общего назначения) через символьные устройства (`/dev/gpiochip*`) или контроллеры GPIO + Состав библиотеки: + - **gpiodetect** + - **gpioinfo** + - **gpioset** + - **gpioget** +Установка: +``` bash +sudo apt-get update +sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod +``` +Проверка корректности установки: +``` bash +pkg-config --cflags --libs libgpiod +``` +Компиляция: +``` bash +g++ -o gpio_control gpio_control.cpp -lgpiod +``` +`` + 3. Компиляция: + + 4. API для Python и C/C++ + +``` cpp title:libgpiod_control.cpp + +``` ## I2C. Integrates `/sys/bus/i2c/devices/` diff --git a/Linux/Programm/GPIO Kernel control.md b/Linux/Programm/GPIO Kernel control.md deleted file mode 100644 index e69de29..0000000 diff --git a/Linux/Programm/GPIO Userspace control.md b/Linux/Programm/GPIO Userspace control.md deleted file mode 100644 index eb58e6d..0000000 --- a/Linux/Programm/GPIO Userspace control.md +++ /dev/null @@ -1,81 +0,0 @@ - -Управление GPIO Raspberry Pi через mmap обеспечивает прямой доступ к регистрам периферии, минуя медленные системные вызовы. -Это реализуется через открытие `/dev/mem`, мапирование базового адреса GPIO - -```cpp title:userspace_gpio_control.cpp - -#include // вывод сообщений -#include // открытие файлов -#include // mmap и munmap -#include // usleep и close -#include // perror -#include // для uint32_t - -/* -1. Userspace драйвер GPIO. -Управление GPIO Raspberry Pi через mmap обеспечивает прямой доступ к регистрам периферии, -минуя медленные системные вызовы. Это реализуется через открытие /dev/mem, -мапирование базового адреса GPIO -*/ - -#define GPIO_BASE 0x3F200000 // физический адрес начала блока регистров GPIO на SoC BCM2835 -#define BLOCK_SIZE 4096 // Размер отображ. памяти Регистры GPIO занимают 41 байт, но мы отображаем целую страницу для простоты. -#define TIME_SLEEP 500000 // Время задержки в микросекундах - -int main() { -// открытие спец.файла физической памяти. Флаги - чтение и запись + отключение кэширования - int mem_fd = open("/dev/mem", O_RDWR | O_SYNC); - // Если не удалось открыть - вывод ошибки - if (mem_fd < 0) { - perror("open"); - return 1; - } - -/* -Отображение памяти регистров в виртуальное адресное пространство -mmap создаёт отображение физической памяти, начиная с адреса GPIO_BASE, размером BLOCK_SIZE, в виртуальную память процесса. -NULL – ядро само выбирает адрес для отображения. -BLOCK_SIZE – количество байт. -PROT_READ | PROT_WRITE – разрешено чтение и запись. -MAP_SHARED – изменения видны другим процессам и синхронизируются с файлом (важно для доступа к реальной памяти). -mem_fd – файловый дескриптор /dev/mem. -GPIO_BASE – смещение в файле (физический адрес). -*/ - void* gpio_map = mmap( - NULL, - BLOCK_SIZE, - PROT_READ | PROT_WRITE, - MAP_SHARED, - mem_fd, - GPIO_BASE - ); - - if (gpio_map == MAP_FAILED) { - perror("mmap"); - return 1; - } - -// Указатель приводится к типу volatile uint32_t*, чтобы: -// Обращаться к памяти 32-битными словами. -// volatile запрещает компилятору оптимизировать обращения, т.к. значения регистров могут меняться аппаратно. - volatile uint32_t* gpio = (volatile uint32_t*)gpio_map; - - // GPIO17 = бит 21 в GPFSEL1 - gpio[1] &= ~(7 << 21); // очистить - gpio[1] |= (1 << 21); // output - - while (true) { - gpio[7] = (1 << 17); // set - usleep(TIME_SLEEP); - gpio[10] = (1 << 17); // clear - usleep(TIME_SLEEP); - } - // освобождение ресурсов, при выходе - munmap(gpio_map, BLOCK_SIZE); - close(mem_fd); -} -``` - -```bash title -cat /proc/device-tree/model -``` \ No newline at end of file