пятница, 22 ноября 2019 г.

Получение списка usb-устройств на Python

Получение в Qt списка usb-флешек через вызов bash-скриптов

1. bash-скрипт списка подключенных устройств, содержащих хотя бы один раздел:

#!/bin/sh
readlink `find /dev/disk/by-path/ -name '*usb*part1*'`

2. bash-скрипт монтирования указанного usb-устройства c файловой системой fat32;  идентификатор usb-устройства передается скрипту в виде первого параметра (например, /dev/sdb1):

#!/bin/sh
if ! [ -z $1 ]
then
  mkdir /media/usb
  mount $1 /media/usb

  SIZE_STRING=`df -h | grep $1 | awk '{print $2}' | sed 's/\n//'`
  LABEL_FS_STRING=`blkid | grep $1 | awk '{print $2 "#" $4}' | sed 's/LABEL=//' | sed 's/TYPE=//' | sed 's/"//g'`

  echo $LABEL_FS_STRING#$SIZE_STRING
fi

3. bash-скрипт отмонтирования устройства, примонтированного к папке /media/usb:

#!/bin/sh
MOUNTED_STRING=`mount | grep /media/usb | egrep -o '/dev/[a-z][a-z][a-z][0-9]+'`
if ! [ -z $MOUNTED_STRING ]
then
  umount /media/usb
  echo $MOUNTED_STRING
fi

Источники (bash):
1) Передача параметров в bash-скрипты https://habr.com/ru/company/ruvds/blog/326328/
2) Предопределенные переменные в bash https://habr.com/ru/post/47163/
3) $? https://www.opennet.ru/docs/RUS/bash_scripting_guide/c2105.html
4) https://ru.wikipedia.org/wiki/Bash

Источники (libusb):
1) https://github.com/libusb/libusb/blob/master/examples/listdevs.c
2) http://libusb.sourceforge.net/api-1.0/index.html
3) https://ru.stackoverflow.com/questions/835083/%D0%9A%D0%B0%D0%BA-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8E-%D0%BE-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B5
4) https://forum.ubuntu.ru/index.php?topic=176467.0

четверг, 21 ноября 2019 г.

Общение платы на основе stm32 и qt-го клиентского приложения по usb

Разблокировка игровой консоли Wii (чтение игр с usb-флешки)

Игровая консоль на raspberrypi (orangepi)

вторник, 19 ноября 2019 г.

Восстановление grub

У меня на компе с двумя ОС (Ubuntu14.04/Windows7; Fedora31/Win10) перестала грузиться первая. Я решил создать загрузочную ОС на флешке (LiveUSB), загрузиться с нее, примонтироваться с исходной файловой системе и обновить порядок загрузки ОС в grub.

Скачиваем нужный исошник отсюда. Скачиваем прогу UNetbootin отсюда. Вставляем флешку (у меня 8GB, но 4GB вполне должно хватить). Запускаем UNetbootin, выбираем исошник, флешку, записываем. Перезагружаемся, проверяем, чтобы в BIOS'е в списке устройств для загрузки первым устройством стояла флешка. Загружаемся с флешки.

Ubuntu Links:
1) http://help.ubuntu.ru/wiki/%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_grub
2) http://help.ubuntu.ru/wiki/unetbootin
3) http://ubuntu.ru/get
4) http://help.ubuntu.ru/wiki/ubuntu_%D0%BD%D0%B0_usb
5) http://help.ubuntu.ru/wiki/liveusb

Fedora Links:
1) https://sys-adm.in/sections/os-nix/844-vosstanovlenie-grub-v-fedora.html
2) https://docs.fedoraproject.org/en-US/quick-docs/bootloading-with-grub2/
3) https://superuser.com/questions/596317/how-would-i-reinstall-the-grub-efi-bootloader-on-fedora-linux
4) https://fedoraproject.org/wiki/GRUB_2
5) https://zen.yandex.ru/media/id/5d75175fc7e50c00ade545d5/nastroika-fedora-31-posle-ustanovki-5dd803896c428f7920c2b85a

Ubuntu 16.04 + Windows 10: amd64, GPT, UEFI

Bash-скрипт для создания img-сборок образов microsd-карт для работы под BeagleBoneBlack

