STM32F103C8 und Bootloader

OP #4684157
Lesenswert?

Ich habe mal wieder ein Problem:

Controller: STM32F108C8

Den Testaufbau kann ich flashen mit einem ST-Link /V2 (original und 
China Clone)

Jetzt möchte ich den Chip mittels Bootloader flashen:

USB2RS232 Adapter, Chip = FTDI

- funktioniert mit Windows ST Demonstrator Loader
- funktioniert mit Linux stm32flash

USB2RS232 Adapter, Chip = CH340G

- funktioniert mit Windows ST Demostrator Loader

und (wurgs):

- mit Linux nicht !!!!

Im Netz finde ich ein paar wenige Aussagen, dass das am Linux-Kernel 
Treiber liegen soll !

Verwende ich den CH340 Adapter an einem LPC1114 und dem Programm 
lpc21isp, so lässt sich der LPC auch ueber den CH340 Adapter und 
Bootloader flashen.

Die Kombination CH340G und STM32 will jedoch einfach nicht.

Jetzt habe ich mir den Quellcode von stm32flash angesehen um vielleicht 
dahinter zu kommen, wo ich (ohne Linux-Kernel) eventuell ansetzen kann, 
aber ich komme leider nicht dahinter !

Hat das hier eventuell schon einmal jemand ans laufen gebracht ?

: - ) eine Aussage in der Art: dann verwende den FTDI Chip nutzt mir 
relativ wenig, weil ich für die "Entwicklung" eh den ST-Link verwende.

Ein STM32 Programm kann natürlich ueber den CH340 eine serielle 
Verbindung aus einem Programm heraus zu Linux aufbauen so dass ich 
Ausgaben die ein STM32 auf der seriellen Schnittstelle macht über diesen 
Adapter auf einem Linux Terminal sehe.

Wie gesagt, hat das schon jemand ans Laufen gebracht und evtl. den 
Originalcode des stm32flash gefixt (vllt. ist auch eine stty - 
Einstellung die Lösung ??? )
#4684222
Lesenswert?

Als erstes könntest Du mal die Systemaufrufe des stm32flash bei 
Verwendung des FTDIs und des CH340 mit strace vergleichen und schauen an 
welcher Stelle da die ersten Unterschiede entstehen.

Dann würde ich mir die Übertragung zwischen Adapter und µC mit dem Logic 
Analyzer anschauen und auch dort FTDI und CH340 vergleichen.

Dann weißt Du genauer wo das Problem herkommt und kannst Dir überlegen 
wie Du das angehst.
Gast #4684291
Lesenswert?

Ralph S. schrieb:
> wo ich (ohne Linux-Kernel) eventuell ansetzen kann,

Moin,

da es ein bekanntes Treiberproblem mit der Parität ist, kann es auch nur 
durch den Treiber gelöst werden.
Solange es in deinem Kernel nicht korrigiert ist:

http://www.wch.c*n/download/CH341SER_LINUX_ZIP.html

* bitte entfernen.

In das entpackte Verzeichnis wechseln, dann

# sudo make

und

#sudo make load

sollte das Problem lösen.
#4685942
Lesenswert?

Ralph S. schrieb:
> USB2RS232 Adapter, Chip = CH340G
>
> - funktioniert mit Windows ST Demostrator Loader
>
> und (wurgs):
>
> - mit Linux nicht !!!!
>
> Im Netz finde ich ein paar wenige Aussagen, dass das am Linux-Kernel
> Treiber liegen soll !
>
> Verwende ich den CH340 Adapter an einem LPC1114 und dem Programm
> lpc21isp, so lässt sich der LPC auch ueber den CH340 Adapter und
> Bootloader flashen.

Scheinbar benötigt der LPC keine Parity-Bits für das Protokoll, siehe 
unten.

> Die Kombination CH340G und STM32 will jedoch einfach nicht.
>
> Jetzt habe ich mir den Quellcode von stm32flash angesehen um vielleicht
> dahinter zu kommen, wo ich (ohne Linux-Kernel) eventuell ansetzen kann,
> aber ich komme leider nicht dahinter !

Es liegt tatsächlich am CH340 Treiber, da der keine Parity-Bits 
unterstützt.

> Hat das hier eventuell schon einmal jemand ans laufen gebracht ?

Ja, hatte selber vor ein paar Tagen das gleiche Problem. Im folgenden 
die Anleitung wie man den Open-Source Treiber für den CH340 unter *buntu 
14.04 patcht:
1
cd /tmp # oder "mkdir temp && cd temp" im Homeverzeichnis oder wo auch immer
2
apt-get source linux-source-3.13.0 # Hier ohne sudo, sonst muss man später die Berechtigungen anpassen! Die sources landen im aktuellen Verzeichnis!
3
sudo apt-get linux-headers-$(uname -r) # Diesmal als root, header landen in /usr/src/linux-headers... siehe unten
4
cd linux-source-3.13.0 
5
make oldconfig 
6
make prepare 
7
make scripts 
8
cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers . 
9
cp /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko.orig 
10
cd drivers/usb/serial 
11
cp ch341.c ch341.c.orig 
12
wget https://github.com/karlp/ch341-linux/raw/master/0001-usb-serial-ch341-Add-parity-support.patch 
13
patch -p4 < 0001-usb-serial-ch341-Add-parity-support.patch 
14
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules 
15
sudo cp ch341.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko 
16
sudo rmmod ch341 # alten Treiber entfernen
17
sudo modprobe ch341 # neuen Treiber laden

Fertig :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren