mirror of
https://github.com/EmbedDevIOT/obsidian-vault-.git
synced 2026-11-06 00:23:26 +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. Процесс запуска и инициализации
|
||||
|
||||
## Boot оr UBoot
|
||||
## Device tree
|
||||
#DeviceTree
|
||||
Модель платы под которую создан **device tree**:
|
||||
```
|
||||
``` bash
|
||||
cat /proc/device-tree/model
|
||||
```
|
||||
|
||||
@@ -16,20 +15,19 @@ cat /proc/device-tree/model
|
||||
`lsmod` - просмотр загруженных модулей
|
||||
|
||||
## Commands - System
|
||||
#system
|
||||
|
||||
Параметры которое передает GPU при загрузке системы
|
||||
```
|
||||
``` bash
|
||||
vcgencmd get_config int
|
||||
```
|
||||
|
||||
Просмотр версии системы
|
||||
```
|
||||
``` bash
|
||||
cat /etc/os-release
|
||||
```
|
||||
|
||||
Просмотр всех активных физических адресов устройств в системе
|
||||
```
|
||||
``` bash
|
||||
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 <sys/mman.h> // mmap и munmap
|
||||
#include <unistd.h> // usleep и close
|
||||
#include <cstring> // perror
|
||||
#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
|
||||
#include <cstdint> // для uint32_t
|
||||
|
||||
/*
|
||||
1. Userspace драйвер GPIO.
|
||||
@@ -24,7 +23,7 @@
|
||||
#define TIME_SLEEP 500000 // Время задержки в микросекундах
|
||||
|
||||
int main() {
|
||||
// открытие спец.файла физической памяти. Флаги - чтение и запись + отключение кэширования
|
||||
// открытие спец.файла физической памяти. Флаги - чтение и запись + отключение кэширования
|
||||
int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
|
||||
// Если не удалось открыть - вывод ошибки
|
||||
if (mem_fd < 0) {
|
||||
@@ -32,16 +31,16 @@ int main() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Отображение памяти регистров в виртуальное адресное пространство
|
||||
mmap создаёт отображение физической памяти, начиная с адреса GPIO_BASE, размером BLOCK_SIZE, в виртуальную память процесса.
|
||||
NULL – ядро само выбирает адрес для отображения.
|
||||
BLOCK_SIZE – количество байт.
|
||||
PROT_READ | PROT_WRITE – разрешено чтение и запись.
|
||||
MAP_SHARED – изменения видны другим процессам и синхронизируются с файлом (важно для доступа к реальной памяти).
|
||||
mem_fd – файловый дескриптор /dev/mem.
|
||||
GPIO_BASE – смещение в файле (физический адрес).
|
||||
*/
|
||||
/*
|
||||
Отображение памяти регистров в виртуальное адресное пространство
|
||||
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,
|
||||
@@ -56,9 +55,9 @@ int main() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Указатель приводится к типу volatile uint32_t*, чтобы:
|
||||
// Обращаться к памяти 32-битными словами.
|
||||
// volatile запрещает компилятору оптимизировать обращения, т.к. значения регистров могут меняться аппаратно.
|
||||
// Указатель приводится к типу volatile uint32_t*, чтобы:
|
||||
// Обращаться к памяти 32-битными словами.
|
||||
// volatile запрещает компилятору оптимизировать обращения, т.к. значения регистров могут меняться аппаратно.
|
||||
volatile uint32_t* gpio = (volatile uint32_t*)gpio_map;
|
||||
|
||||
// GPIO17 = бит 21 в GPFSEL1
|
||||
@@ -77,3 +76,6 @@ int main() {
|
||||
}
|
||||
```
|
||||
|
||||
```bash title
|
||||
cat /proc/device-tree/model
|
||||
```
|
||||
Reference in New Issue
Block a user