Перейти к содержанию

Драйвер CP210x - управление GPIO

Добрый день.

Не редко в работе нужен USB-UART преобразователь с парой-тройкой gpio. Ранее использовал FTDI, но решил попробовать CP2102N. Пока выбирал - ориентировался на выложенные в сети примеры работы с gpio (гуглятся по cp210x_gpio_example2_linux.c или cp210x_gpio_example.c), там управление gpio делается через ioctl прямо в /dev/ttyUSB0 устройство. Только вот когда собрал плату, обнаружил, что в текущей версии драйвера отсутствует ioctl. Но зато есть какие-то свои функции (cp210x_gpio_*) для работы с gpio. Только я не могу понять - как к ним обратиться из пространства пользователя?

Может где-нибудь есть примеры управления gpio через этот драйвер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Добрый день.

Не редко в работе нужен USB-UART преобразователь с парой-тройкой gpio. Ранее использовал FTDI, но решил попробовать CP2102N. Пока выбирал - ориентировался на выложенные в сети примеры работы с gpio (гуглятся по cp210x_gpio_example2_linux.c или cp210x_gpio_example.c), там управление gpio делается через ioctl прямо в /dev/ttyUSB0 устройство. Только вот когда собрал плату, обнаружил, что в текущей версии драйвера отсутствует ioctl. Но зато есть какие-то свои функции (cp210x_gpio_*) для работы с gpio. Только я не могу понять - как к ним обратиться из пространства пользователя?

Может где-нибудь есть примеры управления gpio через этот драйвер?

 

Если у вас не старое ядро, то есть стандартный способ управлять ножками:

https://github.com/torvalds/linux/blob/mast.../gpio/sysfs.txt

 

Если не катит -- поищу исходники драйвера для управления ножками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Система - десктопная Ubuntu, ядро 4.15, т.е. не старое. Управлять через sysfs не получается - при подключении CP2102N новый gpiochip в /sys/class/gpio/ не появляется. Через новомодный uapi - то же самое, новый gpiochip в /dev/ не появляется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Система - десктопная Ubuntu, ядро 4.15, т.е. не старое. Управлять через sysfs не получается - при подключении CP2102N новый gpiochip в /sys/class/gpio/ не появляется. Через новомодный uapi - то же самое, новый gpiochip в /dev/ не появляется.

 

Это только через драйвер получится. /sys/class/gpio/ только для своих ножек годится. А найти код драйвера CP2102N и посмотреть как там сделано не пробовали? Может что-то поменяли и надо как-то модифицировать запрос?

https://github.com/torvalds/linux/blob/mast...serial/cp210x.c

 

Вот ключевая структура, определяющая девайс:

struct cp210x_serial_private {

#ifdef CONFIG_GPIOLIB

struct gpio_chip gc;

u8 config;

u8 gpio_mode;

bool gpio_registered;

#endif

u8 partnum;

};

 

Проверьте если в ядре включено CONFIG_GPIOLIB. Тогда к GPIO доступ возможен. Если нет, то надо перекомпилировать драйвер, а возможно не только его.

Есть разные места, где это можно посмотреть. В разных системах бывают разные комбинации.

/proc/config.gz

/boot/config

/boot/config-$(uname -r)

 

В первом случае во такая команда распакует архив:

zcat /proc/config.gz > running.config

 

Возможно это имеет отношение:

https://lwn.net/Articles/574055/

 

http://www.armadeus.org/wiki/index.php?title=GPIOlib

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Система - десктопная Ubuntu, ядро 4.15, т.е. не старое. Управлять через sysfs не получается - при подключении CP2102N новый gpiochip в /sys/class/gpio/ не появляется. Через новомодный uapi - то же самое, новый gpiochip в /dev/ не появляется.

А вы совершенно уверены, что "при подключении" нормально отрабатывается?

Что говорят dmesg, lsmod и т.д.?

Вообще то странно ... всякий производитель и всякое устройство обязаны поддерживать стандартный интерфейс GPIO.

Если у вас не старое ядро, то есть стандартный способ управлять ножками:

https://github.com/torvalds/linux/blob/mast.../gpio/sysfs.txt

Подробно, внятно и просто, на пальцах - описано здесь: Linux: кнопки, светодиоды и GPIO.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня есть положительный опыт управления CP2103 с использованием libusb из userspace.

Вполне рабочая программа во вложении. Думаю, что обеспечить в ней поддержку для CP2102 особых проблем не составит.

cp2103_gpio_20180712.1232.tar.xz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
У меня есть положительный опыт управления CP2103 с использованием libusb из userspace.

