Die FTDI-USB-UARTs haben eine Seriennummer, mithilfe derer sie eindeutig identifizierbar sind und so kann UDEV individuell benamste /dev-Einträge anlegen: http://hintshop.ludvig.co.nz/show/persi ... l-devices/
Den CH34x-Mitbewerbern auf die Details geschaut fand ich Dergleichen nicht... :-(
Der FT232 (zumindest das Original) ist manipulierbar (IDs ändern usw)... zum CH34x fand ich auch dazu bislang Nix... :-/
Welche anderen USB<->UART-Wandler haben auch Seriennummern und/oder andere durch Umflashen manipulierbare Eigenschaften, die eine Individualisierung unterstützen?
----------8<-----{20170425-0916-GMT}----->8----------
Ok... das lag auch viel zu lange herum... *hust!* ...fette Staubschicht drauf... *keuch!*
Jetzt hab ich mal meinem bevorzugten Propeller-Platinchen einen passenden Eintrag gezimmert:
Code: Alles auswählen
(yeti@kumari:1)~$ cat /etc/udev/rules.d/99-local-usb-serial.rules
##
## 99-local-usb-serial.rules
##
##++
## see http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/
##
## examples mentioned there:
##
#SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="arduino"
#SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="buspirate"
#SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="ttyUSB.ARM"
##--
##++
## Gadget Gangster Propeller Platform USB SD (Hong-Kong Clone)
##
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A800BSBW", SYMLINK+="GG-PP-SD-USB-HK-C"
##--
Code: Alles auswählen
(yeti@kumari:1)~$ sudo service udev reload
Code: Alles auswählen
(yeti@kumari:1)~$ ls -l /dev/GG-PP*
lrwxrwxrwx 1 root root 7 Apr 25 08:42 /dev/GG-PP-SD-USB-HK-C -> ttyUSB0
(yeti@kumari:1)~$ ls -l /dev/ttyUSB0
crw-rw-rw- 1 root dialout 188, 0 Apr 25 08:42 /dev/ttyUSB0
Testing... 1 2 Test!
Code: Alles auswählen
(yeti@kumari:1)~/wrk/propeller/spinsim/mandelbrot$ /opt/p1load/bin/p1load -?
p1load - a simple loader for the propeller - v0.1-21-g03cc4cd, Mar 30 2016
usage: p1load
[ -b baud ] baud rate (default is 115200)
[ -D var=val ] set variable value
[ -e ] write a bootable image to EEPROM
[ -p port ] serial port (default is to auto-detect the port)
[ -P ] list available serial ports
[ -r ] run the program after loading (default)
[ -t ] enter terminal mode after running the program
[ -T ] enter PST-compatible terminal mode
[ -v ] verbose output
[ -? ] display a usage message and exit
file file to load
(yeti@kumari:1)~/wrk/propeller/spinsim/mandelbrot$ /opt/p1load/bin/p1load -P
/dev/ttyUSB0
Code: Alles auswählen
(yeti@kumari:1)~/wrk/propeller/spinsim/mandelbrot$ /opt/spin2cpp/bin/fastspin -L /opt/parallax.spin.src/spin mandelbrot-20140623-fds-102x35.spin
Propeller Spin/PASM Compiler 'FastSpin' (c) 2011-2016 Total Spectrum Software Inc.
Version 3.6.2 Compiled on: Apr 24 2017
mandelbrot-20140623-fds-102x35.spin
|-FullDuplexSerial.spin
Done.
Program size is 1732 bytes
(yeti@kumari:1)~/wrk/propeller/spinsim/mandelbrot$ /opt/p1load/bin/p1load -p /dev/GG-PP-SD-USB-HK-C -t -b 115200 mandelbrot-20140623-fds-102x35.binary
Found propeller version 1 on /dev/GG-PP-SD-USB-HK-C
Code: Alles auswählen
Loading 'mandelbrot-20140623-fds-102x35.binary' (1732 bytes)
Loading hub memory ... OK
[ Entering terminal mode. Type ESC or Control-C to exit. ]
!!!!!!!!!!!!!!!!!"""""""""""""##############################$$$$$$$%&&%%%$$$$$$#######"""""""""""""""
!!!!!!!!!!!!!!!""""""""""##############################$$$$$$$$$%%%&',)'&&&%$$$$$$$########""""""""""
!!!!!!!!!!!!!"""""""""#############################$$$$$$$$$$$%%%%&&')+5*,:)&%$$$$$$$$########"""""""
!!!!!!!!!!!!"""""""############################$$$$$$$$$$$$$%%%%%&''()-03+)('&%%%$$$$$$$$########""""
!!!!!!!!!!!"""""############################$$$$$$$$$$$$$%%%%%&&'39:.:9::2-,:(&%%%%%$$$$$$$#########"
!!!!!!!!!!""""###########################$$$$$$$$$$$$$%%%&&&&&''()74:::::::4+(''&&%%%%%%$$$$#########
!!!!!!!!!"""##########################$$$$$$$$$$$%%%%'''()(''(())*,1::::::::+*)(('&&&&&&(&%$$$#######
!!!!!!!!"""########################$$$$$$$$%%%%%%%&&')-:4/:++0::5:::::::::::::56::*))))*.*'&%$$######
!!!!!!!""#######################$$$$$%%%%%%%%%%&&&&'()*::::::::::::::::::::::::::::0::::5-7&%%$$#####
!!!!!!""####################$$$%%%%%%%%%%%%%&&&&&'():,-:::::::::::::::::::::::::::::::::/('&%%%$$####
!!!!!!"##############$$$$$$%&)('&&&&&&&&&&&&''''((*2:::::::::::::::::::::::::::::::::::::*((&%%$$$###
!!!!!"########$$$$$$$$$%%%%&&-0*))((()2,)((''((()+:::::::::::::::::::::::::::::::::::::::::5,&%$$$$##
!!!!!#####$$$$$$$$$$%%%%%%&&'')*,1::.52::/36+***+:::::::::::::::::::::::::::::::::::::::::+('&%$$$$##
!!!!"##$$$$$$$$$$$%%%%%%%&'''(*+-4::::::::::::0-.::::::::::::::::::::::::::::::::::::::::::5'%%$$$$$#
!!!!#$$$$$$$$$$%%%%%&&&'(.*))+-8::::::::::::::::5::::::::::::::::::::::::::::::::::::::::::'&%%$$$$$#
!!!!$$%%%%%%&&&&&&&''''))+4:::5::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)'&%%%$$$$$#
!!!!)+-,-..0:13:5:2316:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::7-*('&&%%%$$$$$#
!!!!$$%%%%%%&&&&&&&''''))+4:::5::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)'&%%%$$$$$#
!!!!#$$$$$$$$$$%%%%&&&&'(.*))+-5::::::::::::::::5:::::::::::::::::::::::::::::::::::::::::3'&%%$$$$$#
!!!!"##$$$$$$$$$$$%%%%%%%&'''(*+-3::::::::::::0..:::::::::::::::::::::::::::::::::::::::::::'%%$$$$$#
!!!!!####$$$$$$$$$$$%%%%%%&&'')*,1::/32::/35,***+:::::::::::::::::::::::::::::::::::::::::+('&%$$$$##
!!!!!"########$$$$$$$$$%%%%&&//*))((()2,)(('(((()+:::::::::::::::::::::::::::::::::::::::::5-&%$$$$##
!!!!!!"##############$$$$$$%&))'&&&&&&&&&&&&''''((*/:::::::::::::::::::::::::::::::::::::*((&%%$$$###
!!!!!!""####################$$$%%%%%%%%%%%%%&&&&&'():,.:::::::::::::::::::::::::::::::::-('&%%%$$####
!!!!!!!""#######################$$$$$%%%%%%%%%%&&&&'()*::::::::::::::::::::::::::::1::::5-.&%%$$#####
!!!!!!!!"""########################$$$$$$$$%%%%%%%&&')-:5/:++0::6:::::::::::::5:::*))))*.*'&%$$######
!!!!!!!!!"""##########################$$$$$$$$$$$%%%%'''()(('(())*,1:::::::4+*)(('&&&&&&)&%$$$#######
!!!!!!!!!!""""###########################$$$$$$$$$$$$$%%%&&&&&''():4:::::::3+(''&&%%%%%%$$$$#########
!!!!!!!!!!!"""""############################$$$$$$$$$$$$$%%%%%&&'27:.::::2-,8(&%%%%%$$$$$$$#########"
!!!!!!!!!!!!"""""""############################$$$$$$$$$$$$$%%%%%&''().03+)('&%%%$$$$$$$$########""""
!!!!!!!!!!!!!"""""""""#############################$$$$$$$$$$$%%%%&&'(*6+-:)&%%$$$$$$$########"""""""
!!!!!!!!!!!!!!!""""""""""##############################$$$$$$$$$%%%&'-*'&&&%$$$$$$$########""""""""""
!!!!!!!!!!!!!!!!!"""""""""""""##############################$$$$$$$%&&%%%$$$$$$#######"""""""""""""""
!!!!!!!!!!!!!!!!!!"""""""""""""""""##############################################""""""""""""""""""""
Code: Alles auswählen
(yeti@kumari:1)~/wrk/propeller/spinsim/mandelbrot$ _
Edit@20181020-1954: Das gibt es tatsächlich! Seit wann, ist mir nicht klar, aber "propeller-load" aus dem PropGCC-Umfeld kann durch senden einer magischen 3-Byte-Sequenz verlassen werden. "p1load" habe ich das zumindest in einer lokalen Kopie beigebracht (das harrt noch der Abnickung durch DBetz) und Eric hat es seinem Clone von "PropLoader" beigebogen.
----------8<-----{20170425-1059-GMT}----->8----------
Jetzt hat auch der C3 ein Symlink-Namensschildchen bekommen...
Code: Alles auswählen
(yeti@kumari:1)~$ fgrep -B3 -A1 A8004HWW /etc/udev/rules.d/99-local-usb-serial.rules
##++
## Propeller C3
##
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A8004HWW", SYMLINK+="PROPELLER-C3"
##--
(yeti@kumari:1)~$ ls -l /dev/{PR*,ttyUSB1}
lrwxrwxrwx 1 root root 7 Apr 25 11:00 /dev/PROPELLER-C3 -> ttyUSB1
crw-rw-rw- 1 root dialout 188, 1 Apr 25 11:00 /dev/ttyUSB1
----------8<-----{20170425-1130-GMT}----->8----------
Wer sieht, was als Nächstes anliegt?
Richtig!
Jedermann-schreib und -lesbar sollten die Teile dann vielleicht doch besser nicht sein. Meine Unixen bespaße ich zwar ganz alleine, aber trotzdem hätte ich es gern ordentlich...
...aber das muß noch'n bissl warten, denn jetzt verlangt erstmal das Echtleben nach Interaktion mit mir... :-(
----------8<-----{20170425-1715-GMT}----->8----------
Zwischenspiel:
...die 2102-Kerlchen haben also auch Seriennummern... mal schauen, wo in den Sedimenten sich meine 2102-USB-Pröppel verstecken...[url]https://www.silabs.com/documents/public/data-sheets/CP2102-9.pdf[/url], Seite 4 hat geschrieben:The on-chip programmable ROM may be used to customize the USB Vendor ID, Product ID, Product Description String, Power Descriptor, Device Release Number, and Device Serial Number as desired for OEM applications.
The programmable ROM is programmed on-board via the USB, allowing the programming step to be easily integrated into the product manufacturing and testing process.
Hmmmm... "on-chip programmable ROM" klingt aber halbwegs böse... vielleicht meinen sie das ja nicht ganz so ernst und es ist änderbar?
CP2102-USB-Seriell-Pröppel fand ich auf die Schnelle nur eines der theoretisch 4 vorhandenen Individuen und damit ist schlecht vergleichen.
Zwei NodeMCU-Amicas zeigen leider die selbe "iSerial":
Code: Alles auswählen
Bus 001 Device 126: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x10c4 Cygnal Integrated Products, Inc.
idProduct 0xea60 CP210x UART Bridge / myAVR mySmartUSB light
bcdDevice 1.00
iManufacturer 1 Silicon Labs
iProduct 2 CP2102 USB to UART Bridge Controller
iSerial 3 0001
bNumConfigurations 1
Bedingter Optimismus wird durch folgende Fundstelle getriggert:
...aber jetzt erstmal Kalorien-Input![url]https://www.silabs.com/documents/public/data-sheets/CP2102-9.pdf[/url], Seite 17 hat geschrieben:8. Internal Programmable ROM
The CP2102 includes an internal electrically erasable programmable read-only memory (EEPROM), and the CP2109 includes an internal one-time programmable (OTP) erasable programmable read-only memory (EPROM). Either may be used to customize the USB Vendor ID (VID), Product ID (PID), Product Description String, Power Descriptor, Device Release Number and Device Serial Number as desired for OEM applications. If the EEPROM/EPROM is not programmed with OEM data, the default configuration data shown in Table 13 is used. The EEPROM has a typical endurance of 100,000 write cycles with a data retention of 100 years. The EPROM can only be written one time and cannot be erased.
----------8<-----{20170425-1811-GMT}----->8----------
Ok... da gibt es mindestens "CP210x Programmer" und "cp210x-cfg", aber darüber muß ich erst mehr wissen, bevor ich das auf meine CP2102er loslasse...
----------8<-----{20170425-2009-GMT}----->8----------
...uuund was ist mit CH34x?
[StackExchange/Arduino] Setting serial number on CH340 USB-Serial device
Mit CH34x, det wird wohl nix. :-(
----------8<-----{20170427-0752-GMT}----->8----------
Mit "MODE:=" statt "MODE=" klappt nun auch das Wegfiltern des Jedermann-Zugriffs.
Code: Alles auswählen
(yeti@kumari:12)~$ fgrep -B2 NANO-3.0-3 /etc/udev/rules.d/99-local-usb-serial.rules
SUBSYSTEM=="tty", \
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="AH01GHFS", \
OWNER="yeti", GROUP="yeti", MODE:="0660", SYMLINK+="ARDUINO-NANO-3.0-3"
(yeti@kumari:12)~$ ls -l /dev/{ARDUINO,ttyUSB}*
lrwxrwxrwx 1 root root 7 Apr 27 07:43 /dev/ARDUINO-NANO-3.0-3 -> ttyUSB0
crw-rw---- 1 yeti yeti 188, 0 Apr 27 07:43 /dev/ttyUSB0
Zuweisung mit "=" kann von späteren Regeln noch geändert werden, Zuweisung mit ":=" ist endgültig.
----------8<-----{20170427-0844-GMT}----->8----------
Noch keinen Projekten fest zugewiesene FT232R-Module will ich erstmal unter ihrer Seriennummer registrieren.
Code: Alles auswählen
(yeti@kumari:12)~$ fgrep -B1 -A1 A9M9DV3R /etc/udev/rules.d/99-local-usb-serial.rules
SUBSYSTEM=="tty", \
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A9M9DV3R" \
OWNER="yeti", GROUP="yeti", MODE:="0660", SYMLINK+="FT232R-$attr{serial}"
(yeti@kumari:12)~$ ls -l /dev/{FT,ttyUSB}*
lrwxrwxrwx 1 root root 7 Apr 27 08:31 /dev/FT232R-A9M9DV3R -> ttyUSB0
crw-rw---- 1 yeti yeti 188, 0 Apr 27 08:31 /dev/ttyUSB0
Dank "FT232R-$attr{serial}" muß die Seriennummer nicht mehrfach in der Regel auftauchen, was Fehler durch schlampertes Duplizieren und Modifizieren vorhandener Regeln deutlich minimiert. Ich kenn mich doch: Nachm Kopieren einer Regel und dem Ändern des "ATTRS{serial}" Vergleiches würd ich manches Mal das Ändern der Seriennummer beim Basteln des Symlinknamens vergessen anzupassen... o:-)
----------8<-----{20170427-1305-GMT}----->8----------
Ich hab mich dann man gaaanz muuutig an https://github.com/DiUS/cp210x-cfg herangewagt. Von den beiden mir bekannten Kandidaten war es der mit dem jüngeren Änderungsdatum in den Quellen (letzte Änderung vor ein paar Monaten) und so unterstelle ich mal, daß der Code noch gepflegt wird.
Da ich wohl kaum mehr als einen CP210x pro Sekunde programmieren werde, hielt ich die Unix-Timestamp (in Sekunden) für eine brauchbare Seriennummer:
Code: Alles auswählen
(ruth@kumari:7)~$ sudo /opt/cp210x-cfg/bin/cp210x-cfg -S $(date +@%s)
(ruth@kumari:7)~$ sudo lsusb -v |& grep -A14 '^Bus.*CP210x'
Bus 001 Device 006: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x10c4 Cygnal Integrated Products, Inc.
idProduct 0xea60 CP210x UART Bridge / myAVR mySmartUSB light
bcdDevice 1.00
iManufacturer 1 Silicon Labs
iProduct 2 CP2102 USB to UART Bridge Controller
iSerial 3 @1493297474
(ruth@kumari:7)~$ date -d @1493297474
Do 27. Apr 12:51:14 UTC 2017
Die CP210x-Module dürfen bleiben!
----------8<-----{20170430-1312-GMT}----->8----------
Diese süßen kleinen 6pinnigen CP2102-Module mit DTR, 3.3V und 5V plus vielleicht noch 'n kleinen 3.3V-Regler, Quarz und EEPROM machen vermutlich 'n ganz netten und günstigen PropStick-Selbstbau möglich.
----------8<-----{This line temporarily left blank...}----->8----------