воскресенье, 19 ноября 2017 г.

Стоит разбить экран и смартфон становится бесполезных хламом

Недавно LG Nexus 5 неудачно спланировал с высоты примерно 1.5 метров на пол. Результат разбитый сенсор и экран, показывающий ворох цветных линий.


Ремонтировать такой телефон экономически невыгодно - за неоригинальный экран в Минске просят 60-70 рублей (примерно 35$). А еще его нужно заменить, не угробив телефон окончательно. Б/у Nexus 5 стоит 150-200 рублей в зависимости от состояния. В общем имеет смысл скопировать информацию, очистить телефон и продать на запчасти.

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

Подключил мышку через USB-OTG переходник и экспериментальным путем нашел точку на экране, нажатие на которую дает небольшую область слева, где с трудом, но можно прочесть текст. Вращая телефон между альбомной и портретной ориентациями "нащупал" нужную опцию и сбросил файлы.

Данные с телефона стер через веб-версию Play Market, использую функцию поиска телефона.

Я пробовал установить софт проде AirDroid для управления телефоном с компьютера, но не смог запустить этот софт удаленно. Включить ADB тоже оказалось непросто, т.к. при попытке использования выскакивает запрос в центре экрана, а эту область увидеть не получилось.

Есть возможность подключить телефон к телевизору или монитору через HDMI, но у меня нет такого переходника:


Теперь остался вопрос - что взять на замену. Скорее всего буду брать еще один Xiaomi Mi4c и прошивать его на LineageOS 14.1.

пятница, 10 ноября 2017 г.

Использование STM32F103C8T6 в Arduino IDE

Разобрался как использовать плату на базе контроллера STM32F103C8T6 в Arduino. Мой вариант платы выглядит вот так


В wiki сайта stm32duino.com такая плата называется Blue Pill. И эта плата имеет несколько недостатков, которые относительно просто устранить имея под рукой паяльник.

Крепление micro-usb разъема не внушает доверие - я пропаял его. USB D+ пин подтянут к питанию через резистор номиналом 10k, но чтобы устройство определилось на шине USB как Full Speed, нужно подтягивать USB D+ к питанию через резистор номиналом 1,5k. Гуру smd пайки могут заменить на плате резистор R10, но я выбрал вариант с подключением резистора номиналом 1,8k между пинами PA12 (на этот пин выведен USB D+) и 3.3v.

Прошивку можно заливать через USB-UART преобразователь. Для этого нужно переключить преобразователь в режим 3,3V и подключить выводы согласно таблице (в комментарии подсказали, что выводы PA9/PA10 толерантны к 5V)

USB-UARTBlue Pill
GndGnd
Vcc3.3V
RXPA9
TXPA10

В настройках Arduino IDE нужно добавить поддержку SMT32F103 (File / Preferences / Additional Boards Manager URL):

http://dan.drown.org/stm32duino/package_STM32duino_index.json

В Boards Manager (Tools / Board / Boards Manager) установить "SMT32F1xx/GD32F1xx boards by smt32duino" и активировать загрузку прошивки через Serial (Tools / Upload method / Serial). На плате нужно переключить перемычку BOOT0 в High, а BOOT1 в Low. После этого нужно сбросить плату и можно заливать скетчи. Для нормальной работы прошивки BOOT0 и BOOT1 должны быть в состоянии Low.

Но лично я рекомендую прошить STM32duino bootloader и пользоваться загрузкой скетча через USB. Для этого подключаем плату через USB-UART преобразователь, как описано выше. Затем в консоли выполняем команды

$ wget -P /tmp https://github.com/rogerclarkmelbourne/STM32duino-bootloader/raw/master/binaries/generic_boot20_pc13.bin
$ cd ~/.arduino15/packages/stm32duino/tools/stm32tools/2017.11.8/linux/stm32flash
$ ./stm32flash -w /tmp/generic_boot20_pc13.bin -v -g 0x0 /dev/ttyUSB0

Мне еще потребовалось подправить правила UDEV, чтобы ModemManager, libmtp и UDisks не трогали плату:

$ cat /etc/udev/rules.d/45-usbprog.rules
# STM32duino USB bootloader
ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="0660", GROUP="plugdev", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="0660", GROUP="plugdev", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="0660", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="0660", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"

В начале файла /lib/udev/rules.d/69-libmtp.rules добавить

# STM32duino USB bootloader
ATTR{idVendor}=="1eaf", GOTO="libmtp_rules_end"
ATTR{idVendor}=="0110", GOTO="libmtp_rules_end"

После этого выполнить

$ sudo udevadm control --reload-rules

Мне пришлось перезагрузить компьютер - в моем случае UDisks не отставал от платы без перезагрузки. После этого отключить USB-UART преобразователь, выставить перемычки BOOT0 и BOOT1 в Low и подключить плату к компьютеру через USB. Теперь выбираем в Arduino IDE тип загрузки "STM32duino bootloader" (Tools / Upload method / STM32duino bootloader).

Первую загрузку скетча нужно делать включив режим infinite в загрузчике. Для этого подключается резистор номиналом 10k между 3,3v и PC14. После сброса светодиод на плате начинает постоянно мигать, что означает что загрузчик будет ждать начала загрузки без ограничения по времени. После первой загрузки этот режим можно выключить и дальше пользоваться платой как обычно.

Последовательный порт платы опознается в Linux как /dev/ttyACM0 и его нужно выбрать в "Tools / Port" чтобы работал Serial Monitor.

В Arduino IDE 1.6.8 у меня были ошибки при компиляции и я обновился до Arduino IDE 1.8.5. Для проверки работы платы можно использовать пример Blink (File / Examples / 01.Basics / Blink).

OpenTasks не показывает задачи после запуска

Если вы используете OpenTasks (Play Market, F-Droid), то возможно столкнулись с ситуацией когда приложение показывает задачи не сразу после запуска, а секунд через 10-15. Если активно использовать задачи, то такое поведение начинает раздражать.

У меня эта проблема проявилась на LineageOS 14.1 (Android 7.1.2). Чтобы исправить ситуацию достаточно выдать приложению разрешения "Contacts" (Settings / Apps / OpenTasks / Permissions). Заодно я включил два разрешения, помеченных как дополнительные: "read tasks" и "write tasks" (Settings / Apps / OpenTasks / Permissions / Additional permissions).

Теперь список задач виден сразу после запуска приложения.