vault backup: 2026-03-14 16:39:49

This commit is contained in:
2026-03-14 16:39:49 +03:00
parent 6c0e716b12
commit 9bac224a53
4 changed files with 133 additions and 115 deletions
+23 -15
View File
@@ -6,37 +6,38 @@
Модель платы под которую создан **device tree**: Модель платы под которую создан **device tree**:
``` bash ``` bash
cat /proc/device-tree/model 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 ## Commands - System
Параметры которое передает GPU при загрузке системы Параметры которое передает GPU при загрузке системы
``` bash ``` bash
vcgencmd get_config int vcgencmd get_config int
``` ```
Просмотр версии системы Просмотр версии системы
``` bash ``` bash
cat /etc/os-release cat /etc/os-release
``` ```
Просмотр всех активных физических адресов устройств в системе Просмотр всех активных физических адресов устройств в системе
``` bash ``` bash
cat /proc/iomem cat /proc/iomem
``` ```
## SSH ## SSH
1. Настройка доступа по ключу с использованием `./ssh/config` 1. Настройка доступа по ключу с использованием файла `./ssh/config`
1. Сгенерировать ключ (на локальном хосте) 1. Сгенерировать ключ (на локальном хосте) `ssh-keygen -t ed25519`
1. ```
```
`ssh-keygen -t ed25519`
- Приватный ключ: `~/.ssh/id_ed25519` - Приватный ключ: `~/.ssh/id_ed25519`
- Публичный ключ: `~/.ssh/id_ed25519.pub` - Публичный ключ: `~/.ssh/id_ed25519.pub`
2. Добавить `pub` ключ на сервер (_`~/.ssh/authorized_keys`_) 2. Добавить `pub` ключ на сервер (_`~/.ssh/authorized_keys`_)
@@ -58,9 +59,16 @@ cat /proc/iomem
2. 5900+ (VNC) 2. 5900+ (VNC)
3. 22 (SSH) 3. 22 (SSH)
4. 80 / 443 (HTTP/HTTPS) 4. 80 / 443 (HTTP/HTTPS)
2. Используемые команды:
```bash
ssh-keygen -t ed25519
```
## Network ## Network
1. Проверка маршрута следования трафика. Проверка маршрута следования трафика.
1. `traceroute ` ``` bash
traceroute
```
+110 -19
View File
@@ -1,36 +1,127 @@
#linux #GPIO #i2c #spi #hardware #linux #GPIO #i2c #spi #hardware #userspase #libgpiod
Все устройства в Linux живут тут: Контроль и управление периферией в Linux
`/dev` Все устройства в Linux живут тут: `/dev`
## GPIO ## GPIO
#userspase #libgpiod
Полезная информация: Полезная информация:
https://devdotnet.org/post/rabota-s-gpio-v-linux-chast-6-biblioteka-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 1. Обход GPIO Subsystem
2. Нет контроля конкуренции (может управлять несколько процессов) 2. Нет контроля конкуренции (может управлять несколько процессов)
3. Можно сломать драйвер 3. Можно сломать драйвер
4. Нет безопасности 4. Нет безопасности
```cpp title:userspace_gpio_control.cpp
2. **libgpiod** (Library General Purpose Input/Output device) - Библиотека и набор утилит в Linux для управления пинами GPIO (ввод/вывод общего назначения) через символьные устройства (`/dev/gpiochip*`) или контроллеры GPIO #include <iostream> // вывод сообщений
1. Установка: #include <fcntl.h> // открытие файлов
sudo apt-get update #include <sys/mman.h> // mmap и munmap
sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod #include <unistd.h> // usleep и close
2. Проверка корректности установки: #include <cstring> // perror
pkg-config --cflags --libs libgpiod #include <cstdint> // для uint32_t
3. Состав:
1. **gpiodetect**
2. **gpioinfo**
3. **gpioset**
4. **gpioget**
4. Компиляция:
g++ -o gpio_control gpio_control.cpp -lgpiod
5. API для Python и C/C++
/*
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 ## I2C. Integrates
`/sys/bus/i2c/devices/` `/sys/bus/i2c/devices/`
-81
View File
@@ -1,81 +0,0 @@
Управление GPIO Raspberry Pi через mmap обеспечивает прямой доступ к регистрам периферии, минуя медленные системные вызовы.
Это реализуется через открытие `/dev/mem`, мапирование базового адреса GPIO
```cpp title:userspace_gpio_control.cpp
#include <iostream> // вывод сообщений
#include <fcntl.h> // открытие файлов
#include <sys/mman.h> // mmap и munmap
#include <unistd.h> // usleep и close
#include <cstring> // perror
#include <cstdint> // для 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
```