Работа bash-скрипта выливается в:
- создание заархивированных образов img-дампов образов microsd-карт
- создание файла словаря списка созданных дампов и аппаратных конфигураций обрудования, для которых предназначены эти дампы

Сборка состоит из:
- кросскомпилированного бинарника приложения на qt (параметры сборок передаются в виде дефайнов)
- конфигурационных файлов
- других bash-скриптов и python-скриптов (это не так важно)

Создание образа microsd-карты и его автоматическое расширение под BeagleBoneBlack частично описано тут.

Использованные материалы:

1. bash:
1) https://habr.com/ru/company/ruvds/blog/325522/

2. sfdisk:
1) Пример скрипта, заливающего на встроенную emmc-память платы BeagleBoneBlack содержимого microsd-карты с бинарниками uboot, ядра и rootfs 
https://raw.githubusercontent.com/RobertCNelson/boot-scripts/master/tools/eMMC/bbb-eMMC-flasher-eewiki-ext4.sh
2) https://www.thegeekstuff.com/2017/05/sfdisk-examples/
3) https://suntong.github.io/blogs/2015/12/25/use-sfdisk-to-partition-disks/
4) https://stackoverflow.com/questions/12150116/how-to-script-sfdisk-or-parted-for-multiple-partitions
5) http://download.vikis.lt/doc/util-linux-ng-2.17.2/sfdisk.examples
6) https://www.systutorials.com/docs/linux/man/8-sfdisk/

3. генерирование файла словаря созданных дампов из bash-скрипта:
1) https://habr.com/ru/company/ruvds/blog/326594/

4. формирование номера программы и билда:
1) https://habr.com/ru/post/118756/
2) Нумерация версий программного обеспечения 

пятница, 15 ноября 2019 г.

Создание кастомного редактора для двухуровневого xml-файла (структура ini-файла) в виде древовидной структуры наследника QTreeView, состоящих из элементов QTreeWidgetItem в qt4

1. Tree Model with MVC (QTreeView):
2) Использование моделей в Qt https://habr.com/ru/post/171443/
3) Иерархические модели в Qt https://habr.com/ru/post/172187/
4) QT: программируем по шаблонам MVC http://blog.kislenko.net/show.php?id=1511
5) Трюки с моделями в Qt https://habr.com/ru/post/126995/

2. Tree Model without MVC (QTreeWidget):
1) QT: строим дерево строк на основе QTreeWidget http://blog.kislenko.net/show.php?id=1509
2) https://qt-way-notes.blogspot.com/search?q=Xmltree&m=1

3. Qt GUI:

пятница, 8 ноября 2019 г.

Расширение раздела ext2 и файловой системы в bash

В bash-скрипте я создаю 200M-образ, связываю его с loop-устройством, монтирую, создаю файловую систему ext2, делаю сборку из необходимых файлов и в конце собираю бинарник на qt при помощи кросс-компилятора:

# 200 метров должно хватить для любого диска с прогой, скриптов и настроек 
dd if=/dev/zero of=./dump.img bs=1M count=200

# освобождаем loop0-устройство
losetup -d /dev/loop0

# сопоставляем образ с loop-устройством
losetup /dev/loop0 ./dump.img

# формируем таблицу разделов на /dev/loop0
sfdisk /dev/loop0 <<-__EOF__
;
__EOF__

# перечитываем
partprobe /dev/loop0

# создаем файловую систему ext2
mkfs.ext2 -F -L "$FIRMWARE_VER1" /dev/loop0p1

# создаем папку, на всякий случай
mkdir ./imgmnt

# монтируем loop-устройство в папку

mount /dev/loop0p1 ./imgmnt

Записываем созданный распакованный образ на microsd-карту через usb-переходник (microsd-карта монтируется как /dev/sdc1):

sudo dd if=./myimage.img of=/dev/sdc bs=1M

На плате BBB делаем авторасширение ext2-раздела (microsd-карта монтируется как /dev/mmcblk0p1) в моем bash-скрипте, запускаемом при инициализации (/etc/init.d/mystart.sh).

Авторасширение делается в два этапа:
1) до монтирования microsd-карты делаем расширение раздела с предварительной проверкой на размер раздела:

# расширение раздела до монтирования
read MSIZE < /sys/class/block/mmcblk0/size
read NR START END TYPE < <( partx -gbro NR,START,END,TYPE /dev/mmcblk0 )
if [ "$END" -lt "$(($MSIZE - 1))" ] && [ "$TYPE" == "0x83" ]; then
  dd if=/usr/share/medteco/sdresize.rgb of=/dev/fb0
  parted /dev/mmcblk0 resizepart 1 100%
  e2fsck -f /dev/mmcblk0p1
fi

2) после монтирования microsd-карты делаем расширение файловой системы (этот этап можно было сделать до монтирования, но почему-то на нем в таком случае часто случались косяки):

# расширяем файловую систему после монтирования
resize2fs /dev/mmcblk0p1

Источники:

четверг, 7 ноября 2019 г.

Общение по spi плат raspberrypi3b и stm32f103 (bluepill)

Сборка libusb-1.0.22 для BBB на Fedora30/Ubuntu16.04

Скачиваем архив отсюда, распаковываем в локальную папку (у меня, /media/Data/Libraries/bbb/libusb-1.0.22). 

Переходим в папку, определяем уже установленный кросс-компилятор, запускаем autotools, configure, make, make install:

cd /media/Data/Libraries/bbb/libusb-1.0.22

./autogen.sh

export CC=/usr/local/tools/linaro-gnueabihf-4.9/bin/arm-linux-gnueabihf-gcc
export CXX=/usr/local/tools/linaro-gnueabihf-4.9/bin/arm-linux-gnueabihf-g++

./configure --with-pic --disable-udev --host=arm-linux
--prefix=/usr/local/tools/libusb-1.0.22

make
make install

вторник, 5 ноября 2019 г.

Отладка ядра BeagleBone через KGDB

Будем использовать это ядро. При пересборке ядра (./tools/rebuild.sh) включим следующие опции:
1) Kernel hacking -> Compile time checks and compiler options -> Compile the kernel with debug info [*]
2) Kernel hacking -> Kgdb: Kernel Debugger [*]
3) Kernel Features -> Compile kernel in thumb-2 mode [] (отключаем сборку в режиме thumb-2, чтобы побороть ошибку Internal error: Oops - undefined instruction: 0 [#1] THUMB2)

Отредактируем /boot/uEnv.txt, добавим:
optargs=kgdbwait kgdboc=ttyS0,115200

Запускаем BBB, вывод процесса загрузки по uart (sudo screen /dev/ttyUSB0 115200,cs8) остановился на:
[    3.125478] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 249)
[    3.125613] io scheduler noop registered
[    3.125627] io scheduler deadline registered
[    3.125660] io scheduler cfq registered (default)
[    3.126677] pinctrl-single 44e10800.pinmux: 142 pins at pa f9e10800 size 568
[    3.128057] Serial: 8250/16550 driver, 6 ports, IRQ sharing disabled
[    3.130208] 44e09000.serial: ttyS0 at MMIO 0x44e09000 (irq = 154, base_baud = 3000000) is a 8250
[    3.939841] console [ttyS0] enabled
[    3.944036] KGDB: Registered I/O driver kgdboc
[    3.948520] KGDB: Waiting for connection from remote gdb...
[    3.954150] Internal error: Oops - undefined instruction: 0 [#1] THUMB2

Entering kdb (current=0xdd8f3840, pid 1) due to Keyboard Entry
kdb> 

Будем отлаживать через тот же uart. Собранный незаархивирванный образ ядра (Image) лежит здесь: /mnt/Data/Projects/LinuxKernel/4.1.38/bb-kernel/KERNEL/arch/arm/boot.
Клиент gdb (arm-linux-gnueabihf-gdb) лежит здесь: /mnt/Data/Projects/LinuxKernel/4.1.38/bb-kernel/dl/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin. Скидываем их в одну локальную папку (например, /mnt/Data/Projects/LinuxKernel/Debug), переходим в папку, запускаем:

cd /mnt/Data/Projects/LinuxKernel/Debug
arm-linux-gnueabihf-gdb -ex 'file vmlinuz-4.1.38-bone24' -ex 'target remote /dev/ttyUSB0'

Получаем:

[adil@adil Debug]$ ./arm-linux-gnueabihf-gdb -ex 'file Image' -ex 'target remote /dev/ttyUSB0'
...
/dev/ttyUSB0: Device or resource busy.


Источники:
1) https://code-examples.net/en/q/4b6ff1