Вполне рабочая программа во вложении. Думаю, что обеспечить в ней поддержку для CP2102 особых проблем не составит.

Я тоже использую CP2102/CP2103 (законченные устройства) в качестве конверторов USB-UART (например, в однопллатных SoC незаменимая вещь просматривать сообщения U-boot ... или вообще взаимодействовать с embedded устройства).

000-250x211.jpg

Но ТС называл устройство CP2102N (там этих CP2102N 3 или 4 штуки, с разными суффиксами, отличающиеся конструктивом и др.). А у этих там 3 (что ли) дискретных вывода GPIO, сверх канала USB-UART.

Конечно, это не GPIO вовсе, в смысле Linux GPIO, а ... чёрт знает что - самоделка на коленке ("дерибас" ;) ).

И поэтому всё, что с ним буде связано, будет обязательно проблематичным :laughing: ... : реакция по выходу на такое ... "якобы-GPIO" будет ещё более-менее понятной, через ioctl() или libusb, но реакция по входу с таких "якобы-GPIO" (когда нужно бы реагировать на прерывания) - это вообще мрак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В даташите CP2103 сказано:

7. GPIO Pins

The CP2103 supports (4) user-configurable GPIO pins for status and control information. More information

regarding the configuration and usage of these pins can be found in “AN144: CP210x Customization Guide” and

“AN223: Port Configuration and GPIO for CP210x” available on the Silicon Laboratories website.

Смотрите там.

Но там же и вот такое ... сильно настораживающее предупреждение:

10. USBXpress™ Direct Driver Support

The Silicon Laboratories USBXpress™ for CP210x Development Kit provides an alternate solution for interfacing

with CP2103 devices than using the Virtual COM port. No Serial Port protocol expertise is required. Instead, a

simple, high-level application program interface (API) is used to provide simpler CP2103 connectivity and

functionality.

The USBXpress for CP210x Development Kit includes Windows device drivers, Windows device driver installer

and uninstallers, and a host interface function library (host API) provided in the form of a Windows Dynamic Link

Library (DLL). The included device drivers and installation files support MS Windows 98SE/2000/XP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А найти код драйвера CP2102N и посмотреть как там сделано не пробовали?
Пробовал, находил. В первом посте написано.

 

Вот ключевая структура, определяющая девайс:
Да, я видел эту структуру. Там в коде драйвера ещё есть функции для работы с gpio (cp210x_gpio_*). Но не могу понять, как из пользовательского пространства получить доступ к этим функциям.

 

Проверьте если в ядре включено CONFIG_GPIOLIB.
Проверил, включен (CONFIG_GPIOLIB=y).

 

А вы совершенно уверены, что "при подключении" нормально отрабатывается? Что говорят dmesg, lsmod и т.д.?
Да вроде нормально всё

dmesg:

[43684.566224] usb 2-2: new full-speed USB device number 8 using uhci_hcd
[43684.763274] usb 2-2: New USB device found, idVendor=10c4, idProduct=ea60
[43684.763276] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[43684.763278] usb 2-2: Product: CP2102N USB to UART Bridge Controller
[43684.763279] usb 2-2: Manufacturer: Silicon Labs
[43684.763280] usb 2-2: SerialNumber: 3c5e2951f9f3e7119e656e160c17285f
[43684.766413] cp210x 2-2:1.0: cp210x converter detected
[43684.772296] usb 2-2: cp210x converter now attached to ttyUSB0

lsmod:

