mirror of
https://github.com/EmbedDevIOT/obsidian-vault-.git
synced 2026-11-06 00:13:26 +03:00
Merge remote-tracking branch 'origin/main'
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 187 KiB |
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
#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.
|
||||
Управление 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user