воскресенье, 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).

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

вторник, 31 октября 2017 г.

Тестирование OLED экрана 128x64

Сегодня пришли два монохромных OLED экрана с диагональю 0.96" и разрешением 128x64. Один из экранов собираюсь добавить в мой проект arduino-air-sensors, а второй - в радио-будильник для детей. О последнем я напишу отдельно, когда будет готово управление и индикация.

Модуль экрана использует контроллер SSD1306 и имеет четыре вывода: Gnd, Vcc, SCL, SDA. Подключение к Arduino выглядит так:

OLEDArduino
GndGnd
Vcc5V
SCLA4
SDAA5

Скачал библиотеки Adafruit_GFX и Adafruit_SSD1306. В последней нужно отредактировать файл Adafruit_SSD1306.h чтобы выбрать i2c адрес 0x3C и разрешение 128x64.

#define SSD1306_I2C_ADDRESS   0x3C
#define SSD1306_128_64

После этого залил минимальный скетч для инициализации экрана

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
}

void loop() {

}

Результат работы скетча:


В примерах библиотеки Adafruit_SSD1306 есть неплохая демка с элементами анимации.

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

ESP8266 + AM2302 + MH-Z19

Это продолжение поста про слежение за "погодой" в доме. Пришли заказанные в августе модули ESP8266 ESP-12S. Запаял их на платы и приступил к переделке проекта arduino-air-sensors.



На плате есть два резистора по 10k и один резистор-перемычка. Один из резисторов на 10k подтягивает ch_pd к питанию, а второй - gpio15 к земле. Чтобы плата запускалась без проблем еще нужно подтянуть gpio0 и gpio2 к питанию через резисторы номиналом 10k. Во время заливки прошивки нужно подтянуть gpio0 к земле.

Bootloader Modes
Modegpio0gpio2gpio15
UART Download Mode (Programming)010
Flash Startup (Normal)110
SD-Card Boot001

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

Но не спешите запаивать туда популярный AMS1117-3.3. Нужен стабилизатор, имеющий порядок выводов "Gnd, Vin, Vout", а у AMS1117 порядок выводов "Gnd, Vout, Vin". Можно попробовать MCP1700 в корпусе SOT-23 или SOT-89, но в этом случае максимальное входное напряжение не должно превышать 6V, а выходной ток - 250mA. Я не пробовал такое подключение, но при работе от USB или 3-х батареек AA должно работать.

Переписал скетч с Ethernet Shield на ESP8266 и добавил в проект схему в формате Eagle и PNG.

Для проверки надежности запустил siege на список урлов, которые поддерживает прошивка. Если за сутки ничего не отвалится и не зависнет, то можно говорить о какой-то надежности. Напомню, что версия на Ethernet Shield зависала случайным образом проработав от нескольких часов до суток и более.

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

Слежу за погодой в доме: DHT22 + MH-Z19

С наступлением холодов условия в помещении меняются. В качестве показателей "погоды" в доме я решил использовать температуру, относительную влажность и содержание углекислого газа. За показания температуры и влажности отвечает датчик AM2302 (DHT22), а за показания углекислоты - MH-Z19. При покупке на AliExpress оба сенсора обойдутся примерно 22$ - львиную долю составляет стоимость датчика MH-Z19. Химические датчики вроде MG811 я не рассматривал т.к. они довольно быстро деградируют и имеют невысокую точность.

Схема подключения и вид самой платы



К плате подключены два источника питания: USB порт, который питает саму Arduino и Ethernet shield, и AC-DC блок питания, подключенный через модуль питания макетной платы. Последний требуется из-за значительной просадки напряжения при питании MH-Z19 от внутреннего стабилизатора Arduino.

Изначально планировал использовать ESP8266 ESP-12S в качестве контроллера, но из-за проблем с покупкой пока собрал временный вариант на базе Arduino + Ethernet Shield. Показания сенсоров собираются в Munin а доступность платы по сети контролирует Nagios.


На графике хорошо заметны моменты, когда окно в комнате открывалось для проветривания. За время измерений уровень CO2 не превысил 1262 ppm (parts per million). Хотя это и не слишком много, но достаточно чтобы чувствовать себя уставшим. С одной стороны слеклопакеты дают отличную тепло- и звукоизоляцию, но расплата за это - фактически полное отсутствие вентиляции помещения.

