Разборка прошивки электросамоката Xiaomi M365

Форум / Электротранспорт / Электросамокаты / Xiaomi Mijia Electric Scooter / Разборка прошивки электросамоката Xiaomi M365
#прошивка
Форум / Электротранспорт / Электросамокаты / Xiaomi Mijia Electric Scooter / Разборка прошивки электросамоката Xiaomi M365
Open header post
Vladimir Lavrulin
Раздаю лайки
МоскваRating: 4759
Vladimir Lavrulin
13 march 2018, 10:02
Posted: 13 march 2018, 10:02

Думаю, будет правильным оставить здесь ссылку на схожую тему:

https://electro.club/forum/Xiaomi_Mijia_M365_proshivka_syaokata_na_kastomnuyu_versiyu_1000w_do_32_km_ch


Не уверен, что их стоит объединять, т.к. там речь идет о готовом программном продукте.

 1   
Олег
Гость
Олег
14 march 2018, 2:26
Posted: 14 march 2018, 2:26

А зачем необходимо понижать вервию бмс?

Михаил
Гость
Михаил
18 march 2018, 8:59
Posted: 18 march 2018, 8:59

Здравствуйте! Такой вопрос: были ли успехи в изучении протокола подключения и запроса данных о состоянии самоката?

Подумал, было бы любопытно прицепить на руль ардуину с экраном, как велокомп (отображать скорость, пробег, заряд и т.д.)

demonizer
Участник
Rating: 78
demonizer
18 march 2018, 9:04
Posted: 18 march 2018, 9:04
 3   
Антон Бердов
Новичок
Антон Бердов
19 march 2018, 14:54
Posted: 19 march 2018, 14:54

Добрый день! Ищу API к самокату Mi M365, готов заплатить, если можете помочь, свяжитесь пож-та со мной

Alex_VI
Новичок
Alex_VI
26 may 2018, 11:52
Posted: 26 may 2018, 11:52

У меня такой вопрос.

Если алгоритм обновления бмс и головного контроллера одинаков. То почему бы не разобрать загрузчик от БМС и не переписать по подобию загрузчик для STM32? 

Что-то мне подсказывает, что он не сильно сложный

Andrey
Гость
Rating: 1
Andrey
27 may 2018, 9:38
Posted: 27 may 2018, 9:38

Вот тут есть проект open source контроллера


https://eggelectricunicycle.bitbucket.io/MicroWorks_30B4_board.html


плата очень похожа на нашу... я думаю китайцы одно и тоже плодят..


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


https://opensourceebikefirmware.bitbucket.io/windows_instructions/index5.html


 1   
pradeep
Новичок
pradeep
04 june 2018, 15:23
Posted: 04 june 2018, 15:23
Ответ пользователю
Vladimir Lavrulin : 20 february 2017, 14:38
на это сообщение (развернуть)
​​​Предлагаю здесь делиться информацией о прошивке и работе приложений для Xiaomi M365. Основная задача -...
​​​Предлагаю здесь делиться информацией о прошивке и работе приложений для Xiaomi M365. 

Основная задача - сделать аппарат наиболее опциональным.
Чтобы ограничение максимальной скорости было опцией
Чтобы Zero-Start был опцией
​​Ну и т.д. и т.п. :)

Что сейчас есть:
1. История версий прош​​​ивки в txt:
https://electro.club/data/users/2193/files/Xiaomi/CNESCVersion.txt

2. Декомпилированный APK-файл приложения MiHome (одна из версией, распаковалась криво, но много познавательного кода имеется):
https://electro.club/data/users/2193/files/Xiaomi/MiHome_4.0.8_source_from_JADX.rar

I want to develop an Android app so that it connects to M365 bluetooth and get certain values like Battery level,speed,mileage,location.How can i get values into Android app?

Дмитрий
Гость
Дмитрий
12 july 2018, 8:07
Posted: 12 july 2018, 8:07

Всем привет!

Кто прошивал через ST link - программатор контролер? Прошивки bin  использовали те же, что и для прошивки по блютус? 

Пробовал штук 5 прошивок- включаю самокат и просто горит 4 диода.

Андрей
Гость
Андрей
13 july 2018, 20:33
Posted: 13 july 2018, 20:33

Ничего работать не будет - файлы bin это только часть прошивки - в них нет bootloader...

Answers: 1
Дмитрий
Гость
Дмитрий
16 july 2018, 6:40
Posted: 16 july 2018, 6:40
Ответ пользователю
Андрей : 13 july 2018, 20:33
на это сообщение (развернуть)
Ничего работать не будет - файлы bin это только часть прошивки - в них нет bootloader...

Ничего работать не будет - файлы bin это только часть прошивки - в них нет bootloader...

Печально! Ну я это уже методом тыка понял.  И насколько понимаю, прошивки сети тоже нет нигде ? Остаётся только новый контроллер или к Листу?

Андрей
Гость
Андрей
17 july 2018, 21:43
Posted: 17 july 2018, 21:43

У меня тоже один кирпич лежит.. на запчасти. Пришлось заказывать новый контроллер на али экспресс.. 50euro c доставкой за неделю. а лучше выкинуть внутренности и поставить контроллер Infineon... так можно будет разогнать самокат под 40кмч - если батарею заменить.

Ed01
Продвинутый форумчанин
Rating: 583
Ed01
19 july 2018, 15:43
Posted: 19 july 2018, 15:43

По поводу получения полной прошивки: Как ранее было известно, при снятии защиты как снаружи так и изнутри, все данные в чипе стираются.


Но появился инженерный прошивальщик (используется для конструктора прошивок), который льет любые данные в чип контроллера без проверки. На примере ошибочной заливки прошивки от БМС в чип контроллера было видно, что прошивка действительно туда попала и на неё было передано управление (самокат завис).


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

По поводу защиты страниц памяти изнутри и сравнения STM32 и АТМега: Вот цитата из переписки специалистов с другого форума.


Спойлер

Кроме boot-лоадера в полной прошивке присутствуют пользовательские данные. Серийный номер, пробег, текущие настройки рекуперации и круиз-контроля. И эти данные могут быть привязаны к конкретному чипу. Что препятствовало бы клонированию контроллеров.

---

p.s Все это конечно интересно. Вопрос только, как написать такую программу-ридер.

 1   
Ed01
Продвинутый форумчанин
Rating: 583
Ed01
20 july 2018, 18:32
Posted: 20 july 2018, 18:32

Нашел близкий пример (Flash to UART). Адекватный отклик вполне есть. Скрипт, только нужно немного изменить. http://easystm32.ru/for-beginners/38-flash-stm32




 1   
Ed01
Продвинутый форумчанин
Rating: 583
Ed01
23 july 2018, 14:21
Posted: 23 july 2018, 14:21

Попробовал залить в чистый чип на программаторе. Программа работает и извлекает данные в UART.

code

Сложность в следующем:

1). Неизвестно в какой адрес попадет программа при ее заливке в реальный контроллер. А в любом адресе она работать не будет.

2). В компиляторе-линкере (CoIDE) почему-то не удается получить рабочий вариант программы в адресе, отличном от базового (0x08000000 - начало Flash-памяти). А его занимать нельзя, там boot.

3). Сам процесс запуска дополнительной программы внутри чипа, сложнее чем мне казалось раньше. Программа выставляет перед собой таблицу векторов прерываний и других указателей. А сама точка входа в программу может находится далеко не в ее начале. Поэтому, например приём "Трамплин NOP ", тут вряд ли поможет.

Answers: 1
 2   
Conejo
Продвинутый форумчанин
МадридRating: 703
Conejo
24 july 2018, 20:45
Posted: 24 july 2018, 20:45
Ответ пользователю
Ed01 : 23 july 2018, 14:21
на это сообщение (развернуть)
Попробовал залить в чистый чип на программаторе. Программа работает и извлекает данные в UART.[spoiler]Сложность в...

Попробовал залить в чистый чип на программаторе. Программа работает и извлекает данные в UART.

code

Сложность в следующем:

1). Неизвестно в какой адрес попадет программа при ее заливке в реальный контроллер. А в любом адресе она работать не будет.

2). В компиляторе-линкере (CoIDE) почему-то не удается получить рабочий вариант программы в адресе, отличном от базового (0x08000000 - начало Flash-памяти). А его занимать нельзя, там boot.

3). Сам процесс запуска дополнительной программы внутри чипа, сложнее чем мне казалось раньше. Программа выставляет перед собой таблицу векторов прерываний и других указателей. А сама точка входа в программу может находится далеко не в ее начале. Поэтому, например приём "Трамплин NOP ", тут вряд ли поможет.

Начальный адрес прошиваемой части - 0x08001000. Бут соответственно должен быть перед ней. Формат с таблицей векторов в начале стандартен для ядер Cortex-M, вот описание: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/BABIFJFG.html

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

VTOR = 0x08001000

SP = [0x08001000]

PC = [0x08001004]

Возможно даже в сухом остатке ничего другого от него и не требуется :)

Очень простая идея теста на чистом контроллере: шьём бинарник из обновления (т.е. основную часть) по адресу 0x08001000, а в качестве бута шьём по адресу 0x08000000 начальный кусок длины 0x1000 от него же - из него будет задействована только таблица векторов, в которой все указатели смотрят в правильные места в диапазон 0x08001000+. Если основная часть не полагается ни на какую инициализацию из бута, возможно она даже заработает.


А так конечно же интересно слить оригинальные 0x08000000-0x08001000.

Answers: 1
 2   
Ed01
Продвинутый форумчанин
Rating: 583
Ed01
26 july 2018, 1:18
Posted: 26 july 2018, 1:18
Ответ пользователю
Conejo : 24 july 2018, 20:45
на это сообщение (развернуть)
Начальный адрес прошиваемой части - 0x08001000. Бут соответственно должен быть перед ней. Формат с таблицей...

Начальный адрес прошиваемой части - 0x08001000. Бут соответственно должен быть перед ней. Формат с таблицей векторов в начале стандартен для ядер Cortex-M, вот описание: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/BABIFJFG.html

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

VTOR = 0x08001000

SP = [0x08001000]

PC = [0x08001004]

Возможно даже в сухом остатке ничего другого от него и не требуется :)

Очень простая идея теста на чистом контроллере: шьём бинарник из обновления (т.е. основную часть) по адресу 0x08001000, а в качестве бута шьём по адресу 0x08000000 начальный кусок длины 0x1000 от него же - из него будет задействована только таблица векторов, в которой все указатели смотрят в правильные места в диапазон 0x08001000+. Если основная часть не полагается ни на какую инициализацию из бута, возможно она даже заработает.


А так конечно же интересно слить оригинальные 0x08000000-0x08001000.

Спасибо за подсказки!

Проверил с простым самописным бутом. Вот его текст:


#include "stm32f10x.h"
/////////////////////////////////////////////////////// #define APPLICATION_ADDRESS    0x08001000 //адрес начала программы void Go_To_User_App(void)
{
    uint32_t app_jump_address;     typedef void(*pFunction)(void); //объявляем пользовательский тип
    pFunction Jump_To_Application; //и создаём переменную этого типа      __disable_irq();//запрещаем прерывания     app_jump_address = *( uint32_t*) (APPLICATION_ADDRESS + 4); //извлекаем адрес из вектора Reset
    Jump_To_Application = (pFunction)app_jump_address; //приводим его к пользовательскому типу
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //устанавливаем SP приложения
    Jump_To_Application(); //запускаем приложение
} int main(void) {  Go_To_User_App();
}

источник


С этим бутом в адресе 0x08000000, прошивка v1.30 залитая с адреса 0x08001000, запустилась! 

Это видно по миганию диода на шестой ноге чипа.  Заливал в чистый чип через ST-Link на макетке.

На реальном контроллере не пробовал.


В этом случае (с boot-ом, но без пользовательских данных), контроллер может стать рабочим, но не активированным (5км/ч).

---

Внешний вид макетки, утилиты "STM32 ST-LINK Utility" и самописный бут-загрузчик в бинарном формате.

Внимание! Нельзя лить через BT и голову в исправный контроллер  - окирпичится!

Только для попыток поднять чистый чип в неработающем контроллере. И заливки напрямую через ST-LINK.

 4   
Conejo
Продвинутый форумчанин
МадридRating: 703
Conejo
26 july 2018, 15:28
Posted: 26 july 2018, 15:28

Ed01, результат с миганием обнадёживает!

Однако в таком виде до основной прошивки не доходят прерывания (а они там используются, видно), они застревают в "заглушках" бута. Нужно либо перенацелить VTOR куда следует (добавить SCB->VTOR = APPLICATION_ADDRESS), либо просто записать вместо бута копию таблицы векторов основной части, как писал выше - оно хоть и выглядит примитивно, но работать должно идеально, полный минимализм, никакого промежуточного кода вообще, ядро всё сделает само.


Не на чем пока проверять самому, единственную оказавшуюся под рукой плату с STM32F103C6 превратил в ST-LINK для экспериментов с контроллером BMS. Скоро должны дать на эксперименты остальные части скутера, с которого эта BMS, тогда развернусь :)

 3   
Conejo
Продвинутый форумчанин
МадридRating: 703
Conejo
26 july 2018, 15:36
Posted: 26 july 2018, 15:36

Почитал по вычитыванию бута через "подставную" основную часть - в целом в STM32 возможна защита и от такого (PCROP, при включении сектор перестаёт читаться по шине данных вообще, только исполнение из него), но её использование имеет ограничения, как минимум ей нельзя закрывать сектор с таблицей векторов, а нужный нам бут лежит целиком в нём, так что всё должно получиться.


Ред.: на F103 нет PCROP, это только на старших моделях, здесь только RDP, которая от чтения изнутри не защищает.

 2   
Ed01
Продвинутый форумчанин
Rating: 583
Ed01
26 july 2018, 18:31
Posted: 26 july 2018, 18:31
[quote="Conejo"]Ред.: на F103 нет PCROP, это только на старших моделях, здесь только RDP, которая от чтения изнутри не защищает.[/quote]

Да, ранее проверил практически. Из закрытого чипа читает всю flash.

А вот, если эту программу запустить в RAM, то не читает.

---

Чтобы вывести чип из спящего режима (на макетке кнопки включения-то нет), подтянул 3-ю ногу к земле.

Прошивка с "самопальным" бут-загрузчиком точно работает. Светодиодом сигналит ошибку 27 – Неверный серийный номер. Это и понятно, его там нет).


При установке на макетку оригинального закрытого чипа: сигналит разные ошибки на отсутствие периферии.

Еще бы с UART разобраться.

[quote="Conejo"]Нужно либо перенацелить VTOR куда следует (добавить SCB->VTOR = APPLICATION_ADDRESS), либо просто записать вместо бута копию таблицы векторов основной части[/quote]

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

 2