USMI

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » JL SoC. (杰理芯片) Programmer (Dongle) (Download Tool) Программатор.


JL SoC. (杰理芯片) Programmer (Dongle) (Download Tool) Программатор.

Сообщений 241 страница 260 из 351

241

https://forumupload.ru/uploads/001b/ca/8a/2/t279752.png
https://forumupload.ru/uploads/001b/ca/8a/2/t984412.png
Ногодрыг который 0001011011101111 не отправлял ACK, без него не работает 696/697.
https://forumupload.ru/uploads/001b/ca/8a/2/t880510.jpg

Подпись автора

By Admin

242

BIOS написал(а):

не отправлял ACK, без него не работает 696/697.

точнее это вроде как чип отвечает этим. Но вот код ногодрыга не нравился 695/696 чипам.

Подпись автора

By Admin

243

Буду приделывать разные режимы работы, и делать платку, ну и попутно тестить задумку управления с компа, что бы физически не нажимать кнопочки на донгле, буду пробовать по уарту с батника обращаться . А в сам батник обращается уде IDE. Так что получиться должно.

Подпись автора

By Admin

244

Всем привет.Комрады,подскажите пожалуйста , я вот этим: "Last Full Firmware For Updater - Dongle v4"смогу слить прошивку с рабочего блютуза? Имею на руках  миниколонку "TG-174" - одну рабочую , а другую сгоревшую - на данный момент уже с заменёнными элементами  и новым процессором , купленными с АЛИ-експресс. Есть ли смысл покупать данный донгл? Заранее благодарю за ответ.

Отредактировано rubikon63 (2023-11-05 01:51:18)

245

rubikon63 написал(а):

Всем привет.Комрады,подскажите пожалуйста , я вот этим: "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 подпихивал файл ключа.

246

Givanich

У меня чип 6921A , думаю что должно получиться. И какой мне купить Ардуин из этих  o.O  :
Arduino Nano V3.0 ATmega328P
Arduino UNO REV 3 (made in Italy)
Arduino Leonardo (made in Italy)

247

rubikon63 написал(а):

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)

248

Givanich написал(а):

Покупать донгл нет смысла

Да, за такие деньги да.
Могу посоветовать собрать или на AVR, или хоть даже на том же самом AC6925A - прошивка и схема есть.
А с учетом того что в последнем коде что тут был от меня - там уже работают все чипы (по крайней мерее не только 690 и 692)

Givanich написал(а):

если у вас 690x или 692x, то можете просто разобрать прошивку и собрать заново, потом обрезать jl_isd.fw и залить на новый чип.
на 695x, 696x такой финт не прокатит.

лично я на чипах 6925 обходился без чипкея, просто обрезал прошивку.
для 6955 и 6965 подпихивал файл ключа.

Да, так и есть. Пока что авто разборка прошивок есть только на 690. Остальное все ручками обрезать и пересобрать. 
Для некоторых чипов например как 695 нужно не только разобрать а ещё перешифровать часть прошивки, и только потом резать.
В принципе уже есть годный дампер, и минимальный набор софта для работы с чипами , кейген, перешифровка, расборка, да и много тут инфы описано.

rubikon63 написал(а):

смогу слить прошивку с рабочего блютуза? Имею на руках  миниколонку "TG-174" - одну рабочую , а другую сгоревшую

Добро пожаловать на форум.
Да, если все сделать правильно - все будет работать. На покупать донгл для такого слишком затратно, поиграться пару раз, прошить - можно и на ардуинке собрать.
Сорри за то что не отвечал, работа.

Подпись автора

By Admin

249

Givanich написал(а):

Прошивка которая у меня срабатывает 10 из 10 случаев

Ага, так и задумывал. Вот только щас есть другая версия где работают все чипы... 690/691/692/695/696/697/698/70х
JL SoC. (杰理芯片) Programmer (Dongle) (Download Tool) Программатор.
Вот только я хочу добавить нормальную работу Delay что бы дергать ключ по питанию, не кнопкой ресет, а сделать пару свитч-кейсов для разных режимов работы донгла, для перевода в бутлоадер, для включения, для включения и подключения усб, и тд.
Все работает, но из за Delay() конченого в ардуинке, все идет через сраку, если юзать микросекунды, то там вроде не вписываемся в максимальное значение для микрос, вроде понятно что нужно сделать костыль, но Delay  конечно через сраку в ардуинке....

Подпись автора

By Admin

250

BIOS написал(а):

