vault backup: 2026-03-14 16:14:13

This commit is contained in:
2026-03-14 16:14:13 +03:00
parent 1e9013a7bf
commit 45fc91320c
2 changed files with 30 additions and 30 deletions
+5 -7
View File
@@ -1,11 +1,10 @@
#os #command #linux #os #command #linux #DeviceTree #system
## Hardware starting. Процесс запуска и инициализации ## Hardware starting. Процесс запуска и инициализации
## Boot оr UBoot ## Boot оr UBoot
## Device tree ## Device tree
#DeviceTree
Модель платы под которую создан **device tree**: Модель платы под которую создан **device tree**:
``` ``` bash
cat /proc/device-tree/model cat /proc/device-tree/model
``` ```
@@ -16,20 +15,19 @@ cat /proc/device-tree/model
`lsmod` - просмотр загруженных модулей `lsmod` - просмотр загруженных модулей
## Commands - System ## Commands - System
#system
Параметры которое передает GPU при загрузке системы Параметры которое передает GPU при загрузке системы
``` ``` bash
vcgencmd get_config int vcgencmd get_config int
``` ```
Просмотр версии системы Просмотр версии системы
``` ``` bash
cat /etc/os-release cat /etc/os-release
``` ```
Просмотр всех активных физических адресов устройств в системе Просмотр всех активных физических адресов устройств в системе
``` ``` bash
cat /proc/iomem cat /proc/iomem
``` ```
+25 -23
View File
@@ -1,16 +1,15 @@
```
Управление GPIO Raspberry Pi через mmap обеспечивает прямой доступ к регистрам периферии, минуя медленные системные вызовы.
Это реализуется через открытие `/dev/mem`, мапирование базового адреса GPIO
```cpp title:userspace_gpio_control.cpp
#include <iostream> // вывод сообщений
#include <fcntl.h> // открытие файлов #include <fcntl.h> // открытие файлов
#include <sys/mman.h> // mmap и munmap #include <sys/mman.h> // mmap и munmap
#include <unistd.h> // usleep и close #include <unistd.h> // usleep и close
#include <cstring> // perror #include <cstring> // perror
#include <cstdint> // для uint32_t #include <cstdint> // для uint32_t
```
#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. 1. Userspace драйвер GPIO.
@@ -24,7 +23,7 @@
#define TIME_SLEEP 500000 // Время задержки в микросекундах #define TIME_SLEEP 500000 // Время задержки в микросекундах
int main() { int main() {
// открытие спец.файла физической памяти. Флаги - чтение и запись + отключение кэширования // открытие спец.файла физической памяти. Флаги - чтение и запись + отключение кэширования
int mem_fd = open("/dev/mem", O_RDWR | O_SYNC); int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
// Если не удалось открыть - вывод ошибки // Если не удалось открыть - вывод ошибки
if (mem_fd < 0) { if (mem_fd < 0) {
@@ -32,16 +31,16 @@ int main() {
return 1; return 1;
} }
/* /*
Отображение памяти регистров в виртуальное адресное пространство Отображение памяти регистров в виртуальное адресное пространство
mmap создаёт отображение физической памяти, начиная с адреса GPIO_BASE, размером BLOCK_SIZE, в виртуальную память процесса. mmap создаёт отображение физической памяти, начиная с адреса GPIO_BASE, размером BLOCK_SIZE, в виртуальную память процесса.
NULL – ядро само выбирает адрес для отображения. NULL – ядро само выбирает адрес для отображения.
BLOCK_SIZE – количество байт. BLOCK_SIZE – количество байт.
PROT_READ | PROT_WRITE – разрешено чтение и запись. PROT_READ | PROT_WRITE – разрешено чтение и запись.
MAP_SHARED – изменения видны другим процессам и синхронизируются с файлом (важно для доступа к реальной памяти). MAP_SHARED – изменения видны другим процессам и синхронизируются с файлом (важно для доступа к реальной памяти).
mem_fd – файловый дескриптор /dev/mem. mem_fd – файловый дескриптор /dev/mem.
GPIO_BASE – смещение в файле (физический адрес). GPIO_BASE – смещение в файле (физический адрес).
*/ */
void* gpio_map = mmap( void* gpio_map = mmap(
NULL, NULL,
BLOCK_SIZE, BLOCK_SIZE,
@@ -56,9 +55,9 @@ int main() {
return 1; return 1;
} }
// Указатель приводится к типу volatile uint32_t*, чтобы: // Указатель приводится к типу volatile uint32_t*, чтобы:
// Обращаться к памяти 32-битными словами. // Обращаться к памяти 32-битными словами.
// volatile запрещает компилятору оптимизировать обращения, т.к. значения регистров могут меняться аппаратно. // volatile запрещает компилятору оптимизировать обращения, т.к. значения регистров могут меняться аппаратно.
volatile uint32_t* gpio = (volatile uint32_t*)gpio_map; volatile uint32_t* gpio = (volatile uint32_t*)gpio_map;
// GPIO17 = бит 21 в GPFSEL1 // GPIO17 = бит 21 в GPFSEL1
@@ -77,3 +76,6 @@ int main() {
} }
``` ```
```bash title
cat /proc/device-tree/model
```