AVR crosscompile Cobra mk3

Jak jsem rozcházel crosscompile na svém novém počítači podle http://micro-corner.gilhad.cz/blog/AVR/2019-02-01-AVR-crosscompile.html - aneb příprava na další práci.

Aby šlo AVR programovat, musí se připojit, takže kernel musí mít nastavené příslušné ovladače:

1   Kernel:

su -
cd /usr/src/linux
make menuconfig
        Device Drivers  --->
            [*] USB support --->
                  <*> USB Modem (CDC ACM) support
                  <*> USB Serial Converter support --->
                      <*> USB FTDI Single Port Serial Driver
                      <*> USB Winchiphead CH341 Single Port Serial Driver

make -j25 # -j25 se dá vynechat, řiká kolik vláken se má použít, u počítače s 24 core mi přijde škoda je nevytížit všechna a jedno navíc pro režii
make modules_install

Já používám UEFI, takže kernel nainstaluju příslušným způsobem:

cp /usr/src/linux/arch/x86/boot/bzImage /boot/bzImage.efi

efibootmgr
#       BootCurrent: 0008
#       Timeout: 1 seconds
#       BootOrder: 0008,0007,0003,0000,0001,0002,0006
#       Boot0000* NVM-Gentoo-NVM-SYSTEM
#       Boot0001* NVM-Gentoo-SDA2
#       Boot0002* NVM-Gentoo-NVM-SYSBCK
#       Boot0003* SDA-Gentoo-NVM-SYSTEM
#       Boot0004* SDA-Gentoo-SDA2
#       Boot0005* SDA-Gentoo-NVM-SYSBCK
#       Boot0006  Windows Boot Manager
#       Boot0007* SDA-Gentoo-NVM-TeachMePCB
#       Boot0008* NVM-Gentoo-NVM-TeachMePCB
efibootmgr -b 7 -B
efibootmgr -b 8 -B


mount /dev/sda1 /boot
mkdir -p /boot/EFI/'Gentoo-NVM-TeachMePCB'      # or any other name under /boot/EFI
cp /usr/src/linux/arch/x86/boot/bzImage /boot/EFI/'Gentoo-NVM-TeachMePCB'/bzImage.efi
efibootmgr -c -L "SDA-Gentoo-NVM-TeachMePCB" -l '\EFI\Gentoo-NVM-TeachMePCB\bzImage.efi' -d /dev/sda1
umount /boot

mount /dev/nvme0n1p1 /boot
mkdir -p /boot/EFI/'Gentoo-NVM-TeachMePCB'      # or any other name under /boot/EFI
cp /usr/src/linux/arch/x86/boot/bzImage /boot/EFI/'Gentoo-NVM-TeachMePCB'/bzImage.efi
efibootmgr -c -L "NVM-Gentoo-NVM-TeachMePCB" -l '\EFI\Gentoo-NVM-TeachMePCB\bzImage.efi' -d /dev/nvme0n1p1
umount /boot

efibootmgr # Check BootCurrent: 0008; BootOrder: 0008,..; Boot0008* NVM-Gentoo-NVM-TeachMePCB

2   Repository:

cd ~/GIT-arduino
portage-tools-new-repository.sh -u arduino BareAVR "Arduino as AVR only\n see http://micro-corner.gilhad.cz/blog/AVR/2019-02-01-AVR-crosscompile.html"
cd BareAVR
mkdir simple_self_test
cd simple_self_test
wget http://micro-corner.gilhad.cz/blog/AVR/listings/simple_self_test2.sh -O simple_self_test2.sh
./simple_self_test2.sh
# fail, no compiler

Simple self test na ověření, že to aspoň nějak funguje: simple_self_test2.sh a jeho zdroj samozřejmě selhal, protože mu chybí kompilátor a utility, takže to hned napravím

3   Intel Hex konverze

echo >>/etc/portage/package.accept_keywords/AVR "dev-python/intelhex ~amd64"
emerge -avq dev-python/intelhex

4   Crosschain:

#  * error: please convert //etc/portage/package.mask to a directory
emerge -avq sys-devel/crossdev
mkdir -p /var/db/repos/portage-crossdev/{profiles,metadata}
echo 'crossdev' > /var/db/repos/portage-crossdev/profiles/repo_name
echo 'masters = gentoo' > /var/db/repos/portage-crossdev/metadata/layout.conf
chown -R portage:portage /var/db/repos/portage-crossdev

###############################################
# /etc/portage/repos.conf/crossdev.conf
##############################################
#       [crossdev]
#       location = /var/db/repos/portage-crossdev
#       priority = 10
#       masters = gentoo
#       auto-sync = no

