arm-none-eabi-gdb and Python 3.8 issue

In this post, I’m going to show, how to fix an issue with arm-none-eabi-gdb from ARM GNU Toolchain, and old Python 3.8 or Python 3.6 dependencies

Not a long time ago, I’ve updated my home computer with fresh Xubintu 24.04 LTS, so I need to reinstall/resetup my develop enviroment for STM32

If you had an experience with installation of ARM GNU Toolchain on Linux, I guess you also had a painfull experience with ancient and non-working installation instruction for Linux provided by ARM. In general, installtion procedure is quite simple: just unpack an archive, than add «bin» directory into PATH variable.

But! The main issue is a GDB binary with python-based TUI (terminal user interface). It is linked with the old Python 3.8 library, and legacy (plus removed in fresh distros) libncurses5 library.

On the previous Xubuntu 22.04, I’ve used a solution with a custom repository, but for the current Xubintu 24.04 Python 3.8 doesn’t exist, and libncurses5 package has been removed from repositories. How can we solve this problem?

After a litte search, I’ve found a suitable solution on StackOverflow. Just build your own GDB with actual Python for you system! It is quite simple!

I’ve checked this instruction, and did a small change in the tutorial: replaced final «make install» command on a deb-file generation, because simple «make install» just copies compiled binary and other files into your system directories without any control. Please, DON’T DO IT on modern repository-based Linux systems! All software MUST BE installed using a system package manger.

OK. Let’s installation begin! I’m going to do all my action in «/storage/Temp» directory.

Part I. GDB compilation

At first, let’s install all required packages for a compilation

$ sudo apt-get install -y build-essential libz-dev libexpat1-dev libncurses-dev libgmp-dev libmpfr-dev libisl-dev libreadline-dev libpython3-dev texinfo texlive

Then, fetch fresh sources for GDB

$ wget https://ftp.gnu.org/gnu/gdb/gdb-14.2.tar.xz

Unpack it

$ tar Jxf gdb-14.2.tar.xz

Create a directory for compilation

$ mkdir gdb-build

And the directories for a future package’s tree

$ mkdir arm-none-eabi-gdb
$ mkdir arm-none-eabi-gdb/usr

Move to the build directory

$ cd gdb-build

And run pre-configuration. Please mention «—prefix» option. It points on our «package’s tree» dir

$ ../gdb-14.2/configure --with-expat --target=arm-none-eabi --program-prefix=arm-none-eabi- --with-source-highlight --with-python=$(which python3) --enable-tui --prefix=/storage/Temp/arm-none-eabi-gdb/usr

Run compilation process

$ make -j8 all

And finally, make an «installation»

$ make install

Well, let’s check what we have in our installation dir

$ cd /storage/Temp/arm-none-eabi-gdb/usr/bin/
$ ls

arm-none-eabi-gdb  arm-none-eabi-gdb-add-index  arm-none-eabi-run

Great! We have «arm-none-eabi-gdb» binary. But we have to check, which kind of libraries linked to our binary.

$ ldd arm-none-eabi-gdb

	linux-vdso.so.1 (0x00007ffff49cd000)
	libncursesw.so.6 => /lib/x86_64-linux-gnu/libncursesw.so.6 (0x0000796ab03c4000)
	libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x0000796ab0390000)
	libpython3.12.so.1.0 => /lib/x86_64-linux-gnu/libpython3.12.so.1.0 (0x0000796aafa00000)
	libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x0000796ab0365000)
	libmpfr.so.6 => /lib/x86_64-linux-gnu/libmpfr.so.6 (0x0000796ab02aa000)
	libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x0000796aaf97c000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000796aaf600000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x0000796aaf893000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x0000796aaf5d3000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000796aaf200000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x0000796aaf5b7000)
	/lib64/ld-linux-x86-64.so.2 (0x0000796ab0e0e000)

Success! Our custom GDB binary linked with the fresh system Python, and libncurses libraries! Save this command output, it will be usefull for future steps.

Part II. Build custom «deb» package file

Now we can build our custom «deb» package for the installation.

$ cd /storage/Temp/arm-none-eabi-gdb/
$ mkdir DEBIAN && cd DEBIAN
$ nano control

Add follwing text into «control» file

