mirror of
https://github.com/EmbedDevIOT/obsidian-vault-.git
synced 2026-11-06 01:53:26 +03:00
vault backup: 2026-03-14 16:39:49
This commit is contained in:
+23
-15
@@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+106
-15
@@ -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. Нет безопасности
|
||||||
|
|
||||||
2. **libgpiod** (Library General Purpose Input/Output device) - Библиотека и набор утилит в Linux для управления пинами GPIO (ввод/вывод общего назначения) через символьные устройства (`/dev/gpiochip*`) или контроллеры GPIO
|
```cpp title:userspace_gpio_control.cpp
|
||||||
1. Установка:
|
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 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 update
|
||||||
sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod
|
sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod
|
||||||
2. Проверка корректности установки:
|
```
|
||||||
|
Проверка корректности установки:
|
||||||
|
``` bash
|
||||||
pkg-config --cflags --libs libgpiod
|
pkg-config --cflags --libs libgpiod
|
||||||
3. Состав:
|
```
|
||||||
1. **gpiodetect**
|
Компиляция:
|
||||||
2. **gpioinfo**
|
``` bash
|
||||||
3. **gpioset**
|
|
||||||
4. **gpioget**
|
|
||||||
4. Компиляция:
|
|
||||||
g++ -o gpio_control gpio_control.cpp -lgpiod
|
g++ -o gpio_control gpio_control.cpp -lgpiod
|
||||||
5. API для Python и C/C++
|
```
|
||||||
|
``
|
||||||
|
3. Компиляция:
|
||||||
|
|
||||||
|
4. API для Python и C/C++
|
||||||
|
|
||||||
|
``` cpp title:libgpiod_control.cpp
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
## I2C. Integrates
|
## I2C. Integrates
|
||||||
`/sys/bus/i2c/devices/`
|
`/sys/bus/i2c/devices/`
|
||||||
|
|||||||
@@ -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
|
|
||||||
```
|
|
||||||
Reference in New Issue
Block a user