[{"data":1,"prerenderedAt":625},["ShallowReactive",2],{"navigation":3,"\u002Fproduction-workflows\u002Ffirmware-images":99,"\u002Fproduction-workflows\u002Ffirmware-images-surround":620},[4,16,28,55,82],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Get started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-rocket",{"title":12,"path":13,"stem":14,"icon":15},"Your first station run","\u002Fgetting-started\u002Ffirst-run","1.getting-started\u002F2.first-run","i-lucide-play",{"title":17,"path":18,"stem":19,"children":20,"icon":22},"Core concepts","\u002Fcore-concepts","2.core-concepts\u002F1.index",[21,23],{"title":17,"path":18,"stem":19,"icon":22},"i-lucide-boxes",{"title":24,"path":25,"stem":26,"icon":27},"Projects and access","\u002Fcore-concepts\u002Fprojects-and-access","2.core-concepts\u002F2.projects-and-access","i-lucide-users",{"title":29,"path":30,"stem":31,"children":32,"icon":34},"Station runtime","\u002Fstation-runtime","3.station-runtime\u002F1.index",[33,35,40,45,50],{"title":29,"path":30,"stem":31,"icon":34},"i-lucide-circuit-board",{"title":36,"path":37,"stem":38,"icon":39},"Configure a station","\u002Fstation-runtime\u002Fconfiguration","3.station-runtime\u002F2.configuration","i-lucide-file-code-2",{"title":41,"path":42,"stem":43,"icon":44},"Custom stages","\u002Fstation-runtime\u002Fcustom-stages","3.station-runtime\u002F3.custom-stages","i-lucide-puzzle",{"title":46,"path":47,"stem":48,"icon":49},"Credentials and secrets","\u002Fstation-runtime\u002Fcredentials-and-secrets","3.station-runtime\u002F4.credentials-and-secrets","i-lucide-key-round",{"title":51,"path":52,"stem":53,"icon":54},"Multiple lanes","\u002Fstation-runtime\u002Fmultiple-lanes","3.station-runtime\u002F5.multiple-lanes","i-lucide-git-branch",{"title":56,"path":57,"stem":58,"children":59,"icon":61},"Production workflows","\u002Fproduction-workflows","4.production-workflows\u002F1.index",[60,62,67,72,77],{"title":56,"path":57,"stem":58,"icon":61},"i-lucide-factory",{"title":63,"path":64,"stem":65,"icon":66},"Applications and firmware","\u002Fproduction-workflows\u002Ffirmware-images","4.production-workflows\u002F2.firmware-images","i-lucide-cpu",{"title":68,"path":69,"stem":70,"icon":71},"DUT records and IDs","\u002Fproduction-workflows\u002Fdut-records-and-ids","4.production-workflows\u002F3.dut-records-and-ids","i-lucide-scan-barcode",{"title":73,"path":74,"stem":75,"icon":76},"Results and logs","\u002Fproduction-workflows\u002Fresults-and-logs","4.production-workflows\u002F4.results-and-logs","i-lucide-chart-no-axes-combined",{"title":78,"path":79,"stem":80,"icon":81},"Operator kiosk","\u002Fproduction-workflows\u002Foperator-kiosk","4.production-workflows\u002F5.operator-kiosk","i-lucide-monitor",{"title":83,"path":84,"stem":85,"children":86,"icon":88},"Reference","\u002Freference","5.reference\u002F1.index",[87,89,94],{"title":83,"path":84,"stem":85,"icon":88},"i-lucide-book-open",{"title":90,"path":91,"stem":92,"icon":93},"API access","\u002Freference\u002Fapi-access","5.reference\u002F2.api-access","i-lucide-braces",{"title":95,"path":96,"stem":97,"icon":98},"Troubleshooting","\u002Freference\u002Ftroubleshooting","5.reference\u002F3.troubleshooting","i-lucide-life-buoy",{"id":100,"title":63,"body":101,"description":613,"extension":614,"links":615,"meta":616,"navigation":617,"path":64,"seo":618,"stem":65,"__hash__":619},"docs\u002F4.production-workflows\u002F2.firmware-images.md",{"type":102,"value":103,"toc":606},"minimark",[104,112,115,120,128,157,160,168,183,187,258,265,271,277,283,287,313,319,325,332,347,365,369,376,440,458,536,558,562,572,578,602],[105,106,107,111],"p",{},[108,109,110],"strong",{},"Applications"," is the project library for firmware archives. An application has an ID that station plans reference; each uploaded ZIP or 7z file is a version of that application. This walkthrough uses a HEX file inside a ZIP and shows both ways to get it back: downloading it in the browser and letting a station download it for a firmware stage.",[105,113,114],{},"The screenshots use a deliberately non-flashable documentation example in the demo workspace. For a real run, use a HEX file built for your hardware and test it on a bench before using it on a production line.",[116,117,119],"h2",{"id":118},"_1-put-your-hex-file-in-a-zip","1. Put your HEX file in a ZIP",[105,121,122,123,127],{},"Suppose your build produced ",[124,125,126],"code",{},"zephyr\u002Fzephyr.hex",". From the build directory, create the archive and inspect its contents:",[129,130,135],"pre",{"className":131,"code":132,"language":133,"meta":134,"style":134},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cd path\u002Fto\u002Fyour\u002Fbuild\nzip firmware-1.0.0.zip zephyr\u002Fzephyr.hex\nunzip -l firmware-1.0.0.zip\n","sh","",[124,136,137,145,151],{"__ignoreMap":134},[138,139,142],"span",{"class":140,"line":141},"line",1,[138,143,144],{},"cd path\u002Fto\u002Fyour\u002Fbuild\n",[138,146,148],{"class":140,"line":147},2,[138,149,150],{},"zip firmware-1.0.0.zip zephyr\u002Fzephyr.hex\n",[138,152,154],{"class":140,"line":153},3,[138,155,156],{},"unzip -l firmware-1.0.0.zip\n",[105,158,159],{},"The archive must contain the file at the path your station plan will use:",[129,161,166],{"className":162,"code":164,"language":165,"meta":134},[163],"language-text","firmware-1.0.0.zip\n└── zephyr\u002Fzephyr.hex\n","text",[124,167,164],{"__ignoreMap":134},[105,169,170,171,174,175,178,179,182],{},"If your HEX file has another name or folder, use that path in both the ",[124,172,173],{},"zip"," command and the plan's ",[124,176,177],{},"path"," field. The station reads the path ",[108,180,181],{},"inside the archive",", not the path to the ZIP on your computer.",[116,184,186],{"id":185},"_2-upload-the-version","2. Upload the version",[188,189,190,197,212,238,249],"ol",{},[191,192,193,194,196],"li",{},"In HTF, open the project and select ",[108,195,110],{},".",[191,198,199,200,203,204,207,208,211],{},"Select ",[108,201,202],{},"Upload version"," and leave ",[108,205,206],{},"Image"," set to ",[108,209,210],{},"Create new image"," for the first upload.",[191,213,214,215,218,219,222,223,226,227,230,231,234,235,196],{},"Choose ",[124,216,217],{},"firmware-1.0.0.zip"," as the ",[108,220,221],{},"Archive file",". Enter a clear ",[108,224,225],{},"Image name",", the hardware ",[108,228,229],{},"Target",", and ",[108,232,233],{},"Version"," ",[124,236,237],{},"1.0.0",[191,239,240,241,244,245,248],{},"Add notes or build provenance if useful. Select ",[108,242,243],{},"Tag this version as latest"," only if this is the version that ",[124,246,247],{},"latest"," should resolve to.",[191,250,199,251,253,254,257],{},[108,252,202],{},". Wait for the application to show ",[108,255,256],{},"Ready",". A pending version does not yet have a downloadable binary.",[105,259,260],{},[261,262],"img",{"alt":263,"src":264},"Applications page with the Upload version action","\u002Fimages\u002Fproduct\u002F04-applications.png",[105,266,267],{},[261,268],{"alt":269,"src":270},"Upload image version form with the archive, name, target, and version fields","\u002Fimages\u002Fproduct\u002F05-upload-version.png",[105,272,273,274,276],{},"The application list then shows the archive, version, status, and number of retained versions. To add another build later, open the existing application and select ",[108,275,202],{},"; keep its application ID and add a new version.",[105,278,279],{},[261,280],{"alt":281,"src":282},"Applications list with a ready documentation example archive","\u002Fimages\u002Fproduct\u002F15-application-listed.png",[116,284,286],{"id":285},"_3-download-and-check-the-uploaded-archive","3. Download and check the uploaded archive",[105,288,289,290,293,294,297,298,301,302,305,306,309,310,312],{},"Open the application. Its ",[108,291,292],{},"Application ID"," is the value to use as ",[124,295,296],{},"firmware_id"," in a station plan. The ",[108,299,300],{},"Versions"," panel lists the retained ZIP files. Select ",[108,303,304],{},"Download"," beside a version to open ",[108,307,308],{},"Version details",", then select ",[108,311,304],{}," in that panel to save the ZIP in your browser.",[105,314,315],{},[261,316],{"alt":317,"src":318},"Application detail page with the application ID and version Download action","\u002Fimages\u002Fproduct\u002F16-application-detail.png",[105,320,321],{},[261,322],{"alt":323,"src":324},"Version details showing the stored ZIP, SHA-256, and Download action","\u002Fimages\u002Fproduct\u002F17-application-version.png",[105,326,327,328,331],{},"Check the downloaded file before using it. For example, if the browser saved it in ",[124,329,330],{},"~\u002FDownloads",":",[129,333,335],{"className":131,"code":334,"language":133,"meta":134,"style":134},"unzip -l ~\u002FDownloads\u002Ffirmware-1.0.0.zip\nshasum -a 256 ~\u002FDownloads\u002Ffirmware-1.0.0.zip\n",[124,336,337,342],{"__ignoreMap":134},[138,338,339],{"class":140,"line":141},[138,340,341],{},"unzip -l ~\u002FDownloads\u002Ffirmware-1.0.0.zip\n",[138,343,344],{"class":140,"line":147},[138,345,346],{},"shasum -a 256 ~\u002FDownloads\u002Ffirmware-1.0.0.zip\n",[105,348,349,350,353,354,357,358,361,362,364],{},"On Linux, use ",[124,351,352],{},"sha256sum"," if ",[124,355,356],{},"shasum"," is unavailable. The checksum should match the ",[108,359,360],{},"SHA-256"," shown in ",[108,363,308],{},". In the demo workspace, the downloaded documentation ZIP matched the uploaded file byte for byte.",[116,366,368],{"id":367},"_4-tell-the-station-which-file-to-use","4. Tell the station which file to use",[105,370,371,372,375],{},"The station needs a locally configured programmer. For a J-Link jig, add a programmer to its local ",[124,373,374],{},"config.yaml"," with the serial number and target for your hardware. The values below are illustrative:",[129,377,381],{"className":378,"code":379,"language":380,"meta":134,"style":134},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","programmers:\n  - name: jlink_1\n    kind: jlink\n    serial_number: 823000667\n    target_device: nrf54l15_xxca\n","yaml",[124,382,383,393,407,417,429],{"__ignoreMap":134},[138,384,385,389],{"class":140,"line":141},[138,386,388],{"class":387},"swJcz","programmers",[138,390,392],{"class":391},"sMK4o",":\n",[138,394,395,398,401,403],{"class":140,"line":147},[138,396,397],{"class":391},"  -",[138,399,400],{"class":387}," name",[138,402,331],{"class":391},[138,404,406],{"class":405},"sfazB"," jlink_1\n",[138,408,409,412,414],{"class":140,"line":153},[138,410,411],{"class":387},"    kind",[138,413,331],{"class":391},[138,415,416],{"class":405}," jlink\n",[138,418,420,423,425],{"class":140,"line":419},4,[138,421,422],{"class":387},"    serial_number",[138,424,331],{"class":391},[138,426,428],{"class":427},"sbssI"," 823000667\n",[138,430,432,435,437],{"class":140,"line":431},5,[138,433,434],{"class":387},"    target_device",[138,436,331],{"class":391},[138,438,439],{"class":405}," nrf54l15_xxca\n",[105,441,442,443,446,447,450,451,454,455,331],{},"Then open the station's ",[108,444,445],{},"Station configuration"," in HTF and add a firmware stage to its runtime YAML. Replace ",[124,448,449],{},"REPLACE_WITH_APPLICATION_ID"," with the ID displayed on ",[108,452,453],{},"Application detail",", and use the path you saw in ",[124,456,457],{},"unzip -l",[129,459,461],{"className":378,"code":460,"language":380,"meta":134,"style":134},"stages:\n  - name: Flash firmware\n    kind: firmware_flash\n    programmer: jlink_1\n    firmware_id: REPLACE_WITH_APPLICATION_ID\n    firmware_version: '1.0.0'\n    path: zephyr\u002Fzephyr.hex\n",[124,462,463,470,481,490,499,509,525],{"__ignoreMap":134},[138,464,465,468],{"class":140,"line":141},[138,466,467],{"class":387},"stages",[138,469,392],{"class":391},[138,471,472,474,476,478],{"class":140,"line":147},[138,473,397],{"class":391},[138,475,400],{"class":387},[138,477,331],{"class":391},[138,479,480],{"class":405}," Flash firmware\n",[138,482,483,485,487],{"class":140,"line":153},[138,484,411],{"class":387},[138,486,331],{"class":391},[138,488,489],{"class":405}," firmware_flash\n",[138,491,492,495,497],{"class":140,"line":419},[138,493,494],{"class":387},"    programmer",[138,496,331],{"class":391},[138,498,406],{"class":405},[138,500,501,504,506],{"class":140,"line":431},[138,502,503],{"class":387},"    firmware_id",[138,505,331],{"class":391},[138,507,508],{"class":405}," REPLACE_WITH_APPLICATION_ID\n",[138,510,512,515,517,520,522],{"class":140,"line":511},6,[138,513,514],{"class":387},"    firmware_version",[138,516,331],{"class":391},[138,518,519],{"class":391}," '",[138,521,237],{"class":405},[138,523,524],{"class":391},"'\n",[138,526,528,531,533],{"class":140,"line":527},7,[138,529,530],{"class":387},"    path",[138,532,331],{"class":391},[138,534,535],{"class":405}," zephyr\u002Fzephyr.hex\n",[105,537,538,539,542,543,546,547,549,550,553,554,557],{},"The ",[124,540,541],{},"programmer"," name must match the local configuration. Pin an exact ",[124,544,545],{},"firmware_version"," for a controlled build; ",[124,548,247],{}," follows whichever version is currently tagged latest. Save the runtime YAML with ",[108,551,552],{},"Save for station pull",", then restart or reconnect the station to load that revision. See ",[555,556,36],"a",{"href":37}," for a plan with device recovery before flashing.",[116,559,561],{"id":560},"_5-see-the-station-download-it","5. See the station download it",[105,563,564,565,568,569,571],{},"On the next run that reaches ",[124,566,567],{},"firmware_flash",", the station resolves the selected version through the HTF API, downloads the ZIP, checks its SHA-256, extracts ",[124,570,126],{},", and passes the extracted file to the programmer. The stage output includes lines like:",[129,573,576],{"className":574,"code":575,"language":165,"meta":134},[163],"resolving firmware \u003Capplication-id> (1.0.0)\nusing firmware file .htf-cache\u002Ffirmware\u002F\u003Capplication-id>\u002F\u003Cversion-id>\u002Fextracted\u002Fzephyr\u002Fzephyr.hex\n",[124,577,575],{"__ignoreMap":134},[105,579,580,581,584,585,588,589,592,593,595,596,598,599,601],{},"The station keeps the verified archive in ",[124,582,583],{},".htf-cache\u002Ffirmware\u002F"," and reuses it for later runs of the same version. Open the station's ",[108,586,587],{},"Run logs"," or kiosk ",[108,590,591],{},"Console output"," to see those lines. If the stage reports that the archive does not contain the file, compare the YAML ",[124,594,177],{}," with ",[124,597,457],{}," on the downloaded ZIP. If it cannot resolve the version, confirm the application ID, version string, ",[108,600,256],{}," status, and that the application belongs to the station's project.",[603,604,605],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":134,"searchDepth":141,"depth":147,"links":607},[608,609,610,611,612],{"id":118,"depth":147,"text":119},{"id":185,"depth":147,"text":186},{"id":285,"depth":147,"text":286},{"id":367,"depth":147,"text":368},{"id":560,"depth":147,"text":561},"Zip a HEX file, upload it as an application version, download it, and use it in a station plan.","md",null,{},{"icon":66},{"title":63,"description":613},"P74PyA1Ki0ybRHymGvhD2P2224ziOhm92Ry__Shi_OU",[621,623],{"title":56,"path":57,"stem":58,"description":622,"icon":61,"children":-1},"Keep firmware, device IDs, operators, and results connected.",{"title":68,"path":69,"stem":70,"description":624,"icon":71,"children":-1},"Import, reserve, commit, and trace production identifiers.",1790376318214]