mirror of
https://github.com/FunKey-Project/FunKey-Project.github.io.git
synced 2025-12-16 12:18:51 +01:00
1 line
63 KiB
HTML
1 line
63 KiB
HTML
<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="FunKey S - the world's smallest foldable handheld console Ultra-compact, foldable, powerful and comfortable, the FunKey S is the perfect handheld for playing retrogames anywhere, anytime."><meta name=author content="Michel Stempin"><link href=https://doc.funkey-project.com/developer_guide/software_reference/boot_process/boot_rom/ rel=canonical><link href=../ rel=prev><link href=../spl/ rel=next><link rel=icon href=../../../../assets/favicon.png><meta name=generator content="mkdocs-1.6.0, mkdocs-material-9.5.21"><title>Boot ROM - FunKey Project Documentation</title><link rel=stylesheet href=../../../../assets/stylesheets/main.66ac8b77.min.css><link rel=stylesheet href=../../../../assets/stylesheets/palette.06af60db.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../../../assets/css/custom.css><link rel=stylesheet href=../../../../assets/css/simple-lightbox.min.css><script>__md_scope=new URL("../../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=indigo> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#power-on-reset-por class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class="md-header md-header--shadow" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../../../.. title="FunKey Project Documentation" class="md-header__button md-logo" aria-label="FunKey Project Documentation" data-md-component=logo> <img src=../../../../assets/images/logo.png alt=logo> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> FunKey Project Documentation </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Boot ROM </span> </div> </div> </div> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> </button> </nav> </form> <div class=md-search__output> <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/FunKey-Project/FunKey-Project.github.io title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class=md-source__repository> GitHub </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../../../.. title="FunKey Project Documentation" class="md-nav__button md-logo" aria-label="FunKey Project Documentation" data-md-component=logo> <img src=../../../../assets/images/logo.png alt=logo> </a> FunKey Project Documentation </label> <div class=md-nav__source> <a href=https://github.com/FunKey-Project/FunKey-Project.github.io title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class=md-source__repository> GitHub </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../.. class=md-nav__link> <span class=md-ellipsis> Overview </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex=0> <span class=md-ellipsis> User's Manual </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> User's Manual </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1> <label class=md-nav__link for=__nav_2_1 id=__nav_2_1_label tabindex=0> <span class=md-ellipsis> Tutorials </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_1_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1> <span class="md-nav__icon md-icon"></span> Tutorials </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1_1> <label class=md-nav__link for=__nav_2_1_1 id=__nav_2_1_1_label tabindex=0> <span class=md-ellipsis> Software </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_2_1_1_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1> <span class="md-nav__icon md-icon"></span> Software </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/add_roms/ class=md-nav__link> <span class=md-ellipsis> Add New ROMs </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/add_opk/ class=md-nav__link> <span class=md-ellipsis> Add OPK Files </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/gba_bios/ class=md-nav__link> <span class=md-ellipsis> Install the GBA/PS1 BIOS </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/aspect_ratio/ class=md-nav__link> <span class=md-ellipsis> Change Aspect Ratio </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/snapshot/ class=md-nav__link> <span class=md-ellipsis> Take a Snapshot </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/firmware_update/ class=md-nav__link> <span class=md-ellipsis> Firmware Upgrade </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/gb_palette/ class=md-nav__link> <span class=md-ellipsis> Change Game Boy Palette </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/software/gmenu2x_wallpaper/ class=md-nav__link> <span class=md-ellipsis> Change GMenu2X Wallpaper </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1_2> <label class=md-nav__link for=__nav_2_1_2 id=__nav_2_1_2_label tabindex=0> <span class=md-ellipsis> Hardware </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_2_1_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_2> <span class="md-nav__icon md-icon"></span> Hardware </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/hardware/teardown/ class=md-nav__link> <span class=md-ellipsis> Teardown </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/hardware/flash_change_sd_card/ class=md-nav__link> <span class=md-ellipsis> Flash & Change micro-SD Card </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/hardware/change_buttons/ class=md-nav__link> <span class=md-ellipsis> Change the Buttons </span> </a> </li> <li class=md-nav__item> <a href=../../../../user_manual/tutorials/hardware/fix_unstuck_screen/ class=md-nav__link> <span class=md-ellipsis> </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3 checked> <label class=md-nav__link for=__nav_3 id=__nav_3_label tabindex=0> <span class=md-ellipsis> Developer's Guide </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_3_label aria-expanded=true> <label class=md-nav__title for=__nav_3> <span class="md-nav__icon md-icon"></span> Developer's Guide </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_1> <div class="md-nav__link md-nav__container"> <a href=../../../hardware_reference/ class="md-nav__link "> <span class=md-ellipsis> Hardware Reference </span> </a> <label class="md-nav__link " for=__nav_3_1 id=__nav_3_1_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_3_1_label aria-expanded=false> <label class=md-nav__title for=__nav_3_1> <span class="md-nav__icon md-icon"></span> Hardware Reference </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../hardware_reference/architecture/ class=md-nav__link> <span class=md-ellipsis> Architecture </span> </a> </li> <li class=md-nav__item> <a href=https://htmlpreview.github.io/?https://github.com/FunKey-Project/FunKey-S-Hardware/blob/master/BOM/ibom.html class=md-nav__link> <span class=md-ellipsis> BOM </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/cpu/ class=md-nav__link> <span class=md-ellipsis> CPU </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_1_4> <label class=md-nav__link for=__nav_3_1_4 id=__nav_3_1_4_label tabindex=0> <span class=md-ellipsis> Power </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_3_1_4_label aria-expanded=false> <label class=md-nav__title for=__nav_3_1_4> <span class="md-nav__icon md-icon"></span> Power </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../hardware_reference/power/power_supplies_topologies/ class=md-nav__link> <span class=md-ellipsis> Regulated DC Power Supply Topologies </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/power/multiple_voltages/ class=md-nav__link> <span class=md-ellipsis> Multiple Power Supply Voltages </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/power/pmic/ class=md-nav__link> <span class=md-ellipsis> PMIC </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/power/dram_power/ class=md-nav__link> <span class=md-ellipsis> DRAM Power </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/power/decoupling/ class=md-nav__link> <span class=md-ellipsis> Decoupling </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../../hardware_reference/screen/ class=md-nav__link> <span class=md-ellipsis> Screen </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/audio/ class=md-nav__link> <span class=md-ellipsis> Audio </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/buttons/ class=md-nav__link> <span class=md-ellipsis> Buttons </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/sd-card/ class=md-nav__link> <span class=md-ellipsis> SD Card </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/usb/ class=md-nav__link> <span class=md-ellipsis> USB </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/uart/ class=md-nav__link> <span class=md-ellipsis> UART </span> </a> </li> <li class=md-nav__item> <a href=../../../hardware_reference/magnetic_switch/ class=md-nav__link> <span class=md-ellipsis> Magnetic Switch </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_2 checked> <div class="md-nav__link md-nav__container"> <a href=../../ class="md-nav__link "> <span class=md-ellipsis> Software Reference </span> </a> <label class="md-nav__link " for=__nav_3_2 id=__nav_3_2_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_3_2_label aria-expanded=true> <label class=md-nav__title for=__nav_3_2> <span class="md-nav__icon md-icon"></span> Software Reference </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_2_1 checked> <div class="md-nav__link md-nav__container"> <a href=../ class="md-nav__link "> <span class=md-ellipsis> Boot Process </span> </a> <label class="md-nav__link " for=__nav_3_2_1 id=__nav_3_2_1_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_3_2_1_label aria-expanded=true> <label class=md-nav__title for=__nav_3_2_1> <span class="md-nav__icon md-icon"></span> Boot Process </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> <span class=md-ellipsis> Boot ROM </span> <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> Boot ROM </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#power-on-reset-por class=md-nav__link> <span class=md-ellipsis> Power-On Reset (POR) </span> </a> </li> <li class=md-nav__item> <a href=#reset-function class=md-nav__link> <span class=md-ellipsis> Reset Function </span> </a> <nav class=md-nav aria-label="Reset Function"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#register-initialization class=md-nav__link> <span class=md-ellipsis> Register Initialization </span> </a> </li> <li class=md-nav__item> <a href=#brom-header class=md-nav__link> <span class=md-ellipsis> BROM Header </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#start-function class=md-nav__link> <span class=md-ellipsis> Start Function </span> </a> <nav class=md-nav aria-label="Start Function"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#brom-output-pin-toggling class=md-nav__link> <span class=md-ellipsis> BROM Output Pin Toggling </span> </a> </li> <li class=md-nav__item> <a href=#multi-cpu-check class=md-nav__link> <span class=md-ellipsis> Multi-CPU Check </span> </a> </li> <li class=md-nav__item> <a href=#start-cpu-0 class=md-nav__link> <span class=md-ellipsis> Start CPU #0 </span> </a> </li> <li class=md-nav__item> <a href=#disable-memory-access-features class=md-nav__link> <span class=md-ellipsis> Disable Memory Access Features </span> </a> </li> <li class=md-nav__item> <a href=#disable-watchdog class=md-nav__link> <span class=md-ellipsis> Disable Watchdog </span> </a> </li> <li class=md-nav__item> <a href=#configure-internal-system-bus-clocks class=md-nav__link> <span class=md-ellipsis> Configure Internal System Bus Clocks </span> </a> </li> <li class=md-nav__item> <a href=#initialize-dma-and-pio class=md-nav__link> <span class=md-ellipsis> Initialize DMA and PIO </span> </a> </li> <li class=md-nav__item> <a href=#initialize-stack-pointer-in-sram-a1 class=md-nav__link> <span class=md-ellipsis> Initialize Stack Pointer in SRAM A1 </span> </a> </li> <li class=md-nav__item> <a href=#resume-from-standby-mode class=md-nav__link> <span class=md-ellipsis> Resume from Standby Mode </span> </a> </li> <li class=md-nav__item> <a href=#enable-sram-c class=md-nav__link> <span class=md-ellipsis> Enable SRAM C </span> </a> </li> <li class=md-nav__item> <a href=#initialize-stack-pointer-in-sram-c class=md-nav__link> <span class=md-ellipsis> Initialize Stack Pointer in SRAM C </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#boot-function class=md-nav__link> <span class=md-ellipsis> Boot Function </span> </a> <nav class=md-nav aria-label="Boot Function"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#check-uboot-button class=md-nav__link> <span class=md-ellipsis> Check UBoot Button </span> </a> </li> <li class=md-nav__item> <a href=#boot-from-flash-memory class=md-nav__link> <span class=md-ellipsis> Boot from Flash Memory </span> </a> </li> <li class=md-nav__item> <a href=#booting-from-sd-card class=md-nav__link> <span class=md-ellipsis> Booting from SD Card </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#fel class=md-nav__link> <span class=md-ellipsis> FEL </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../spl/ class=md-nav__link> <span class=md-ellipsis> SPL </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_2_2> <div class="md-nav__link md-nav__container"> <a href=../../sd_card_layout/ class="md-nav__link "> <span class=md-ellipsis> SD-Card Layout </span> </a> <label class="md-nav__link " for=__nav_3_2_2 id=__nav_3_2_2_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_3_2_2_label aria-expanded=false> <label class=md-nav__title for=__nav_3_2_2> <span class="md-nav__icon md-icon"></span> SD-Card Layout </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../sd_card_layout/directory_structure/ class=md-nav__link> <span class=md-ellipsis> Directory Structure </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_3> <label class=md-nav__link for=__nav_3_3 id=__nav_3_3_label tabindex=0> <span class=md-ellipsis> Tutorials </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_3_3_label aria-expanded=false> <label class=md-nav__title for=__nav_3_3> <span class="md-nav__icon md-icon"></span> Tutorials </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../tutorials/access_recovery/ class=md-nav__link> <span class=md-ellipsis> Access the Recovery Boot Mode </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_3_2> <div class="md-nav__link md-nav__container"> <a href=../../../tutorials/build_system/ class="md-nav__link "> <span class=md-ellipsis> Build System </span> </a> <label class="md-nav__link " for=__nav_3_3_2 id=__nav_3_3_2_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_3_3_2_label aria-expanded=false> <label class=md-nav__title for=__nav_3_3_2> <span class="md-nav__icon md-icon"></span> Build System </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../tutorials/build_system/compilation_environments/ class=md-nav__link> <span class=md-ellipsis> Compilation Environments </span> </a> </li> <li class=md-nav__item> <a href=../../../tutorials/build_system/get_sources/ class=md-nav__link> <span class=md-ellipsis> Get the Sources </span> </a> </li> <li class=md-nav__item> <a href=../../../tutorials/build_system/compile_sdk/ class=md-nav__link> <span class=md-ellipsis> Compile SDK </span> </a> </li> <li class=md-nav__item> <a href=../../../tutorials/build_system/compile_distribution/ class=md-nav__link> <span class=md-ellipsis> Compile Distribution </span> </a> </li> <li class=md-nav__item> <a href=../../../tutorials/build_system/write_image/ class=md-nav__link> <span class=md-ellipsis> Write firmware to SD Card </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../../tutorials/build_system/build_program_using_sdk/ class=md-nav__link> <span class=md-ellipsis> Build Programs using SDK </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=https://grabcad.com/library/funkey-s-1 class=md-nav__link> <span class=md-ellipsis> 3D files </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_5> <label class=md-nav__link for=__nav_5 id=__nav_5_label tabindex=0> <span class=md-ellipsis> Miscellaneous </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_5_label aria-expanded=false> <label class=md-nav__title for=__nav_5> <span class="md-nav__icon md-icon"></span> Miscellaneous </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../../miscellaneous/glossary/ class=md-nav__link> <span class=md-ellipsis> Glossary </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#power-on-reset-por class=md-nav__link> <span class=md-ellipsis> Power-On Reset (POR) </span> </a> </li> <li class=md-nav__item> <a href=#reset-function class=md-nav__link> <span class=md-ellipsis> Reset Function </span> </a> <nav class=md-nav aria-label="Reset Function"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#register-initialization class=md-nav__link> <span class=md-ellipsis> Register Initialization </span> </a> </li> <li class=md-nav__item> <a href=#brom-header class=md-nav__link> <span class=md-ellipsis> BROM Header </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#start-function class=md-nav__link> <span class=md-ellipsis> Start Function </span> </a> <nav class=md-nav aria-label="Start Function"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#brom-output-pin-toggling class=md-nav__link> <span class=md-ellipsis> BROM Output Pin Toggling </span> </a> </li> <li class=md-nav__item> <a href=#multi-cpu-check class=md-nav__link> <span class=md-ellipsis> Multi-CPU Check </span> </a> </li> <li class=md-nav__item> <a href=#start-cpu-0 class=md-nav__link> <span class=md-ellipsis> Start CPU #0 </span> </a> </li> <li class=md-nav__item> <a href=#disable-memory-access-features class=md-nav__link> <span class=md-ellipsis> Disable Memory Access Features </span> </a> </li> <li class=md-nav__item> <a href=#disable-watchdog class=md-nav__link> <span class=md-ellipsis> Disable Watchdog </span> </a> </li> <li class=md-nav__item> <a href=#configure-internal-system-bus-clocks class=md-nav__link> <span class=md-ellipsis> Configure Internal System Bus Clocks </span> </a> </li> <li class=md-nav__item> <a href=#initialize-dma-and-pio class=md-nav__link> <span class=md-ellipsis> Initialize DMA and PIO </span> </a> </li> <li class=md-nav__item> <a href=#initialize-stack-pointer-in-sram-a1 class=md-nav__link> <span class=md-ellipsis> Initialize Stack Pointer in SRAM A1 </span> </a> </li> <li class=md-nav__item> <a href=#resume-from-standby-mode class=md-nav__link> <span class=md-ellipsis> Resume from Standby Mode </span> </a> </li> <li class=md-nav__item> <a href=#enable-sram-c class=md-nav__link> <span class=md-ellipsis> Enable SRAM C </span> </a> </li> <li class=md-nav__item> <a href=#initialize-stack-pointer-in-sram-c class=md-nav__link> <span class=md-ellipsis> Initialize Stack Pointer in SRAM C </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#boot-function class=md-nav__link> <span class=md-ellipsis> Boot Function </span> </a> <nav class=md-nav aria-label="Boot Function"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#check-uboot-button class=md-nav__link> <span class=md-ellipsis> Check UBoot Button </span> </a> </li> <li class=md-nav__item> <a href=#boot-from-flash-memory class=md-nav__link> <span class=md-ellipsis> Boot from Flash Memory </span> </a> </li> <li class=md-nav__item> <a href=#booting-from-sd-card class=md-nav__link> <span class=md-ellipsis> Booting from SD Card </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#fel class=md-nav__link> <span class=md-ellipsis> FEL </span> </a> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <h1>Boot ROM</h1> <p>According to the <a href="https://linux-sunxi.org/images/2/23/Allwinner_V3s_Datasheet_V1.0.pdf#page=60">Allwinner V3s datasheet</a>, the integrated boot system consists in a 32KB boot <abbr title="Read-Only Memory">ROM</abbr> mapped at addresses <code>0xffff0000-0xffff7fff</code>, that can boot from <abbr title="Serial Peripheral Interface">SPI</abbr> NOR Flash, <abbr title="Serial Peripheral Interface">SPI</abbr> NAND Flash, <abbr title="Secure Digital">SD</abbr> Card and <abbr title="Universal Serial Bus">USB</abbr>.</p> <p>In Allwinner terminology, this boot <abbr title="Read-Only Memory">ROM</abbr> is called "<strong>BROM</strong>" (for "Boot <abbr title="Read-Only Memory">ROM</abbr>") or "<strong>eGON.BRM</strong>" (for "Embedded GO-ON Bootloader Boot <abbr title="Read-Only Memory">ROM</abbr>", who knows what this means exactly?).</p> <p>But in <a href="https://linux-sunxi.org/images/2/23/Allwinner_V3s_Datasheet_V1.0.pdf#page=41">another place</a> in the same datasheet, it is stated that it can boot from eMMC, too.</p> <div class="admonition failure"> <p class=admonition-title>Wrong!</p> <p><strong>We found that the available information is either incomplete, inacurate, misleading or completely false</strong>.</p> </div> <p>What triggered our suspicion was this first mismatch and the lack of details regarding the boot process: not a single explanation on the boot firmware format and/or exact location.</p> <p>The original <a href="https://drive.google.com/file/d/0BwAsAOITzQTGb2hSeXp3WE1qeGM/view?usp=sharing">v3s_lichee.zip</a> SDK is not very helpful in this regard.</p> <p>Hopefully, as Allwinner tends to use a rather consistent similar boot process for all its <abbr title="System on Chips">SoCs</abbr>, the <a href=http://dl.linux-sunxi.org/users/tsvetan/ANDROID-4.2.2-SDK2.0-KERNEL-3.4/lichee-v2.0.tar.gz>lichee-v2.0.tar.gz</a> from Olimex is actually giving some clues, albeit it does not mention the V3s.</p> <p>But the best source of information on the Allwinner chips is certainly the <a href=https://linux-sunxi.org/Main_Page>sunxi community</a>, that is dedicated to gather information around the Allwinner <abbr title="System on Chips">SoCs</abbr>.</p> <p>And although it describes in details the Allwinner A10/A20 and A31 chips and not the V3s, their <a href=https://linux-sunxi.org/BROM>BROM page</a> is a golden mine.</p> <p>The <a href=http://dl.linux-sunxi.org/users/tsvetan/A20-SDK-V1.2/A20-V1.2.tar.gz>A20-V1.2.tar.gz</a> SDK from Olimex is also relevant, as it contains some original source code for the Allwinner A20 <abbr title="System on Chip">SoC</abbr> bootloader.</p> <p>Eventually, in order to clear all doubts regarding the Boot <abbr title="Read-Only Memory">ROM</abbr> role, we had to reverse-engineer the Allwinner V3s Boot <abbr title="Read-Only Memory">ROM</abbr> by disassembling its source code. The current findings are available in our repository, in the "<a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s>brom.s</a>" file, with our comments added:</p> <p><a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM>https://github.com/FunKey-Project/Allwinner-V3s-BROM</a></p> <h2 id=power-on-reset-por>Power-On Reset (POR)<a class=headerlink href=#power-on-reset-por title="Permanent link">¶</a></h2> <p>As it is common to all ARM Cortex-A architecture <abbr title="Central Processing Units">CPUs</abbr>, the Allwinner V3s fetches the first instruction to execute from the first 32-bit word in a vector table located at address <code>0xffff0000</code>.</p> <p>On the V3s, this location is the <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L2>first 32-bit word</a> in the Boot <abbr title="Read-Only Memory">ROM</abbr>, that contains as its first vector a branch instruction to the <code>reset</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L16-L31>function</a>", located immediately after the vector table.</p> <p>And except for the <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L8>irq vector</a> that contains a branch instruction to the <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L34-L38>first-level routine handling interrupt request</a>, all other standard ARM vectors only contain a branch to a "<a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L12-L13>forever loop</a>" as they are not implemented at this stage.</p> <div class="admonition note"> <p class=admonition-title>Note</p> <p>A non-standard <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L10>"FEL" vector</a> is appended at the end of the vector table.</p> <p>This provides an indirect way to access the FEL code, allowing to change its actual location while keeping the ability to address it using a fixed location.</p> </div> <h2 id=reset-function>Reset Function<a class=headerlink href=#reset-function title="Permanent link">¶</a></h2> <p>The <code>reset</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L16-L31>function</a> is the first useful piece of code executed on the <abbr title="Central Processing Unit">CPU</abbr>.</p> <p>At this point, the only known-working hardware is the <abbr title="Central Processing Unit">CPU</abbr> 24 MHz clock derived from the external crystal, the <abbr title="Central Processing Unit">CPU</abbr> itself and its internal registers which may not even be initialized.</p> <h3 id=register-initialization>Register Initialization<a class=headerlink href=#register-initialization title="Permanent link">¶</a></h3> <p>This is the role of the short <code>reset</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L16-L31>function</a> that clears all <abbr title="Central Processing Unit">CPU</abbr> registers (except r0 that is set to <code>1</code>) and jumps to the actual BROM header first 32-bit word.</p> <h3 id=brom-header>BROM Header<a class=headerlink href=#brom-header title="Permanent link">¶</a></h3> <p>The <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L2994>BROM location</a> contains a "BROM header" structure made up of:</p> <ul> <li> <p>a 32-bit word branch instruction that jumps to the <code>start</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3015>function</a></p> </li> <li> <p>an ASCII magic signature "<strong>eGON.BRM</strong>"</p> </li> <li> <p>a header length in bytes (32)</p> </li> <li> <p>a boot version in ASCII ("1100" for version 1.1.00)</p> </li> <li> <p>an eGON version in ASCII ("1100" for version 1.1.00)</p> </li> <li> <p>a platform information in ASCII ("1681" for the V3s)</p> </li> <li> <p>a 32-bit word padding</p> </li> </ul> <h2 id=start-function>Start Function<a class=headerlink href=#start-function title="Permanent link">¶</a></h2> <p>The <code>start</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3015>function</a> role is to setup a minimal execution environment with a call stack, using the internal static <abbr title="Random-Access Memory">RAM</abbr> A1 and C memory.</p> <h3 id=brom-output-pin-toggling>BROM Output Pin Toggling<a class=headerlink href=#brom-output-pin-toggling title="Permanent link">¶</a></h3> <p>We found that the <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3015-L3084>first step</a> of the <code>start</code> function consists in toggling an unidentified "BROM Output" pin.</p> <p>This guess is based on the fact that, according to the <a href="https://linux-sunxi.org/images/4/46/Allwinner_H6_V200_User_Manual_V1.1.pdf#page=239">H6 User Manual</a> which has a register with similar offset (<code>0xa4</code>) in its system configuration block, it is indeed <code>BROM_OUTPUT_REG</code>, and its bit 0 is <code>BROM_OUTPUT_ENABLE</code>, and bit 1 is <code>BROM_OUTPUT_VALUE</code>.</p> <div class="admonition tip"> <p class=admonition-title>Tip</p> <p>If this pin is actually available, this would allow to check with an oscilloscope if the <abbr title="Central Processing Unit">CPU</abbr> is running or not, but we were not able to locate it.</p> </div> <h3 id=multi-cpu-check>Multi-<abbr title="Central Processing Unit">CPU</abbr> Check<a class=headerlink href=#multi-cpu-check title="Permanent link">¶</a></h3> <p>The second step in the <code>start</code> function is to <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3086-L3100>check for multi-<abbr title="Central Processing Units">CPUs</abbr></a>. This is unlikely to do anything, as the V3s only contains a single <abbr title="Central Processing Unit">CPU</abbr>, but the code is probably here for compatibility with other multi-core <abbr title="System on Chips">SoCs</abbr>.</p> <h3 id=start-cpu-0>Start <abbr title="Central Processing Unit">CPU</abbr> #0<a class=headerlink href=#start-cpu-0 title="Permanent link">¶</a></h3> <p>The third step in the <code>start</code> function is to <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3102-L3109>initialize the <abbr title="Central Processing Unit">CPU</abbr> #0 operating mode</a>:</p> <ul> <li> <p>define the system as an ARMv4+ architecture</p> </li> <li> <p>set the <abbr title="Central Processing Unit">CPU</abbr> #0 in SVC (supervisor) mode</p> </li> <li> <p>disable both normal <abbr title="Interrupt ReQuest">IRQ</abbr> and fast FIRQ interrupt requests</p> </li> <li> <p>set the system as little-endian</p> </li> </ul> <h3 id=disable-memory-access-features>Disable Memory Access Features<a class=headerlink href=#disable-memory-access-features title="Permanent link">¶</a></h3> <p>The next step in the <code>start</code> function is to <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3111-L3115>disable all kind of memory access optimization features</a>:</p> <ul> <li> <p>disable the <abbr title="Memory Management Unit">MMU</abbr></p> </li> <li> <p>disable the data cache (D-Cache)</p> </li> <li> <p>disable the program flow prediction and the instruction cache (I-Cache)</p> </li> </ul> <h3 id=disable-watchdog>Disable Watchdog<a class=headerlink href=#disable-watchdog title="Permanent link">¶</a></h3> <p>The next step in sequence in the <code>start</code> function is to <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3117-L3121>disable the watchdog</a>.</p> <div class="admonition tip"> <p class=admonition-title>Tip</p> <p>However, this is described in the datasheet as having "no effect"?</p> <p>It may be a <em>write-once</em> capability that is disabled when written anything but zeros.</p> </div> <h3 id=configure-internal-system-bus-clocks>Configure Internal System Bus Clocks<a class=headerlink href=#configure-internal-system-bus-clocks title="Permanent link">¶</a></h3> <p>The clocks for the AHB1 (Advanced High-speed Bus #1) and APB1 (Advanced Peripheral Bus #1) <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3123-L3130>bus clocks are set up</a> to enable access to most of the internal peripheral controllers, except <abbr title="Universal Asynchronous Receiver/Transmitter">UART</abbr>, TWI that are on APB2 bus and EMAC and <abbr title="Universal Serial Bus">USB</abbr> that are on AHB2 bus, as can be seen in the diagram below:</p> <p><img alt="System Bus Tree" class=lightbox src=/assets/images/System_Bus.png></p> <div class="admonition bug"> <p class=admonition-title>Bug</p> <p>In the above diagram taken from the datasheet, the BROM looks like is located on the APB1 bus, which is certainly not possible, as the system already accesses it before enabling its clock!</p> </div> <h3 id=initialize-dma-and-pio>Initialize <abbr title="Direct Memory Access">DMA</abbr> and <abbr title="Peripheral I/O">PIO</abbr><a class=headerlink href=#initialize-dma-and-pio title="Permanent link">¶</a></h3> <p>In the <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3132-L3146>next step</a> in the <code>start</code> function:</p> <ul> <li> <p>the <abbr title="Direct Memory Access">DMA</abbr> engine is enabled</p> </li> <li> <p>the <abbr title="Peripheral I/O">PIO</abbr> (Peripheral <abbr title=Input/Output>I/O</abbr>) controller is enabled to access external pins</p> </li> <li> <p>the <abbr title="Direct Memory Access">DMA</abbr> engine is reset</p> </li> </ul> <h3 id=initialize-stack-pointer-in-sram-a1>Initialize Stack Pointer in <abbr title="Static Random-Access Memory">SRAM</abbr> A1<a class=headerlink href=#initialize-stack-pointer-in-sram-a1 title="Permanent link">¶</a></h3> <p>At this stage, the 16KB <abbr title="Static Random-Access Memory">SRAM</abbr> A1 is available at addresses <code>0x00000000-0x00003fff</code>, so a <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3148-L3149>first stack pointer is initialized at the top of <abbr title="Static Random-Access Memory">SRAM</abbr> A1 memory</a>.</p> <h3 id=resume-from-standby-mode>Resume from Standby Mode<a class=headerlink href=#resume-from-standby-mode title="Permanent link">¶</a></h3> <p>A <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3151-L3158>check</a> is then performed to see if the <abbr title="Central Processing Unit">CPU</abbr> is resuming from standby mode.</p> <div class="admonition hint"> <p class=admonition-title>Hint</p> <p>This standby mode is not documented anywhere!</p> </div> <p>If yes, a jump to the <code>resume_from_standby</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3288-L3317>function</a> is done, where further checking is performed on the resume header:</p> <ul> <li> <p>check for a "<strong>eGON.BT0</strong>" signature at an address <code>0x01f01da8</code> that is suspected to be a "<strong>standby resume entry address register</strong>"</p> </li> <li> <p>check if the resume address the follows the signature is valid (if its 10 MSB bits are all zeros)</p> </li> <li> <p>verify the header checksum</p> </li> </ul> <p>If all these checks passed, the resume entry point is called, otherwise a call to the <code>boot</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3219>function</a> is performed to try to resume the normal boot sequence.</p> <div class="admonition bug"> <p class=admonition-title>Bug</p> <p>However, the normal boot sequence will not be able to continue, as the next steps to enable the <abbr title="Static Random-Access Memory">SRAM</abbr> C block are skipped, so this is expected to fail!</p> </div> <h3 id=enable-sram-c>Enable <abbr title="Static Random-Access Memory">SRAM</abbr> C<a class=headerlink href=#enable-sram-c title="Permanent link">¶</a></h3> <p>In the next to final step of the <code>start</code> function, the <abbr title="Static Random-Access Memory">SRAM</abbr> C (44 KB) is enabled at addresses <code>0x00004000-0x000efff</code>:</p> <ul> <li> <p>first, <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3160-L3164>an undocumented register in System Control block is cleared</a>, that is suspected to enable <abbr title="Static Random-Access Memory">SRAM</abbr> C access to the <abbr title="Central Processing Unit">CPU</abbr> and the <abbr title="Direct Memory Access">DMA</abbr></p> </li> <li> <p>Then <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3166-L3182>the Video Engine (VE) is started</a> by enabling its clock and reseting it. It is suspected that the reason it is done here is because the <abbr title="Static Random-Access Memory">SRAM</abbr> C block is tied to the Video Engine function</p> </li> </ul> <h3 id=initialize-stack-pointer-in-sram-c>Initialize Stack Pointer in <abbr title="Static Random-Access Memory">SRAM</abbr> C<a class=headerlink href=#initialize-stack-pointer-in-sram-c title="Permanent link">¶</a></h3> <p>In the last step of the <code>start</code> function, the <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3184-L3187>stack pointer is set 4KB below the end of <abbr title="Static Random-Access Memory">SRAM</abbr> C</a> (address <code>0x0000dffc</code>), before calling the final <code>boot</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3219>function</a>.</p> <h2 id=boot-function>Boot Function<a class=headerlink href=#boot-function title="Permanent link">¶</a></h2> <p>The role of the <code>boot</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3219>function</a> is to implement the boot sequence described in the datasheet:</p> <p><img alt="Boot Sequence" class=lightbox src=/assets/images/Boot_Sequence.png></p> <div class="admonition failure"> <p class=admonition-title>Wrong!</p> <p><strong>However, we found out that this diagram is inacurate!</strong></p> </div> <h3 id=check-uboot-button>Check UBoot Button<a class=headerlink href=#check-uboot-button title="Permanent link">¶</a></h3> <p>The first step in the <code>boot</code> function is to check if an "UBoot button" is pressed by calling the <code>check_uboot</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L7037-L7063>function</a>.</p> <div class="admonition note"> <p class=admonition-title>Note</p> <p>Here, "UBoot" stands for "<abbr title="Universal Serial Bus">USB</abbr> Boot", it has nothing to do whith "Das U-Boot" bootloader!</p> </div> <p>However, as the <code>check_uboot</code> function uses a special register to check the input pin rather than the standard <abbr title="Peripheral I/O">PIO</abbr> controller, it is not possible to determine from the code which pin is actually involved.</p> <p>We are not aware of any pin on the V3s that has this capability, although we suspected the PF6 pin (pin 100) to have this function as it has no alternate function like all the other pins, but this is not the case: pulling this pin to GND during the boot process has no effect, so likely, this function is not implemented on the V3s.</p> <p>If this hypothetical button is pressed during the boot sequence, the <code>boot</code> function would branch directly to the FEL <abbr title="Universal Serial Bus">USB</abbr> Boot code, bypassing the normal boot process.</p> <h3 id=boot-from-flash-memory>Boot from Flash Memory<a class=headerlink href=#boot-from-flash-memory title="Permanent link">¶</a></h3> <p>Unlike what is describe in the control flow diagram above, the V3s search order for the Flash memory to boot from is actually the following:</p> <ol> <li> <p><abbr title="Secure Digital">SD</abbr> Card on SDC0 interface</p> </li> <li> <p>eMMC chip on SDC2 interface</p> </li> <li> <p><abbr title="Secure Digital">SD</abbr> Card on SDC2 interface</p> </li> <li> <p>NOR Flash chip on <abbr title="Serial Peripheral Interface">SPI</abbr> interface</p> </li> <li> <p>NAND Flash chip on <abbr title="Serial Peripheral Interface">SPI</abbr> interface</p> </li> </ol> <p>For all Flash memory types, the boot process is similar:</p> <ul> <li> <p>read one 512 byte block at address <code>0x00000000</code> from the Flash device to get a "<strong>BOOT0 Header</strong>"</p> </li> <li> <p>check the "<strong>eGON.BT0</strong>" signature at the very beginning of the loaded block using the <code>check_magic</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L7133-L7158>function</a> (<a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3688-L3692>example for booting from MMC0</a>)</p> </li> <li> <p>check the length field at offset 16: the second stage bootloader length must be < 32KB (0x8000), <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3698-L3701>example for booting from MMC0</a></p> </li> <li> <p>check if the length field bits 24:31 are null (which is always true anyway because of the test above, <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3702-L3705>example for booting from MMC0</a>)</p> </li> <li> <p>perform 2 attempts to read the required number of 512-byte blocks for the specified length and load them at address <code>0x00000000</code> from the Flash device (it looks like the first block is re-read, <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3711-L3728>example for booting from MMC0</a>). The reason to perform 2 attempts is unknown</p> </li> <li> <p>eventually, jump to the <code>.boot_spl</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3284-L3286>function</a>, which:</p> <ul> <li> <p>loads <code>0xfc</code> into register r1 and <code>0x0</code> into register r0</p> </li> <li> <p>calls the <code>jump_spl</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3210-L3215>function</a> that:</p> </li> <li> <p>saves the r0 contents to r4</p> </li> <li> <p>calls in turn the <code>jump_to</code> <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L7267-L7268>function</a> that:</p> <ul> <li>loads r0 into the program counter and never returns, actually launching the loaded <abbr title="Secondary Program Loader">SPL</abbr> (Secondary Program Loader) at address <code>0x00000000</code> in <abbr title="Static Random-Access Memory">SRAM</abbr> A1 and C</li> </ul> </li> </ul> </li> </ul> <p>If no bootable Flash memory is found, the <code>boot</code> function will branch to the FEL <abbr title="Universal Serial Bus">USB</abbr> Boot code.</p> <h3 id=booting-from-sd-card>Booting from <abbr title="Secure Digital">SD</abbr> Card<a class=headerlink href=#booting-from-sd-card title="Permanent link">¶</a></h3> <p>As on the <strong>FunKey S</strong> the only available Flash memory to boot from is the <abbr title="Secure Digital">SD</abbr> Card, we will focus on this one and ignore the other devices.</p> <p>The only <abbr title="Secure Digital">SD</abbr> Card specificity regarding the boot process is that the BOOT0 header above is fetched from 2 byte-offsets from the beginning of the card:</p> <ul> <li> <p><a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3792-L3799>at offset 8KB</a></p> </li> <li> <p><a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3801-L3807>at offset 128KB</a></p> </li> </ul> <p>The reason why these particular offsets were chosen is unknown, but they are not very convenient for card following a standard partitioning scheme:</p> <ul> <li> <p>the 8KB offset falls in the middle of the Primary GPT in a GUID Partition Table scheme. As most <abbr title="Secure Digital">SD</abbr> Card are optimized in hardware for the old MBR scheme, it is not critical</p> </li> <li> <p>both offsets fall within the first 1GB on the disk, which is most of the time not allocated for disk partitions, so they require specific tools to access them</p> </li> </ul> <p>On the <strong>FunKey S</strong>, the 8KB offset is used for the <abbr title="Secondary Program Loader">SPL</abbr>, detailed in the next section.</p> <p>The <abbr title="Secure Digital">SD</abbr> Card interface used (0 or 2) is stored into the BOOT0 header in the byte at offset 40, and bit 5 in this byte is set to <code>1</code> when the BOOT0 header is loaded from offset 128 KB, and to <code>0</code> when booted from offset 8KB by this <a href=https://github.com/FunKey-Project/Allwinner-V3s-BROM/blob/main/brom.s#L3740-L3756>code</a>.</p> <h2 id=fel>FEL<a class=headerlink href=#fel title="Permanent link">¶</a></h2> <p>The FEL is a low-level subroutine also contained in the BootROM on Allwinner devices. It is used for initial programming and recovery of devices using <abbr title="Universal Serial Bus">USB</abbr>.</p> <p>The FEL is actually implementing a tiny <abbr title="Universal Serial Bus">USB</abbr> stack for a <a href=https://linux-sunxi.org/FEL/Protocol>proprietary <abbr title="Universal Serial Bus">USB</abbr> protocol</a> different from the standard <abbr title="Device Firmware Update">DFU</abbr> (Device Firmware Update) protocol used by many other devices.</p> <p>Using some specific tools on the host computer, it is possible to read or write data to/from the device over <abbr title="Universal Serial Bus">USB</abbr> and execute code on it, providing a way to boot the system over <abbr title="Universal Serial Bus">USB</abbr>.</p> <p>These "sunxi-tools" are described <a href=https://linux-sunxi.org/FEL/USBBoot>here</a> and <a href=https://linux-sunxi.org/Sunxi-tools>here</a>.</p> <div class="admonition warning"> <p class=admonition-title>Warning</p> <p>For the V3s, it is mandatory to build the version from the <a href=https://github.com/linux-sunxi/sunxi-tools>repository</a>, as the versions packaged in the different operating systems are too old and do not take into account the V3s chip.</p> </div> <p>Using the "sunxi-tools" and the built-in FEL mode from the BootROM, it is possible to boot the V3s <abbr title="Central Processing Unit">CPU</abbr> over <abbr title="Universal Serial Bus">USB</abbr> without any attached Flash storage.</p> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> <div class=md-copyright__highlight> © 2020-2024 FunKey Project<br> Last updated on 2024-05-04 by DrUm78<br> <a href=http://creativecommons.org/licenses/by-sa/4.0/ rel=license> <img alt="Creative Commons License" style=border-width:0 src=https://i.creativecommons.org/l/by-sa/4.0/80x15.png> </a><br>This work is licensed under a <a href=http://creativecommons.org/licenses/by-sa/4.0/ rel=license>Creative Commons Attribution-ShareAlike 4.0 International License</a>. </div> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> <div class=md-social> <a href=https://www.facebook.com/FunKeyProjectOfficial target=_blank rel=noopener title=www.facebook.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256c0 120 82.7 220.8 194.2 248.5V334.2h-52.8V256h52.8v-33.7c0-87.1 39.4-127.5 125-127.5 16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287v175.9C413.8 494.8 512 386.9 512 256z"/></svg> </a> <a href=https://twitter.com/FunKeyProject target=_blank rel=noopener title=twitter.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> </a> <a href=https://www.instagram.com/funkey_project/ target=_blank rel=noopener title=www.instagram.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/></svg> </a> <a href=https://www.youtube.com/channel/UCm6RThJXazA1VMhimqOtjww target=_blank rel=noopener title=www.youtube.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 576 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/></svg> </a> <a href=https://www.pinterest.fr/davidlarbi/funkey-project/ target=_blank rel=noopener title=www.pinterest.fr class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"/></svg> </a> <a href=https://github.com/FunKey-Project target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> </a> <a href=https://hub.docker.com/r/funkeyproject/funkey-os/ target=_blank rel=noopener title=hub.docker.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 640 512"><!-- Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4.4 67.6.1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../../../..", "features": [], "search": "../../../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src=../../../../assets/javascripts/bundle.a7c05c9e.min.js></script> <script src=../../../../assets/js/jquery-3.5.1.min.js></script> <script src=../../../../assets/js/simple-lightbox.jquery.min.js></script> <script src=../../../../assets/js/custom.js></script> </body> </html> |