diff --git a/Linux/Linux - Commands.md b/Linux/Linux - Commands.md index 53618ed..a2e27c6 100644 --- a/Linux/Linux - Commands.md +++ b/Linux/Linux - Commands.md @@ -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 ``` diff --git a/Linux/Programm/GPIO Userspace control.md b/Linux/Programm/GPIO Userspace control.md index 63d6bcd..eb58e6d 100644 --- a/Linux/Programm/GPIO Userspace control.md +++ b/Linux/Programm/GPIO Userspace control.md @@ -1,16 +1,15 @@ -``` + +Управление GPIO Raspberry Pi через mmap обеспечивает прямой доступ к регистрам периферии, минуя медленные системные вызовы. +Это реализуется через открытие `/dev/mem`, мапирование базового адреса GPIO + +```cpp title:userspace_gpio_control.cpp + +#include // вывод сообщений #include // открытие файлов #include // mmap и munmap #include // usleep и close #include // perror -#include // для uint32_t -``` -#include // вывод сообщений -#include // открытие файлов -#include // mmap и munmap -#include // usleep и close -#include // perror -#include // для uint32_t +#include // для 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 +``` \ No newline at end of file