Module                  Size  Used by
cp210x                 28672  1
usbserial              45056  3 cp210x
cdc_acm                32768  0
btrfs                1122304  0
zstd_compress         163840  1 btrfs
xor                    24576  1 btrfs
raid6_pq              114688  1 btrfs
ufs                    77824  0
qnx4                   16384  0
hfsplus               106496  0
hfs                    57344  0
minix                  32768  0
ntfs                  102400  0
msdos                  20480  0
jfs                   188416  0
xfs                  1200128  0
libcrc32c              16384  1 xfs
cpuid                  16384  0
pci_stub               16384  1
vboxpci                24576  0
vboxnetadp             28672  0
vboxnetflt             28672  0
vboxdrv               471040  3 vboxnetadp,vboxnetflt,vboxpci
binfmt_misc            20480  1
snd_hda_codec_hdmi     49152  1
edac_mce_amd           28672  0
sch_fq_codel           20480  2
cuse                   16384  3
joydev                 24576  0
input_leds             16384  0
snd_hda_codec_realtek    94208  1
snd_hda_codec_generic    73728  1 snd_hda_codec_realtek
kvm_amd                86016  0
kvm                   593920  1 kvm_amd
snd_hda_intel          40960  6
snd_hda_codec         126976  4 snd_hda_intel,snd_hda_codec_hdmi,snd_hda_codec_generic,snd_hda_codec_realtek
snd_hda_core           81920  5 snd_hda_intel,snd_hda_codec,snd_hda_codec_hdmi,snd_hda_codec_generic,snd_hda_cod
ec_realtek
irqbypass              16384  1 kvm
snd_hwdep              20480  1 snd_hda_codec
snd_pcm                98304  5 snd_hda_intel,snd_hda_codec,snd_hda_core,snd_hda_codec_hdmi
eeepc_wmi              16384  0
asus_wmi               28672  1 eeepc_wmi
crct10dif_pclmul       16384  0
sparse_keymap          16384  1 asus_wmi
crc32_pclmul           16384  0
snd_seq_midi           16384  0
video                  45056  1 asus_wmi
wmi_bmof               16384  0
snd_seq_midi_event     16384  1 snd_seq_midi
ghash_clmulni_intel    16384  0
pcbc                   16384  0
snd_rawmidi            32768  1 snd_seq_midi
snd_seq                65536  2 snd_seq_midi_event,snd_seq_midi
snd_seq_device         16384  3 snd_seq,snd_rawmidi,snd_seq_midi
snd_timer              32768  2 snd_seq,snd_pcm
aesni_intel           188416  0
aes_x86_64             20480  1 aesni_intel
crypto_simd            16384  1 aesni_intel
glue_helper            16384  1 aesni_intel
cryptd                 24576  3 crypto_simd,ghash_clmulni_intel,aesni_intel
k10temp                16384  0
snd                    81920  22 snd_hda_intel,snd_hwdep,snd_seq,snd_hda_codec,snd_timer,snd_rawmidi,snd_hda_code
c_hdmi,snd_hda_codec_generic,snd_seq_device,snd_hda_codec_realtek,snd_pcm
ccp                    73728  0
soundcore              16384  1 snd
nvidia_uvm            757760  0
shpchp                 36864  0
wmi                    24576  2 asus_wmi,wmi_bmof
mac_hid                16384  0
lm78                   20480  0
hwmon_vid              16384  1 lm78
nfsd                  339968  13
parport_pc             36864  0
auth_rpcgss            61440  1 nfsd
ppdev                  20480  0
nfs_acl                16384  1 nfsd
lockd                  90112  1 nfsd
lp                     20480  0
grace                  16384  2 nfsd,lockd
parport                49152  3 lp,parport_pc,ppdev
sunrpc                335872  18 auth_rpcgss,nfsd,nfs_acl,lockd
ip_tables              28672  0
x_tables               40960  1 ip_tables
autofs4                40960  2
hid_generic            16384  0
usbhid                 49152  0
hid                   118784  2 hid_generic,usbhid
nvidia_drm             40960  2
nvidia_modeset       1110016  8 nvidia_drm
nvidia              14340096  460 nvidia_modeset,nvidia_uvm
drm_kms_helper        172032  1 nvidia_drm
syscopyarea            16384  1 drm_kms_helper
sysfillrect            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
fb_sys_fops            16384  1 drm_kms_helper
drm                   401408  5 nvidia_drm,drm_kms_helper
i2c_piix4              24576  0
ipmi_devintf           20480  0
ipmi_msghandler        53248  2 nvidia,ipmi_devintf
r8169                  86016  0
ahci                   36864  4
mii                    16384  1 r8169
libahci                32768  1 ahci
gpio_amdpt             16384  0
gpio_generic           20480  1 gpio_amdpt

У меня есть положительный опыт управления CP2103 с использованием libusb из userspace.

Вполне рабочая программа во вложении. Думаю, что обеспечить в ней поддержку для CP2102 особых проблем не составит.

Спасибо, посмотрю, если не получится работать через стандартный драйвер.

 

 

Вообще, как я понял, стандарный драйвер должен предоставлять доступ к этим GPIO через интерфейс gpio uapi. Про него обзор тут есть. Но lsgpio/gpiodetect/gpioinfo видят только 2 устройства, относящиеся к материнской плате (gpiochip0 [AMDI0030:00] (256 lines) и gpiochip1 [AMDIF030:00] (8 lines)).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже поддержка gpio в драйвере cp210x.c просто не доделана, т.к. недавно в рассылке ядра появился этот патч: https://patchwork.kernel.org/patch/10536995/

Поэтому остановился на использовании этого кода: https://github.com/nekromant/pl2303gpio

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти