JL SoC. (杰理芯片) Programmer (Dongle) (Download Tool) Программатор.
Сообщений 241 страница 260 из 351
Поделиться2422023-10-06 23:00:36
не отправлял ACK, без него не работает 696/697.
точнее это вроде как чип отвечает этим. Но вот код ногодрыга не нравился 695/696 чипам.
- Подпись автора
By Admin
Поделиться2432023-10-06 23:05:45
Буду приделывать разные режимы работы, и делать платку, ну и попутно тестить задумку управления с компа, что бы физически не нажимать кнопочки на донгле, буду пробовать по уарту с батника обращаться . А в сам батник обращается уде IDE. Так что получиться должно.
- Подпись автора
By Admin
Поделиться2442023-11-05 01:50:29
Всем привет.Комрады,подскажите пожалуйста , я вот этим: "Last Full Firmware For Updater - Dongle v4"смогу слить прошивку с рабочего блютуза? Имею на руках миниколонку "TG-174" - одну рабочую , а другую сгоревшую - на данный момент уже с заменёнными элементами и новым процессором , купленными с АЛИ-експресс. Есть ли смысл покупать данный донгл? Заранее благодарю за ответ.
Отредактировано rubikon63 (2023-11-05 01:51:18)
Поделиться2452023-11-06 15:47:14
Всем привет.Комрады,подскажите пожалуйста , я вот этим: "Last Full Firmware For Updater - Dongle v4"смогу слить прошивку с рабочего блютуза? Имею на руках миниколонку "TG-174" - одну рабочую , а другую сгоревшую - на данный момент уже с заменёнными элементами и новым процессором , купленными с АЛИ-експресс. Есть ли смысл покупать данный донгл? Заранее благодарю за ответ.
Отредактировано rubikon63 (Вчера 06:51:18)
Покупать донгл нет смысла, дешевле и быстрее собрать на ардуино.
Сдампить прошивку сможете, но не факт что заработает на новом чипе, все чипы что стоят в устройствах идут с прожженным chipkey.
Есть способы обойти данную процедуру, да и чип с али по идее должен быть с чипкеем 0xFFFF, то есть в теории сможете "прожечь" чипкей от донора.
если у вас 690x или 692x, то можете просто разобрать прошивку и собрать заново, потом обрезать jl_isd.fw и залить на новый чип.
на 695x, 696x такой финт не прокатит.
лично я на чипах 6925 обходился без чипкея, просто обрезал прошивку.
для 6955 и 6965 подпихивал файл ключа.
Поделиться2462023-11-06 18:29:54
Givanich
У меня чип 6921A , думаю что должно получиться. И какой мне купить Ардуин из этих :
Arduino Nano V3.0 ATmega328P
Arduino UNO REV 3 (made in Italy)
Arduino Leonardo (made in Italy)
Поделиться2472023-11-06 20:38:48
Givanich
У меня чип 6921A , думаю что должно получиться. И какой мне купить Ардуин из этих :
Arduino Nano V3.0 ATmega328P
Arduino UNO REV 3 (made in Italy)
Arduino Leonardo (made in Italy)
Использую Nano, но и UNO на 328p тоже подойдёт.
Схема вот.
Использовал реле HK19F-DC5V-SHG, P-канальный мосфет на питания и N-канальный мосфет на реле.
Всё это нашёл в ближайшем магазине радиотоваров.
Спаял на макетке и радуюсь)
Если будет время, сделаю схему и плату для лута.
Прошивка которая у меня срабатывает 10 из 10 случаев
#define JL_CLK A5 ///USBDP #define JL_DAT A4 ///USBDM #define BUS_CTRL A3 ///USB_BUS_CTRL #define POW_CTRL A2 ///USB_POWER_CTRL #define POW_RESET 2 ///USB_POWER_CTRL #define LED 13 ///LED boolean answer=0; //статус ответа boolean done=0; //0-время не вышло, 1 - время вышло (подача сигналов) boolean setupdone=0; //0-переинициализации не было, 1- была unsigned long ann=0; //засечка времени unsigned long timecount=0; //то же самое) int cnt; //счетчик сигналов bool send_usbkey(void) { pinMode(JL_DAT, OUTPUT); pinMode(JL_CLK, OUTPUT); for (uint16_t mask = 0x8000; mask; mask >>= 1) { digitalWrite(JL_DAT, (mask & 0x16EF) ? HIGH : LOW); digitalWrite(JL_CLK, LOW); delayMicroseconds(10); digitalWrite(JL_CLK, HIGH); } pinMode(JL_DAT, INPUT_PULLUP); pinMode(JL_CLK, INPUT_PULLUP); return (digitalRead(JL_DAT) == LOW) && (digitalRead(JL_CLK) == LOW); } void setup() { pinMode(POW_RESET, INPUT_PULLUP); if(done==0) { pinMode(POW_CTRL, OUTPUT); pinMode(LED, OUTPUT); digitalWrite(LED,1); digitalWrite(LED,0); } else { pinMode(LED, OUTPUT); digitalWrite(LED,0); } } void loop() { if(digitalRead(POW_RESET) == LOW) { digitalWrite(POW_CTRL,1); delay(100); digitalWrite(POW_CTRL,0); } if(answer==0) { //если нет ответа if(cnt==1) { //количество сообщений done=1; //сигналы посланы if(setupdone==0) { //если переинициализации не было setup(); //переинициализация setupdone=1; //переинициализация выполнена timecount= micros(); //старт отсчета 50 микросек } if(digitalRead(JL_DAT)==1) { //если на ноге + answer=1; //статус ответа } else if(micros()>timecount) { //если в течение 50 мкс нет ответа done=0; //сбрасываем все переменные setupdone=0; ann=millis(); timecount=0; answer=0; cnt=0; setup(); //переинициализация } } else { pinMode(BUS_CTRL,OUTPUT); digitalWrite(BUS_CTRL,0); digitalWrite(POW_CTRL,0); delayMicroseconds(1000); pinMode(POW_CTRL,OUTPUT); //digitalWrite(POW_CTRL,1); while (!send_usbkey()); delayMicroseconds(5000); cnt++; } } else { digitalWrite(BUS_CTRL,answer); digitalWrite(POW_CTRL,0); // состояние ключа шины после принятия ответа digitalWrite(LED, answer); //LED } }
Прошивка от админа здесь.
Отредактировано Givanich (2023-11-15 13:40:55)
Поделиться2482023-11-06 21:06:11
Покупать донгл нет смысла
Да, за такие деньги да.
Могу посоветовать собрать или на AVR, или хоть даже на том же самом AC6925A - прошивка и схема есть.
А с учетом того что в последнем коде что тут был от меня - там уже работают все чипы (по крайней мерее не только 690 и 692)
если у вас 690x или 692x, то можете просто разобрать прошивку и собрать заново, потом обрезать jl_isd.fw и залить на новый чип.
на 695x, 696x такой финт не прокатит.лично я на чипах 6925 обходился без чипкея, просто обрезал прошивку.
для 6955 и 6965 подпихивал файл ключа.
Да, так и есть. Пока что авто разборка прошивок есть только на 690. Остальное все ручками обрезать и пересобрать.
Для некоторых чипов например как 695 нужно не только разобрать а ещё перешифровать часть прошивки, и только потом резать.
В принципе уже есть годный дампер, и минимальный набор софта для работы с чипами , кейген, перешифровка, расборка, да и много тут инфы описано.
смогу слить прошивку с рабочего блютуза? Имею на руках миниколонку "TG-174" - одну рабочую , а другую сгоревшую
Добро пожаловать на форум.
Да, если все сделать правильно - все будет работать. На покупать донгл для такого слишком затратно, поиграться пару раз, прошить - можно и на ардуинке собрать.
Сорри за то что не отвечал, работа.
- Подпись автора
By Admin
Поделиться2492023-11-06 21:13:31
Прошивка которая у меня срабатывает 10 из 10 случаев
Ага, так и задумывал. Вот только щас есть другая версия где работают все чипы... 690/691/692/695/696/697/698/70х
JL SoC. (杰理芯片) Programmer (Dongle) (Download Tool) Программатор.
Вот только я хочу добавить нормальную работу Delay что бы дергать ключ по питанию, не кнопкой ресет, а сделать пару свитч-кейсов для разных режимов работы донгла, для перевода в бутлоадер, для включения, для включения и подключения усб, и тд.
Все работает, но из за Delay() конченого в ардуинке, все идет через сраку, если юзать микросекунды, то там вроде не вписываемся в максимальное значение для микрос, вроде понятно что нужно сделать костыль, но Delay конечно через сраку в ардуинке....
- Подпись автора
By Admin
Поделиться2502023-11-06 22:52:13
Добро пожаловать на форум.
Да, если все сделать правильно - все будет работать. На покупать донгл для такого слишком затратно, поиграться пару раз, прошить - можно и на ардуинке собрать.
Сорри за то что не отвечал, работа.
Спасибо ребята большое!
P.S.Всё таки "Medusa-Pro" была проще, подпаял флэшку без проблем , форматнул и любую прошивку закатал.
Поделиться2512023-11-06 23:10:39
P.S.Всё таки "Medusa-Pro" была проще, подпаял флэшку без проблем , форматнул и любую прошивку закатал
Ой ну да ну да, соскреби компаунд, отпаяй, слей/залей/ накатай шары, подготовь место, припаяй, ...Это еще если флешка не привязана к процу. Хотя и на старых ноклах тоже приходилось парами менять)
Отвалившийся модемы передавали привет)))
Рад коллегам по делу)
- Подпись автора
By Admin
Поделиться2522023-11-08 15:35:41
Накидал тут схемку с платкой на обеде, глядишь кому-нибудь пригодится.
Google Диск
Поделиться2532023-11-08 17:22:39
Накидал тут схемку с платкой на обеде, глядишь кому-нибудь пригодится.
Это альтиум? Как он, юзер френдли?
- Подпись автора
By Admin
Поделиться2542023-11-08 18:08:12
Это альтиум? Как он, юзер френдли?
Вполне френдли, мануалы довольно хорошо написаны, видосиков много, но их тяга к пересовыванию функций из места к месту в новых версиях, напрягает.
Чертежи по ЕСКД вообще отлично делаются, один раз настроил и фигачишь на потоке.
Да и привык к нему, уже лет 7 в нём работаю.
Почти всеядный, единственное, диптрейс вообще не кушает.
Минимизирует количество ошибок при разводке, но это присуще любому САПР.
Из альтернатив, думал на Cadence пересесть, но никак руки не доходят его изучить.
Поделиться2552023-11-08 18:24:04
Из альтернатив, думал на Cadence пересесть, но никак руки не доходят его изучить.
Не не не, не готов я на такие подвиги. Я KiCad освоил после сранного лайоута. Пока что с головой, да и опен сурс, и начиная с 6 версии а щас уже 7, все стало отлично, вполне для производства, и главное исправлено много косяков которые были давно в 5 версии, сейчас отличный САПР.
- Подпись автора
By Admin
Поделиться2562023-11-08 21:57:14
А easyEDA не практикуете? Там проектами делиться удобно и база компонентов
Поделиться2572023-11-09 09:36:04
Не не не, не готов я на такие подвиги. Я KiCad освоил после сранного лайоута. Пока что с головой, да и опен сурс, и начиная с 6 версии а щас уже 7, все стало отлично, вполне для производства, и главное исправлено много косяков которые были давно в 5 версии, сейчас отличный САПР.
Пробовал KiCad когда ещё учился, вроде нетлисты в нём делал для SPICE(программа симуляции).
Но меня тогда напрягло что всё разнесено по разным программам, для некоторых может это и плюс.
А так KiCad вполне годный, рвотного рефлекса не было, как например сейчас от лэйаута. И ведь когда я в нём разводил платы, бррр...
А Cadence уже совсем проф уровень, показывали его на практике, там начальник делал мультиплексор для ИК камеры, выглядило очень серьезно.
Да и подкупает что он есть на линукс, в отличии от Альтиума. Но цена за сие чудо, отбивает желания его изучать.
А easyEDA не практикуете? Там проектами делиться удобно и база компонентов
EasyEDA не плох, в том плане что очень много пользовательских компонентов, грешил, брал оттуда посадочные когда лень было самому рисовать.
Простой и понятный интерфейс.
Для начала он не плох, но мне кажется, для 4 и более слоев уже не катит.
Отредактировано Givanich (2023-11-09 09:38:12)
Поделиться2582023-12-10 02:16:55
for (uint16_t mask = 0x8000; mask; mask >>= 1) {
digitalWrite(JL_DAT, (mask & 0x16EF) ? HIGH : LOW);digitalWrite(JL_CLK, LOW);
delayMicroseconds(10);
digitalWrite(JL_CLK, HIGH);
delayMicroseconds(10);
}pinMode(JL_DAT, INPUT_PULLUP);
pinMode(JL_CLK, INPUT_PULLUP);
Вот так короче пуллап резисторы на вход не нужно подтягивать, если ноги атмеги подключены параллельно JL чипу всегда - есть проблемы , по большей части только когда отключаешь чип который уже в бутлоадере, и в тот момент атмега с подтягивающими резисторами висит, из за этого чип диспетчер устройств не сразу видит что чип отключили, через пару секунд, он все таки понимает что чип отключили, но из за того что атмега в режиме входа с подтяжкой - комп обратно воспринимает будто бы что то к нему подключено, и разумеется бьет ошибку опроса дескриптора.
Сегодня пару часов провозился пока понял в чем дело, до этого таких проблем не было, потому что атмега и комп у меня коммутировались через свои ключи, а щас атмега всегда будет висеть на усб чипа, и только комп подключается после того как чип перевели в бутлоадер.
#define JL_CLK A5 ///USBDP #define JL_DAT A4 ///USBDM const int buttonPin1 = 2; // Пин для кнопки 1 const int buttonPin2 = 3; // Пин для кнопки 2 const int buttonPin3 = 4; // Пин для кнопки 3 const int buttonPin4 = 5; // Пин для кнопки 4 const int POW_CTRL = 13; // Пин для светодиода const int BUS_CTRL = 12; const int LED_MODE1 = 8; const int LED_MODE2 = 9; const int LED_MODE3 = 10; const int LED_MODE4 = 11; int buttonState1 = 0; // Текущее состояние кнопки 1 int buttonState2 = 0; // Текущее состояние кнопки 2 int buttonState3 = 0; // Текущее состояние кнопки 3 int buttonState4 = 0; // Текущее состояние кнопки 4 int lastButtonState1 = 0; // Предыдущее состояние кнопки 1 int lastButtonState2 = 0; // Предыдущее состояние кнопки 2 int lastButtonState3 = 0; // Предыдущее состояние кнопки 3 int lastButtonState4 = 0; // Предыдущее состояние кнопки 4 unsigned long lastSwitchMillis = 0; // Время последнего изменения режима const long interval = 300; // Интервал между изменениями режима (в миллисекундах) const int debounceDelay = 50; // Время дебаунсинга (в миллисекундах) boolean answer=0; //статус ответа boolean done=0; //0-время не вышло, 1 - время вышло (подача сигналов) boolean setupdone=0; //0-переинициализации не было, 1- была unsigned long ann=0; //засечка времени unsigned long timecount=0; //то же самое) int cnt; //счетчик сигналов int mode = 0; // Текущий режим bool send_usbkey(void) { pinMode(JL_DAT, OUTPUT); pinMode(JL_CLK, OUTPUT); for (uint16_t mask = 0x8000; mask; mask >>= 1) { digitalWrite(JL_DAT, (mask & 0x16EF) ? HIGH : LOW); digitalWrite(JL_CLK, LOW); delayMicroseconds(10); digitalWrite(JL_CLK, HIGH); } pinMode(JL_DAT, INPUT); pinMode(JL_CLK, INPUT); return (digitalRead(JL_DAT) == LOW) && (digitalRead(JL_CLK) == LOW); } void setup() { pinMode(buttonPin1, INPUT_PULLUP); pinMode(buttonPin2, INPUT_PULLUP); pinMode(buttonPin3, INPUT_PULLUP); pinMode(buttonPin4, INPUT_PULLUP); pinMode(POW_CTRL, OUTPUT); pinMode(BUS_CTRL, OUTPUT); pinMode(LED_MODE1, OUTPUT); pinMode(LED_MODE2, OUTPUT); pinMode(LED_MODE3, OUTPUT); pinMode(LED_MODE4, OUTPUT); } void loop() { unsigned long currentMillis = millis(); // Чтение состояния кнопок с учетом дебаунсинга int newButtonState1 = digitalRead(buttonPin1); int newButtonState2 = digitalRead(buttonPin2); int newButtonState3 = digitalRead(buttonPin3); int newButtonState4 = digitalRead(buttonPin4); if (newButtonState1 != buttonState1) { lastSwitchMillis = currentMillis; delay(debounceDelay); newButtonState1 = digitalRead(buttonPin1); } if (newButtonState2 != buttonState2) { lastSwitchMillis = currentMillis; delay(debounceDelay); newButtonState2 = digitalRead(buttonPin2); } if (newButtonState3 != buttonState3) { lastSwitchMillis = currentMillis; delay(debounceDelay); newButtonState3 = digitalRead(buttonPin3); } if (newButtonState4 != buttonState4) { lastSwitchMillis = currentMillis; delay(debounceDelay); newButtonState4 = digitalRead(buttonPin4); } // Обновление состояния кнопок buttonState1 = newButtonState1; buttonState2 = newButtonState2; buttonState3 = newButtonState3; buttonState4 = newButtonState4; // Переключение режима при нажатии на кнопку if (buttonState1 != lastButtonState1 && buttonState1 == LOW) { mode = 1; digitalWrite(BUS_CTRL,0); digitalWrite(POW_CTRL, LOW); digitalWrite(LED_MODE1, LOW); digitalWrite(LED_MODE2, LOW); digitalWrite(LED_MODE3, LOW); digitalWrite(LED_MODE4, LOW); done=0; //сбрасываем все переменные setupdone=0; ann=millis(); timecount=0; answer=0; cnt=0; setup(); } if (buttonState2 != lastButtonState2 && buttonState2 == LOW) { mode = 2; digitalWrite(BUS_CTRL,0); digitalWrite(POW_CTRL, LOW); digitalWrite(LED_MODE1, LOW); digitalWrite(LED_MODE2, LOW); digitalWrite(LED_MODE3, LOW); digitalWrite(LED_MODE4, LOW); } if (buttonState3 != lastButtonState3 && buttonState3 == LOW) { mode = 3; digitalWrite(BUS_CTRL,0); digitalWrite(POW_CTRL, LOW); digitalWrite(LED_MODE1, LOW); digitalWrite(LED_MODE2, LOW); digitalWrite(LED_MODE3, LOW); digitalWrite(LED_MODE4, LOW); } if (buttonState4 != lastButtonState4 && buttonState4 == LOW) { mode = 4; digitalWrite(POW_CTRL, LOW); digitalWrite(LED_MODE1, LOW); digitalWrite(LED_MODE2, LOW); digitalWrite(LED_MODE3, LOW); digitalWrite(LED_MODE4, LOW); } // Обработка режимов и управление светодиодом switch (mode) { case 1: if (currentMillis - lastSwitchMillis >= interval) { digitalWrite(POW_CTRL, HIGH); // Включаем светодиод после заданной задержки digitalWrite(LED_MODE1, HIGH); { if(answer==0) { if(cnt==2){ //количество сообщений done=1; //сигналы посланы if(setupdone==0){ //если переинициализации не было setup(); //переинициализация setupdone=1; //переинициализация выполнена timecount= micros(); //старт отсчета 50 микросек } if(digitalRead(JL_CLK)==1){ //если на ноге + answer=1; //статус ответа }else if(micros()>timecount){ //если в течение 50 мкс нет ответа done=0; //сбрасываем все переменные setupdone=0; ann=millis(); timecount=0; answer=0; cnt=0; setup(); //переинициализация } }else{ while (!send_usbkey()); delayMicroseconds(4000); cnt++; } }else{ digitalWrite(BUS_CTRL,1); digitalWrite(POW_CTRL,1); // состояние ключа шины после принятия ответа } } } break; case 2: if (currentMillis - lastSwitchMillis >= interval) { digitalWrite(POW_CTRL, HIGH); digitalWrite(LED_MODE2, HIGH); digitalWrite(BUS_CTRL,1); { } } break; case 3: if (currentMillis - lastSwitchMillis >= interval) { digitalWrite(POW_CTRL, HIGH); digitalWrite(LED_MODE3, HIGH); } break; case 4: if (currentMillis - lastSwitchMillis >= interval) { digitalWrite(POW_CTRL, HIGH); digitalWrite(LED_MODE4, HIGH); } break; } // Обновление предыдущего состояния кнопок lastButtonState1 = buttonState1; lastButtonState2 = buttonState2; lastButtonState3 = buttonState3; lastButtonState4 = buttonState4; }
При нажатии кнопки 1 - все чипы стабильно 10 из 10 раз переходят в бутлоадер в первую же секунду. 690/692/695/696/697/698/
Остальные три режима не доделал еще, там будут всякие плюшки типа подключить как бутлоадер, или загрузить чип, и подключить как усб устройство, переключение усб/уарт, и еще всякого)
Главное - без сранного всратого Delay(); который портит всю суть ардуинки.
Можно выкинуть остальных три режима, и просто одной кнопкой (не ресетом как раньше) переводить любые чипы в бутлоадер. Тоесть уже стабильный результат. Который может каждый получить просто прошив ардуинку. Ну и свои донглы можно клепать.
- Подпись автора
By Admin
Поделиться2592023-12-10 03:01:14
Дебаунс кстати от ложных срабатываний кнопок добавил.
- Подпись автора
By Admin
Поделиться2602023-12-10 03:24:40
Вот так короче пуллап резисторы на вход не нужно подтягивать, если ноги атмеги подключены параллельно JL чипу всегда - есть проблемы , по большей части только когда отключаешь чип который уже в бутлоадере
В исходном варианте у меня эти подтяжки выключаются по выходу из цикла отправки ключа (while (!send_usbkey());), а в привидённом здесь коде это нигде не делается.
Но вообще да, от встроенных подятжек нету толка так как у них достаточно высокое сопротивление (заявлено от 20 до 50 кОм), из-за чего проседает уровень более чем в два раза (ну хотя бы из-за подтяжек на землю по 15 кОм на USB порте), и цикл обрывается ещё не начавшись, так как атмега посчитала что на входах появился низкий уровень.
Я попробовал сначала использовать внешнюю подтяжку (ну сначала я это делал на RP2040, где подтяжки заявлены вообще по 50..80 кОм), и оно работало в общем-то идеально.
Также я опробовал вариант с проверкой подтяжки на D+, но там вроде есть проблема, что если вместе с атмегой к чипу я подвожу USB от компа, то всё работает, но если к атмеге подключен только чип, то ничего не работает.. Но в твоём коде вроде именно это и проверяется.
Вот мой вариант с обоими методами определения (с внешней подтяжкой или проверка D+), вместе с простеньким управлением по UART (особо не старался, использовал для тестов)
В принципе сюда можно уже приделать управление с кнопок, или что-то ещё, может допилить управление по UART..
#define POWER_CTRL 9 //A2 #define USB_ENABLE A3 #define JL_DAT 11 //A4 /* USBDM */ #define JL_CLK 12 //A5 /* USBDP */ #define PULL_CTRL 10 /* D+/D- pullup */ //#define EXT_PULLUP /*------------------------------------------*/ bool powered_on = false; bool dlmode_enter = false; void power_off(void) { powered_on = false; digitalWrite(USB_ENABLE, LOW); digitalWrite(POWER_CTRL, LOW); } void power_on(void) { if (powered_on) { power_off(); /* Power cycle */ delay(250); } powered_on = true; digitalWrite(POWER_CTRL, HIGH); } bool send_usbkey(void) { pinMode(JL_DAT, OUTPUT); pinMode(JL_CLK, OUTPUT); for (uint16_t mask = 0x8000; mask; mask >>= 1) { digitalWrite(JL_DAT, (mask & 0x16EF) ? HIGH : LOW); digitalWrite(JL_CLK, LOW); delayMicroseconds(10); digitalWrite(JL_CLK, HIGH); delayMicroseconds(10); } pinMode(JL_DAT, INPUT); pinMode(JL_CLK, INPUT); #ifdef EXT_PULLUP return digitalRead(JL_DAT) == LOW && digitalRead(JL_CLK) == LOW; /* ACK signalling */ #else return digitalRead(JL_CLK) == HIGH && digitalRead(JL_DAT) == LOW; /* D+ pullup */ #endif } /*------------------------------------------*/ void setup() { Serial.begin(19200); digitalWrite(POWER_CTRL, LOW); digitalWrite(USB_ENABLE, LOW); pinMode(POWER_CTRL, OUTPUT); pinMode(USB_ENABLE, OUTPUT); pinMode(JL_DAT, INPUT); pinMode(JL_CLK, INPUT); #ifdef EXT_PULLUP pinMode(PULL_CTRL, INPUT); #endif Serial.println(F("--- JL dongle ---")); } void loop() { if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (cmd == "off") { dlmode_enter = false; power_off(); } else if (cmd == "on" || cmd == "on-usb") { dlmode_enter = false; power_on(); digitalWrite(USB_ENABLE, cmd == "on-usb"); } else if (cmd == "download") { dlmode_enter = true; } } if (dlmode_enter) { bool succeed = false; power_on(); #ifdef EXT_PULLUP pinMode(PULL_CTRL, OUTPUT); digitalWrite(PULL_CTRL, HIGH); #endif for (int i = 0; i < 100 && !succeed; i++) succeed = send_usbkey(); #ifdef EXT_PULLUP pinMode(PULL_CTRL, INPUT); #endif if (succeed) { digitalWrite(USB_ENABLE, HIGH); dlmode_enter = false; Serial.println(F("done!")); } else { Serial.write('.'); } } }
Отредактировано kagaimiq (2023-12-10 03:26:26)
- Подпись автора
水Mizu-DEC JLtech since 22.06.2019