mirror of
https://github.com/EmbedDevIOT/obsidian-vault-.git
synced 2026-11-05 23:13:25 +03:00
vault backup: 2026-03-14 16:14:13
This commit is contained in:
@@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user