Прошивка получилась незамысловатая, но вот ее надежность оставляет желать лучшего. Может проработать больше несколько суток без сбоев, а может зависнуть несколько раз за час. Сначала я грешил на нехватку оперативной памяти, т.к. после добавления всего функционала компилятор стал жаловаться ее нехватку.


Оказалось, что при запуске прошивки все строки копирутся в оперативную память и поэтому ее не хватает. Но если обернуть строку в макрос F(), то такая строка читается из флеш памяти с использованием функций доступа без копирования в оперативную. Использование памяти значительно снизилось


Но проблему зависаний это не решило. Подключил библиотеку MemoryFree - до момента зависания показывает больше килобайта свободной памяти. Сейчас хочу загрузить самый минимальный скетч, который не будет опрашивать сенсоры, а только отдавать OK на health check.

Если плата зависнет, то скорее всего либо проблема в самом Ethernet shield либо в библиотеке Ethernet. В последнем случае можно попробовать проверить стабильность работы заменив общение по сети на работу через Serial.

вторник, 17 октября 2017 г.

SDR приемник на базе RTL2838U

Приобрел DVB-T приемник на базе чипа RTL2838U, который собираюсь использовать как SDR приемник.





Чтобы ядро Linux не пыталось использовать его как dvb устройство, нужно запретить загрузку модуля dvb_usb_rtl28xxu

$ echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/rtl2838u-sdr.conf
$ sudo modprobe -r dvb_usb_rtl28xxu
$ sudo udevadm control --reload-rules

После этого нужно подключить приемник или переподключить его.

В системе устройство опозналось так:

$ lsusb -d 0bda:2838 -v

Bus 001 Device 030: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0bda Realtek Semiconductor Corp.
  idProduct          0x2838 RTL2838 DVB-T
  bcdDevice            1.00
  iManufacturer           1 Realtek
  iProduct                2 RTL2838UHIDIR
  iSerial                 3 00000001
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          4 USB2.0-Bulk&Iso
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              5 Bulk-In, Interface
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              5 Bulk-In, Interface
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  bNumConfigurations      2
Device Status:     0x0000
  (Bus Powered)

На первое время установил GNU Radio и Gqrx

sudo apt-get update
sudo apt-get install -t jessie-backports rtl-sdr gqrx-sdr gnuradio gr-osmosdr

Так выглядит FM станция при приеме на самодельную антенну четвертьволновой диполь из двух телескопических колен (каждое 19 см - 110 см) и одежной вешалки.



Регулируя длину колен такую антенну можно настраивать на оптимальный прием нужной частоты. Для приема FM частот нужно выдвинуть оба плеча антенны на 80 см - это будет соответствовать середине частоты FM диапазона.

В моем варианте длина телескопических колен регулируется от 19 см до 110 см, что соответствует частотам от 394MHz до 68MHz соответственно (чем больше выдвинуты колена, тем ниже частота оптимального приема).

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

Не везет с покупкой ESP8266 ESP-12S

С весны пытаюсь заказать два модуля ESP8266 в варианте ESP-12S.


ESP-12S - последний вариант эволюции модулей ESP-12E и ESP-12F. От двух последних отличается отсутствием падов для SPI flash на торце и наличием 4MB flash памяти (по непроверенным слухам).

В мае заказал два модуля на eBay у продавца kingelectronics15. Высокий рейтинг продавца и много продаж внушали доверие. В августе начал пинать продавца на предмет "а где моя посылка" - в итоге возврат средств без каких либо дополнительных вопросов.

Ну бывает, подумал я, и заказал эти модули у продавца caelectronics8. Аналогично высокий рейтинг и много продаж. На этой неделе я обратился к продавцу с тем же вопросом - где моя посылка? В итоге возрат средств.

Появилась мысль, что на почте завелся электронщик, которому приглянулись мои модули. Но эта мысль развеялась, когда я заглянул в транзакции Paypal - оба продавца имеют одинаковый email! В принципе если бы я был более внимателен к мелочам, то в самом начале можно было заметить одинаковый текст в оповещении о заказе. Как там говорят - в одну воронку снаряд дважды не попадает?

В этот раз испытываю удачу на Aliexpress. Теперь заказал пересылку с треком. Надеюсь я не настолько "везуч", чтобы в третий раз наткнуться на этого продавца.

