diff --git a/Linux/Files/rp5_pinout.png b/Linux/Files/rp5_pinout.png new file mode 100644 index 0000000..8151fbe Binary files /dev/null and b/Linux/Files/rp5_pinout.png differ diff --git a/Linux/Linux - Commands.md b/Linux/Linux - Commands.md index 53e683f..12e203e 100644 --- a/Linux/Linux - Commands.md +++ b/Linux/Linux - Commands.md @@ -18,6 +18,37 @@ `cat /etc/os-release` - просмотр версии системы `cat /proc/iomem` - просмотр Все активные отображения физических адресов в системе +## SSH +1. Настройка доступа по ключу с использованием `./ssh/config` + 1. Сгенерировать ключ (на локальном хосте) + `ssh-keygen -t ed25519` + - Приватный ключ: `~/.ssh/id_ed25519` + - Публичный ключ: `~/.ssh/id_ed25519.pub` + 2. Добавить `pub` ключ на сервер (_`~/.ssh/authorized_keys`_) + 1. Если файл с директорией не существует - создать + 2. Можно использовать `ssh-copy-id` + 3. Добавить конфигурацию в `./ssh/config` + 1. **Host** my-server + 2. **HostName** IP_АДРЕС_СЕРВЕРА + 3. **User** ИМЯ_ПОЛЬЗОВАТЕЛЯ + 4. **IdentityFile** ~/.ssh/id_ed25519 + 5. **IdentitiesOnly** yes + 6. **Port** 22 - если порт изменент + 4. Проброс портов: + Синтаксис: локальный порт - целевой хост - целевой порт + 1. **LocalForward** 8080 localhost:80 + 2. **LocalForward** 5432 10.0.0.5:5432 + 5. Порты для проброса: + 1. 3389 (RDP) + 2. 5900+ (VNC) + 3. 22 (SSH) + 4. 80 / 443 (HTTP/HTTPS) + + + + + + diff --git a/Linux/Linux SBC - Hardware.md b/Linux/Linux SBC - Hardware.md index cffc6ab..f8c307e 100644 --- a/Linux/Linux SBC - Hardware.md +++ b/Linux/Linux SBC - Hardware.md @@ -4,7 +4,7 @@ `/dev` ## GPIO -#userspase #libgpiod # +#userspase #libgpiod Полезная информация: https://devdotnet.org/post/rabota-s-gpio-v-linux-chast-6-biblioteka-libgpiod/ @@ -15,13 +15,21 @@ https://devdotnet.org/post/rabota-s-gpio-v-linux-chast-6-biblioteka-libgpiod/ 2. Нет контроля конкуренции (может управлять несколько процессов) 3. Можно сломать драйвер 4. Нет безопасности + 2. **libgpiod** (Library General Purpose Input/Output device) - Библиотека и набор утилит в Linux для управления пинами GPIO (ввод/вывод общего назначения) через символьные устройства (`/dev/gpiochip*`) или контроллеры GPIO - 1. Включает в себя: + 1. Установка: + sudo apt-get update + sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod + 2. Проверка корректности установки: + pkg-config --cflags --libs libgpiod + 3. Состав: 1. **gpiodetect** 2. **gpioinfo** 3. **gpioset** 4. **gpioget** - 2. API для Python и C/C++ + 4. Компиляция: + g++ -o gpio_control gpio_control.cpp -lgpiod + 5. API для Python и C/C++ ## I2C. Integrates diff --git a/Linux/Programm/GPIO Kernel control.md b/Linux/Programm/GPIO Kernel control.md new file mode 100644 index 0000000..e69de29 diff --git a/Linux/Programm/GPIO Userspace control.md b/Linux/Programm/GPIO Userspace control.md new file mode 100644 index 0000000..95547c7 --- /dev/null +++ b/Linux/Programm/GPIO Userspace control.md @@ -0,0 +1,71 @@ +#include // вывод сообщений +#include // открытие файлов +#include // mmap и munmap +#include // usleep и close +#include // perror +#include // для 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); +} +