220426
This commit is contained in:
+113
@@ -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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Настройка зеркалирования репозиториев
|
||||||
@@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#command #linux #system #files #filesystem
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
<center>Описание команд взаимодействия с файловой системой </center>
|
||||||
|
## Filesystem control
|
||||||
|
Перемещение по директориям
|
||||||
|
``` bash
|
||||||
|
cd ..
|
||||||
|
cd /
|
||||||
|
cd ~
|
||||||
|
```
|
||||||
|
Вывод рабочей директории
|
||||||
|
```bash
|
||||||
|
pwd
|
||||||
|
```
|
||||||
|
Вывод списка файлов директории
|
||||||
|
``` bash
|
||||||
|
ls -la
|
||||||
|
ls -la /home/user/diterctory
|
||||||
|
```
|
||||||
|
Создать файл
|
||||||
|
``` bash
|
||||||
|
# использованием touch
|
||||||
|
touch <file_name.cpp>
|
||||||
|
|
||||||
|
# использование редактора nano
|
||||||
|
nano <file_name.cpp>
|
||||||
|
```
|
||||||
|
Создание директорий
|
||||||
|
``` bash
|
||||||
|
mkdir dir_name
|
||||||
|
```
|
||||||
|
Копирование файлов и директорий
|
||||||
|
```bash
|
||||||
|
cp
|
||||||
|
```
|
||||||
|
Удаление файлов или директорий
|
||||||
|
``` bash
|
||||||
|
# удаление без подтверждения
|
||||||
|
rm -f <file or directory>
|
||||||
|
|
||||||
|
# рекурсивное удаление
|
||||||
|
rm -r <file or directory>
|
||||||
|
```
|
||||||
|
Перемещение файлов
|
||||||
|
``` bash
|
||||||
|
# перемещение файла в директорию
|
||||||
|
mv file.cpp directory/
|
||||||
|
|
||||||
|
# перемещение директорий
|
||||||
|
mv dir dir2/
|
||||||
|
```
|
||||||
|
Вывод содержимого файла
|
||||||
|
```bash
|
||||||
|
cat file_name
|
||||||
|
```
|
||||||
|
Поиск "патерна" в выводе
|
||||||
|
``` bash
|
||||||
|
cat file | grep error
|
||||||
|
```
|
||||||
|
Печать с выводом (отслеживанием) последних строк в файле
|
||||||
|
```bash
|
||||||
|
tail -f /dir/file | grep error
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
@@ -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 <bus_num>
|
||||||
|
```
|
||||||
|
#### UART
|
||||||
|
Вывод объектов устройств
|
||||||
|
``` bash
|
||||||
|
cat /dev/tty*
|
||||||
|
```
|
||||||
|
Поиск текущих устройств в логе ядра
|
||||||
|
```bash
|
||||||
|
dmesg | grep tty
|
||||||
|
```
|
||||||
|
Утилиты для работы с портом (or minicom)
|
||||||
|
```bash
|
||||||
|
picocom -b 115200 /dev/ttyUSB0
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
#command #linux #system #daemons #kernel
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
<center>Описание команд взаимодействия с файловой системой </center>
|
||||||
|
## System Control
|
||||||
|
Изменение прав файла или директории
|
||||||
|
``` bash
|
||||||
|
chmod
|
||||||
|
```
|
||||||
|
Вывод системных логов ядра
|
||||||
|
```bash
|
||||||
|
dmesg
|
||||||
|
```
|
||||||
|
Вывод списка запущенных процессов
|
||||||
|
``` bash
|
||||||
|
ps -ef
|
||||||
|
```
|
||||||
|
Убить процесс
|
||||||
|
``` bash
|
||||||
|
kill -9 <PID>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Systemd** - система инициализации и управления сервисами.
|
||||||
|
``` bash
|
||||||
|
systemctl status <service>
|
||||||
|
```
|
||||||
|
Управление сервисами
|
||||||
|
```bash
|
||||||
|
systemctl start/stop/restart <service>
|
||||||
|
```
|
||||||
|
Удаление файлов или директорий
|
||||||
|
``` bash
|
||||||
|
# удаление без подтверждения
|
||||||
|
rm -f <file or directory>
|
||||||
|
|
||||||
|
# рекурсивное удаление
|
||||||
|
rm -r <file or directory>
|
||||||
|
```
|
||||||
|
Перемещение файлов
|
||||||
|
``` bash
|
||||||
|
# перемещение файла в директорию
|
||||||
|
mv file.cpp directory/
|
||||||
|
|
||||||
|
# перемещение директорий
|
||||||
|
mv dir dir2/
|
||||||
|
```
|
||||||
|
Вывод содержимого файла
|
||||||
|
```bash
|
||||||
|
cat file_name
|
||||||
|
```
|
||||||
|
Поиск "патерна" в выводе
|
||||||
|
``` bash
|
||||||
|
cat file | grep error
|
||||||
|
```
|
||||||
|
Печать с выводом (отслеживанием) последних строк в файле
|
||||||
|
```bash
|
||||||
|
tail -f /dir/file | grep error
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
@@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -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 <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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 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 <gpiod.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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 <gpiod.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
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 <gpiod.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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
|
||||||
|
```
|
||||||
@@ -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]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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 <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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 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 <gpiod.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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 <gpiod.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
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` - просмотр версии системы
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 367 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 79 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 187 KiB |
@@ -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
|
||||||
|
|
||||||
@@ -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 Зеркалирование
|
||||||
Reference in New Issue
Block a user