OrangePi PC работаем с GPIO, UART и i2c

Для работы с GPIO в OrangePi не подойдут библиотеки и инструменты предназначенные для RaspberryPi, однако мне удалось найти библиотеку WiringOP основанную на библиотеке WiringPi.

Установка WiringOP

git clone https://github.com/zhaolei/WiringOP.git -b h3
cd WiringOP
chmod +x ./build
sudo ./build


после установки проверяем работоспособность
gpio readall
покажет все порты, назначения и состояния



Настройка назначения портов GPIO при старте системы.
При наличии файла script.bin
в разделе /boot находим файл script.bin (если нет такого файла, а есть папка dts или файл с разрешением dts то пропускаем этот раздел и переходим к следующему) и конвертируем его в читаемый формат командой
bin2fex script.bin script.fex
у меня были отключены UART1 и UART3, в данном выводе UART порты все работают, но Вы можете переназначить их в режим IN или OUT с помощью WiringOP не редактируя файл script.bin
чтобы включить UART1 надо найти секцию [uart1] и в ней параметр использования порта uart_used, 0 — не используется, 1 — используется.

[uart1]
uart_used = 1


так же надо посмотреть порты, которые занимает UART

uart_tx = port:PG06<2><1>
uart_rx = port:PG07<2><1>
uart_rts = port:PG08<2><1>
uart_cts = port:PG09<2><1>


и исключить их из секции [gpio_para], точно так же делается и с остальными портами (SPI, i2c).
После внесенных изменений конвертируем обратно
fex2bin script.fex script.bin
и перезагружаемся.

При наличии DTB
для конвертирования бинарного файла dtb необходимо установить компилятор файлов dtb

apt-get install device-tree-compiler

у меня на Armbian Ubuntu 16.04 в папке /boot файлы dtb находятся в папке dtb, на других системах этот файл может быть в корне /boot, с помощью следующей команды конвертируем наш файл dtb в dts

dtc -I dtb -O dts -o sun8i-h3-orangepi-pc.dts ./sun8i-h3-orangepi-pc.dtb

где:
sun8i-h3-orangepi-pc.dtb — исходный бинарный файл
sun8i-h3-orangepi-pc.dts — файл который мы будем редактировать.
открываем файл sun8i-h3-orangepi-pc.dts в любом редакторе и ищем слово serial, у меня 4 таких секции следующего содержания

serial@01c28000 {
compatible = "snps,dw-apb-uart";
reg = <0x1c28000 0x400>;
interrupts = <0x0 0x0 0x4>;
reg-shift = <0x2>;
reg-io-width = <0x4>;
clocks = <0x2 0x3e>;
resets = <0x2 0x31>;
dmas = <0x15 0x6 0x15 0x6>;
dma-names = "rx", "tx";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <0x19>;
linux,phandle = <0x4e>;
phandle = <0x4e>;
};


включение uart порта делается изменением параметра status = «okay»
после изменения сохраняем файл и конвертируем обратно

dtc -I dts -O dtb -o ./sun8i-h3-orangepi-pc.dtb ./sun8i-h3-orangepi-pc.dts

Использование GPIO с помощью WiringOP

для вывода справки по командам наберите
gpio -h
Если у Вас в файле script.bin назначены порты UART, SPI, i2c, то переназначить их можно не редактируя файл script.bin, достаточно задать их командой
gpio mode <номер порта> <значение>
где номер порта который соответствует номеру в строке wPi, для использования физического номера используйте команду
gpio -1 mode <номер порта> <значение>
например надо физический порт 8 определить на выход
gpio -1 mode 8 out
запишем в порт логическую единицу
gpio -1 write 8 1
Так же можно управлять двумя светодиодами на плате, зеленый
перезагружаем устройство и проверяем работу.

echo 1 > /sys/class/gpio_sw/standby_led/data
echo 0 > /sys/class/gpio_sw/standby_led/data

и красный

echo 1 > /sys/class/gpio_sw/normal_led/data
echo 0 > /sys/class/gpio_sw/normal_led/data

Соответственно включение и выключение.

Работа с i2c
У процессора Н3 имеется 3 порта i2c, однако на разъем GPIO выведены только 2, у меня по умолчанию был включен только порт 0, а порт 1 был отключен, его надо включить аналогично тому, как включали порты UART.
Для работы с i2c необходимо установить i2c-tools
apt-get install i2c-tools

данный пакет имеет программы
i2cdetect — проверка подключенных устройств — выводит адреса подключенных устройств
i2cdump — снятие дампа данных
i2cget — получение значения нужного регистра в подключенном устройстве. Опрашивается в формате i2cget
i2cset — запись значения в регистр подключенного устройства, команда в формате i2cset
где:
— i2c шина (0 или 1)
— адрес чипа
— адрес регистра
— значение регистра
подключаем устройства i2c к соответствующим портам OrangePi. Для того, чтобы выяснить по какому адресу у нас устройства i2c надо ввести команду

i2cdetect -y 0 для шины 0
i2cdetect -y 1 для шины 1

root@orangepipc:~# i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@orangepipc:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

у нас по адресу 20 и 27 определились микросхемы PCF8574, для управления выводами у данной микросхемы адрес регистра не указывается, для чтения данных используем команду

Управление PCF8574

i2cget -y 0 0x20
где флаг -y означает означает согласие на работу, если без этого флага использовать то чтобы получить данные надо ответить yes
запись значений происходит командой:
i2cset -y 0 0x20 0xff — подача на все порты pcf8574 высокий логический уровень
i2cset -y 0 0x20 0x00 — подача на все порты pcf8574 низкий логический уровень

вместо шеснадцатиричного значения возможно использовать десятичное
i2cset -y 0 0x20 255 и i2cset -y 0 0x20 0
соответственно
так же и двоичное
i2cset -y 0 0x20 $(( 2#11111111 ))
и
i2cset -y 0 0x20 $(( 2#00000000 ))
для включения первого и третьего вывода надо выполнить команду
i2cset -y 0 0x20 $(( 2#11111010 ))
для изменения состояния вывода можно использовать следующую команду
a=`i2cget -y 0 0x20` && i2cset -y 0 0x20 $(( $a ^ X ))
где X — имеет значения 1,2,4,8,16,32,64,128 для изменения состояния соответственно 1,2,3,4,5,6,7,8 вывода, сначала получаем значение регистра PCF85474 и присваиваем его переменной a, затем к этому значению выполняем операцию XOR.

Источник

, просмотров 4346

gpio, orange pi pc,


Поиск




Карта сайта
Обратная связь
RSS-канал



Рейтинг@Mail.ru