Package: arm-none-eabi-gdb
Version: 4.12
Maintainer: Igor Volodin
Architecture: amd64
Depends: libc6, zlib1g, libgcc-s1, libstdc++6, libgmp10, libmpfr6, libexpat1, libpython3-stdlib, libtinfo6, libncurses6, libncursesw6          
Description: GDB for ARM with Python TUI

Also, I have to mention, how to collect a list of packages for the «Depends» option. Look at the output of «ldd» command. It contains list of required shared libraries. Just get the library name from the output (for example, I will use «libexpat»), and find similar in the installed packages.

$ dpkg -l | grep libexpat

ii  libexpat1:amd64                                2.6.1-2build1                             amd64        XML parsing C library - runtime library
ii  libexpat1-dev:amd64                            2.6.1-2build1                             amd64        XML parsing C library - development kit

OK, we have «libexpat1» and «libexpat1-dev». The second is just for compilation from sources, and not needed for the our binary package. Re-check our choice, by listing all files, related to the «libexpat1» package. Yes, it includes /usr/lib/x86_64-linux-gnu/libexpat.so.1 file, so we can add «libexpat1» into «Depends» section.

$ dpkg -L libexpat1

/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1
/usr/lib/x86_64-linux-gnu/libexpatw.so.1.9.1
/usr/share
/usr/share/doc
/usr/share/doc/libexpat1
/usr/share/doc/libexpat1/AUTHORS
/usr/share/doc/libexpat1/changelog.Debian.gz
/usr/share/doc/libexpat1/copyright
/usr/lib/x86_64-linux-gnu/libexpat.so.1
/usr/lib/x86_64-linux-gnu/libexpatw.so.1

Right now we have a «package installation tree» in «/storage/Temp/arm-none-eabi-gdb» directory. And on this step, better to check, have we intersections with already installed files in our system, or not. Our package tree has «gdb» directory in /storage/Temp/arm-none-eabi-gdb/usr/share/. And it contains something.

$ ls /storage/Temp/arm-none-eabi-gdb/usr/share/gdb

python  syscalls  system-gdbinit

But our current system directory also has same directory and files in /usr/share/!

$  ls /usr/share/gdb/

auto-load  python  syscalls  system-gdbinit

Unfortunallty, I don’t know, how package mainteiner have to resolve similar issues. I’ve removed confilcting directories and files form «package installation tree»

$ rm -rf /storage/Temp/arm-none-eabi-gdb/usr/share/gdb /storage/Temp/arm-none-eabi-gdb/usr/include/gdb

Well, it is time to build the package. Move to the top directory

$ cd /storage/Temp/

And build the package

$ dpkg-deb --build arm-none-eabi-gdb

dpkg-deb: building package 'arm-none-eabi-gdb' in 'arm-none-eabi-gdb.deb'.

Recheck what the package contains

$ dpkg -c arm-none-eabi-gdb.deb
drwxrwxr-x igor/igor         0 2024-06-19 21:25 ./
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/bin/
-rwxr-xr-x igor/igor 163716584 2024-06-19 21:16 ./usr/bin/arm-none-eabi-gdb
-rwxr-xr-x igor/igor      4627 2024-06-19 21:16 ./usr/bin/arm-none-eabi-gdb-add-index
-rwxr-xr-x igor/igor   8545496 2024-06-19 21:16 ./usr/bin/arm-none-eabi-run
drwxrwxr-x igor/igor         0 2024-06-19 23:19 ./usr/include/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/include/sim/
-rw-r--r-- igor/igor     12471 2024-06-19 21:16 ./usr/include/sim/callback.h
-rw-r--r-- igor/igor      9969 2024-06-19 21:16 ./usr/include/sim/sim.h
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/lib/
-rw-r--r-- igor/igor   9277172 2024-06-19 21:16 ./usr/lib/libarm-none-eabi-sim.a
drwxrwxr-x igor/igor         0 2024-06-19 21:46 ./usr/share/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/doc/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/doc/arm/
-rw-r--r-- igor/igor       779 2024-06-19 21:16 ./usr/share/doc/arm/README
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/info/
-rw-r--r-- igor/igor     48920 2024-06-19 21:16 ./usr/share/info/annotate.info
-rw-r--r-- igor/igor    698473 2024-06-19 21:16 ./usr/share/info/bfd.info
-rw-r--r-- igor/igor     90873 2024-06-19 21:16 ./usr/share/info/ctf-spec.info
-rw-rw-r-- igor/igor       990 2024-06-19 21:16 ./usr/share/info/dir
-rw-r--r-- igor/igor     29050 2024-06-19 21:16 ./usr/share/info/gdb.info
-rw-r--r-- igor/igor    301325 2024-06-19 21:16 ./usr/share/info/gdb.info-1
-rw-r--r-- igor/igor    300368 2024-06-19 21:16 ./usr/share/info/gdb.info-2
-rw-r--r-- igor/igor    302491 2024-06-19 21:16 ./usr/share/info/gdb.info-3
-rw-r--r-- igor/igor    308967 2024-06-19 21:16 ./usr/share/info/gdb.info-4
-rw-r--r-- igor/igor    287286 2024-06-19 21:16 ./usr/share/info/gdb.info-5
-rw-r--r-- igor/igor    299564 2024-06-19 21:16 ./usr/share/info/gdb.info-6
-rw-r--r-- igor/igor    302126 2024-06-19 21:16 ./usr/share/info/gdb.info-7
-rw-r--r-- igor/igor    384849 2024-06-19 21:16 ./usr/share/info/gdb.info-8
-rw-r--r-- igor/igor    249330 2024-06-19 21:16 ./usr/share/info/gdb.info-9
-rw-r--r-- igor/igor     29825 2024-06-19 21:16 ./usr/share/info/sframe-spec.info
-rw-r--r-- igor/igor    184719 2024-06-19 21:16 ./usr/share/info/stabs.info
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/da/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/da/LC_MESSAGES/
-rw-r--r-- igor/igor    153602 2024-06-19 21:16 ./usr/share/locale/da/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     17551 2024-06-19 21:16 ./usr/share/locale/da/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/de/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/de/LC_MESSAGES/
-rw-r--r-- igor/igor     54340 2024-06-19 21:16 ./usr/share/locale/de/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/es/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/es/LC_MESSAGES/
-rw-r--r-- igor/igor    208584 2024-06-19 21:16 ./usr/share/locale/es/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     39868 2024-06-19 21:16 ./usr/share/locale/es/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fi/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fi/LC_MESSAGES/
-rw-r--r-- igor/igor    162673 2024-06-19 21:16 ./usr/share/locale/fi/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     31220 2024-06-19 21:16 ./usr/share/locale/fi/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fr/LC_MESSAGES/
-rw-r--r-- igor/igor    239357 2024-06-19 21:16 ./usr/share/locale/fr/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     57025 2024-06-19 21:16 ./usr/share/locale/fr/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ga/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ga/LC_MESSAGES/
-rw-r--r-- igor/igor     30700 2024-06-19 21:16 ./usr/share/locale/ga/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/hr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/hr/LC_MESSAGES/
-rw-r--r-- igor/igor      5144 2024-06-19 21:16 ./usr/share/locale/hr/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/id/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/id/LC_MESSAGES/
-rw-r--r-- igor/igor    144237 2024-06-19 21:16 ./usr/share/locale/id/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     30272 2024-06-19 21:16 ./usr/share/locale/id/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/it/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/it/LC_MESSAGES/
-rw-r--r-- igor/igor     26349 2024-06-19 21:16 ./usr/share/locale/it/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ja/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ja/LC_MESSAGES/
-rw-r--r-- igor/igor    134646 2024-06-19 21:16 ./usr/share/locale/ja/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ka/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ka/LC_MESSAGES/
-rw-r--r-- igor/igor      4993 2024-06-19 21:16 ./usr/share/locale/ka/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/nl/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/nl/LC_MESSAGES/
-rw-r--r-- igor/igor     25259 2024-06-19 21:16 ./usr/share/locale/nl/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt/LC_MESSAGES/
-rw-r--r-- igor/igor    218318 2024-06-19 21:16 ./usr/share/locale/pt/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt_BR/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt_BR/LC_MESSAGES/
-rw-r--r-- igor/igor     56398 2024-06-19 21:16 ./usr/share/locale/pt_BR/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ro/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ro/LC_MESSAGES/
-rw-r--r-- igor/igor    238628 2024-06-19 21:16 ./usr/share/locale/ro/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     56150 2024-06-19 21:16 ./usr/share/locale/ro/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ru/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ru/LC_MESSAGES/
-rw-r--r-- igor/igor    292997 2024-06-19 21:16 ./usr/share/locale/ru/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/rw/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/rw/LC_MESSAGES/
-rw-r--r-- igor/igor       388 2024-06-19 21:16 ./usr/share/locale/rw/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sr/LC_MESSAGES/
-rw-r--r-- igor/igor    292730 2024-06-19 21:16 ./usr/share/locale/sr/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     67410 2024-06-19 21:16 ./usr/share/locale/sr/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sv/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sv/LC_MESSAGES/
-rw-r--r-- igor/igor    155219 2024-06-19 21:16 ./usr/share/locale/sv/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     55522 2024-06-19 21:16 ./usr/share/locale/sv/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/tr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/tr/LC_MESSAGES/
-rw-r--r-- igor/igor     69552 2024-06-19 21:16 ./usr/share/locale/tr/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     16117 2024-06-19 21:16 ./usr/share/locale/tr/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/uk/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/uk/LC_MESSAGES/
-rw-r--r-- igor/igor    299719 2024-06-19 21:16 ./usr/share/locale/uk/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     70903 2024-06-19 21:16 ./usr/share/locale/uk/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/vi/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/vi/LC_MESSAGES/
-rw-r--r-- igor/igor    160341 2024-06-19 21:16 ./usr/share/locale/vi/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     33633 2024-06-19 21:16 ./usr/share/locale/vi/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/zh_CN/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/zh_CN/LC_MESSAGES/
-rw-r--r-- igor/igor     17866 2024-06-19 21:16 ./usr/share/locale/zh_CN/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     20533 2024-06-19 21:16 ./usr/share/locale/zh_CN/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/man/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/man/man1/
-rw-r--r-- igor/igor      6536 2024-06-19 21:16 ./usr/share/man/man1/arm-none-eabi-gdb-add-index.1
-rw-r--r-- igor/igor     16840 2024-06-19 21:16 ./usr/share/man/man1/arm-none-eabi-gdb.1
-rw-r--r-- igor/igor     14121 2024-06-19 21:16 ./usr/share/man/man1/arm-none-eabi-gdbserver.1
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/man/man5/
-rw-r--r-- igor/igor      7873 2024-06-19 21:16 ./usr/share/man/man5/arm-none-eabi-gdbinit.5

Now, we can install it using dpkg

$ sudo dpkg -i arm-none-eabi-gdb.deb

Check it

$ sudo dpkg -l | grep arm-none
ii  arm-none-eabi-gdb  4.12     amd64        GDB for ARM with Python TUI

$ which arm-none-eabi-gdb

/usr/bin/arm-none-eabi-gdb

ICOM PCR-1000. Внешнее управление

Лет 10 назад, до тех времен когда получили широкое распостранение USB донглы rtl-sdr, единственной возможностью слушать желаемые частоты в эфире, была покупка сканирующего радиоприемника. А еще хотелось, чтобы им можно было управлять с компа, ибо крутить валкодер своего Degen DE1103 весело, но утомительно.

И вот я, долго выбирая, остановился на брутальном кирпиче ICOM PCR-1000. Диапазон от 100 кГц до 1.3 ГГц. Управление с компа. Сказка!

Поигрался я им, поигрался, и потребность иметь компьютер для управления приемником начинала раздражать. Иногда хотелость что-то послушать вдали от цивилизации, а цивилизацию в виде ноутбука приходилось тащить с собой. И как-то он оказался запихнут в дальний ящик. Я конечно его извлекал, делал ему модификацию с выводм ПЧ наружу, для ее оцифровки и добавления панорамного SDR. Но все же потребность в куче проводов, и каки-то болтающихся проводов идущих к компу, утомляет.

В прошлом году, я захватил из дома в Вильнюс этот приемник, дабы дореализовать одну интересную идею. А именно — независимый модуль управления PCR-1000.

Требования я сформулировал следующие:

  • Подключение к компьютеру по USB
  • Возможность управлять приемником с панели управления
  • Возможность переключаться между режимами управления с панели и управлением с компьютера.
  • Возможность батарейного питания.
  • Возможность подключения внешних динамиков, ибо громкость встроенного зачастую недостаточна.
  • (опиционально) вывод звука на компьютер через USB, c с представлением в системе как звукового источника

Ранее я года два назад я пытался сделать что-то подобное, но в качесте протокола управления, я взял протокол какого-то трансивера ICOM. Потом застрял с передачей данных по USB, глюках энкодера, и забил.

И вот в феврале этого года я допилил беспроблемную работу сквозь STM32F4. На удивление все пошло достаточно легко.

В настоящий момент моя прошивка умеет передавать все команды от компа к приемнику, и отображать выставленные параметры. Так же от приемника я принимаю уровень сигнала, и так же показываю его на экране.

Снял небольшое видео, о том как оно все работает.

Из неприятного — наблюдатся глюки с отображением значнений ширины фильтра. Подебажив это дело, я обнаружил, что PythonPCR какого-то черта в отсылает команду установки параметров мало того что обрезаную (нет установки фильтра), так еще и без финальных «\r\n» символов.

Это дерьмо сбивало парсинг, и на экране я получал мусор. Сейчас я решил обрабатывать лишь корректные полные команды. Но это вызывает иногда неотрисовку значений фильтра и модуляции. Буду думать.

А пока, вполне оптимистично!

Текущий статус

В связи с внешнеполитическим прищемлением хера всем и без разбору благодаря параноидальным-маниакальным инвалидам умственного труда, нахожусь в оплачиваемом отпуске с туманными перспективами. Но без работы не останусь, уж это точно.

А пока в связи с вынужденным простоем решил взять себя за жопу, и мощным усилием воли допилить такую важную штуку как библиотека работы с переферией и различными устройствами использующая libopencm32. На текущий момент запил/портировал иницализацию i2c, spi, oled экрана на ssd1306, ad9850.

В процессе работы — самое сладкое: использование USB CDC, ибо вся суть перехода на STM32 была в возможности создавать беспроблемное подключение микроконтроллера к компьютеру.

We need to go deeper

Приключения с прошивкой мотороллы достигают невиданного размаха.

— Перекомпилирован dosbox с поддержкой отладочного вывода последовательно порта. Увидел, какие байты пытается отослать программа. С тем, что я вижу на логическом анализаторе, не соотносится никак. Следовательно проблема в нестандартном битрейте.

— Изучены внутренности досбокса, на предмет того как он инициализирует порты. Стало понятно, что досбокс инициализирует порты используя только стандартные битрейты, используя классические функции tc*. В недрах интернета я нашел упоминание что нестандартный битрейт может быть применен классическими функциями лишь для FTDI чипов. Что конечно странно. Ибо нестандартная скорость не применяется даже для аппаратного RS-232. Плюс у людей шьется через аппаратный последовательный порт, а у меня нет. По итогу я принял решение переписать код досбокса, на использование расширенного интерфейса конфигурации порта, используя ioctl запросы TCGETS2 и TCSETS2 для termios2.

В процессе переписывания натолкнулся на дичь. Запрашиваю конфигурацию порта с помощью TCGETS2 в dosbox — получаю в ответ ошибку. Делаю то же запрос в своем приложении — все отлично читается. По итогу ковыряния с gdb, выяснилось что при запросах из досбокс и моего приложения, адреса регистра TCGETS2 разные! Что это за ересь я пока не понимаю.

Нехватка магии в волшебной палочке

Выходные пролетели, а SPI в stm32f103 под libopencm3 все так и не заводится.

Ну ладно, я первый раз не заметил что в конфигах секции данных для mapple и bluepill отличаются.

Но чего потом, оно не заводится даже с примерами из гитхаба — не ясно.

Причем у меня есть мой код использующий spl, и он рабочий. Я тупо переписал инициализацию, а логический анализатор даже поднятие CS не показывает.

STM32F411 «Black Pill» USB & Libopencm3 bug

Небольшая заметка по результатм исследования бага с неработающей инициализацией USB с библиотекой LibOpenCm3 для китайской платки WeAct «Black Pill» v2.0.
Если не у вас не работают примеры для USB, и система даже не проводит энумерацию подключенного устройства, то вам надо:

  1. Заинклюдить otg_fs.h
    #include <libopencm3/usb/dwc/otg_fs.h>
  2. После вызова функции usbd_init отключить VBUS sensing
    OTG_FS_GCCFG |= OTG_GCCFG_NOVBUSSENS | OTG_GCCFG_PWRDWN;
    OTG_FS_GCCFG &= ~(OTG_GCCFG_VBUSBSEN | OTG_GCCFG_VBUSASEN);

Фикс-реквест все еще с 2020 года ждет мержа.
https://github.com/libopencm3/libopencm3/pull/1256