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 Зеркалирование