Configurare nod bazat pe CM108: Diferență între versiuni

De la YO3ITI
Sari la navigare Sari la căutare
 
(Nu s-au afișat 41 de versiuni intermediare efectuate de același utilizator)
Linia 1: Linia 1:
__TOC__
__TOC__
=Introducere=
=Introducere=
* configurare echolink
 
* configurare udev
Pentru secțiunea principală legată de instalarea și configurarea svxlink, vezi [[Instalare Svxlink|acest link]].
 
Vezi și documentația completă despre HIDRAW la [https://docs.kernel.org/hid/hidraw.html HIDRAW - Raw Access to USB and Bluetooth Human Interface Devices].


=Verificări hardware=
=Verificări hardware=
==Verificare recunoaștere chip CM108==
==Verificare recunoaștere chip CM108==
Mai întâi trebuie conectate fizic terminalele D+ și D- ale mufei cu pinii test de pe Raspberry Pi. Pentru o imagine a pinilor-test, [https://datasheets.raspberrypi.com/rpizero2/raspberry-pi-zero-2-w-test-pads.pdf vezi acest link].


După conectarea fizică (prin lipire) a pinilor D+ și D- în paralel cu port-ul USB 2.0 al plăcii-mamă, trebuie verificat că sistemul recunoaște chip-ul CM108 ca subsistem audio.
După '''''conectarea fizică''''' (prin lipire) a pinilor D+ și D- în paralel cu port-ul USB 2.0 al plăcii-mamă, trebuie verificat că sistemul recunoaște chip-ul CM108 ca subsistem audio.


Se rulează comanda <code>lsusb</code>:
Se rulează comanda <code>lsusb</code>:
Linia 17: Linia 20:
În răspunsul sistemului trebuie să se regăsească <code>C-Media Electronics, Inc. USB Audio Device</code>:
În răspunsul sistemului trebuie să se regăsească <code>C-Media Electronics, Inc. USB Audio Device</code>:


<syntaxhighlight lang="console" highlight="2">
<syntaxhighlight lang="console" highlight="3">
tom@raspberrypi:~ $ lsusb
tom@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Linia 36: Linia 39:


==Verificare stack HID (Human Interface Device)==
==Verificare stack HID (Human Interface Device)==
O verificare mai detaliată se poate face cu comanda <code>lsusb -v -d VID:PID</code> unde VID și PID sunt vendorID respectiv productID:
<syntaxhighlight lang="console">
tom@rpi-yo3iti:/etc/udev/rules.d $ lsusb -v -d 0d8c:0012
Bus 001 Device 003: ID 0d8c:0012 C-Media Electronics, Inc. USB Audio Device
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType        1
  bcdUSB              1.10
  bDeviceClass            0
  bDeviceSubClass        0
  bDeviceProtocol        0
  bMaxPacketSize0        8
  idVendor          0x0d8c C-Media Electronics, Inc.
  idProduct          0x0012
  bcdDevice            1.00
  iManufacturer          1 C-Media Electronics Inc.
  iProduct                2 USB Audio Device
  iSerial                0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                9
    bDescriptorType        2
    wTotalLength      0x00e0
    bNumInterfaces          4
    bConfigurationValue    1
    iConfiguration          0
    bmAttributes        0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                9
      bDescriptorType        4
      bInterfaceNumber        0
      bAlternateSetting      0
      bNumEndpoints          0
      bInterfaceClass        1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0
      iInterface              0
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC              1.00
        wTotalLength      0x0047
        bInCollection          2
        baInterfaceNr(0)        1
        baInterfaceNr(1)        2
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID            1
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bNrChannels            2
        wChannelConfig    0x0003
          Left Front (L)
          Right Front (R)
        iChannelNames          0
        iTerminal              0
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID            2
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bNrChannels            1
        wChannelConfig    0x0001
          Left Front (L)
        iChannelNames          0
        iTerminal              0
      AudioControl Interface Descriptor:
        bLength                9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID            6
        wTerminalType      0x0301 Speaker
        bAssocTerminal          0
        bSourceID              9
        iTerminal              0
      AudioControl Interface Descriptor:
        bLength                9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID            7
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID              10
        iTerminal              0
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                9
        bSourceID              1
        bControlSize            1
        bmaControls(0)      0x01
          Mute Control
        bmaControls(1)      0x02
          Volume Control
        bmaControls(2)      0x02
          Volume Control
        iFeature                0
      AudioControl Interface Descriptor:
        bLength                9
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                10
        bSourceID              2
        bControlSize            1
        bmaControls(0)      0x43
          Mute Control
          Volume Control
          Automatic Gain Control
        bmaControls(1)      0x00
        iFeature                0
    Interface Descriptor:
      bLength                9
      bDescriptorType        4
      bInterfaceNumber        1
      bAlternateSetting      0
      bNumEndpoints          0
      bInterfaceClass        1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
    Interface Descriptor:
      bLength                9
      bDescriptorType        4
      bInterfaceNumber        1
      bAlternateSetting      1
      bNumEndpoints          1
      bInterfaceClass        1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink          1
        bDelay                  1 frames
        wFormatTag        0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                14
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType            1 (FORMAT_TYPE_I)
        bNrChannels            2
        bSubframeSize          2
        bBitResolution        16
        bSamFreqType            2 Discrete
        tSamFreq[ 0]        48000
        tSamFreq[ 1]        44100
      Endpoint Descriptor:
        bLength                9
        bDescriptorType        5
        bEndpointAddress    0x01  EP 1 OUT
        bmAttributes            9
          Transfer Type            Isochronous
          Synch Type              Adaptive
          Usage Type              Data
        wMaxPacketSize    0x00c8  1x 200 bytes
        bInterval              1
        bRefresh                0
        bSynchAddress          0
        AudioStreaming Endpoint Descriptor:
          bLength                7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes        0x01
            Sampling Frequency
          bLockDelayUnits        1 Milliseconds
          wLockDelay        0x0001
    Interface Descriptor:
      bLength                9
      bDescriptorType        4
      bInterfaceNumber        2
      bAlternateSetting      0
      bNumEndpoints          0
      bInterfaceClass        1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
    Interface Descriptor:
      bLength                9
      bDescriptorType        4
      bInterfaceNumber        2
      bAlternateSetting      1
      bNumEndpoints          1
      bInterfaceClass        1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink          7
        bDelay                  1 frames
        wFormatTag        0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                14
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType            1 (FORMAT_TYPE_I)
        bNrChannels            1
        bSubframeSize          2
        bBitResolution        16
        bSamFreqType            2 Discrete
        tSamFreq[ 0]        48000
        tSamFreq[ 1]        44100
      Endpoint Descriptor:
        bLength                9
        bDescriptorType        5
        bEndpointAddress    0x82  EP 2 IN
        bmAttributes          13
          Transfer Type            Isochronous
          Synch Type              Synchronous
          Usage Type              Data
        wMaxPacketSize    0x0064  1x 100 bytes
        bInterval              1
        bRefresh                0
        bSynchAddress          0
        AudioStreaming Endpoint Descriptor:
          bLength                7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes        0x01
            Sampling Frequency
          bLockDelayUnits        0 Undefined
          wLockDelay        0x0000
    Interface Descriptor:
      bLength                9
      bDescriptorType        4
      bInterfaceNumber        3
      bAlternateSetting      0
      bNumEndpoints          1
      bInterfaceClass        3 Human Interface Device
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
        HID Device Descriptor:
          bLength                9
          bDescriptorType        33
          bcdHID              1.00
          bCountryCode            0 Not supported
          bNumDescriptors        1
          bDescriptorType        34 Report
          wDescriptorLength      60
        Report Descriptors:
          ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                7
        bDescriptorType        5
        bEndpointAddress    0x87  EP 7 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type              None
          Usage Type              Data
        wMaxPacketSize    0x0004  1x 4 bytes
        bInterval              2
</syntaxhighlight>


=Setarea regulilor în <code>udev</code>=
=Setarea regulilor în <code>udev</code>=
<code>udev</code> este un subsistem Linux pentru gestionarea evenimentelor-dispozitiv. Pentru utilizarea nodurilor bazate pe CM108 prin intermediul HIDRAW, este necesarea crearea unor reguli de gestionare a evenimentelor legate de acest dispozitiv.


Secvența <code>ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012"</code> trebuie să corespundă cu informația dată de <code>lsusb</code>:
Un articol foarte bine scris despre <code>udev</code> poate fi accesat la '''[https://opensource.com/article/18/11/udev An introduction to Udev: The Linux subsystem for managing device events]'''. Link-ul este dat și în secțiunea [[#Link-uri externe|Link-uri externe]]
Actualizarea udev se face cu comanda:
 
<syntaxhighlight lang="console">
tom@raspberrypi:~ $ sudo udevadm control --reload-rules && sudo udevadm trigger
</syntaxhighlight>


==Creare fișier reguli==
==Creare fișier reguli==


Se ver
Pentru nodurile realizate cu CM108 trebuie creat un fișier de reguli în udev pentru a încărca modului CM108 ca dispozitiv audio <code>hidraw</code>
 
<syntaxhighlight lang="sh" highlight="5,11">
Pentru SHARI PiHat trebuie creat un fișier de reguli în udev pentru a încărca modului C801 ca dispozitiv audio <code>hidraw</code>
<syntaxhighlight lang="sh">
# block pulseaudio using the soundcard for SVXLINK
# block pulseaudio using the soundcard for SVXLINK
# astea sunt foarte importante
# astea sunt foarte importante
Linia 61: Linia 325:
# 0d8c:000c
# 0d8c:000c
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="000c", SYMLINK+="my_custom_dev_entry", MODE="0666"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="000c", SYMLINK+="my_custom_dev_entry", MODE="0666"
# 0d8c:0012 CM108B SHARI
# 0d8c:0012 CM108B
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", SYMLINK+="my_custom_dev_entry", MODE="0666"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", SYMLINK+="my_custom_dev_entry", MODE="0666"
</syntaxhighlight>
</syntaxhighlight>


==Setări <code>svxlink.conf</code>==
Secvența <code>ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012"</code> trebuie să corespundă cu informația dată de <code>lsusb</code>.
Eu folosesc doar liniile evidențiate.
 
În cazul meu, creez un fișier în <code>/etc/udev/rules.d</code>. L-am numit <code>55-cm108.rules</code>. Numărul de la începutul denumirii asigură prioritatea.
Acest fișier conține:
 
<syntaxhighlight lang="sh">
# block pulseaudio using the soundcard for SVXLINK
# astea sunt foarte importante
ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", ENV{PULSE_IGNORE}="1"
# creez un symlink /dev/hidrawX la /dev/yo3iti
# 0d8c:0012 CM108B
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", SYMLINK+="yo3iti", MODE="0666"
</syntaxhighlight>
 
Actualizarea udev se face cu comanda:
 
<syntaxhighlight lang="console">
tom@raspberrypi:~ $ sudo udevadm control --reload-rules && sudo udevadm trigger
</syntaxhighlight>
 
==Verificare fișier reguli==
 
Se verifică încărcarea corectă a regulilor prin <code>udevadm info /dev/yo3iti</code>. Vezi liniile cu informațiile <code>ID_VENDOR_FROM_DATABASE</code> și <code>DEVLINKS</code>:
 
<syntaxhighlight lang="console" highlight="16,18">
tom@rpi-yo3iti:/etc/udev/rules.d $ udevadm info /dev/yo3iti
P: /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3:1.3/0003:0D8C:0012.0001/hidraw/hidraw0
M: hidraw0
R: 0
U: hidraw
D: c 242:0
N: hidraw0
L: 0
S: yo3iti
E: DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3:1.3/0003:0D8C:0012.0001/hidraw/hidraw0
E: DEVNAME=/dev/hidraw0
E: MAJOR=242
E: MINOR=0
E: SUBSYSTEM=hidraw
E: USEC_INITIALIZED=5866251
E: ID_VENDOR_FROM_DATABASE=C-Media Electronics, Inc.
E: PULSE_IGNORE=1
E: DEVLINKS=/dev/yo3iti
</syntaxhighlight>
 
'''NOTĂ:''' comanda completă este <code>udevadm info -a -n /dev/yo3iti</code> care dă informații extrem de detaliate despre tot stack-ul.
 
=Setări <code>svxlink.conf</code>=
==Izolarea nodului doar în mod Echolink==
Nodul poate fi configurat doar pentru conectare la Echolink. Trebuie eliminată intrarea <code>ReflectorLogic</code> din secțiunea <code>[GLOBAL]</code> a fișierului de configurare:
Nodul poate fi configurat doar pentru conectare la Echolink. Trebuie eliminată intrarea <code>ReflectorLogic</code> din secțiunea <code>[GLOBAL]</code> a fișierului de configurare:
<syntaxhighlight lang="sh" highlight="3,4,9">
<syntaxhighlight lang="sh" highlight="3,4,9">
Linia 80: Linia 393:
</syntaxhighlight>
</syntaxhighlight>


==Configurarea Tx și Rx==
Apoi se modifică secțiunile Rx și Tx cu setările necesare pentru hidraw:
Apoi se modifică secțiunile Rx și Tx cu setările necesare pentru hidraw:


Linia 86: Linia 400:
...
...
SQL_DET=HIDRAW
SQL_DET=HIDRAW
HID_DEVICE=/dev/my_custom_dev_entry
HID_DEVICE=/dev/yo3iti
HID_SQL_PIN=VOL_DN
HID_SQL_PIN=VOL_DN
...
...
Linia 92: Linia 406:
...
...
PTT_TYPE=Hidraw
PTT_TYPE=Hidraw
HID_DEVICE=/dev/my_custom_dev_entry
HID_DEVICE=/dev/yo3iti
HID_PTT_PIN=GPIO3
HID_PTT_PIN=GPIO3
...
...
Linia 98: Linia 412:
Unde <code>my_custom_dev_entry</code> e setarea din <code>udev</code>.
Unde <code>my_custom_dev_entry</code> e setarea din <code>udev</code>.
Grijă la utilizarea majusculelor pentru <code>SQL_DET</code> și <code>PTT_TYPE</code>
Grijă la utilizarea majusculelor pentru <code>SQL_DET</code> și <code>PTT_TYPE</code>
<syntaxhighlight lang="console">
sudo udevadm control --reload-rules && sudo udevadm trigger
</syntaxhighlight>
=Corecție software pentru LED de squelch=
LED-ul galben care indică deschiderea și închiderea squelch-ului este conectat la GPIO4 al CM108. Pentru activarea acestui indicator sunt necesari câțiva pași adiționali:
* Compilarea și instalarea utilitarului cm108
* Modificarea <code>Logic.tcl</code> din <code>/opt/rolink/share/svxlink/events.d/Logic.tcl</code>
==Compilarea și instalarea utilitarului cm108==
ATENȚIE !!! Ultimele versiuni de nod cu CM108 (versiunea 2.0) nu mai folosesc acest GPIO pentru indicatorul de SQL, deci modificarea <code>Logic.tcl</code> și pașii de mai jos nu mai sunt valabile.
Sursa acestui utilitar se poate descărca de la [https://github.com/twilly/cm108 https://github.com/twilly/cm108].
La compilare cu <code>make all</code> trebuie modificat ușor fișierul <code>Makefile</code> care, în forma de pe github, dă erori de linker. Eu l-am modificat în:
<syntaxhighlight lang="tcl">
CC=gcc
CFLAGS=-Wall
LDFLAGS=-ludev
#cm108: cm108.o
OBJECTS=cm108.o
all: $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) -o cm108 $(LDFLAGS)
.PHONY: install
install: cm108
sudo cp cm108 /usr/local/bin
# cp 99-cm108-cmedia.rules /etc/udev/rules.d
.PHONY: clean
clean:
rm -f cm108 *.o
</syntaxhighlight>
Programul trebuie instalat în <code>/usr/local/bin</code> cu <code>make install</code>
Se poate testa prin
<syntaxhighlight lang="console">
tom@rpi-yo3iti:/ $ cm108 -p
    VID  PID  Product                          Sound                  ADEVICE        HID [ptt]       
    ---  ---  -------                          -----                  -------        ---------       
**  0d8c 0012  USB Audio Device                /dev/snd/controlC0                    /dev/hidraw0   
**  0d8c 0012  USB Audio Device                /dev/snd/pcmC0D0c      plughw:0,0      /dev/hidraw0   
**  0d8c 0012  USB Audio Device                /dev/snd/pcmC0D0p      plughw:0,0      /dev/hidraw0 
</syntaxhighlight>
LED-ul galben pentru squelch se poate testa cu comenzile:
Pentru aprindere:
<syntaxhighlight lang="console">
tom@rpi-yo3iti:/ $ cm108 -H /dev/hidraw0 -P 4 -L 1
</syntaxhighlight>
Pentru stingere:
<syntaxhighlight lang="console">
tom@rpi-yo3iti:/ $ cm108 -H /dev/hidraw0 -P 4 -L 0
</syntaxhighlight>
Dacă aceste comenzi funcționează cum trebuie, mai trebuie modificat <code>Logic.tcl</code> pentru a permite aprinderea și stingerea la apăsarea, respectiv eliberarea PTT-ului stației.
==Modificarea Logic.tcl==
Se editează <code>Logic.tcl</code> din <code>/opt/rolink/share/svxlink/events.d/Logic.tcl</code>:
<syntaxhighlight lang="console">
tom@rpi-yo3iti:~ $ sudo nano /opt/rolink/share/svxlink/events.d/Logic.tcl
</syntaxhighlight>
Prin adăugarea liniei care apelează executabilul <code>cm108</code>:
<syntaxhighlight lang="tcl" highlight="7">
#
# Executed each time the squelch is opened or closed
#  rx_id  - The ID of the RX that the squelch opened/closed on
#  is_open - Set to 1 if the squelch is open or 0 if it's closed
#
proc squelch_open {rx_id is_open} {
  exec cm108 -H /dev/hidraw0 -P 4 -L $is_open;
  variable sql_rx_id;
  #puts "The squelch is $is_open on RX $rx_id";
  set sql_rx_id $rx_id;
}
</syntaxhighlight>
Se dă restart la <code>svxlink</code> și apoi se testează funcționarea: LED-ul galben trebuie să se aprindă la apăsarea PTT-ului și să se stingă la eliberarea acestuia.
=Link-uri externe=
* [http://kb.amft-it.de/doku.php?id=kb-afu:shari-hs SOLUȚIA !!!] - Shari cu svxlink
* [https://opensource.com/article/18/11/udev An introduction to Udev]
* [https://www.reddit.com/r/archlinux/comments/ega9ix/udev_rule_for_hid_usb_device/ udev rule for hid usb device]
* [https://groups.io/g/SHARI/topic/svxlink_on_a_shari_node/100717081 SvxLink on a SHARI Node] → important !!
* [https://groups.io/g/svxlink/attachment/275/0/Hidraw_Serial%20Permissions%20Scripts.pdf Hidraw/Serial Permissions Scripts]
* [https://unix.stackexchange.com/questions/85379/dev-hidraw-read-permissions /dev/hidraw: read permissions]
* [https://www.google.com/search?client=safari&rls=en&q=raspberry+display+kernel+module+for+a+certain+audio+device&ie=UTF-8&oe=UTF-8 raspberry display kernel module for a certain audio device]
* [https://stackoverflow.com/questions/34403703/how-to-fix-linker-errors-for-libudev-on-ubuntu-15 -ludev] – probleme cu linkeditorul pentru <code>udev-dev</code>
* [https://stackoverflow.com/questions/13249610/how-to-use-ldflags-in-makefile LDFLAGS] – Cum se utilizează în <code>Makefile</code>

Versiunea curentă din 24 ianuarie 2026 18:14

Introducere

Pentru secțiunea principală legată de instalarea și configurarea svxlink, vezi acest link.

Vezi și documentația completă despre HIDRAW la HIDRAW - Raw Access to USB and Bluetooth Human Interface Devices.

Verificări hardware

Verificare recunoaștere chip CM108

Mai întâi trebuie conectate fizic terminalele D+ și D- ale mufei cu pinii test de pe Raspberry Pi. Pentru o imagine a pinilor-test, vezi acest link.

După conectarea fizică (prin lipire) a pinilor D+ și D- în paralel cu port-ul USB 2.0 al plăcii-mamă, trebuie verificat că sistemul recunoaște chip-ul CM108 ca subsistem audio.

Se rulează comanda lsusb:

tom@raspberrypi:~ $ lsusb

În răspunsul sistemului trebuie să se regăsească C-Media Electronics, Inc. USB Audio Device:

tom@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0d8c:0012 C-Media Electronics, Inc. USB Audio Device
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Ia aminte la VID și PID (vendor ID și Product ID 0d8c:0012. Aceste informații trebuie folosite la crearea regulilor din udev.

Verificarea se mai poate face și cu comanda cat:

tom@raspberrypi:~ $ cat /proc/asound/cards
 0 [Device         ]: USB-Audio - USB Audio Device
                      C-Media Electronics Inc. USB Audio Device at usb-0000:01:00.0-1.3, full speed

Verificare stack HID (Human Interface Device)

O verificare mai detaliată se poate face cu comanda lsusb -v -d VID:PID unde VID și PID sunt vendorID respectiv productID:

tom@rpi-yo3iti:/etc/udev/rules.d $ lsusb -v -d 0d8c:0012

Bus 001 Device 003: ID 0d8c:0012 C-Media Electronics, Inc. USB Audio Device
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x0d8c C-Media Electronics, Inc.
  idProduct          0x0012 
  bcdDevice            1.00
  iManufacturer           1 C-Media Electronics Inc.
  iProduct                2 USB Audio Device
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x00e0
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              0 
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength       0x0047
        bInCollection           2
        baInterfaceNr(0)        1
        baInterfaceNr(1)        2
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             1
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bNrChannels             2
        wChannelConfig     0x0003
          Left Front (L)
          Right Front (R)
        iChannelNames           0 
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             2
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bNrChannels             1
        wChannelConfig     0x0001
          Left Front (L)
        iChannelNames           0 
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             6
        wTerminalType      0x0301 Speaker
        bAssocTerminal          0
        bSourceID               9
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             7
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID              10
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 9
        bSourceID               1
        bControlSize            1
        bmaControls(0)       0x01
          Mute Control
        bmaControls(1)       0x02
          Volume Control
        bmaControls(2)       0x02
          Volume Control
        iFeature                0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                10
        bSourceID               2
        bControlSize            1
        bmaControls(0)       0x43
          Mute Control
          Volume Control
          Automatic Gain Control
        bmaControls(1)       0x00
        iFeature                0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           1
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                14
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             2
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            2 Discrete
        tSamFreq[ 0]        48000
        tSamFreq[ 1]        44100
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            9
          Transfer Type            Isochronous
          Synch Type               Adaptive
          Usage Type               Data
        wMaxPacketSize     0x00c8  1x 200 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         1 Milliseconds
          wLockDelay         0x0001
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           7
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                14
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             1
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            2 Discrete
        tSamFreq[ 0]        48000
        tSamFreq[ 1]        44100
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes           13
          Transfer Type            Isochronous
          Synch Type               Synchronous
          Usage Type               Data
        wMaxPacketSize     0x0064  1x 100 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      60
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x87  EP 7 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval               2

Setarea regulilor în udev

udev este un subsistem Linux pentru gestionarea evenimentelor-dispozitiv. Pentru utilizarea nodurilor bazate pe CM108 prin intermediul HIDRAW, este necesarea crearea unor reguli de gestionare a evenimentelor legate de acest dispozitiv.

Un articol foarte bine scris despre udev poate fi accesat la An introduction to Udev: The Linux subsystem for managing device events. Link-ul este dat și în secțiunea Link-uri externe

Creare fișier reguli

Pentru nodurile realizate cu CM108 trebuie creat un fișier de reguli în udev pentru a încărca modului CM108 ca dispozitiv audio hidraw

# block pulseaudio using the soundcard for SVXLINK
# astea sunt foarte importante
ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="013c", ENV{PULSE_IGNORE}="1"
ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="000c", ENV{PULSE_IGNORE}="1"
ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", ENV{PULSE_IGNORE}="1"
# create a symlink /dev/hidrawX to /dev/cm108gpio
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="013c", SYMLINK+="my_custom_dev_entry", MODE="0666"
# 0d8c:000c
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="000c", SYMLINK+="my_custom_dev_entry", MODE="0666"
# 0d8c:0012 CM108B
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", SYMLINK+="my_custom_dev_entry", MODE="0666"

Secvența ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012" trebuie să corespundă cu informația dată de lsusb. Eu folosesc doar liniile evidențiate.

În cazul meu, creez un fișier în /etc/udev/rules.d. L-am numit 55-cm108.rules. Numărul de la începutul denumirii asigură prioritatea. Acest fișier conține:

# block pulseaudio using the soundcard for SVXLINK
# astea sunt foarte importante
ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", ENV{PULSE_IGNORE}="1"
# creez un symlink /dev/hidrawX la /dev/yo3iti
# 0d8c:0012 CM108B
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", SYMLINK+="yo3iti", MODE="0666"

Actualizarea udev se face cu comanda:

tom@raspberrypi:~ $ sudo udevadm control --reload-rules && sudo udevadm trigger

Verificare fișier reguli

Se verifică încărcarea corectă a regulilor prin udevadm info /dev/yo3iti. Vezi liniile cu informațiile ID_VENDOR_FROM_DATABASE și DEVLINKS:

tom@rpi-yo3iti:/etc/udev/rules.d $ udevadm info /dev/yo3iti
P: /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3:1.3/0003:0D8C:0012.0001/hidraw/hidraw0
M: hidraw0
R: 0
U: hidraw
D: c 242:0
N: hidraw0
L: 0
S: yo3iti
E: DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3:1.3/0003:0D8C:0012.0001/hidraw/hidraw0
E: DEVNAME=/dev/hidraw0
E: MAJOR=242
E: MINOR=0
E: SUBSYSTEM=hidraw
E: USEC_INITIALIZED=5866251
E: ID_VENDOR_FROM_DATABASE=C-Media Electronics, Inc.
E: PULSE_IGNORE=1
E: DEVLINKS=/dev/yo3iti

NOTĂ: comanda completă este udevadm info -a -n /dev/yo3iti care dă informații extrem de detaliate despre tot stack-ul.

Setări svxlink.conf

Nodul poate fi configurat doar pentru conectare la Echolink. Trebuie eliminată intrarea ReflectorLogic din secțiunea [GLOBAL] a fișierului de configurare:

[GLOBAL]
...
LOGICS=SimplexLogic
#,ReflectorLogic
...
TIMESTAMP_FORMAT="%Y-%m-%d %H:%M:%S"
CARD_SAMPLE_RATE=48000
CARD_CHANNELS=1
#LINKS=ReflectorLink
LOCATION_INFO=LocationInfo

Configurarea Tx și Rx

Apoi se modifică secțiunile Rx și Tx cu setările necesare pentru hidraw:

[Rx1]
...
SQL_DET=HIDRAW
HID_DEVICE=/dev/yo3iti
HID_SQL_PIN=VOL_DN
...
[Tx1]
...
PTT_TYPE=Hidraw
HID_DEVICE=/dev/yo3iti
HID_PTT_PIN=GPIO3
...

Unde my_custom_dev_entry e setarea din udev. Grijă la utilizarea majusculelor pentru SQL_DET și PTT_TYPE

sudo udevadm control --reload-rules && sudo udevadm trigger

Corecție software pentru LED de squelch

LED-ul galben care indică deschiderea și închiderea squelch-ului este conectat la GPIO4 al CM108. Pentru activarea acestui indicator sunt necesari câțiva pași adiționali:

  • Compilarea și instalarea utilitarului cm108
  • Modificarea Logic.tcl din /opt/rolink/share/svxlink/events.d/Logic.tcl

Compilarea și instalarea utilitarului cm108

ATENȚIE !!! Ultimele versiuni de nod cu CM108 (versiunea 2.0) nu mai folosesc acest GPIO pentru indicatorul de SQL, deci modificarea Logic.tcl și pașii de mai jos nu mai sunt valabile.

Sursa acestui utilitar se poate descărca de la https://github.com/twilly/cm108. La compilare cu make all trebuie modificat ușor fișierul Makefile care, în forma de pe github, dă erori de linker. Eu l-am modificat în:

CC=gcc
CFLAGS=-Wall
LDFLAGS=-ludev

#cm108: cm108.o
OBJECTS=cm108.o
all: $(OBJECTS)
	$(CC) $(CFLAGS) $(OBJECTS) -o cm108 $(LDFLAGS)

.PHONY: install
install: cm108
	sudo cp cm108 /usr/local/bin
#	cp 99-cm108-cmedia.rules /etc/udev/rules.d

.PHONY: clean
clean:
	rm -f cm108 *.o

Programul trebuie instalat în /usr/local/bin cu make install Se poate testa prin

tom@rpi-yo3iti:/ $ cm108 -p
    VID  PID   Product                          Sound                  ADEVICE         HID [ptt]        
    ---  ---   -------                          -----                  -------         ---------        
**  0d8c 0012  USB Audio Device                 /dev/snd/controlC0                     /dev/hidraw0     
**  0d8c 0012  USB Audio Device                 /dev/snd/pcmC0D0c      plughw:0,0      /dev/hidraw0     
**  0d8c 0012  USB Audio Device                 /dev/snd/pcmC0D0p      plughw:0,0      /dev/hidraw0

LED-ul galben pentru squelch se poate testa cu comenzile:

Pentru aprindere:

tom@rpi-yo3iti:/ $ cm108 -H /dev/hidraw0 -P 4 -L 1

Pentru stingere:

tom@rpi-yo3iti:/ $ cm108 -H /dev/hidraw0 -P 4 -L 0

Dacă aceste comenzi funcționează cum trebuie, mai trebuie modificat Logic.tcl pentru a permite aprinderea și stingerea la apăsarea, respectiv eliberarea PTT-ului stației.

Modificarea Logic.tcl

Se editează Logic.tcl din /opt/rolink/share/svxlink/events.d/Logic.tcl:

tom@rpi-yo3iti:~ $ sudo nano /opt/rolink/share/svxlink/events.d/Logic.tcl

Prin adăugarea liniei care apelează executabilul cm108:

#
# Executed each time the squelch is opened or closed
#   rx_id   - The ID of the RX that the squelch opened/closed on
#   is_open - Set to 1 if the squelch is open or 0 if it's closed
#
proc squelch_open {rx_id is_open} {
  exec cm108 -H /dev/hidraw0 -P 4 -L $is_open;
  variable sql_rx_id;
  #puts "The squelch is $is_open on RX $rx_id";
  set sql_rx_id $rx_id;
}

Se dă restart la svxlink și apoi se testează funcționarea: LED-ul galben trebuie să se aprindă la apăsarea PTT-ului și să se stingă la eliberarea acestuia.

Link-uri externe

  • -ludev – probleme cu linkeditorul pentru udev-dev
  • LDFLAGS – Cum se utilizează în Makefile