# AVR (Arduino/Genuino/ATmicro/ATmega/etc.)
crossdev -s4 --stable --portage --verbose --target avr

# ARM (STM32/GD32/etc.)
crossdev -s4 --stable --portage --verbose --target arm

Troubleshooting

# If issues are encountered when crossdev is compiling the gcc stages, try:
# USE="-openmp -hardened -sanitize -vtv" crossdev -s4 --stable --portage --verbose --target avr

Tentokrát by simple_self_test2.sh měl projít bez problémů a přeložit dva jednoduché prográmky, plus k nim přidat výpisy (a vidím, že dostávám něco dost rozdílného, podle toho co po překladači chci, jednou tam jsou i vektory přerušní, podruhé nikoli)

5   Potlačení akcelerace Arduino myši

Zatímco u normální myši je akcelerace přijemná, protože dosáhneme na celou obrazovku a přitom se dá kurzor umístit celkem přesně, tak u robotické myši je dost nevýhodná, protože chybí zpětná vazba a velice záleží na délce pohybů, pauzách mezi nimi a i jejich řazení.

Myš umožňuje pohyb jen o +/- 127 v každém směru v jedné akci, přitom přez celou obrazovku to může být i několik tisíc - jednoduché řešní je si napsat funkci, která delší požadovaný pohyb rozloží na několik menších, které SW zvládne.

Nejjednodušší funkce vezme cíl, ořízne nějakou hodnotou (127, 100, ...), udělá tento pohyb a odečte od cíle, takto pokračuje, dokud nezbude 0,0 a má hotovo.

Problém je, že s výjimkou pohybu po osách a úhlopříčkách se cesta tam a zpátky liší a kvůli urychlení se nevrátíte do počátečního bodu. Nemluvě o tom, že skládání pohybů obecně vede k dost nepředvidatelným výsledkům - nejde například jednoduše proskákat a proklikat pravoúhlou síť tlačítek. Myš totiž neumožňuje zjištění aktuální polohy, ani pohyb na absolutní souřadnice.

Řešením je akceleraci vypnout, ale jen pro robotickou myš (ta si bude muset jet lineární rychlostí, tedy víc úseků, ale zato budou přesně dlouhé), normální nechat pohodlnou, akcelerovanou.

Nejdřív je potřeba zjistit, jak se nám robomyš hlásí v systému:

xinput --list
- Virtual core pointer                          id=2    [master pointer  (3)]
-   - Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
-   - SONiX USB DEVICE Consumer Control         id=11   [slave  pointer  (2)]
-   - SONiX USB DEVICE Mouse                    id=12   [slave  pointer  (2)]
-   - BY Tech Usb Gaming Keyboard Consumer Control      id=15   [slave  pointer  (2)]
-   - BY Tech Usb Gaming Keyboard Mouse         id=17   [slave  pointer  (2)]
-   - USB Optical Mouse                         id=20   [slave  pointer  (2)]
-   - Arduino LLC Arduino Micro Mouse           id=19   [slave  pointer  (2)]
- Virtual core keyboard                         id=3    [master keyboard (2)]
    - Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    - Power Button                              id=6    [slave  keyboard (3)]
    - Power Button                              id=7    [slave  keyboard (3)]
    - SONiX USB DEVICE                          id=8    [slave  keyboard (3)]
    - SONiX USB DEVICE Keyboard                 id=9    [slave  keyboard (3)]
    - SONiX USB DEVICE System Control           id=10   [slave  keyboard (3)]
    - BY Tech Usb Gaming Keyboard               id=13   [slave  keyboard (3)]
    - BY Tech Usb Gaming Keyboard System Control        id=14   [slave  keyboard (3)]
    - BY Tech Usb Gaming Keyboard               id=16   [slave  keyboard (3)]
    - SONiX USB DEVICE Consumer Control         id=21   [slave  keyboard (3)]
    - BY Tech Usb Gaming Keyboard Consumer Control      id=22   [slave  keyboard (3)]
    - Arduino LLC Arduino Micro Keyboard        id=18   [slave  keyboard (3)]

Myš je zjevně Arduino LLC Arduino Micro Mouse a má id=19. Znázvu je první slovo do mezery Vendor, zbytek Produkt, takže vytvoříme soubor /etc/X11/xorg.conf.d/mouse-acceleration.conf, který ji akceleraci zakáže a restartujeme Xka

Section "InputClass"
    Identifier "My Mouse"
    MatchIsPointer "yes"
    MatchVendor "Arduino"
    MatchProduct "LLC Arduino Micro Mouse"
    Option "AccelerationProfile" "-1"
    Option "AccelerationScheme" "none"
    Option "AccelSpeed" "-1"
EndSection
# Stop acceleration on mouse