ЗАО «ЗЭО»

Техническая поддержка пользователей => Тион270, Тион-Про270, Сириус270 => Тема начата: KDM от 25 Марта, 2013, 15:21:44

Название: Свободные GPIO-выводы
Отправлено: KDM от 25 Марта, 2013, 15:21:44
Тион270, Сириус270, Linux.

Есть вопрос по ряду GPIO, (не?)используемых на Сириус270.
1) Выводы EXT_CS0#, EXT_CS1#, EXT_CS2# (GPIO15, GPIO79, GPIO80);
2) Выводы EXT_IO0, EXT_IO1, EXT_IO2 (GPIO35, GPIO36, GPIO37);
3) Вывод RDY (GPIO18);
4) Выводы PWM0, PWM1, PWM2\PWR_EN, PWM3, (GPIO16, GPIO17, GPIO11, GPIO12);
5) Выводы PS2_SCL1, PS2_SCL2, PS2_SDA1, PS2_SDA2 (GPIO14, GPIO19, GPIO20, GPIO106);
6) Выводы InfraRed_Port STD_TXD, STD_RXD (GPIO47, GPIO46).

PS/2 Мышь, клавиатура не нужны. Инфракрасный порт тоже. ШИМ аналогично. Управление питанием не требуется (перемычки J38 - On, J39 - 12).

Исходя из этого вопрос.
Можно ли их использовать как свободные GPIO без правки ядра и без потери функциональности (т.е. в прикладной программе
-сконфигурировать альтернативные функции GPIO(GAFR) = ...
-сконфигурировать направление GPIO(GPDR) = ...
-и использовать как обычный GPIO на разъеме J6)?
Название: Re: Свободные GPIO-выводы
Отправлено: asv от 26 Марта, 2013, 10:06:25
> Можно ли их использовать как свободные GPIO без правки ядра

Можно, если соответствующие сигналы не используются драйверами.
Если используете ядро 2.6.22, может быть пригодиться drivers/misc/pxa-gpio.c
Название: Re: Свободные GPIO-выводы
Отправлено: KDM от 27 Марта, 2013, 15:19:07
Основной вопрос как раз и состоит в том, чтобы понять, какие из этих GPIO так или иначе используются в драйвере/ядре.

Понятно, что если собрать ядро без поддержки SD-карты, часть GPIO можно использовать как обычные IO.

Но каким образом можно отслеживать цепочки вхождений тех или иных интересующих GPIO в какие-либо драйвера, в том числе включенные в ядро?



P.S. >> Если используете ядро 2.6.22, может быть пригодиться drivers/misc/pxa-gpio.c
Можно и проще, прямо из Qt.
#include <sys/file.h>
#include <sys/mman.h>
#include <iostream>
#define UINT unsigned long int
#define GPIO(x)             *(volatile UINT *)(StartAdd + x)
#define GPIO_BASE           0x40E00000
#define MAP_SIZE            4096
#define MyGPLR3             0x00000100
...
int DeviceMem;
DeviceMem = open ("/dev/mem", O_RDWR|O_SYNC);
char *StartAdd;
StartAdd = (char *)mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED , DeviceMem, GPIO_BASE);
GPIO(MyGPDR1)|=  ((1<<0));
GPIO(MyGPSR1) =  ((1<<0));
UINT GPIO_GPLR3 = GPIO(MyGPLR3);
munmap(StartAdd, MAP_SIZE);
::close(DeviceMem);
Название: Re: Свободные GPIO-выводы
Отправлено: KDM от 27 Марта, 2013, 16:29:20
Интересующие GPIO, чтение из регистров контроллера
GPIO N  По схемеDirAltFunction
GPIO 0SDоткл.In0
GPIO 9-In0
GPIO 11PWM2/PWR_ENIn2SSPRXD2 - а по схеме должно быть OUT2
GPIO 12PWM3In0
GPIO 13-Out1SSPTXD2
GPIO 14PS2_SCL1Out2SSPSFRM2
GPIO 15EXT_CS0In0
GPIO 16PWM0Out2PWM0
GPIO 17PWM1In0
GPIO 18RDYIn1RDY
GPIO 19PS2_SDA1Out1SSPSCLK2
GPIO 20PS2_SCL2In0
GPIO 21-In0
GPIO 22-In0
GPIO 35EXT_IO0In0
GPIO 36EXT_IO2In0
GPIO 37EXT_IO1In0
GPIO 52-In0
GPIO 79EXT_CS1Out2nCS3
GPIO 80EXT_CS2In0
GPIO 47STD_TXDOut1STD_TXD
GPIO 46STD_RXDIn2STD_RXD

GPIO N : 31 29 27 25 23 21 19 17 15 13 11 09 07 05 03 01
GPIO N :  30 28 26 24 22 20 18 16 14 12 10 08 06 04 02 00
GPDR0 : 11 00 10 11 10 00 10 01 01 10 00 00 00 00 00 00

GPION_N: 15.14.13.12.11.10.09.08.07.06.05.04.03.02.01.00
GAFR0_L: 00 10 01 00 10 01 00 00 00 00 00 00 00 00 00 00    <15:0>
GAFR0_U: 10 10 01 01 11 01 10 10 10 00 00 00 01 01 00 10    <31:16>
Название: Re: Свободные GPIO-выводы
Отправлено: asv от 28 Марта, 2013, 11:08:24
> Можно и проще, прямо из Qt.

Это прежде всего через /dev/mem

> Но каким образом можно отслеживать цепочки вхождений тех или иных
> интересующих GPIO в какие-либо драйвера, в том числе включенные в ядро?

Для ядра 2.6.22 я такого способа не знаю, позже появилась _возможность_
использовать gpio_request().

Я бы смотрел в исходном коде pxa_gpio_mode и использование define'ов
содержащих в названии GPIO из include/asm-arm/arch-pxa/pxa-regs.h и
локальных.