Update 2017-10-24: Сегодня забрал на почте посылку от caelectronics8. Пересылка составила больше 60 дней, но подозрения в нечестности продавца развеялись. Возможно первая посылка от kingelectronics15 действительно потерялась на почте.

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

Dell Latitude e6430 включается со второго раза

На прошлой неделе заметил, что ноутбук жены (Dell Latitude e6430) включается со второго раза. После нажатия кнопки питания на порт-репликаторе на мониторе появляется логотип Dell, висит секунд 15, а затем ноутбук отключается. Если включить еще раз, то логотип пропадает быстро и начинается загрузка системы.

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


Собственно наибольший интерес представляет событие "Power Off - ASF2 force off". Поиск в интернете привел на форумы Dell, где пишут что это очень общая ошибка, которая может значить любые проблемы. Но один из советов - проверить защелкнуты ли замки аккумулятора.

Достал ноутбук из дока и оказалось, что один из замков батареи открыт. Достал и снова установил батарею чтобы оба замка штатно закрылись.

За несколько дней проблема больше не повторилась - посмотрю как будет дальше.

четверг, 13 июля 2017 г.

Обновление Xiaomi Mi4c до LineageOS 14.1

Решил поделиться впечатлениями от обновления своего Xiaomi Mi4c с CyanogenMod 13.1 до LineageOS 14.1. Основная причина обновления - попытка решить проблему с внезапным отключением телефона при заряде батареи 20-30%.

Для обновления использовал вариант прошивки LineageOS от Team Superluminal, firmware от miui 8.2.3.0 и заодно обновил TWRP до 3.1.1 (пришлось откатить TWRP на 3.0.2-0, т.к. первый же OTA update привел к boot loop) . Уже прошло две недели с момента обновления и можно подвести итог:
  • Решилась главная проблема с отключением телефона при заряде батареи ниже 30%. Как и положено на 15% я получаю всплывающее уведомление, которое повторяется на 5% и потом телефон разряжается до нуля и выключается.
  • Работает активация/деактивация второй симки. В CyanogenMod 13.1 не было возможности деактивировать вторую симку и она постоянно оставалась активной. В качестве второй симки у меня установлена туристическая симка от GoodLine и не хочется "случайно" звонить через нее.
Теперь касательно плюшек новой версии Android
  • Я получил последнюю стабильную версию Android 7.1.2 (security patch level: June 5, 2017).
  • Теперь при звонке телефон автоматически включает режим "Do not disturb" и новые смски или уведомления от aNag более не жужжат в ухо во время разговора.
P.S. Заметил что если включить русский язык в настройках интерфейса, то Mi Fit не показывает контакт при входящем звонке или SMS. В этом случае в Mi Fit просто нет нужного пункта. Все приходит в норму, если выбрать английский язык.

Второй момент - если смотреть ролики на Youtube и выбран английский язык в настройках интерфейса, то почти нет рекламы. Ее становится сильно больше, если сменить язык интерфейса на русский.

вторник, 11 июля 2017 г.

Прошляпил обновление signing key для моего репозитария

В пятницу пришло письмо от человека, который указал на истекший срок действия ключа, которым подписывается мой репозитарий.

В APT ошибка выглядит так:

Сущ:10 http://www.tataranovich.com/debian jessie Release
Ошк:13 http://www.tataranovich.com/debian jessie Release.gpg
  Следующие подписи неверные: EXPKEYSIG 836CC41976FB442E Tataranovich.com APT Repository 
Чтение списков пакетов… Готово
W: Произошла ошибка при проверке подписи. Репозиторий не обновлён и будут использованы предыдущие индексные файлы. Ошибка GPG: http://www.tataranovich.com/debian jessie Release: Следующие подписи неверные: EXPKEYSIG 836CC41976FB442E Tataranovich.com APT Repository 
W: Не удалось получить http://www.tataranovich.com/debian/dists/jessie/Release.gpg  Следующие подписи неверные: EXPKEYSIG 836CC41976FB442E Tataranovich.com APT Repository 

Я уже обновил ключ, но для исправления требуется несколько ручных действий:

sudo apt-key adv --keyserver pool.sks-keyservers.net --recv-keys 0x836CC41976FB442E
sudo apt-get update

Кроме этого можно установить пакет tataranovich-keyring отсюда. В этом случае больше шансов, что ситуация не повторится.

В процессе обновления пакета заметил, что теперь ключ нужно класть в /etc/apt/trusted.gpg.d, а не добавлять через apt-key в postinst.

среда, 28 июня 2017 г.

Перестал подключаться PPTP через NAT

Имеется домашний сервер, который маршрутизатор домашней сети и еще много чего, работающий на Debian Jessie. После обновления ядра со штатного 3.16.43-2+deb8u1 до 4.9.30-2~bpo8+1 из backports перестало работать подключение к корпоративной сети через PPTP. Если перезагрузить сервер на старое ядро, то PPTP работает.

Нужные модули загружены:

$ grep pptp /etc/modules
nf_nat_pptp
nf_conntrack_pptp

$ lsmod | awk '/pptp/ {print $1}'
nf_nat_pptp
nf_nat_proto_gre
nf_conntrack_pptp
nf_conntrack_proto_gre
nf_nat
nf_conntrack

Помучился немного и спросил в рассылке debian-russian. Добрые люди подсказали два способа решить проблему:

Добавить дополнительное правило в netfilter:

$ sudo iptables -t raw -A PREROUTING -p tcp -m tcp --dport 1723 -j CT --helper pptp

или включить conntrack helper:

$ sudo sysctl -w net.netfilter.nf_conntrack_helper=1

Больше информации по теме можно почерпнуть тут.

пятница, 16 июня 2017 г.

Xiaomi Mi4c внезапно отключается при заряде батареи 20-30%

Не могу вспомнить когда это случилось первый раз, но похоже мой Xiaomi Mi4c взял привычку отключаться при остаточном заряде 20-30%. В произвольный момент, когда батарея показывает ниже 40% телефон вдруг решает что заряд около нуля и штатно выключается.


На графике батареи видно что с примерно 25% батарея мгновенно "разрядилась" до нуля, а после повторного включения телефона отработала еще несколько часов. Причем повторилась старая проблема с продолжающимся разрядом батареи при подключенном зарядном. Калибровка батареи не помогла - я пробовал полностью разрядить батарею, потом зарядить до 100%, калибровать, разрядить до нуля и снова зарядить до 100%.

В интернете встречаются упоминания, что такое поведение не редкость даже у новых телефонов: произвольное отключение телефона происходит при заряде батареи 20-60%. Похоже это связано с проблемами в прошивке (сейчас у меня установлен CyanogenMod 13.1 от Team Superluminal), т.к. у меня эту проблема появилась относительно недавно и скорее всего связана с последним обновлением прошивки в начале этого года.

Зайдя на форум team superluminal узнал, что теперь они предлагают LineageOS 14.1 для Mi4c - нужно будет попробовать эту прошивку при случае.

Обновлено 5/09/2017: Проблема с внезапным отключением решилась обновлением прошивки до LineageOS 14.1.

четверг, 1 июня 2017 г.

Разрядился телефон будучи подключенный к зарядному устройству

Не первый раз замечаю что мой Xiaomi Mi4c, подключенный перед сном к зарядному устройству (остаточный заряд 20-30%), к утру разряжается почти до нуля или совсем отключается.

Сегодня утром аккумулятор показывал 2% заряд и я сделал скриншот


Перед подключением зарядного было больше 20% заряда, но после отключения экрана телефон не уснул. Зарядное устройство и кабель - родные.

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

вторник, 30 мая 2017 г.

Спустя год заметил что отвалился IPv6 на сервере

В процессе прикручивания сертификата Let's Encrypt к своему сайту обнаружил что он более недоступен по IPv6 извне. Причем судя по статистике траффика в панели управления сервером это произошло еще в июне 2016. Сервер имеет IPv4/IPv6 стек и последний был настроен по принципу "пусть будет". А сейчас при валидации домена Let's Encrypt не может соединиться на IPv6 адрес сайта и проверка не проходит.

Доступность сервера по IPv4 проверяется в nagios из дома, а вот проверку доступности IPv6 пришлось добавить в виде костыля (нет у меня другого сервера с IPv6):

command['check_ipv6']=/usr/lib/nagios/plugins/check_http -6 -H google.com

Похоже что-то изменилось в маршрутизации у хостера, т.к. ipv6 адрес шлюза пингуется, а вот дальше него - тишина.

$ ip -6 a
1: lo: <loopback> mtu 16436 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <broadcast> mtu 1500 qlen 1000
    inet6 2a01:4f8:d13:2742::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::21c:14ff:fe01:1dba/64 scope link 
       valid_lft forever preferred_lft forever

$ ip -6 r
2a01:4f8:d13:2742::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
default via 2a01:4f8:d13:2742::1 dev eth0  metric 1024

$ ip -6 neigh
fe80::3285:a9ff:fea4:1ff7 dev eth0 lladdr 30:85:a9:a4:1f:f7 router STALE
2a01:4f8:d13:2742::1 dev eth0 lladdr 30:85:a9:a4:1f:f7 router STALE

$ ping6 -c 5 2a01:4f8:d13:2742::1
PING 2a01:4f8:d13:2742::1(2a01:4f8:d13:2742::1) 56 data bytes
64 bytes from 2a01:4f8:d13:2742::1: icmp_seq=1 ttl=64 time=0.281 ms
64 bytes from 2a01:4f8:d13:2742::1: icmp_seq=2 ttl=64 time=0.284 ms
64 bytes from 2a01:4f8:d13:2742::1: icmp_seq=3 ttl=64 time=0.250 ms
64 bytes from 2a01:4f8:d13:2742::1: icmp_seq=4 ttl=64 time=0.223 ms
64 bytes from 2a01:4f8:d13:2742::1: icmp_seq=5 ttl=64 time=0.148 ms

--- 2a01:4f8:d13:2742::1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.148/0.237/0.284/0.050 ms

$ ping6 -c5 ipv6.google.com
PING ipv6.google.com(waw02s06-in-x0e.1e100.net) 56 data bytes

--- ipv6.google.com ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4033ms

Посмотрю что завтра ответит тех. поддержка Hetzner.

UPDATE 31/05/2017

Ответ из техподдержки:
Thanks for trying a reboot first. We've now rechecked the routing of your IPv6-net and we were able to find an issue, which we fixed directly and your server is now back online using the mentioned IPv6.
IPv6 снова работает и мне удалось установить сертификат Let's Encrypt для моего сайта.

Обновление BIOS на Dell Latitude E6430

Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.

После публикации информации об уязвимости в Intel AMT CVE-2017-5689 (INTEL-SA-00075) отправился на сайт Dell проверить апдейты. На тот момент обновление прошивки для моего Latitude E6430 еще не было выпущено, но в планах значилось начало июня.

На днях проверил обновления еще раз - уже доступна прошивка A21 с исправлением уязвимости. Последний раз обновлял BIOS в ноутбуке сразу после покупки и потому там установлена старая версия A16.

Для обновления скачиваю все доступные прошивки от A16 до A21, которые предназначены для Latitude E6430 (A16, A17, A18, A20, A21) и создаю загрузочный образ FreeDOS, содержащий в себе скачанные прошивки (загрузочный образ можно скачать тут).

Убедидесь что ваша флешка видна в системе как /dev/sdb. В противном случае рискуете затереть системный диск!
 
Несколько команд для скачивания образа и заливки на флешку:

$ wget http://www.tataranovich.com/public/dell/{e6430_bios_update.img.gz,MD5SUMS}
$ md5sum -c MD5SUMS
$ gunzip e6430_bios_update.img.gz
$ sudo dd if=e6430_bios_update.img of=/dev/sdb

Не продолжайте обновление, если не совпадает контрольная сумма для образа диска!

Далее можно продолжать обновление по аналогии.

Посколько в installation guide для прошивки нет ничего про запрет сквозного обновления, то для ноутбука жены (у нее тоже Latitude E6430) выбрал вариант обновления с версии A16 до A21. Весь процесс обновления занял минут 5 и завершился без ошибок.

А вот с моим ноутбуком такой финт не прошел. На этапе обновления "Sending Intel(R) Management Engine Firmware Update" произошла ошибка "ME FW Update Failed: Internal error: FWU_Buffer". После этого обновление продолжилось и завершилось без ошибок.

Я пробовал гуглить ошибку, но нашел только что ее исправили в обновлении A17. Накатываю прошивку версии A17 - обновилось без проблем. Потом настает очередь A18, A20 и снова A21. В этот раз обновление "Management Engine Firmware" прошло без ошибок.

До обновления версия Intel Management Engine Firmware была 8.1.40.1416, а после установки прошивки A21 стала 8.1.71.3608.

Кстати еще нашел утилиту mei-amt-check для проверки версии AMT:

$ git clone https://github.com/mjg59/mei-amt-check.git
$ cd mei-amt-check
$ make
$ sudo ./mei-amt-check
Intel AMT is present
AMT is unprovisioned

Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.

понедельник, 22 мая 2017 г.

Произвольная скорость порта с Prolific PL2303 в Linux

Тут описаны мои попытки разобраться в настройку нестандартной скорости порта 74880 бит/с используя usb-to-serial конвертор prolific pl2303. Похоже в linux модуль ядра pl2303 реализует только стандартные скорости для передачи данных: 9600, 14400, 28800 и т.д. Но скорость 74880 не входит в этот список и драйвер хотя и принимает настройку через anybaud, но ничего при этом не изменяется.

Я нашел в сети два патча для pl2303, которые решают проблему задания произвольной скорости порта в linux. Первый патч меняет формулу расчета делителя частоты, а второй патч использует эту формулу для любой скорости, не входящей в список поддерживаемых драйвером. Соответственно для стандартных скоростей ничего поменяться не должно.

Чтобы не возиться с установкой модуля в linux я подготовил репозитарий с версией для dkms

sudo apt-get update
sudo apt-get install linux-headers-$(uname -r) dkms
wget -O pl2303-dkms.tar.gz https://github.com/tataranovich/pl2303/archive/master.tar.gz
tar -xzf pl2303-dkms.tar.gz
cd pl2303-master
sudo make install

После выполнения этой команды dkms должен собрать и установить обновленную версию модуля pl2303 и загрузить его в систему. Теперь можно задать произвольную скорость (например через anybaud, которая есть в том же репозитарии):

cd pl2303-master
./anybaud /dev/ttyUSB0 74880
Changed successfully.

воскресенье, 21 мая 2017 г.

Скорость порта 74880 бит/с в Prolific PL2303

Собираю датчик качества воздуха (температура, относительная влажность и содержание углекислоты) на базе esp8266, который будет интегрирован с системой мониторинга. Сейчас у меня esp8266 есть только в виде модуля ESP-01 (выводы модуля vcc, gnd, ch_en, reset, gpio0, gpio2, rx, tx), но уже заказал модуль в варианте ESP-12S.
ESP8266 ESP-01

ESP8266 ESP-12S
На ESP-01 выведены только два gpio, но и те доступны с ограничениями. Оба этих вывода участвуют в выборе режима запуска модуля

Bootloader Modes
Modegpio0gpio2gpio15
UART Download Mode (Programming)010
Flash Startup (Normal)110
SD-Card Boot001

Соответственно gpio0/gpio2 желательно не использовать на модуле ESP-01, но поскольку особого выбора не было, то для подключения датчика температуры и влажности DHT22 (AM2302) я использовал gpio2. Чтобы подключить датчик углекислоты mh-z19 мне нужно использовать uart (выводы rx/tx) и после этого для программирования модуля его придется извлекать. Перед подключением датчика проверяю что выдается в uart помимо отладочных сообщений прошивки.

Подключаю конвертер на базе Prolific PL2303, который я использую для связи с компьютеров и настраиваю порт /dev/ttyUSB0 на скорость 115200 бод:

$ stty -F /dev/ttyUSB0 115200 raw
$ cat /dev/ttyUSB0

После этого жму reset и вижу "мусор" перед первой строчкой, которую выдает прошивка.

ESP8266 UART 115200 bps

Скорее всего это лог встроенного загрузчика, но который передается на другой скорости (не 115200). Попробовал несколько вариантов 9600, 38400, 57600, но разборчивого текста так и не получилось.

После гугления я выяснил что лог загрузчика передается на нестандартной скорости 74880 бод и потому я вижу "мусор" в терминале. Пробую переключить порт на 74880:

$ stty -F /dev/ttyUSB0 74880
stty: invalid argument ‘74880’
Try 'stty --help' for more information.

Облом, не дает задать произвольную скорость, но при этом в linux уже давно есть возможность задавать произвольную скорость для последовательных портов. Нашел простую утилитку anybaud.c, которая позволяет выставить произвольную скорость. Компилирую ее и пробую выставить настройку:

$ wget -O anybaud.c https://gist.githubusercontent.com/peterhurley/fbace59b55d87306a5b8/raw/5017e43f9fde34e9ac37ab2c3fd35b5ca3c3e73f/anybaud.c
$ gcc -static -o anybaud anybaud.c
$ ./anybaud /dev/ttyUSB0 74880
/dev/ttyUSB0 speed changed to 74880 baud