Добро пожаловать на форум.
Да, если все сделать правильно - все будет работать. На покупать донгл для такого слишком затратно, поиграться пару раз, прошить - можно и на ардуинке собрать.
Сорри за то что не отвечал, работа.

Спасибо ребята большое! :rolleyes:
P.S.Всё таки "Medusa-Pro" была проще, подпаял флэшку без проблем , форматнул и любую прошивку закатал. :crazyfun:

251

rubikon63 написал(а):

P.S.Всё таки "Medusa-Pro" была проще, подпаял флэшку без проблем , форматнул и любую прошивку закатал

Ой ну да ну да, соскреби компаунд, отпаяй, слей/залей/ накатай шары, подготовь место, припаяй, ...Это еще если флешка не привязана к процу. Хотя  и на старых ноклах тоже приходилось парами менять)
Отвалившийся модемы передавали привет)))
Рад коллегам по делу)  :glasses:

Подпись автора

By Admin

252

Накидал тут схемку с платкой на обеде, глядишь кому-нибудь пригодится.
Google Диск

Фото

253

Givanich написал(а):

Накидал тут схемку с платкой на обеде, глядишь кому-нибудь пригодится.

Это альтиум? Как он, юзер френдли?

Подпись автора

By Admin

254

BIOS написал(а):

Это альтиум? Как он, юзер френдли?

Вполне френдли, мануалы довольно хорошо написаны, видосиков много, но их тяга к пересовыванию функций из места к месту в новых версиях, напрягает.
Чертежи по ЕСКД вообще отлично делаются, один раз настроил и фигачишь на потоке.
Да и привык к нему, уже лет 7 в нём работаю.
Почти всеядный, единственное, диптрейс вообще не кушает.
Минимизирует количество ошибок при разводке, но это присуще любому САПР.
Из альтернатив, думал на Cadence пересесть, но никак руки не доходят его изучить.

255

Givanich написал(а):

Из альтернатив, думал на Cadence пересесть, но никак руки не доходят его изучить.

Не не не, не готов я на такие подвиги. Я KiCad освоил после сранного лайоута. Пока что с головой, да и опен сурс, и начиная с 6 версии а щас уже 7, все стало отлично, вполне для производства, и главное исправлено много косяков которые были давно в 5 версии, сейчас отличный САПР.

PCB
Подпись автора

By Admin

256

А easyEDA не практикуете? Там проектами делиться удобно и база компонентов

257

BIOS написал(а):

Не не не, не готов я на такие подвиги. Я KiCad освоил после сранного лайоута. Пока что с головой, да и опен сурс, и начиная с 6 версии а щас уже 7, все стало отлично, вполне для производства, и главное исправлено много косяков которые были давно в 5 версии, сейчас отличный САПР.

Пробовал KiCad когда ещё учился, вроде нетлисты в нём делал для SPICE(программа симуляции).
Но меня тогда напрягло что всё разнесено по разным программам, для некоторых может это и плюс.
А так KiCad вполне годный, рвотного рефлекса не было, как например сейчас от лэйаута. И ведь когда я в нём разводил платы, бррр...
А Cadence уже совсем проф уровень, показывали его на практике, там начальник делал мультиплексор для ИК камеры, выглядило очень серьезно.
Да и подкупает что он есть на линукс, в отличии от Альтиума. Но цена за сие чудо, отбивает желания его изучать.

RoninDev написал(а):

А easyEDA не практикуете? Там проектами делиться удобно и база компонентов

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

Отредактировано Givanich (2023-11-09 09:38:12)

258

kagaimiq написал(а):

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 чипу всегда -    есть проблемы , по большей части только когда отключаешь чип который уже в бутлоадере, и в тот момент атмега с подтягивающими резисторами висит, из за этого чип диспетчер устройств не сразу видит что чип отключили, через пару секунд, он все таки понимает что чип отключили, но из за того что атмега в режиме входа с подтяжкой - комп обратно воспринимает  будто бы что то к нему подключено, и разумеется бьет ошибку опроса дескриптора.  :D
Сегодня пару часов провозился пока понял в чем дело, до этого таких проблем не было, потому что атмега и комп у меня коммутировались через свои ключи, а щас атмега всегда будет висеть на усб чипа, и только комп подключается после того как чип перевели в бутлоадер.

Код:
#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

259

Дебаунс кстати от ложных срабатываний кнопок добавил.

Подпись автора

By Admin

260

BIOS написал(а):

Вот так короче пуллап резисторы на вход не нужно подтягивать, если ноги атмеги подключены параллельно 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


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » JL SoC. (杰理芯片) Programmer (Dongle) (Download Tool) Программатор.