Forum: Mikrocontroller und Digitale Elektronik HOWTO: DX-ISP Programmieradapter unter Linux


von Tobias W. (hacker-tobi)


Lesenswert?

Hi,

nachdem ich selbst nichts im Netz dazu gefunden habe, veröffentliche ich 
mal ein kleines howto, wie man den beliebten DX-ISP Programmieradapter 
(USB) unter Linux ans Laufen bringt.

Was man benötigt:

-Den DX-ISP - Adapter selbst:

http://www.wiesolator.de/index.php?area=AVR&topic=AVR-Progger%20Diamex%20DX-ISP

-Linux Kernel ab 2.6.24, abzufragen mit uname -a

Linux Arbeitsrechner 2.6.34.7-0.3-desktop #7 SMP PREEMPT Sat Oct 23 
00:23:14 CEST 2010 x86_64 x86_64 x86_64 GNU/Linux

2.6.24 deswegen, weil ab  diesem imHo der ttyACM-Treiber enthalten ist.

-Den ttyACM-Treiber

Dieser ist bei Distributionskerneln in der Regel schon enthalten.
Bei selbstkompilierten Kernel muss man ihn ggf. hinzufügen.

Ob der ttyACM-Treiber installiert ist, sagt einem ein

tail -f /var/log/messages

wenn man den Adapter ansteckt:

Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.803403] usb 7-1: new full 
speed USB device using uhci_hcd and address 3
Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.981131] usb 7-1: New USB 
device found, idVendor=16c0, idProduct=2a9b
Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.981134] usb 7-1: New USB 
device strings: Mfr=1, Product=2, SerialNumber=0
Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.981137] usb 7-1: Product: 
DX-ISP
Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.981138] usb 7-1: 
Manufacturer: Stange Distribution
Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.984174] cdc_acm 7-1:1.0: 
ttyACM0: USB ACM device

Wichtig ist die letzte Zeile; erscheint sie, kann man den folgenden 
Abschnitt überspringen:

-Installation des ttyACM - Treibers-

tobias@Arbeitsrechner: su
tobias@Arbeitsrechner:~> cd /usr/src/linux
tobias@Arbeitsrechner:/usr/src/linux> make menuconfig

In dem Menu navigiert man zu /drivers/usb/ und wählt dann "usb modem 
(cdc acm) support aus, und zwar als Modul ("M").

dann die module mit

make modules
make modules_install

übersetzen und installieren.

Nun sollte sich der ttyACM-Treiber melden, sobald der Adapter erneut 
angesteckt wird:

Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.984174] cdc_acm 7-1:1.0: 
ttyACM0: USB ACM device

-Nutzung des Adapters-

Betrachten wir noch einmal die Zeile

Feb 26 12:44:50 Arbeitsrechner kernel: [ 1501.984174] cdc_acm 7-1:1.0: 
ttyACM0: USB ACM device

aus /var/log/messages.

Netterweise teilt einem der Treiber gleich mit, welchem virtuellen 
Com-Port er nutzt (hier ttyACM0). Über diesen Com-Port lässt sich der 
Adapter jetzt als Stk500v2 ansprechen.
Dazu muss avrdude so konfiguriert werden, dass es als seriellen Port den 
virtuellen com-Port /dev/ttyACMx nutzt.
Die Parameter hierfür sind:

-P <com-Port> also z.B. -P /dev/ttyACM0
-c <Programmer> also -c stk500v2

avrdude -p atmega168 -P /dev/ttyACM0 -c stk500v2 -B 1 -U 
flash:w:nano_os.hex

Damit ist der Adapter unter Linux einsatzbereit!

gruß

tobi

von Tom L. (tlin)


Lesenswert?

Hallo,

ich bin mir nicht sicher, wohin damit. Daher hänge ich das mal hier 
dran. Vielleicht hilft das ja mal jemandem.

Ich verwende den gleichen Programmer unter FreeBSD, dort ist das alles 
allerdings ein bischen anders. Irgendwelche Kernelmodule muss man unter 
FreeBSD nicht installieren, das geht alles out-of-the-box. Ich hab mir 
dieses kleine Script erstellt, das mir via sysctl den entsprechenden 
Port raussucht:
1
#!/bin/sh
2
3
modem=`sysctl -a | grep umodem | grep DX-ISP | sed 's/.%desc.*//'`
4
5
if test -n "$modem"; then
6
    U=`sysctl -a | grep $modem | grep pnpinfo | awk '{print $12}' | awk -F= '{print $2}'`
7
    if test -n "$U"; then
8
  echo "/dev/cua$U"
9
    else
10
  echo "MODEM-$modem-HAS-NO-CUA"
11
    fi
12
else
13
    echo "NO-MODEM-FOUND"
14
fi

Der Vollständigkeit halber, so sieht die Ausgabe des Kernels aus, wenn 
man das Teil anschliesst:
1
ugen4.3: <Stange Distribution> at usbus4
2
umodem2: <Stange Distribution DX-ISP, class 2/0, rev 2.00/1.01, addr 3> on usbus4
3
umodem2: data interface 1, has CM over data, has break

Mit sysctl kann man sich dann raussuchen, welcher Port der virtuelle 
Serial ist:
1
$ sysctl dev.umodem.2
2
dev.umodem.2.%desc: Stange Distribution DX-ISP, class 2/0, rev 2.00/1.01, addr 3
3
dev.umodem.2.%driver: umodem
4
dev.umodem.2.%location: bus=1 hubaddr=1 port=4 devaddr=3 interface=0
5
dev.umodem.2.%pnpinfo: vendor=0x16c0 product=0x2a9b devclass=0x02 devsubclass=0x00 sernum="" release=0x0101 mode=host intclass=0x02 intsubclass=0x02 intprotocol=0x01  ttyname=U2 ttyports=1
6
dev.umodem.2.%parent: uhub4

Interessant ist hier die vorletzte Zeile, der Port ist:

ttyname=U2

Das Device ist also:

/dev/cuaU2

Und das ist dann die Ausgabe des obigen Scriptes.

@Mods: falls das doch nicht richtig hier ist, bitte wenn möglich 
verschieben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.