{"id":4616,"date":"2025-11-29T15:07:10","date_gmt":"2025-11-29T21:07:10","guid":{"rendered":"https:\/\/cocoalopez.com\/blog\/?p=4616"},"modified":"2025-11-29T15:07:17","modified_gmt":"2025-11-29T21:07:17","slug":"how-i-recovered-my-soft-bricked-lilygo-t-watch-s3-after-the-factory-sketch-killed-usb-uploads","status":"publish","type":"post","link":"https:\/\/cocoalopez.com\/blog\/?p=4616","title":{"rendered":"How I Recovered My \u201cSoft-Bricked\u201d LilyGo T-Watch-S3 After the Factory Sketch Killed USB Uploads"},"content":{"rendered":"\n<p>If you own a LilyGo T-Watch-S3 (2022 version) and you ever run the official \u201cFactory Test\u201d example from the LilyGo libraries\u2026 congratulations, you just discovered one of the most common (and frustrating) ESP32-S3 traps in 2025.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Hardware &amp; Software I Was Using<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>LilyGo T-Watch-S3 (2022) \u2013 ESP32-S3 with 16 MB flash + 8 MB PSRAM<\/li>\n\n\n\n<li>Arduino IDE 1.8.19 (yes, the old one \u2013 this actually makes the problem worse)<\/li>\n\n\n\n<li>ESP32 board package inside Arduino: the old LilyGo fork (esp-x32 2411)<\/li>\n\n\n\n<li>TFT_eSPI + LilyGo libraries from their GitHub examples<\/li>\n\n\n\n<li>Windows 10<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">What Happened \u2013 The Soft-Brick Explained<\/h3>\n\n\n\n<p>The factory demo sketch enables native USB (TinyUSB) on the ESP32-S3.<br>That instantly disables the normal USB-to-UART bridge (CP210x\/CH910x) you had when the watch was new.<br>Result:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No more COM port when you plug it in<\/li>\n\n\n\n<li>Windows shows \u201cThe last USB device you connected malfunctioned\u201d or \u201cUnknown device\u201d<\/li>\n\n\n\n<li>Arduino IDE can\u2019t upload anything \u2192 you\u2019re stuck<br>Thousands of users think the watch is dead. It\u2019s not \u2013 it\u2019s just in native-USB purgatory.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The Recovery Path That Actually Worked (After Days1 of Pain)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Force bootloader mode<\/li>\n\n\n\n<li>Hold the tiny BOOT button on the back \u2192 plug USB \u2192 keep holding for 10-12 seconds \u2192 release.<\/li>\n\n\n\n<li>Sometimes a COM port (COM10 in my case) appears for 20-30 seconds.Lower upload speed to 115200 (921600 almost always times out in this state).The magic half-step: manual erase via esptool<\/li>\n\n\n\n<li>This was the turning point. Even when Arduino kept failing, this command always connected and erased the flash:<\/li>\n\n\n\n<li><code>esptool.py --chip esp32s3 --port COM10 --baud 57600 erase_flash<\/code><\/li>\n\n\n\n<li>(At 57600 baud it finally worked without timeout. The erase takes ~90 seconds.)<\/li>\n\n\n\n<li>Immediate Arduino upload right after erase<\/li>\n\n\n\n<li>Board: LilyGo T-Watch-S3<\/li>\n\n\n\n<li>Erase All Flash: Enabled (first time only)<\/li>\n\n\n\n<li>Upload Speed: 115200<\/li>\n\n\n\n<li>Sketch: any tiny one, e.g.<br><code>void setup() { Serial.begin(115200); } void loop() { Serial.println(\"I\u2019m alive again!\"); delay(1000); }<\/code><br><br>The first upload often \u201cdrops\u201d at 80-90 % with \u201cWrite timeout\u201d \u2013 this is normal.<\/li>\n\n\n\n<li>The bootloader, partition table and most of the app were already written.<\/li>\n\n\n\n<li>One final normal upload (no erase this time)<\/li>\n\n\n\n<li>Hold BOOT \u2192 plug \u2192 hold 10 s \u2192 upload again.<\/li>\n\n\n\n<li>This time it finishes 100 % in ~3 seconds with \u201cHard resetting via RTS pin\u2026 Done\u201d.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">The Happy EndingAfter that second successful upload:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Normal COM port appears every single time I plug the watch in<\/li>\n\n\n\n<li>No more boot button gymnastics<\/li>\n\n\n\n<li>Uploads work at 921600 again<\/li>\n\n\n\n<li>Serial Monitor shows my victory messages<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR \u2013 The Exact Commands That Saved My Watch<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n:: 1. Get into bootloader (hold BOOT 10-12 s while plugging)\n:: 2. Erase everything (this breaks the native-USB curse)\nesptool.py --chip esp32s3 --port COM10 --baud 57600 erase_flash\n\n:: 3. Immediately upload once with Arduino IDE (115200 baud, erase enabled)\n:: 4. Upload a second time normally \u2192 done forever\n<\/pre><\/div>\n\n\n<p>If you ever see \u201cdevice malfunctioned\u201d on your T-Watch-S3 after running the factory example, don\u2019t panic and don\u2019t throw it away. Just follow the steps above \u2013 especially the low-baud esptool erase \u2013 and you\u2019ll be back in business in under 10 minutes.Hope this saves someone else the 26+ hours of head-scratching I went through! <img decoding=\"async\" style=\"\" src=\"https:\/\/abs-0.twimg.com\/emoji\/v2\/svg\/1f605.svg\" alt=\"\ud83d\ude05\">\u2014 Edu (November 2025)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you own a LilyGo T-Watch-S3 (2022 version) and you ever run the official \u201cFactory Test\u201d example from the LilyGo libraries\u2026 congratulations, you just discovered one of the most common (and frustrating) ESP32-S3 traps in 2025. The Hardware &amp; Software I Was Using What Happened \u2013 The Soft-Brick Explained The factory demo sketch enables native [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4617,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1002],"tags":[],"class_list":["post-4616","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-featured"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2025\/11\/Grok-Success-ESP-T-watch.jpg?fit=1491%2C819&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9XJix-1cs","jetpack-related-posts":[{"id":3034,"url":"https:\/\/cocoalopez.com\/blog\/?p=3034","url_meta":{"origin":4616,"position":0},"title":"Arduino MKR1000 &#8211; Iot Update Firmware First time setup","author":"cgmodeler","date":"March 19, 2021","format":false,"excerpt":"So you bought an Arduino MKR1000 and would like to quick start making some experiments, unfortunatedly it's no so quick since it seems that the firmware that the boards use is so outdated that even Iot Arduino Cloud service cannot detect them and throws the following error after trying the\u2026","rel":"","context":"In &quot;Featured&quot;","block_context":{"text":"Featured","link":"https:\/\/cocoalopez.com\/blog\/?cat=1002"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2021\/03\/image-6.png?fit=624%2C708&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2021\/03\/image-6.png?fit=624%2C708&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2021\/03\/image-6.png?fit=624%2C708&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":2561,"url":"https:\/\/cocoalopez.com\/blog\/?p=2561","url_meta":{"origin":4616,"position":1},"title":"TUTORIALES DE ANIMACI\u00d3N POR TONIKO PANTOJA","author":"cgmodeler","date":"May 3, 2017","format":false,"excerpt":"https:\/\/www.youtube.com\/watch?v=86tqKH3zxuM TIMING CHARTS https:\/\/www.youtube.com\/watch?v=q2GKZef8jWs H\u00c1BITOS EN LA ANIMACI\u00d3N TRADICIONAL https:\/\/www.youtube.com\/watch?v=0rp3zXBEhCE H\u00c1BITOS PARA INBETWEENING Y TIMING CHARTS https:\/\/www.youtube.com\/watch?v=wdPbiy-8BRo&t=694s INTRODUCCI\u00d3N A LOS BREAKDOWNS","rel":"","context":"In &quot;Featured&quot;","block_context":{"text":"Featured","link":"https:\/\/cocoalopez.com\/blog\/?cat=1002"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2017\/05\/maxresdefault.jpg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2017\/05\/maxresdefault.jpg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2017\/05\/maxresdefault.jpg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2017\/05\/maxresdefault.jpg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2017\/05\/maxresdefault.jpg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":2029,"url":"https:\/\/cocoalopez.com\/blog\/?p=2029","url_meta":{"origin":4616,"position":2},"title":"CINEMA 4D BUG ISSUE con el Viewport","author":"cgmodeler","date":"December 23, 2016","format":"video","excerpt":"Por alguna extra\u00f1a raz\u00f3n, el CINEMA4D \/ BODYPAINT tiene un bug muy extra\u00f1o que no te deja hacer absolutamente nada en el VIEWPORT m\u00e1s que rotar el objeto. Si usas bodypaint y te vas al UV TEXTURE puedes pintar sin problemas pero cualquier operaci\u00f3n en el viewport es imposible. No\u2026","rel":"","context":"In &quot;La vida en Tokyo&quot;","block_context":{"text":"La vida en Tokyo","link":"https:\/\/cocoalopez.com\/blog\/?cat=18"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2016\/12\/sddefault.jpg?fit=640%2C480&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2016\/12\/sddefault.jpg?fit=640%2C480&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2016\/12\/sddefault.jpg?fit=640%2C480&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":2660,"url":"https:\/\/cocoalopez.com\/blog\/?p=2660","url_meta":{"origin":4616,"position":3},"title":"Tutorial 10 minutes to better painting Marco Bucci","author":"cgmodeler","date":"April 26, 2018","format":false,"excerpt":"Merging Shapes https:\/\/www.youtube.com\/watch?v=Nap7dwHjD9Y Visual Language https:\/\/www.youtube.com\/watch?v=9fknSkyN6_0 Digital Brushwork https:\/\/www.youtube.com\/watch?v=CzCGP6kUvLU Good Shapes https:\/\/www.youtube.com\/watch?v=-ZknWKTpc90 Colour Harmony https:\/\/www.youtube.com\/watch?v=4LhcNbFMkTw","rel":"","context":"In &quot;Featured&quot;","block_context":{"text":"Featured","link":"https:\/\/cocoalopez.com\/blog\/?cat=1002"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2018\/04\/tutorial-10-minutes-to-better-painting-marco-bucci.jpg?fit=736%2C414&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2018\/04\/tutorial-10-minutes-to-better-painting-marco-bucci.jpg?fit=736%2C414&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2018\/04\/tutorial-10-minutes-to-better-painting-marco-bucci.jpg?fit=736%2C414&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2018\/04\/tutorial-10-minutes-to-better-painting-marco-bucci.jpg?fit=736%2C414&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":3674,"url":"https:\/\/cocoalopez.com\/blog\/?p=3674","url_meta":{"origin":4616,"position":4},"title":"WF-1000XM3 can&#8217;t connect with Windows 10 and Stutterring playback","author":"cgmodeler","date":"September 19, 2022","format":false,"excerpt":"If you get the following errors when trying to pair the WF-1000XM3 on Windows 10: that didn't work make sure your bluetooth device is still discoverableThey don't appear as a sound device despite being paired alreadyThey show up but you can't select them as audio devices. The solution is to\u2026","rel":"","context":"In &quot;Featured&quot;","block_context":{"text":"Featured","link":"https:\/\/cocoalopez.com\/blog\/?cat=1002"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2022\/09\/imagen-1.png?fit=780%2C567&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2022\/09\/imagen-1.png?fit=780%2C567&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2022\/09\/imagen-1.png?fit=780%2C567&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2022\/09\/imagen-1.png?fit=780%2C567&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":1857,"url":"https:\/\/cocoalopez.com\/blog\/?p=1857","url_meta":{"origin":4616,"position":5},"title":"Miyazaki \/ Making of The Wind Rises (extractos)","author":"cgmodeler","date":"July 20, 2014","format":"video","excerpt":"Interesantes extractos del making of para The wind rises (Kaze Tachinu). Sobre todo la parte d\u00f3nde Miyazaki expresa sus sentimientos sobre el arte de hacer animaci\u00f3n y los hobbies as\u00ed como su visi\u00f3n sobre el futuro del estudio. Algo muy interesante pues en el resto de los estudios en Jap\u00f3n\u2026","rel":"","context":"In &quot;La vida en Tokyo&quot;","block_context":{"text":"La vida en Tokyo","link":"https:\/\/cocoalopez.com\/blog\/?cat=18"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2014\/07\/sddefault.jpg?fit=640%2C480&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2014\/07\/sddefault.jpg?fit=640%2C480&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/cocoalopez.com\/blog\/wp-content\/uploads\/2014\/07\/sddefault.jpg?fit=640%2C480&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4616"}],"version-history":[{"count":2,"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4616\/revisions"}],"predecessor-version":[{"id":4619,"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4616\/revisions\/4619"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=\/wp\/v2\/media\/4617"}],"wp:attachment":[{"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cocoalopez.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}