Хотя команда и прошла без ошибок, но лучше не стало

ESP8266 UART 74880 bps
Сообщения прошивки превратились в мусор, но сообщения загрузчика текстом не стали.

Загрузил Windows 7 в VirtualBox, пробросил pl2303 в виртуальную машину и попробовал подключиться к порту через Putty

ESP8266 UART 74880 bps в Putty

Сначала подумал, что это проблемы из-за эмуляции USB в VirtualBox, но переключение скорости порта в Putty на 115200 опровергает эту теорию

ESP8266 UART 115200 bps в Putty
Гугление приносит результат - для поддержки скорости 74880 бод нужно добавить настройку в реестр:

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Ser2pl]
"ExtBaudrate"="74880,2147485264"

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

ESP8266 UART 74880 bps в Putty после патча реестра
Забегая вперед скажу, что я уже нашел способ как пропатчить pl2303 в linux, но напишу об этом в следующий раз.

Обновлено 22/05/2017: описал способ пропатчить модуль ядра pl2303 в linux для поддержки произвольной скорости передачи данных.

среда, 17 мая 2017 г.

Изменения в моем репозитории: Ubuntu Zesty

Добавил поддержку Ubuntu Zesty 17.04 в свой репозиторий и удалил Ubuntu Precise по причине окончания поддержки последнего.

Пакеты для midnight commander (stable и nightly) уже добавлены для Ubuntu Zesty.

Сейчас список поддерживаемых дистрибутивов и архитектур выглядит так:

Debian: wheezy (i386, amd64, armel, armhf), jessie (i386, amd64, armel, armhf, arm64), stretch (i386, amd64), sid (i386, amd64)
Ubuntu: trusty (i386, amd64, armhf, arm64), xenial (i386, amd64), yakkety (i386, amd64), zesty (i386, amd64)

С покупкой raspberry pi 3 планирую добавить полноценный хост для сборки пакетов под архитектуры armel, armhf и arm64. Сейчас пакеты под эти архитектуры собираются в qemu и скорость сборки достаточно медленная.

Начал тестировать jenkins-debian-glue и думать над реорганизацией структуры репозитория. В теперешнем виде пакеты для debian и ubuntu находятся в одной иерархии и к примеру добавление raspbian дает конфликт по именам относительно debian.

четверг, 2 февраля 2017 г.

Настройка suspend to hibernate в Debian Jessie

Ранее я уже писал про экономию заряда батареи ноутбука при использовании suspend to ram (S3). Такой режим называется suspend to hibernate и заключается в автоматическом переходе из S3 (suspend to ram) в S4 (suspend to disk) если пользователь не продолжит работу в течении заданного периода времени.

Прошлое решение базировалось на pm-utils, но с переходом jessie на systemd это перестало работать (#745848). До недавнего времени я пользовался jessie + sysv init и эта проблема меня не касалась, но последнее время все чаще сталкиваюсь с systemd и решил дать ему шанс на домашней системе. Наибольшей проблемой после перехода на systemd стал отвалившийся suspend-to-hibernate.

В wiki archlinux есть вариант для systemd. Пришлось немного доработать их вариант, чтобы он начал работать в debian jessie.

[Unit]
Description=Delayed hibernation trigger
Documentation=https://wiki.archlinux.org/index.php/Power_management
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
Environment="SLEEPLENGTH=+2hours"
ExecStart=-/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM'
ExecStop=-/bin/sh -c '\
  alarm=$(cat $WAKEALARM); \
  now=$(date +%%s); \
  if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
     echo "hibernate triggered"; \
     systemctl hibernate; \
  else \
     echo "normal wakeup"; \
  fi; \
  echo 0 > $WAKEALARM; \
'

[Install]
WantedBy=sleep.target

Этот сервис нужно сохранить в файле /etc/systemd/system/suspend-to-hibernate.service и добавить в suspend.target зависимость на suspend-to-hibernate.service. В противном случае suspend.target не будет дожидаться выполнения suspend-to-hibernate.service.

sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
echo Requires=suspend-to-hibernate.service | sudo tee -a /etc/systemd/system/suspend.target
sudo systemctl enable suspend-to-hibernate.service
sudo systemctl daemon-reload

В будущем планирую интегрировать поддержку systemd в мой laptop-utils и собрать для него пакет.