{"id":253,"date":"2025-07-02T12:02:29","date_gmt":"2025-07-02T11:02:29","guid":{"rendered":"https:\/\/blog.jeronimodiaz.com\/en\/?p=253"},"modified":"2025-11-19T17:25:04","modified_gmt":"2025-11-19T16:25:04","slug":"flashear-libreboot-en-thinkpad-t480s","status":"publish","type":"post","link":"https:\/\/blog.jeronimodiaz.com\/es\/flashear-libreboot-en-thinkpad-t480s\/","title":{"rendered":"Flashear libreboot en Thinkpad T480S"},"content":{"rendered":"\n<p>Motivado por la tecnolog\u00eda, leo temas diferentes cada semana y algunos me llaman mucho la atenci\u00f3n.<\/p>\n\n\n\n<p>Libreboot.<\/p>\n\n\n\n<p>\u00bfQu\u00e9 demonios es libreboot? Libreboot es una BIOS de c\u00f3digo abierto. En resumen, no es tan malo. Puedes leer m\u00e1s sobre \u00e9l en <a href=\"https:\/\/libreboot.org\/\">https:\/\/libreboot.org\/<\/a>   <\/p>\n\n\n\n<p>\u00bfPor qu\u00e9 me llam\u00f3 la atenci\u00f3n este tema? C\u00f3digo abierto, hardware, tema nuevo (para m\u00ed), no hay mucha gente haci\u00e9ndolo. No se me ocurre un tema mejor en el que trabajar.  <\/p>\n\n\n\n<p>Aunque pensar en una BIOS puede ser muy dif\u00edcil (lo es), para nosotros no lo ser\u00e1 tanto. S\u00f3lo se trata de descargar alg\u00fan archivo y escribirlo en un dispositivo. Parece f\u00e1cil, \u00bfverdad?.  <\/p>\n\n\n\n<p>Pas\u00e9 mucho tiempo leyendo la documentaci\u00f3n oficial. Pas\u00e9 mucho tiempo no por la larga documentaci\u00f3n, ni tampoco por la complejidad, sino, en mi sincera opini\u00f3n, por la mala organizaci\u00f3n. <\/p>\n\n\n\n<p>En primer lugar, aqu\u00ed tienes el enlace a la documentaci\u00f3n oficial <a href=\"https:\/\/libreboot.org\/docs\/install\/t480.html\">https:\/\/libreboot.org\/docs\/install\/t480.html<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Requisitos previos<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un port\u00e1til que funcione con Ubuntu 24.04 (\u00e9ste no ser\u00e1 el port\u00e1til en el que flashear\u00e9 libreboot) con git<\/li>\n\n\n\n<li><a href=\"https:\/\/amzn.to\/4dW0xhb\">Pico de frambuesa<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/amzn.to\/3HRYFty\">Clip 8 clavijas<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/amzn.to\/3FTAYAD\">Cable Dupont hembra 2 macho<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/amzn.to\/45iEnDn\">Cable micro USB<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Prepara el port\u00e1til programador<\/h3>\n\n\n\n<p>He clonado el repositorio git oficial de libreboot.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/codeberg.org\/libreboot\/lbmk<\/code><\/pre>\n\n\n\n<p>Dependencias instaladas para Ubuntu 24.04.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd lbmk\n.\/mk dependencies ubuntu2404<\/code><\/pre>\n\n\n\n<p>Aunque no tenga sentido, tambi\u00e9n tuve que instalar dependencias para el SO Debian. Instalar s\u00f3lo las dependencias de Ubuntu 24.04 me dio un error al ejecutar algunas de las herramientas necesarias (lo pegar\u00e9 un poco m\u00e1s adelante). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/mk dependencies debian<\/code><\/pre>\n\n\n\n<p>Antes de ejecutar el comando anterior, intent\u00e9 ejecutar la herramienta flashprog, pero me dio el siguiente error. Por eso tuve que instalar las dependencias para el SO Debian. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk$ CONFIG_feature=no .\/mk -b flashprog config\/data\/flashprog\/mkhelper.cfg missing config\/flashprog\/target.cfg already exists Loading flashprog config: config\/flashprog\/target.cfg config\/data\/flashprog\/mkhelper.cfg missing config\/flashprog\/target.cfg already exists Loading flashprog config: config\/flashprog\/target.cfg make: Entering directory '\/home\/jjdiaz\/git\/libreboot\/lbmk\/src\/flashprog' Replacing all version templates with p1.4-2-gf730186. Building flashprog version p1.4-2-gf730186 C compiler found: cc (Ubuntu 13.3.0-6ubuntu2\\~24.04) 13.3.0 Target arch: x86 Target OS: Linux Target endian: little Dependency libpci found: yes 3.10.0 Checking for old \"pci_get_dev()\": no CFLAGS: -I\/usr\/include\/x86_64-linux-gnu LDFLAGS: -lpci -lz -lresolv -ludev Dependency libusb1 found: yes 1.0.27 CFLAGS: -I\/usr\/include\/libusb-1.0 LDFLAGS: -lusb-1.0 -ludev Dependency libjaylink found: no Dependency NI-845x found: no Dependency libftdi1 found: no Dependency libgpiod found: no Checking for header \"mtd\/mtd-user.h\": yes Checking for header \"linux\/spi\/spidev.h\": yes Checking for header \"linux\/i2c-dev.h\": yes Checking for header \"linux\/i2c.h\": yes Checking for header \"sys\/utsname.h\": yes Checking for function \"clock_gettime\": yes Checking for external \"librt\": yes The following features require libftdi1: CONFIG_FT2232_SPI=yes CONFIG_USBBLASTER_SPI=yes The following features require libgpiod: CONFIG_LINUX_GPIO_SPI=yes The following features require libjaylink: CONFIG_JLINK_SPI=yes You can disable individual features with CONFIG_feature=no in your make command. make: \\*\\*\\* \\&#91;Makefile:968: config\\] Error 1 make: Leaving directory '\/home\/jjdiaz\/git\/libreboot\/lbmk\/src\/flashprog' ERROR .\/mk: Unhandled error for: make -C src\/flashprog -j1 WARNERROR=no ERROR .\/mk: Unhandled error for: .\/mk -b flashprog<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Prepara el pico de frambuesa<\/h3>\n\n\n\n<p>He creado el firmware de la frambuesa. Dentro de la carpeta del repositorio clonado, ejecut\u00e9 el siguiente comando. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/mk -b pico-serprog<\/code><\/pre>\n\n\n\n<p>El comando anterior generar\u00e1 algunos archivos en la carpeta <em>.\/bin<\/em>.<\/p>\n\n\n\n<p>Conect\u00e9 la frambuesa pico mientras pulsaba el bot\u00f3n BOOTSEL de la frambuesa al USB del port\u00e1til. Ejecut\u00e9 el comando <em>lsusb<\/em> para ver si el port\u00e1til detectaba la frambuesa correctamente (f\u00edjate en el dispositivo de <em>arranque Raspberry Pi RP2 <\/em>). <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"892\" height=\"205\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/07\/Raspi-antes-de-flashear-serprog.png\" alt=\"\" class=\"wp-image-262\"\/><\/figure>\n\n\n\n<p>Tras insertar la frambuesa, deber\u00eda aparecer como cualquier otro dispositivo de almacenamiento usb. Copi\u00e9 en \u00e9l el archivo <em>.\/bin\/serprog_pico\/serprog_pico.uf2<\/em>. Tras pegar el archivo, la frambuesa se reinici\u00f3 autom\u00e1ticamente. Volv\u00ed a ejecutar el comando <em>lsusb<\/em> y observ\u00e9 que el nombre del dispositivo era diferente (f\u00edjate en el dispositivo <em>pico-serprog (pico) de libreboot.org <\/em>).   <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"892\" height=\"205\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/07\/Raspi-despues-de-flashear-serprog.png\" alt=\"\" class=\"wp-image-264\"\/><\/figure>\n\n\n\n<p>La frambuesa estaba lista para empezar a funcionar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Preparar port\u00e1til thinkpad<\/h3>\n\n\n\n<p>He creado el firmware flashprog. Dentro de la carpeta del repositorio clonado, ejecut\u00e9 el siguiente comando. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/mk -b flashprog<\/code><\/pre>\n\n\n\n<p>Una vez finalizada la compilaci\u00f3n, se generaron algunos archivos binarios en <em>.\/elf\/flashprog\/flashprog<\/em><\/p>\n\n\n\n<p><strong>NOTA: ANTES DE CONECTAR EL PICO DE FRAMBUESA A LA PLACA THINKPAD, DESCONECT\u00c9 LA BATER\u00cdA THINKPAD Y LA BATER\u00cdA CMOS. NO CONECT\u00c9 EL PICO DE FRAMBUESA AL PUERTO USB DEL PORT\u00c1TIL UBUNTU HASTA ESTAR SEGURO DE QUE EST\u00c1 COMPLETAMENTE ACOPLADO A LA PLACA THINKPAD. <\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cableado del pico de frambuesa<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/av.libreboot.org\/rpi_pico\/pinout_serprog.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/av.libreboot.org\/rpi_pico\/soic8_pico_pinouts.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Las im\u00e1genes de arriba muestran que los pines pico de la frambuesa deben conectarse a la BIOS y a los chips Thunderbolt.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pin 7 de la Raspberry pico conectado al pin 1 del clip<\/li>\n\n\n\n<li>Pin 6 de la Raspberry pico conectado al pin 2 del clip<\/li>\n\n\n\n<li>Pin 38 de la Raspberry pico conectado al pin 4 del clip<\/li>\n\n\n\n<li>Pin 5 de la Raspberry pico conectado al pin 5 del clip<\/li>\n\n\n\n<li>Pin 4 de la Raspberry pico conectado al pin 6 del clip<\/li>\n\n\n\n<li>Pin 36 de la Raspberry pico conectado al pin 8 del clip<\/li>\n<\/ul>\n\n\n\n<p>La patilla 1 del chip est\u00e1 situada arriba a la izquierda y la patilla 5 abajo a la derecha.<\/p>\n\n\n\n<p>La imagen de abajo muestra c\u00f3mo quedaron las cosas despu\u00e9s de hacer todas las conexiones.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"4000\" height=\"3000\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/07\/Wiring-2.jpg\" alt=\"\" class=\"wp-image-267\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Copia de seguridad del firmware thunderbolt<\/h3>\n\n\n\n<p>Es un problema muy com\u00fan en los port\u00e1tiles thinkpad t480s que el puerto thunderbolt no funcione como se espera debido a un error en el firmware. Estaba 100% seguro de que me afectaba este problema. No hay otra opci\u00f3n. Es necesario un flasheo externo para solucionar el problema.   <\/p>\n\n\n\n<p>Estaba 100% seguro de que me afectaba el problema porque recib\u00eda un mensaje de error cada vez que arrancaba mi port\u00e1til en Windows.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"596\" height=\"341\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/07\/Thunderbolt-error-eng.png\" alt=\"\" class=\"wp-image-270\"\/><\/figure>\n\n\n\n<p>El primer paso antes de ponerme manos a la obra con el proceso de flasheo es volcar el firmware actual del thunderbolt por si algo va mal y poder restaurarlo (ten en cuenta que el problema no significa que el thunderbolt deje de funcionar, sino que s\u00f3lo funciona con dispositivos usb y no carga tan r\u00e1pido como deber\u00eda).<\/p>\n\n\n\n<p>Despu\u00e9s de cablear completamente el pico de frambuesa y el clip, antes de conectar el pico de frambuesa al puerto usb del port\u00e1til ubuntu, conect\u00e9 el clip al chip thunderbolt. La ubicaci\u00f3n del chip se muestra en las siguientes im\u00e1genes (f\u00edjate en el rect\u00e1ngulo rojo situado en la parte superior derecha de la placa). <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"1500\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/06\/Thunderbolt-controller-rectangle-1.jpg\" alt=\"\" class=\"wp-image-184\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"1000\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/06\/Thunderbolt-controller-rectangle-1-1.jpg\" alt=\"\" class=\"wp-image-189\"\/><\/figure>\n\n\n\n<p>NOTA: La patilla 1 del chip es la que est\u00e1 marcada con un punto. La patilla 1 del clip debe estar conectada a la patilla 1 del chip. <\/p>\n\n\n\n<p>Una vez conectado el clip, es hora de empezar a volcar el firmware thunderbolt.<\/p>\n\n\n\n<p>Antes de poder empezar a hacer la copia de seguridad, tuve que localizar d\u00f3nde est\u00e1 montada la frambuesa pico en el port\u00e1til ubuntu. Para obtener la ubicaci\u00f3n correcta, ejecut\u00e9 el siguiente comando. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dmesg -wH<\/code><\/pre>\n\n\n\n<p>Mientras se ejecutaba el comando, conect\u00e9 la raspberry pico al port\u00e1til ubuntu y apareci\u00f3 un mensaje como el siguiente fragmento de c\u00f3digo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\\&#91;jun 1 16:07\\] usb 1-2: new full-speed USB device number 9 using xhci_hcd \\&#91; +0,152742\\] usb 1-2: New USB device found, idVendor=cafe, idProduct=4001, bcdDevice= 1.00 \\&#91; +0,000014\\] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 \\&#91; +0,000006\\] usb 1-2: Product: pico-serprog (pico) \\&#91; +0,000005\\] usb 1-2: Manufacturer: libreboot.org \\&#91; +0,000004\\] usb 1-2: SerialNumber: 503558607A67521F \\&#91; +0,033213\\] cdc_acm 1-2:1.0: ttyACM0: USB ACM device<\/code><\/pre>\n\n\n\n<p>En mi caso, significa que el pico de la frambuesa est\u00e1 montado en <em><strong>\/dev\/ttyACM0<\/strong><\/em>.<\/p>\n\n\n\n<p>Para estar seguro, cog\u00ed 3 volcados y los compar\u00e9 para asegurarme de que todos eran exactamente iguales.<\/p>\n\n\n\n<p><strong>DUMP 1<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/thunderbolt$ ..\/..\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0,spispeed=16M -r dump1.bin flashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64) flashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns). serprog: Programmer name is \"pico-serprog\" Found Winbond flash chip \"W25Q80.V\" (1024 kB, SPI) on serprog. Reading flash... done.<\/code><\/pre>\n\n\n\n<p><strong>DUMP 2<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/thunderbolt$ ..\/..\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0,spispeed=16M -r dump2.bin\nflashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64)\nflashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns).\nserprog: Programmer name is \"pico-serprog\"\nFound Winbond flash chip \"W25Q80.V\" (1024 kB, SPI) on serprog.\nReading flash... done.<\/code><\/pre>\n\n\n\n<p><strong>DUMP 3<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/thunderbolt$ ..\/..\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0,spispeed=16M -r dump3.bin\nflashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64)\nflashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns).\nserprog: Programmer name is \"pico-serprog\"\nFound Winbond flash chip \"W25Q80.V\" (1024 kB, SPI) on serprog.\nReading flash... done.<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s de conseguir los tres volcados, para comprobar que todos tienen exactamente el mismo contenido, s\u00f3lo era cuesti\u00f3n de comprobar el sha de todos ellos y compararlos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/thunderbolt$ sha512sum dump1.bin\n831acf633b19ba806db400072b9f00562f39add0511836f6bd950d5cbd255088c23842a5fbedaecc0898a1869403cadcec17a81a16a9c2d3a3ae107e3c35b2bd  dump1.bin\n\njjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/thunderbolt$ sha512sum dump2.bin\n831acf633b19ba806db400072b9f00562f39add0511836f6bd950d5cbd255088c23842a5fbedaecc0898a1869403cadcec17a81a16a9c2d3a3ae107e3c35b2bd  dump2.bin\n\njjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/thunderbolt$ sha512sum dump3.bin\n831acf633b19ba806db400072b9f00562f39add0511836f6bd950d5cbd255088c23842a5fbedaecc0898a1869403cadcec17a81a16a9c2d3a3ae107e3c35b2bd  dump3.bin<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Construir firmware thunderbolt<\/h3>\n\n\n\n<p>Una vez completada la copia de seguridad, es hora de flashear el firmware correcto para solucionar el problema del puerto thunderbolt.<\/p>\n\n\n\n<p>Dentro de la carpeta del repositorio clonado, ejecut\u00e9 el siguiente comando.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/mk -d coreboot t480s_vfsp_16mb<\/code><\/pre>\n\n\n\n<p>El comando gener\u00f3 un archivo. Se encontraba en <em>.\/vendorfiles\/t480s\/tb.bin<\/em> <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Flashear firmware thunderbolt<\/h3>\n\n\n\n<p>Antes de flashear el nuevo firmware, tuve que eliminar el contenido del chip. Para ello, cre\u00e9 un archivo cuyo contenido son 0s completos. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> dd if=\/dev\/zero of=null.bin bs=1M count=1<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s, he flasheado el archivo en el chip thunderbolt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> .\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0 -w null.bin<\/code><\/pre>\n\n\n\n<p>El resultado del comando se parec\u00eda al siguiente fragmento de c\u00f3digo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk$ .\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0 -w null.bin flashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64) flashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns).\nserprog: Programmer name is \"pico-serprog\"\nFound Winbond flash chip \"W25Q80.V\" (1024 kB, SPI) on serprog.\nReading old flash chip contents... done.\nErasing and writing flash chip... Erase\/write done.\nVerifying flash... VERIFIED.<\/code><\/pre>\n\n\n\n<p>Una vez borrado completamente el chip, tuve que volver a montarlo todo (bater\u00eda CMOS, bater\u00eda thinkpad) y arrancar el ordenador. Una vez arrancado completamente el SO, apagu\u00e9 completamente el thinkpad y volv\u00ed a quitar las bater\u00edas CMOS y thinkpad. <\/p>\n\n\n\n<p>Ahora, he flasheado el nuevo firmware thunderbolt en el chip.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0 -w vendorfiles\/t480s\/tb.bin<\/code><\/pre>\n\n\n\n<p>Una vez completado el flasheo, el c\u00f3digo de salida se parec\u00eda al siguiente fragmento de c\u00f3digo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk$ .\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0 -w vendorfiles\/t480s\/tb.bin\nflashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64)\nflashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns).\nserprog: Programmer name is \"pico-serprog\"\nFound Winbond flash chip \"W25Q80.V\" (1024 kB, SPI) on serprog.\nReading old flash chip contents... done.\nErasing and writing flash chip... FAILED at 0x0000205c! Expected=0xff, Found=0xef, failed byte count from 0x00000000-0x0000ffff: 0x17\nERASE FAILED!\nFAILED!\nUh oh. Erase\/write failed. Checking if anything has changed.\nReading current flash chip contents... done.\nApparently at least some data has changed.\nYour flash chip is in an unknown state.\nPlease report this to the mailing list at flashprog@flashprog.org\nor on IRC (see https:\/\/www.flashprog.org\/Contact for details), thanks!\n\n\njjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk$ .\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0 -w vendorfiles\/t480s\/tb.bin\nflashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64)\nflashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns).\nserprog: Programmer name is \"pico-serprog\"\nFound Winbond flash chip \"W25Q80.V\" (1024 kB, SPI) on serprog.\nReading old flash chip contents... done.\nErasing and writing flash chip... Erase\/write done.\nVerifying flash... VERIFIED.<\/code><\/pre>\n\n\n\n<p>Ten en cuenta que tuve que flashearlo dos veces porque la primera fall\u00f3 al borrar el chip.<\/p>\n\n\n\n<p>Una vez finalizado el flasheo, reinici\u00e9 el port\u00e1til y el error de thunderbolt que aparec\u00eda arriba hab\u00eda desaparecido. \u00a1Lo he conseguido! <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Copia de seguridad del firmware de la BIOS<\/h3>\n\n\n\n<p>Al igual que hice con el firmware del thunderbolt, hice exactamente lo mismo con el firmware de la BIOS. Antes de actualizar la BIOS, por motivos de seguridad, hice una copia de seguridad de la BIOS. <\/p>\n\n\n\n<p>La ubicaci\u00f3n del chip se muestra en la imagen inferior (observa el rect\u00e1ngulo rojo situado en la parte superior central de la placa).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"1500\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/06\/BIOS-controller-rectangle-1.jpg\" alt=\"\" class=\"wp-image-183\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"1500\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/06\/BIOS-controller-1.jpg\" alt=\"\" class=\"wp-image-188\"\/><\/figure>\n\n\n\n<p>Como he dicho para el chip thunderbolt, el pin 1 del chip es el que est\u00e1 marcado con un punto. La patilla 1 del clip debe estar conectada a la patilla 1 del chip. <\/p>\n\n\n\n<p>Es hora de empezar a descargar el firmware.<\/p>\n\n\n\n<p><strong>DUMP 1<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/bios$ ..\/..\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0,spispeed=16M -r dump1.bin flashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64) flashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns). serprog: Programmer name is \"pico-serprog\" Found Winbond flash chip \"W25Q128.V\" (16384 kB, SPI) on serprog. Reading flash... done. <\/code><\/pre>\n\n\n\n<p><strong>DUMP 2<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/bios$ ..\/..\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0,spispeed=16M -r dump2.bin flashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64) flashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns). serprog: Programmer name is \"pico-serprog\" Found Winbond flash chip \"W25Q128.V\" (16384 kB, SPI) on serprog. Reading flash... done. <\/code><\/pre>\n\n\n\n<p><strong>DUMP 3<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/bios$ ..\/..\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0,spispeed=16M -r dump3.bin flashprog p1.4-2-gf730186 on Linux 6.8.0-60-generic (x86_64) flashprog is free software, get the source code at https:\/\/flashprog.org\n\nUsing clock_gettime for delay loops (clk_id: 1, resolution: 1ns). serprog: Programmer name is \"pico-serprog\" Found Winbond flash chip \"W25Q128.V\" (16384 kB, SPI) on serprog. Reading flash... done. <\/code><\/pre>\n\n\n\n<p>Una vez que consegu\u00ed todos los volcados, los compar\u00e9 para asegurarme de que el contenido de todos ellos era exactamente el mismo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/bios$ sha512sum dump1.bin 71251f4c4e41832a66aaaae91d01119988c5253e66c1d4b61ce6975e2d04fb4e80524f797bf1c9102a1cd9a7239775291d0be18a67704666547acc8746d9b518  dump1.bin\n\njjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/bios$ sha512sum dump2.bin 71251f4c4e41832a66aaaae91d01119988c5253e66c1d4b61ce6975e2d04fb4e80524f797bf1c9102a1cd9a7239775291d0be18a67704666547acc8746d9b518  dump2.bin\n\njjdiaz@laptop-HN-WX9X:\\~\/git\/libreboot\/lbmk\/dumps\/bios$ sha512sum dump3.bin 71251f4c4e41832a66aaaae91d01119988c5253e66c1d4b61ce6975e2d04fb4e80524f797bf1c9102a1cd9a7239775291d0be18a67704666547acc8746d9b518  dump3.bin<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Activar hyper-threading<\/h3>\n\n\n\n<p>Por defecto, libreboot no est\u00e1 configurado para gestionar hyper-threading. Esto significa que, para el thinkpad t480s, en lugar de poder utilizar 8 hilos, s\u00f3lo estar\u00edan disponibles 4. <\/p>\n\n\n\n<p>Para poder utilizar toda la potencia del procesador, configur\u00e9 el hyper-threading antes de crear el firmware de la BIOS.<\/p>\n\n\n\n<p>Para ello, dentro de la carpeta del repositorio clonado, ejecut\u00e9 el siguiente comando.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/mk -m coreboot t480s_vfsp_16mb <\/code><\/pre>\n\n\n\n<p>El comando abri\u00f3 una ventana de terminal donde se pueden hacer diferentes personalizaciones.<\/p>\n\n\n\n<p>Para activar el hyper-threading, tuve que ir a <strong><em><strong>Chipset -&gt; Activar Hyper - Threading<\/strong><\/em><\/strong> y marcarlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Construir el firmware de la BIOS<\/h3>\n\n\n\n<p>Dentro de la carpeta del repositorio clonado, ejecut\u00e9 el siguiente comando.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/mk -b coreboot t480s_vfsp_16mb<\/code><\/pre>\n\n\n\n<p>Una vez finalizado el comando, los archivos generados se colocaron en <em>.\/bin\/t480s_vfsp_16mb<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configurar la direcci\u00f3n MAC ethernet<\/h3>\n\n\n\n<p>Por defecto, libreboot configura la misma direcci\u00f3n MAC de ethernet para todos los dispositivos. Esto significa que si m\u00e1s de un dispositivo que utiliza libreboot est\u00e1 conectado a la misma red, tendr\u00e1n problemas de conectividad debido a la coincidencia de las direcciones MAC ethernet. <\/p>\n\n\n\n<p>La soluci\u00f3n para evitar esta situaci\u00f3n es configurar la direcci\u00f3n MAC de ethernet en la configuraci\u00f3n de libreboot para que sea la definida por el fabricante para la tarjeta ethernet del port\u00e1til.<\/p>\n\n\n\n<p>Lo primero que hice fue instalar ifdtool. Dentro de la carpeta del repositorio clonado, ejecut\u00e9 el siguiente comando. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd src\/coreboot\/default\/util\/ifdtool &amp;&amp; make<\/code><\/pre>\n\n\n\n<p>Tambi\u00e9n instal\u00e9 nvmutil. Dentro de la carpeta del repositorio clonado, ejecut\u00e9 el siguiente comando. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd util\/nvmutil &amp;&amp; make<\/code><\/pre>\n\n\n\n<p>Ya he generado un archivo bin que flashear\u00e9 en la BIOS. Este es el archivo en el que tengo que trabajar para establecer la direcci\u00f3n MAC adecuada. Tuve que desbloquear el archivo de la BIOS antes de extraer la direcci\u00f3n MAC. Este comando crear\u00e1 un nuevo archivo llamado <em>bin\/t480s_vfsp_16mb\/seabios_t480s_vfsp_16mb_libgfxinit_corebootfb.rom.new<\/em>    <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/src\/coreboot\/default\/util\/ifdtool\/ifdtool --platform sklkbl --unlock bin\/t480s_vfsp_16mb\/seabios_t480s_vfsp_16mb_libgfxinit_corebootfb.rom<\/code><\/pre>\n\n\n\n<p>Ejecut\u00e9 el siguiente comando para dividir el archivo de la BIOS en varios archivos relacionados con las diferentes secciones que hay en la BIOS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/src\/coreboot\/default\/util\/ifdtool\/ifdtool --platform sklkbl -x bin\/t480s_vfsp_16mb\/seabios_t480s_vfsp_16mb_libgfxinit_corebootfb.rom.new<\/code><\/pre>\n\n\n\n<p>La MAC se encuentra en uno de los archivos generados llamado <em>flashregion_3_gbe.bin<\/em><\/p>\n\n\n\n<p>He ejecutado el siguiente comando para establecer la MAC correcta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/util\/nvmutil\/nvm flashregion_3_gbe.bin setmac ex:6x:6x:4x:ax:9x<\/code><\/pre>\n\n\n\n<p>El archivo tambi\u00e9n contiene una suma de comprobaci\u00f3n y debe ser v\u00e1lida. Como he cambiado el contenido del archivo, es necesario actualizar la suma de comprobaci\u00f3n. Para ello, he ejecutado los siguientes comandos.  <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/util\/nvmutil\/nvm flashregion_3_gbe.bin setchecksum 0  \n.\/util\/nvmutil\/nvm flashregion_3_gbe.bin setchecksum 1<\/code><\/pre>\n\n\n\n<p>El \u00faltimo paso es inyectar la nueva direcci\u00f3n MAC en el archivo de la BIOS generado anteriormente<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/src\/coreboot\/default\/util\/ifdtool\/ifdtool --platform sklkbl -i gbe:flashregion_3_gbe.bin bin\/t480s_vfsp_16mb\/seabios_t480s_vfsp_16mb_libgfxinit_corebootfb.rom.new<\/code><\/pre>\n\n\n\n<p>Se genera un nuevo archivo llamado <em>bin\/t480s_vfsp_16mb\/seabios_t480s_vfsp_16mb_libgfxinit_corebootfb.rom.new.new<\/em>. Este es el archivo que tuve que flashear en el chip de la BIOS. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Flashear el firmware de la BIOS<\/h3>\n\n\n\n<p>Flashear la BIOS fue tan sencillo como ejecutar el siguiente comando<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/elf\/flashprog\/flashprog -p serprog:dev=\/dev\/ttyACM0 -w ..\/bin\/t480s_vfsp_16mb\/seabios_t480s_vfsp_16mb_libgfxinit_corebootfb.rom.new.new<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1818\" height=\"225\" src=\"https:\/\/blog.jeronimodiaz.com\/wp-content\/uploads\/2025\/06\/Flash-BIOS.png\" alt=\"\" class=\"wp-image-192\"\/><\/figure>\n\n\n\n<p>En este punto, se complet\u00f3 el proceso de flasheo de la BIOS.<\/p>\n\n\n\n<p>En mi caso, tuve que instalar un SO porque mi port\u00e1til no ten\u00eda ning\u00fan SO que utilizara grub para arrancar. Hay un mont\u00f3n de tutoriales en internet para instalar un SO, as\u00ed que no lo describir\u00e9. <\/p>\n\n\n\n<p>Espero que te haya gustado esta lectura. Disfrut\u00e9 mucho haciendo todos los pasos, as\u00ed como escribiendo mi experiencia. <\/p>\n\n\n\n<p>Gracias por leer mi blog. \u00a1Nos vemos en el pr\u00f3ximo post! <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Motivado por la tecnolog\u00eda, leo temas diferentes cada semana y algunos me llaman mucho la atenci\u00f3n. Libreboot. \u00bfQu\u00e9 demonios es libreboot? Libreboot es una BIOS de c\u00f3digo abierto. En resumen,&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[124,123],"tags":[134,135,132,131,136,133],"class_list":["post-253","post","type-post","status-publish","format-standard","hentry","category-hardware-es","category-linux-es","tag-bios-es","tag-flash-es","tag-hardware-es","tag-libreboot-es","tag-linux-es","tag-thinkpad-es"],"_links":{"self":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts\/253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/comments?post=253"}],"version-history":[{"count":9,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts\/253\/revisions"}],"predecessor-version":[{"id":337,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts\/253\/revisions\/337"}],"wp:attachment":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/media?parent=253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/categories?post=253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/tags?post=253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}