diff --git a/Git/Git.md b/Git/Git.md
new file mode 100644
index 0000000..7353061
--- /dev/null
+++ b/Git/Git.md
@@ -0,0 +1,113 @@
+### General commands
+Клонирование репозитория на новый ПК:
+```bash
+git clone ha-server:/путь/к/wiki.git
+```
+
+### 1. Подготовка изменений (локально)
+перед тем, как отправить код, нужно собрать коммит
+
+Проверка статуса:
+```bash
+git status
+```
+Добавить файлы в очередь:
+```bash
+git add .
+```
+Сохранить изменения локально с комментарием:
+```bash
+git commit -m "Commit description"
+```
+
+
+### 2. Обмен данными с сервером
+Отправка локальных коммитов на сервер:
+```bash
+git push
+```
+Забрать изменения с сервера
+```bash
+git pull
+```
+Проверка, произошли ли изменения на сервере
+```bash
+git fetch
+```
+
+### 3. Settings Git on my Server
+1. Для работы нужно настроить ssh_config для прямого подключения через ключ
+``` bash
+nano ~/.ssh/config
+```
+
+2. Добавим блок нашего сервера (ключ `id_ed25519` должен быть сгенерирован)
+``` bash
+Host ha-server
+ HostName 89.109.8.114
+ Port 2202
+ User emb
+ IdentityFile ~/.ssh/id_ed25519
+
+```
+
+3. Добавим публичный ключ `.ssh/id_ed25519.pub` в содержимое
+`.ssh/authorized_keys` на сервере
+
+4. Теперь можно не использовать логин и пароль при SSH подключении и копировании
+```bash
+ssh ha-server
+```
+
+5. Инициализация git Bare-репозитория на сервере (git уже установлен)
+```bash
+mkdir -p ~/repos/my_project.git
+cd ~/repos/my_project.git
+git init --bare
+```
+
+
+### 4. Settings on work PC
+1. Инициализируем Пустой репозиторий и добавляем удаленный репозиторий на Server
+```bash
+git init --bare
+git remote add origin ha-server:/home/emb/workspace/wiki.git
+```
+2. Пуш в репозиторий. Внесение изменений в репозиторий и push на сервер
+```bash
+git add .
+git commit -m "commit name"
+git push -u origin master
+```
+
+3. Пулл с репозитория. Начало работы (репозиторий должен быть проинициализирован):
+```bash
+git pull
+```
+
+
+==При возникновении проблем==
+Если возникла ошибка `fatal: detected dubious ownership`- владелец папки не совпадает с пользователем необходимо выполнить:
+```bash
+git config --global --add safe.directory /home/emb/workspace/wiki.git
+```
+
+
+4. Работа с ветками
+
+Ветки нужны, чтобы делать новые фичи, не ломая основной код:
+
+- **`git branch`** — список всех веток.
+- **`git checkout -b имя_ветки`** — создать новую ветку и перейти в нее.
+- **`git checkout master`** — вернуться на главную ветку.
+- **`git merge имя_ветки`** — влить изменения из другой ветки в текущую.
+
+5. Полезные мелочи
+
+- **`git log`** — посмотреть историю всех коммитов (кто, когда и что сделал).
+- **`git diff`** — увидеть конкретные изменения в строках кода до коммита.
+- **`git remote -v`** — проверить, к какому серверу привязан твой локальный Git.
+
+---
+
+### Настройка зеркалирования репозиториев
\ No newline at end of file
diff --git a/Linux/CLI/СLI Boot & Device tree.md b/Linux/CLI/СLI Boot & Device tree.md
new file mode 100644
index 0000000..3c54812
--- /dev/null
+++ b/Linux/CLI/СLI Boot & Device tree.md
@@ -0,0 +1,46 @@
+#os #command #linux #DeviceTree #system
+
+## Boot оr UBoot
+## Device tree
+Модель платы под которую создан **device tree**:
+``` bash
+cat /proc/device-tree/model
+```
+ Дерево устройств, которое kernel получил от GPU
+``` bash
+ls /proc/device-tree/
+```
+Вывод устройств, которые kernel создал на основе DT
+```bash
+ls /sys/bus/platform/devices
+```
+Просмотр загруженных модулей
+```bash
+lsmod
+```
+---
+
+## System
+Параметры которое передает GPU при загрузке системы
+``` bash
+vcgencmd get_config int
+```
+Просмотр версии системы
+``` bash
+cat /etc/os-release
+```
+Просмотр всех активных физических адресов устройств в системе
+``` bash
+cat /proc/iomem
+```
+Вывод информации о работе системы
+```bash
+htop
+```
+Системные логи ядра
+```bash
+dmesg
+```
+
+---
+
diff --git a/Linux/CLI/СLI FileSystem.md b/Linux/CLI/СLI FileSystem.md
new file mode 100644
index 0000000..bbb1dde
--- /dev/null
+++ b/Linux/CLI/СLI FileSystem.md
@@ -0,0 +1,68 @@
+#command #linux #system #files #filesystem
+
+
+---
+
Описание команд взаимодействия с файловой системой
+## Filesystem control
+Перемещение по директориям
+``` bash
+cd ..
+cd /
+cd ~
+```
+Вывод рабочей директории
+```bash
+pwd
+```
+Вывод списка файлов директории
+``` bash
+ls -la
+ls -la /home/user/diterctory
+```
+Создать файл
+``` bash
+# использованием touch
+touch
+
+# использование редактора nano
+nano
+```
+Создание директорий
+``` bash
+mkdir dir_name
+```
+Копирование файлов и директорий
+```bash
+cp
+```
+Удаление файлов или директорий
+``` bash
+# удаление без подтверждения
+rm -f
+
+# рекурсивное удаление
+rm -r
+```
+Перемещение файлов
+``` bash
+# перемещение файла в директорию
+mv file.cpp directory/
+
+# перемещение директорий
+mv dir dir2/
+```
+Вывод содержимого файла
+```bash
+cat file_name
+```
+Поиск "патерна" в выводе
+``` bash
+cat file | grep error
+```
+Печать с выводом (отслеживанием) последних строк в файле
+```bash
+tail -f /dir/file | grep error
+```
+
+---
+
diff --git a/Linux/CLI/СLI Hardware.md b/Linux/CLI/СLI Hardware.md
new file mode 100644
index 0000000..88e944a
--- /dev/null
+++ b/Linux/CLI/СLI Hardware.md
@@ -0,0 +1,35 @@
+#os #command #linux #hardware #system #gpio #i2c #uart #serial
+
+---
+
+## Hardware
+Получение информации о оборудовании.
+```bash
+lshw
+```
+
+#### GPIO
+#### I2C
+Для работы с i2c в linux используются утилиты из пакета `i2c-tools`
+Вывод списка всех доступных адаптеров i2c
+```bash
+i2cdetect -l
+```
+Сканирование указанной шины i2c
+```bash
+i2cdetect -l
+```
+#### UART
+Вывод объектов устройств
+``` bash
+cat /dev/tty*
+```
+Поиск текущих устройств в логе ядра
+ ```bash
+ dmesg | grep tty
+ ```
+Утилиты для работы с портом (or minicom)
+```bash
+picocom -b 115200 /dev/ttyUSB0
+```
+
diff --git a/Linux/CLI/СLI Kernel and System.md b/Linux/CLI/СLI Kernel and System.md
new file mode 100644
index 0000000..61e8553
--- /dev/null
+++ b/Linux/CLI/СLI Kernel and System.md
@@ -0,0 +1,62 @@
+#command #linux #system #daemons #kernel
+
+
+---
+Описание команд взаимодействия с файловой системой
+## System Control
+Изменение прав файла или директории
+``` bash
+chmod
+```
+Вывод системных логов ядра
+```bash
+dmesg
+```
+Вывод списка запущенных процессов
+``` bash
+ps -ef
+```
+Убить процесс
+``` bash
+kill -9
+```
+
+**Systemd** - система инициализации и управления сервисами.
+``` bash
+systemctl status
+```
+Управление сервисами
+```bash
+systemctl start/stop/restart
+```
+Удаление файлов или директорий
+``` bash
+# удаление без подтверждения
+rm -f
+
+# рекурсивное удаление
+rm -r
+```
+Перемещение файлов
+``` bash
+# перемещение файла в директорию
+mv file.cpp directory/
+
+# перемещение директорий
+mv dir dir2/
+```
+Вывод содержимого файла
+```bash
+cat file_name
+```
+Поиск "патерна" в выводе
+``` bash
+cat file | grep error
+```
+Печать с выводом (отслеживанием) последних строк в файле
+```bash
+tail -f /dir/file | grep error
+```
+
+---
+
diff --git a/Linux/CLI/СLI Network SSH other.md b/Linux/CLI/СLI Network SSH other.md
new file mode 100644
index 0000000..68f4977
--- /dev/null
+++ b/Linux/CLI/СLI Network SSH other.md
@@ -0,0 +1,85 @@
+#network #command #linux #ssh #system
+
+---
+
+## SSH - control
+Настройка доступа по ключу с использованием файла `./ssh/config`
+- Сгенерировать ключ (на локальном хосте)
+ `ssh-keygen -t ed25519`
+ - Приватный ключ: `~/.ssh/id_ed25519`
+ - Публичный ключ: `~/.ssh/id_ed25519.pub`
+ Добавить `pub` ключ на сервер (_`~/.ssh/authorized_keys`_)
+ 1. Если файл с директорией не существует - создать
+ 2. Можно использовать `ssh-copy-id`
+
+Добавить конфигурацию в **./ssh/config**
+``` python
+# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
+# Port Forward <локальный порт - целевой хост - целевой порт>
+
+Host MyServer
+ HostName 192.168.1.110
+ User emb
+ IdentityFile ~/.ssh/id_ed25519
+ IdentitiesOnly yes
+ Port 22
+ LocalForward 5432 10.0.0.5:5432
+```
+
+
+Порты для проброса:
+ 1. RDP - **3389**
+ 2. VNC - **5900**
+ 3. SSH - **22**
+ 4. Telnet - **23**
+ 5. HTTP/HTTPS - **80 / 443**
+
+Используемые команды:
+Генерация ssh ключа:
+```bash
+ssh-keygen -t ed25519
+```
+Проброс портов в localhost:
+```bash
+ssh -L 5901:10.10.10.5:5900 user@192.168.10.1
+```
+Копирование файлов на удаленный сервер
+```bash
+scp file.txt root@192.168.1.1:/user/home/workspace
+```
+
+---
+
+## Network
+Настройка, управления сетевыми интерфейсами
+```bash
+# просмотр текеущего состояния интерфейсов
+ip -br a
+
+# включение / выключение интерфейсов
+ip link set eth0 down
+ip link set eth0 up
+```
+ Cписок все IP адресов сетевых интерфейсов:
+``` bash
+ip a
+```
+
+```bash
+ifconfig
+ifconfig eth0 down
+```
+Проверка маршрута следования трафика.
+``` bash
+traceroute
+```
+Cписок все IP адресов сетевых интерфейсов:
+``` bash
+ip a
+```
+Вывод лизов логов dhcp сервера
+```bash
+dhcp-leases-list
+```
+
+
diff --git a/Linux/Embedded Linux/Linux - GPIO.md b/Linux/Embedded Linux/Linux - GPIO.md
new file mode 100644
index 0000000..1095cae
--- /dev/null
+++ b/Linux/Embedded Linux/Linux - GPIO.md
@@ -0,0 +1,373 @@
+#linux #GPIO #i2c #spi #hardware #userspase #libgpiod
+
+Контроль и управление периферией в Linux
+https://habr.com/ru/articles/520488/
+---
+Устройства в Linux представлены в виде файлов и живут в системной директории: `/dev`
+Например :
+- Устройства i2c
+`/dev/i2c-0`
+`/dev/i2c-1`
+- Последовательные порты (Виртуальная консоль)
+`/dev/ttyUSB0`
+- SPI устройства
+`/dev/spidev*`
+
+
+## GPIO Driver
+Полезная информация:
+https://devdotnet.org/post/rabota-s-gpio-v-linux-chast-6-biblioteka-libgpiod/
+
+Способы управления:
+1. Userspace driver -прямое управление
+2. Libgpiod - управление через библиотеку (API для Python и C/C++)
+3. Python library
+#### User Space
+Прямой доступ к регистрам, минуя медленные системные вызовы.
+Посредством открытия `/dev/mem` и мапирование базового адреса GPIO.
+==Подводные камни:==
+ 1. Обход GPIO Subsystem
+ 2. Нет контроля конкуренции (может управлять несколько процессов)
+ 3. Можно сломать драйвер
+ 4. Нет безопасности
+
+##### GPIO Output from userspace
+```cpp title:userspace_gpio_control.cpp
+
+#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);
+}
+```
+
+
+---
+
+#### Libgpiod - library control
+Library General Purpose Input/Output device - Библиотека и набор утилит в Linux для управления пинами GPIO (ввод/вывод общего назначения) через символьные устройства (`/dev/gpiochip*`) или контроллеры GPIO
+ Состав библиотеки:
+ - **gpiodetect**
+ - **gpioinfo**
+ - **gpioset**
+ - **gpioget**
+
+Установка:
+``` bash
+sudo apt-get update
+sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod
+```
+Проверка корректности установки:
+``` bash
+pkg-config --cflags --libs libgpiod
+```
+Компиляция:
+``` bash
+g++ -o gpio_control gpio_control.cpp -lgpiod
+```
+
+##### Example GPIO Output
+``` cpp title:libgpiod_control.cpp
+#include
+#include
+#include
+#include
+#include
+
+#define GPIO_CHIP "gpiochip0"
+#define GPIO_PIN 17
+
+
+int main(int argc, char *argv[]) {
+ struct gpiod_chip *chip;
+ struct gpiod_line *line;
+ int ret;
+ // Open the GPIO chip
+ chip = gpiod_chip_open_by_name(GPIO_CHIP);
+ if (!chip) {
+ perror("gpiod_chip_open_by_name");
+ return EXIT_FAILURE;
+ }
+
+ // Get the GPIO line
+ line = gpiod_chip_get_line(chip, GPIO_PIN);
+ if (!line) {
+ perror("gpiod_chip_get_line");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ // Request the line as output
+ ret = gpiod_line_request_output(line, "gpio-control", 0);
+ if (ret < 0) {
+ perror("gpiod_line_request_output");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ for(int i = 0; i < 50; i++){
+ // Set GPIO to HIGH
+ ret = gpiod_line_set_value(line, 1);
+ if (ret < 0) {
+ perror("gpiod_line_set_value");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ printf("GPIO 17 set to HIGH\n");
+ sleep(2);
+
+ // Set GPIO to LOW
+ ret = gpiod_line_set_value(line, 0);
+ if (ret < 0) {
+ perror("gpiod_line_set_value");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ printf("GPIO 17 set to LOW\n");
+ sleep(2);
+ }
+
+ // Release resources
+ gpiod_chip_close(chip);
+ return EXIT_SUCCESS;
+}
+```
+
+Запуск программы (находясь в папке)
+``` bash
+ ./gpio_control
+```
+
+##### Example GPIO Input
+```c
+
+#include
+#include
+#include
+
+int main() {
+ const char* chipname = "gpiochip0";
+ unsigned int line_num = 27;
+
+ gpiod_chip* chip = gpiod_chip_open_by_name(chipname);
+ if (!chip) {
+ perror("chip open");
+ return 1;
+ }
+
+ gpiod_line* line = gpiod_chip_get_line(chip, line_num);
+ if (!line) {
+ perror("get line");
+ return 1;
+ }
+
+ // Запрос линии как input с событием
+ if(gpiod_line_request_falling_edge_events(line,"button") < 0) {
+ perror("request events");
+ return 1;
+ }
+ std::cout << "Waiting for button press..." << std::endl;
+
+ while (true) {
+ int ret = gpiod_line_event_wait(line, NULL);
+ if (ret < 0) {
+ perror("event wait");
+ break;
+ }
+ if (ret == 1) {
+ struct gpiod_line_event event;
+ gpiod_line_event_read(line, &event);
+ std::cout << "Button pressed!" << std::endl;
+ }
+ }
+
+ gpiod_line_release(line);
+ gpiod_chip_close(chip);
+ return 0;
+}
+```
+
+Запуск компиляции
+```bash
+g++ -std=c++11 gpio_button.cpp -lgpiod -o gpio_button
+```
+
+##### Example GPIO Led Button Contol
+Пример управления светодиодом по кнопке.
+```c++
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define GPIO_CHIP "gpiochip0"
+#define LED_PIN 17
+#define BUTTON_PIN 27
+
+// Function Prototype
+int system_init();
+int button_control();
+// int led_controller();
+
+// General Function
+int main() {
+ button_control();
+}
+
+
+int button_control (){
+ // value`s to led control
+ int led;
+ bool led_state = false;
+
+ gpiod_chip* chip = gpiod_chip_open_by_name(GPIO_CHIP);
+ if (!chip) {
+ perror("chip open");
+ return 1;
+ }
+
+ gpiod_line* button_line = gpiod_chip_get_line(chip, BUTTON_PIN);
+ if (!button_line) {
+ perror("get line");
+ return 1;
+ }
+
+ gpiod_line* led_line = gpiod_chip_get_line(chip, LED_PIN);
+ if (!led_line) {
+ perror("get led line");
+ return 1;
+ }
+
+ // Request the line as output
+ led = gpiod_line_request_output(led_line, "gpio-control", 0);
+ if (led < 0) {
+ perror("gpiod_line_request_output");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ // Запрос линии как input с событием
+ if (gpiod_line_request_falling_edge_events(button_line, "button") < 0) {
+ perror("request events");
+ return 1;
+ }
+
+ std::cout << "Waiting for button press..." << std::endl;
+
+ while (true) {
+ int ret = gpiod_line_event_wait(button_line, NULL);
+ if (ret < 0) {
+ perror("event wait");
+ break;
+ }
+
+ if (ret == 1) {
+ struct gpiod_line_event event;
+ gpiod_line_event_read(button_line, &event);
+ std::cout << "Button pressed!" << std::endl;
+ led_state = !led_state;
+
+ if(led_state){
+ // Set GPIO LED to HIGH
+ led = gpiod_line_set_value(led_line, 1);
+ if (led < 0) {
+ perror("gpiod_line_set_value");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+ printf("GPIO 17 set to HIGH\n");
+ }
+ else{
+ // Set GPIO to LOW
+ led = gpiod_line_set_value(led_line, 0);
+ if (led < 0) {
+ perror("gpiod_line_set_value");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+ printf("GPIO 17 set to LOW\n");
+ }
+ }
+ }
+
+
+ gpiod_line_release(button_line);
+ gpiod_chip_close(chip);
+ return 0;
+
+}
+```
+
+Запуск компиляции
+```bash
+g++ -std=c++11 gpio_button.cpp -lgpiod -o gpio_button
+```
diff --git a/Linux/Embedded Linux/Linux SBC - Boot Process Lerning.md b/Linux/Embedded Linux/Linux SBC - Boot Process Lerning.md
new file mode 100644
index 0000000..63cfcdb
--- /dev/null
+++ b/Linux/Embedded Linux/Linux SBC - Boot Process Lerning.md
@@ -0,0 +1,52 @@
+#DeviceTree #Boot #Linux
+## Hardware starting. Процесс запуска и инициализации
+Далее описан процесс запуска и инициализации оборудования следующих уровней:
+Firmware layer
+Hardware descriptional layer
+kernal initialization stage
+
+1. Power On
+2. Starting GPU on SoC
+3. ROM внутри Video Core начинает выполнение.
+4. GPU читает SD карту (загружаются)
+ Файлы расположены в `/boot или /firmware/boot`
+ 1. ==bootcode.bin== - FirstStage Bootloader.
+ Он инициализирует SDRAM и загружает прошивку start.elf
+ 2. ==start.elf== - Second Stage Bootloader
+ Инициализирует систему и загружает ядро линукс, управляет памятью
+ 3. ==config.txt== - файл конфигурации
+ Основной конфигурационный файл системы, считываемый GPU используемый для настройки оборудования
+ 4. ==cmdline.txt==
+ файл конфигурации, передаваемый ядру линукс при загрузке
+ 5. ==device tree== - подгружается дерево устройств. (файлы *dtb)
+ Передается в kernel. Хранятся в каталоге boot / firmware / overlays
+5. Только после этого GPU включает ARM CPU
+6. ARM начинает выполнение linux kernal
+
+## Device tree - Описание аппаратной конфигурации.
+[Device Tree wiki](https://www.altlinux.org/Device_Tree)
+Device Tree — это **описание аппаратной конфигурации конкретной платы**.
+Применяется GPU до запуска ядра.
+Device Tree Overlays - фрагмент device tree, или слой абстракции который:
+ добавляет новое устройство
+ включает отключенный контроллер
+ меняет параметры существующего узла
+
+Пример изменения конфигурации DT без перекомпиляции ядра
+Открыть config.txt и добавить `dtoverlay=i2c-rtc,ds3231`
+
+Что происходит:
+1. GPU загрузит основной DTB
+2. GPU применит overlay
+3. GPU передаст модифицированный DT ядру
+4. Ядро увидит новое устройство
+5. Драйвер RTC автоматически загрузится
+
+Если удалить узел устройства (например SPI) из Device Tree то ядро просто не создаст SPI контроллер.
+
+[[Linux - Commands]]
+
+
+
+
+
diff --git a/Linux/Embedded Linux/Linux SBC - Hardware.md b/Linux/Embedded Linux/Linux SBC - Hardware.md
new file mode 100644
index 0000000..979a109
--- /dev/null
+++ b/Linux/Embedded Linux/Linux SBC - Hardware.md
@@ -0,0 +1,306 @@
+#linux #GPIO #i2c #spi #hardware #userspase #libgpiod
+
+Контроль и управление периферией в Linux
+https://habr.com/ru/articles/520488/
+---
+Устройства в Linux представлены в виде файлов и живут в системной директории: `/dev`
+Например :
+- Устройства i2c
+`/dev/i2c-0`
+`/dev/i2c-1`
+- Последовательные порты (Виртуальная консоль)
+`/dev/ttyUSB0`
+- SPI устройства
+`/dev/spidev*`
+
+
+## GPIO Driver
+Полезная информация:
+https://devdotnet.org/post/rabota-s-gpio-v-linux-chast-6-biblioteka-libgpiod/
+
+Способы управления:
+1. Userspace driver -прямое управление
+2. Libgpiod - управление через библиотеку (API для Python и C/C++)
+3. Python library
+#### User Space
+Прямой доступ к регистрам, минуя медленные системные вызовы.
+Посредством открытия `/dev/mem` и мапирование базового адреса GPIO.
+==Подводные камни:==
+ 1. Обход GPIO Subsystem
+ 2. Нет контроля конкуренции (может управлять несколько процессов)
+ 3. Можно сломать драйвер
+ 4. Нет безопасности
+
+##### GPIO Output from userspace
+```cpp title:userspace_gpio_control.cpp
+
+#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);
+}
+```
+
+
+---
+
+#### Libgpiod - library control
+Library General Purpose Input/Output device - Библиотека и набор утилит в Linux для управления пинами GPIO (ввод/вывод общего назначения) через символьные устройства (`/dev/gpiochip*`) или контроллеры GPIO
+ Состав библиотеки:
+ - **gpiodetect**
+ - **gpioinfo**
+ - **gpioset**
+ - **gpioget**
+
+Установка:
+``` bash
+sudo apt-get update
+sudo apt-get install -y libgpiod-dev libgpiod-doc gpiod
+```
+Проверка корректности установки:
+``` bash
+pkg-config --cflags --libs libgpiod
+```
+Компиляция:
+``` bash
+g++ -o gpio_control gpio_control.cpp -lgpiod
+```
+
+##### Example GPIO Output
+``` cpp title:libgpiod_control.cpp
+#include
+#include
+#include
+#include
+#include
+
+#define GPIO_CHIP "gpiochip0"
+#define GPIO_PIN 17
+
+
+int main(int argc, char *argv[]) {
+ struct gpiod_chip *chip;
+ struct gpiod_line *line;
+ int ret;
+ // Open the GPIO chip
+ chip = gpiod_chip_open_by_name(GPIO_CHIP);
+ if (!chip) {
+ perror("gpiod_chip_open_by_name");
+ return EXIT_FAILURE;
+ }
+
+ // Get the GPIO line
+ line = gpiod_chip_get_line(chip, GPIO_PIN);
+ if (!line) {
+ perror("gpiod_chip_get_line");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ // Request the line as output
+ ret = gpiod_line_request_output(line, "gpio-control", 0);
+ if (ret < 0) {
+ perror("gpiod_line_request_output");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ for(int i = 0; i < 50; i++){
+ // Set GPIO to HIGH
+ ret = gpiod_line_set_value(line, 1);
+ if (ret < 0) {
+ perror("gpiod_line_set_value");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ printf("GPIO 17 set to HIGH\n");
+ sleep(2);
+
+ // Set GPIO to LOW
+ ret = gpiod_line_set_value(line, 0);
+ if (ret < 0) {
+ perror("gpiod_line_set_value");
+ gpiod_chip_close(chip);
+ return EXIT_FAILURE;
+ }
+
+ printf("GPIO 17 set to LOW\n");
+ sleep(2);
+ }
+
+ // Release resources
+ gpiod_chip_close(chip);
+ return EXIT_SUCCESS;
+}
+```
+
+Запуск программы (находясь в папке)
+``` bash
+ ./gpio_control
+```
+
+##### Example GPIO Input
+```c
+
+#include
+#include
+#include
+
+int main() {
+ const char* chipname = "gpiochip0";
+ unsigned int line_num = 27;
+
+ gpiod_chip* chip = gpiod_chip_open_by_name(chipname);
+ if (!chip) {
+ perror("chip open");
+ return 1;
+ }
+
+ gpiod_line* line = gpiod_chip_get_line(chip, line_num);
+ if (!line) {
+ perror("get line");
+ return 1;
+ }
+
+ // Запрос линии как input с событием
+ if(gpiod_line_request_falling_edge_events(line,"button") < 0) {
+ perror("request events");
+ return 1;
+ }
+ std::cout << "Waiting for button press..." << std::endl;
+
+ while (true) {
+ int ret = gpiod_line_event_wait(line, NULL);
+ if (ret < 0) {
+ perror("event wait");
+ break;
+ }
+ if (ret == 1) {
+ struct gpiod_line_event event;
+ gpiod_line_event_read(line, &event);
+ std::cout << "Button pressed!" << std::endl;
+ }
+ }
+
+ gpiod_line_release(line);
+ gpiod_chip_close(chip);
+ return 0;
+}
+```
+
+Запуск компиляции
+```bash
+g++ -std=c++11 gpio_button.cpp -lgpiod -o gpio_button
+```
+
+---
+
+## I2C Bus. Integrates
+Представление:
+- `/sys/bus/i2c/devices/` - управление конфигурацией устройств через драйверы ядра
+- `/dev/i2c-0` - прямой доступ к шине через userspace
+По умолчанию шина отключена.
+Включить можно следующими способами:
+1 - Через raspi - config
+``` bash
+sudo raspi-config
+```
+
+2 - корректировкой `/boot/firmware/config.txt`
+раскомментировать параметр `dtparam=i2c_arm=on`
+Затем в устройство должно появиться в `/dev` как `i2c-1`
+
+Набор утилит для работы с шиной i2c: `i2c-tools`
+Установка:
+```bash
+sudo apt-get install i2c-tools
+```
+Состав библиотеки:
+- **i2cdetect**
+- **i2cdump**
+- **i2cget**
+- **i2cset**
+
+
+## SPI
+
+Команды для работы:
+```bash
+
+```
+
+
+## Commands
+Система:
+`vcgencmd get_config int` - параметры, которые передает GPU
+`cat /etc/os-release` - просмотр версии системы
+
+
+
+
diff --git a/Linux/Files/GPIO_diagram.jpg b/Linux/Files/GPIO_diagram.jpg
new file mode 100644
index 0000000..3766b58
Binary files /dev/null and b/Linux/Files/GPIO_diagram.jpg differ
diff --git a/Linux/Files/raspberry_pi_circuit_note_fig2.webp b/Linux/Files/raspberry_pi_circuit_note_fig2.webp
new file mode 100644
index 0000000..4b465cc
Binary files /dev/null and b/Linux/Files/raspberry_pi_circuit_note_fig2.webp differ
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/Network/HomeAssistant.md b/Network/HomeAssistant.md
new file mode 100644
index 0000000..22e4777
--- /dev/null
+++ b/Network/HomeAssistant.md
@@ -0,0 +1,14 @@
+==Информация о системе:==
+
+ Static hostname: EmbServer
+ Icon name: computer-desktop
+ Chassis: desktop 🖥️
+ Machine ID: af77fa27e61b4f1c8c49ea5ab5556a6d
+ Boot ID: d223b35397fd48ccb90bb353c37a7096
+Operating System: Debian GNU/Linux 12 (bookworm)
+ Kernel: Linux 6.1.0-28-amd64
+ Architecture: x86-64
+ Hardware Vendor: Acer
+ Hardware Model: Aspire R3700
+Firmware Version: P01-A2
+
diff --git a/Network/Settings.md b/Network/Settings.md
new file mode 100644
index 0000000..734f933
--- /dev/null
+++ b/Network/Settings.md
@@ -0,0 +1,24 @@
+
+## Настройки hosts
+
+[VPN IP Addresses (IP адреса ChatGPT, Copilot, Meta, Facebook, Instagram, YouTube, Medium, X ex. Twitter, Discord)](https://gist.github.com/iamwildtuna/7772b7c84a11bf6e1385f23096a73a15)
+
+[keenetic antifilter routing](https://github.com/shlima/keneetic-antifilter)
+
+### Git на keenetic
+1. Подключить USB накопитель (отформатированный в ext4(3) или NTFS - нежелательно использовать)
+2. Установить пакет Entware (git) через
+3. Перейти на диск накопителя
+ ``` bash
+ cd /opt/root
+ ```
+4. Создать директорию с репозиторием
+ ```shell
+ mkdir myrepo.git
+ ```
+5. Инициализировать репозиторий
+ ```bash
+ git init --bare
+ ```
+
+### Git Зеркалирование