From 71332f591af7a73fd38fa5c8b4fcb7eaf5355212 Mon Sep 17 00:00:00 2001 From: Jean-Yves Vet Date: Tue, 25 Aug 2020 18:24:14 +0200 Subject: [PATCH 1/2] Add -p option to cherry-pick a patchset This patch adds the -p/--patchset option to cherry-pick a patchset on the top of a coreboot tag or commit. The patchset should be submitted for review (not necessarily merged) to the gerrit owned by coreboot.org. --- build.sh | 5 +++++ common/download_coreboot.sh | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/build.sh b/build.sh index f73b3ed..42934ed 100755 --- a/build.sh +++ b/build.sh @@ -25,6 +25,7 @@ usage() echo " -c, --commit Git commit hash" echo " -h, --help Show this help" echo " -i, --config Execute with interactive make config" + echo " -p, --patchset Cherry-pick a patch set which is not merged yet" echo " -t, --tag Git tag/version" echo echo "If a tag, commit or bleeding-edge flag is not given, the latest Coreboot release will be built." @@ -55,6 +56,9 @@ do -i | --config) COREBOOT_CONFIG=true shift 1;; + -p | --patchset) + COREBOOT_PATCHSET="$2" + shift 2;; -t | --tag) COREBOOT_TAG="$2" shift 2;; @@ -93,6 +97,7 @@ docker run --rm -it \ -v "$PWD/$MODEL:$DOCKER_SCRIPT_DIR" \ -v "$PWD/common:$DOCKER_COMMON_SCRIPT_DIR" \ -e COREBOOT_COMMIT="$COREBOOT_COMMIT" \ + -e COREBOOT_PATCHSET="$COREBOOT_PATCHSET" \ -e COREBOOT_TAG="$COREBOOT_TAG" \ -e COREBOOT_CONFIG="$COREBOOT_CONFIG" \ coreboot/coreboot-sdk:"$COREBOOT_SDK_VERSION" \ diff --git a/common/download_coreboot.sh b/common/download_coreboot.sh index 7e06c45..34d4c37 100755 --- a/common/download_coreboot.sh +++ b/common/download_coreboot.sh @@ -60,6 +60,20 @@ function checkoutCommit() { } ################################################################################ +################################################################################ +## Cherry-pick a patchset +################################################################################ +function cherryPickPatchset() { + cd "$DOCKER_COREBOOT_DIR" || exit + + # Workaround git complaining about unset email + git config --global user.email "dummys@docker.com" && git config --global user.name "skull.docker" + + git fetch "https://review.coreboot.org/coreboot" "$COREBOOT_PATCHSET" || exit + git cherry-pick FETCH_HEAD || exit + + git submodule update --recursive --remote +} ################################################################################ ## Download the latest released version of Coreboot @@ -100,5 +114,9 @@ function downloadOrUpdateCoreboot() { gitUpdate checkoutTag fi + + if [ "$COREBOOT_PATCHSET" ]; then + cherryPickPatchset + fi } ################################################################################ From 8cc80fa439198753920ac04bd010cee994c09908 Mon Sep 17 00:00:00 2001 From: Jean-Yves Vet Date: Tue, 25 Aug 2020 18:33:45 +0200 Subject: [PATCH 2/2] x230_fhd: Add support of X230 board with FHD mod resolves #83 --- README.md | 1 + x230_fhd/.gitignore | 3 + x230_fhd/LICENSE | 674 ++++++++++++++++++++++++++ x230_fhd/NEWS | 5 + x230_fhd/README.md | 104 ++++ x230_fhd/bootsplash.jpg | Bin 0 -> 14840 bytes x230_fhd/bootsplash.xcf | Bin 0 -> 42124 bytes x230_fhd/build.sh | 82 ++++ x230_fhd/compile.sh | 46 ++ x230_fhd/external_install_bottom.sh | 265 ++++++++++ x230_fhd/external_install_top.sh | 219 +++++++++ x230_fhd/free-defconfig-f5b3a49b76 | 9 + x230_fhd/front.jpg | Bin 0 -> 73560 bytes x230_fhd/nonfree-defconfig-f5b3a49b76 | 16 + x230_fhd/pci8086,0166.rom | Bin 0 -> 65536 bytes x230_fhd/release.sh | 150 ++++++ x230_fhd/util | 1 + x230_fhd/x230_fhd_skulls.sh | 224 +++++++++ 18 files changed, 1799 insertions(+) create mode 100644 x230_fhd/.gitignore create mode 100644 x230_fhd/LICENSE create mode 100644 x230_fhd/NEWS create mode 100644 x230_fhd/README.md create mode 100644 x230_fhd/bootsplash.jpg create mode 100644 x230_fhd/bootsplash.xcf create mode 100755 x230_fhd/build.sh create mode 100755 x230_fhd/compile.sh create mode 100755 x230_fhd/external_install_bottom.sh create mode 100755 x230_fhd/external_install_top.sh create mode 100644 x230_fhd/free-defconfig-f5b3a49b76 create mode 100644 x230_fhd/front.jpg create mode 100644 x230_fhd/nonfree-defconfig-f5b3a49b76 create mode 100644 x230_fhd/pci8086,0166.rom create mode 100755 x230_fhd/release.sh create mode 120000 x230_fhd/util create mode 100755 x230_fhd/x230_fhd_skulls.sh diff --git a/README.md b/README.md index 9783c5f..3bcb74d 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ coreboot-based BIOS on your laptop. ## Supported Laptops * [Lenovo Thinkpad X230](x230/README.md) +* [Lenovo Thinkpad X230 with FHD mod](x230_fhd/README.md) * [Lenovo Thinkpad X230T](x230t/README.md) ## When do we do a release? diff --git a/x230_fhd/.gitignore b/x230_fhd/.gitignore new file mode 100644 index 0000000..06cbd6a --- /dev/null +++ b/x230_fhd/.gitignore @@ -0,0 +1,3 @@ +/output +x230_fhd_coreboot_seabios_*rom* +/build diff --git a/x230_fhd/LICENSE b/x230_fhd/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/x230_fhd/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/x230_fhd/NEWS b/x230_fhd/NEWS new file mode 100644 index 0000000..b3c963c --- /dev/null +++ b/x230_fhd/NEWS @@ -0,0 +1,5 @@ +skulls-x230_fhd 0.0.1 - released 2020-09-01 +---------------------------------------- +* initial seperate release for the X230 with FHD mod + based on the X230 configuration +* based on coreboot commit f5b3a49b76 diff --git a/x230_fhd/README.md b/x230_fhd/README.md new file mode 100644 index 0000000..ab7ec68 --- /dev/null +++ b/x230_fhd/README.md @@ -0,0 +1,104 @@ +# Skulls - [Thinkpad X230](https://pcsupport.lenovo.com/en/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x230) with FHD mod + +![seabios_bootmenu](front.jpg) + +## Supported Hardware Modifications +The motherboard may be modified to use the 2nd Display Port from the dock +as the integrated panel's connection, which allows using a Full HD (FHD) +eDP panel instead of the stock LVDS display. + +To make this work with coreboot a [patch](https://review.coreboot.org/c/coreboot/+/28950) +is automatically applied. It disables the internal LVDS connector and also allows +brightness controls to work out of the box. + +*Note: this is currently only tested with the [Nitrocaster FHD mod](https://forum.thinkpads.com/viewtopic.php?f=43&t=122640).* + +## Latest release +Get it from our [release page](https://github.com/merge/skulls/releases) +* __coreboot__: We take coreboot's master branch at the time we build a release image. +* __microcode update__: revision `0x21` from 2019-02-13 +* __SeaBIOS__: version [1.13.0](https://seabios.org/Releases) from 2019-12-09 + +### release images to choose from +We release multiple different, but _very similar_ images you can choose from. +They all should work on all versions of the X230 FHD. These are the +differences; (xxxxxxxxxx stands for random characters in the filename): +* `x230_fhd_coreboot_seabios_xxxxxxxxxx_top.rom` includes the _proprietary_ +[VGA BIOS](https://en.wikipedia.org/wiki/Video_BIOS) from [Intel](https://www.intel.com/content/www/us/en/intelligent-systems/intel-embedded-graphics-drivers/faq-bios-firmware.html) +which is non-free software. It is executed in "secure" mode. +* `x230_fhd_coreboot_seabios_free_xxxxxxxxxx_top.rom` includes the +[VGA BIOS](https://en.wikipedia.org/wiki/Video_BIOS) +[SeaVGABIOS](https://www.seabios.org/SeaVGABIOS) which is free software. +While technically more interesting, visually this is currently not as +beautiful: + * The [bootspash image is not shown](https://github.com/merge/skulls/issues/59). + * Early boot console messages (after your HDD's bootloader has started a kernel) might be [missing](https://github.com/merge/skulls/issues/46). + +## table of contents +* [TL;DR](#tldr) +* [First-time installation](#first-time-installation) +* [Updating](#updating) +* [Moving to Heads](#moving-to-heads) +* [Why does this work](#why-does-this-work) +* [How to rebuild](#how-to-reproduce-the-release-images) +* [How to replace the splashscreen image](#how-to-replace-the-splashscreen-image) + +## TL;DR +1. run `sudo ./x230_fhd_skulls.sh` on your current X230 Linux system +2. Power down, remove the battery. Remove the keyboard and palmrest. Connect +a hardware flasher to an external PC (or a Raspberry Pi with a SPI 8-pin chip clip +can directly be used), and run +`sudo ./external_install_bottom.sh` on the lower chip +and `sudo ./external_install_top.sh` on the top chip of the two. +3. For updating later, run `./x230_fhd_skulls.sh`. No need to disassemble. + +And always use the latest [released](https://github.com/merge/skulls/releases) +package. This will be tested. The git master +branch is _not_ meant to be stable. Use it for testing only. + +## First-time installation +Same steps as the X230 without FHD mod (see [First-time installation](https://github.com/jyvet/skulls/blob/master/x230/README.md#first-time-installation)). + +## Updating +If you have locked your flash (i.e. `./external_install_bottom -l`) you can +flash externally using `external_install_top.sh` just like the +first time, see above. Only the "upper" 4MB chip has to be written. + +It is recommended to do the the update directly on your X230 using Linux +though. This is considered more safe for your hardware and is very convenient - +just install the "flashrom" program and run `./x230_fhd_skulls.sh`, see below. + +1. boot Linux with the `iomem=relaxed` boot parameter (for example in /etc/default/grub `GRUB_CMDLINE_LINUX_DEFAULT`) +2. [download](https://github.com/merge/skulls/releases) the latest Skulls release tarball and unpack it or check for updates by running `./x230_fhd_skulls.sh -U`. +3. run `sudo ./x230_fhd_skulls.sh` and choose the image to flash. + +Hint: In case your Linux distribution's GRUB bootloader doesn't use the full +screen, put the line `GRUB_GFXMODE=1366x768x32` in your `/etc/default/grub` file +(and run `update_grub`). + +## Moving to Heads +*Not supported yet.* + +## Why does this work? +On the X230, there are 2 physical "BIOS" chips. The "upper" 4MB +one holds the actual bios we can generate using coreboot, and the "lower" 8MB +one holds the rest that you can [modify yourself once](#first-time-installation), +if you like, but strictly speaking, you +[don't need to touch it at all](https://www.coreboot.org/Board:lenovo/x230#Building_Firmware). +What's this "rest"? +Mainly a tiny binary used by the Ethernet card and the Intel Management Engine. +Read the [coreboot documentation](https://doc.coreboot.org/mainboard/lenovo/xx30_series.html) +for more details. + +## How to reproduce the release images +* `git clone https://github.com/merge/skulls` +* `cd skulls/x230_fhd` +* `git checkout 0.1.0` for the release you want to build. In this example 0.1.5. +* `./build.sh` and choose the configuration you want to build + +## How to replace the splashscreen image +In order to create your own splashscreen image, before building, +overwrite the `splashscreen.jpg` with your own JPEG, using +* "Progressive" turned off, and +* "4:2:0 (chroma quartered)" Subsampling + diff --git a/x230_fhd/bootsplash.jpg b/x230_fhd/bootsplash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41d2b917a50d5e33721d772d2d95dc7e32cf32ed GIT binary patch literal 14840 zcmeHtc~FyA+-}q=RuqdYDhRYtK|nxcQxMWB0c%-`As~qZ^lRrITz}f(1Fit} z?cMv&vuj`MKKl>u-~YuI`wuB795{IR(BZ?1hZGf$C>{Iih?26BqT*NTUn#4os;Q|R zK6?Cwy6TBzs%onL6tZXE?mu7b|8oESFIA5y9#Q?jww)IM<%9bGUjX*)(FN>P-m_16 z&rTaa8?XnkZ#QYz0RLeM2fy5Z;LsO)_w3uv|KY1WfZeM1?A@#I#eo9{6nDSbvv;=- z2NaYK9{c7?a~0k1J#NMPqIy36v6{Nx<@%S$EiPV?X-k_c;JAdu%EtcP zqE!EP75`b)KdH+9Rq=nN4g(JF+q2uoeaZkJpzE*yO#k=&F9QD}@Gk=YBJeK)|DO=h zx)%|78#j*#(3Y8IL+mj2+NgPa|g!%xS^)gV#ZTy{!cd2q!J;5H#6fukd$ z?EqdDT+e}jD<1J7R(HOwb95fF9H~Ugo09zc?@-hWig4i<)^2~8@*{8;Z1iXmxWJmM zpObH^-|JgceSRruN}7Exl56LFgYc}}dc%Jp$(|b?vWQ-SEbaDqPlR0CUw?GP`;jnc zKG8^C9h$(&$HoTE3y7_AWF74Am)jp3mNs)2ypHRys2|<|TUKvQ5ns08r@1 z%?)X^R-x{p5Ye}T1UNP^o)rgyxO?by_-C~kF0USCxhcGD)QIG`kqW}g7}qx7zH}}t zPGu{tIG4YJ>8MQK7KVAOo%piU(OSC7$ z=jHO_@vekchST!=IU)U*i)(wpU#^ z?yJSg_|7*ZGkxK9ffbYv<$3n;E$q94ThE_jX!_l^OwUIlIi=09rI5GF(@_Ar-+ z!e1$6uvRpGwwBXv!ie7O}|UiX95emp`Xi@t^l#=dWe z4ip1Ja8$gs%=Xr*LUadjCGHQ)`LH!`v=0+v&KvTSFxf`|pVFcpyUk3Rke`6Gnf!!P zsVeScYEYcPmhE`V(!FS;kF<6Ida{b=zDA~#o#D5&xWErbK^jU}w}Q&BO;1O#n}a>w zLwP+VEOQ57z=y?vEFfTI7w0&O^())T1IE~jitmS(7g&NMa6<~litRM=A#8AaqqLCa zPkLwfdl0-0Rkj1*g!~~H8HY|j0fTK zA}|YeHKK4r2(?58pZ-jQ0su6mB2#|{@D^?5(Ik$nAvYyic}_sZT(LDh}dW1y@(n7%63SQi;5ZHWTog+(XUjTU)g2a zDD|yeNf3-+O#SmqaI>q?vn#c13qg{u0g1WsJ&9)u4i-Rmw+$fkU6xleZ_c#!b(YNJ z#W0_QC4-Y9qiBS-j_hzr5n_Yejb#lzg&#v2ge~v7o0UeHh3*-F<^#;%OLJM0!P(+@ zI`+xA>*C=RQ(oc}7}hn9ArNXr!67r}kG}bAwC?+^^(#&I?*^C^vOv8(aXsh;QOAp( z)J%!Zh;Ij`dl-ei8u1{mhUka-*@4KA9>$NlrE#9lF^DmwFIB3mjoLK0zh=6BB1$hT z^u&M+R2>2bXHtFTmIYL-Z&v zV;<*uaW3hN|B<&X_a=_O!y<~;pm_ZOd0$50!VNl)TUWAeTU4&?H(}!Ukg5V5)(~Kx z&CHdk`IHpT8{?To&kPlsL%&b3=Z1pvG3R-fQUKd2aso zXf_(jtcF9T6W2xh96>QZwsNGXi(}vmtZ>B`KgQdZH=zLc4Y+7LBb21~zcCh5h zO&>9okyux$t2eB-93uL(`8HB$mf)t1CdVb%>!Mn-8*t5);rLdDhfC#H4)XWpAwK8Y zINQdE=$ojP9habC!sWe#k~R#nuk^;m!J+o&@4#(^(O<9Y>(35T8z;wMd3D1j@^@@x zl$G<4q4IA?#YMf9yU`U(iPH#(r;x#h-WsJq;MWCnI{`?6zD_a@zKIvGiUzCfyvVJL(Q! z=HnoLeWo$7|J|n35N@&ff*M3iVwpp$T9xF>!+ojPFI~D~(%Rlt69V+ti;57~K7xVt zmv?f#t&0~O0%O0JWP>e(`a#;H=b4qZUWva*Z#DZ_gs(nOm$F!d`0|%15SPTc;sPgo zsf}DGR}B+1#7a6rOGQteQ|j;Ydv{^=femh=WUaUS zX%HNToCB%wR_CVUuJGZ_Men|J~ zlM#X;e#TtOWe0GksO*J0@ncqg0eaf4TZUzlj?Yqg+XaYJh*x%+W;5L4POPZ*jn4%! z_~~pjIbcFSuqQI(hEt?9JAki1OtnwpXOjz>jc~T5%_j=ETM~U>m#P>cH=?f1Bo|TV zZ~@4Ww)O`5^c{fnnEbZmXX12EP^*^TqjJ*paqUTOcx6rwVOc*Ix%p@w2P}KlLkwzD1}h9UXvWoG>%%X0_vC0FoN=)KC^NW{ z^DH+YM#xPJU*mT)K>V{)&`iSZh@qJo%CTwZM`cIe+-NeQKJ>zexO7up?c3EreGnC3 z$IWA7X!)%$`PCKDw=oW+$4;hBC@)YJ!GIgB-)^Hnu(9FZf>iry26!(KUqWplYuoYa zg<;g=`co%PHufdbD`e*8>!;xl-H!zaCM)(z?-vEoZ}7y=%59F(YUYjSWe{(3iCCxV z^2=O1g%7+pwhunkyUp^>#S8T@;|LyFTnBN_kfoACe%pjcEt$UHtXI5m!)q$2V{74X ze<3m|!JU78vF>P^2%28rkidvDn)GFHmPC_07iag>kHkZa zR$Un2s;v9r40iyhGves0u_L2?JQxqrvnwz}eX1$hlBG-sZvFV{XBtQV0HWws!yC;@ zqzRG!P)`>Mvp%?>G^GX+B;42m2)I&vCTK9Zb=j`-2)x6=m$TutA0pr^6gO0lJ8t_o zSS(6dz1sIKpoZ9P2%|L8_ulN)^p@J*^*^u0nX z{A9Sq+H`En`WGc>#?hn#JR|J0GPegK$NI!NRrTFPp%9J z_shnlACJ84vF153vM`FFZwI8);4so6*%G^D3}63ddZCjRfc@s8lCG|<)iZ494j}LQ zjV*;KCCSQrC2|%@x!GM zT3mcZZSDdKm#Y^Zce?Qhgb^o(y_}9nFG*2<`c`&8XtfXlcpyp5F*UK6y8TM-x{Qws z!-zItylUf!Php45=i9qcT-QEF-awmkV}i@Cb{~ZkXjTiJoMd{NCK{jf%`GD~dTeuC ztsMJY5hFW*<04(Ibw|xZ^nGHlo73rTPtc83<#|F@=7w}C=WA>9cbhL_l$1s}^`wvU zYm+`56a+1dRgy_C%)}ylPpWnEnL5ao2XiCEkLJlJLb%QIS`YZ*?jF`cieV<`Go z`R?apYP!j3gm^dFb>H_mW);zMzJF1Apb2Yc(dGmq0;*8fp;gQ!#p(6HiXuXR!(uG}LiYVD~^%8-h&dX0*kFWI_ zZ00Okmu^G&KK0g>LLdn0Vb@R0~hsVBXn zKqu8r`eF7QI6STAvis)14&c*KG*co)N+_OzZ^o2tj%TIyH^o>W+@4Yrj$G@RlayPE z)x?PvvqTZ$8T$X=&?>XU%hr8c?)j(vo%;`K#R$jRIfi$=HaM5U3V-CmTJIvq*L8IwK7 zK9y+b2h^-3tV$X_(ctPwjf9~Z88!-${Qj%}Ho@RV8Iq{#mnkV;=5_OH{v=bF?>F*y z07FCY^}2ng($r*X#UqOMt?Er)xQ}C^HZ@K)1gK$GW zoKD)>6$xL9Xf_?G3VNO^ngQbhJ|sOOd6v4+hoZ%Wfis#jGn2~y+o$x!qN4Z+;4#q` zM3@Bl9vP6C#o$$%rknIRr_1g4{vHZHtdzl9Q?w=5HlWbK!e*-a`RC(;*{nPX#&(NH z(Os^a98c#IP?Ed~Q?GKLrE<|3wk5a>i1U~VCnF6vHR}73j|ryKH@TUv3=ay~zU9Ou z{qsUG(AIFvCBBV$jyj|FW;A|~lKx3i0wK&&azhmKHa>ZP>{EgrIv4-G{PX9T1$H{8 zKIPQ?FqWb|_=*v&W9HReb&Siew{W$B*gN+9nEbrOcLmk%;P;Z+7@s4}EW?Bm_1sCk zhxyI~z3r=u!}`FB_rITDEEKUcXD$m)sLwJ=o=ow($%sV}7oswDog>hkh{k(7;o~6_ zE#0&~!P>Ot*ie)|>6O9QUoJpZ!ZYZHUON&P$JH1SMcIbp`OQS8FaY~{5-ZJI@pfFM zTpdcrOl2>0@WiPa?i^>bwJsr;KqM|@;%*S9j+W9(J9|NI#pPfPOBu5=s2{2LLxXo? zf~O1DQ$}`i{^4jZGE+T&ilrUJpyGs3;okLv>W&2OmFRw`w+;xVU7VdUI={H~#p*J0 zxo#9;UC7o<(k^YP^KddHL5df-yW4*P!yfr1w$t`b1(!YLe&5ZM|8`E2?hcHY`Zz?^ zUbRX0);08u%3pTu59#QJ!rs^!*u@LvXp$?vJVG}+j2c~oisSmrtMeE;00sA@?s50( zyA1O4rV8R?*oa@S84r1gORRVOg!J67+;HFkXz(wiwJ8r3Bkd=uqfNBs4@-%`9uO4} z@KeH{%xvzDlu!B>w#01C6j{6Z2j_>gJw2%NnQQ%X_+ex0ViFG~UiAQ?9A3U%H~Uk} ztqk;ijfcGZG!rz`psd*ghI)>*#Ff z-%SV!SA)Mn#kp4F!b@-lGxlJIH!q(c59UPKSs>!lbNy+xbKaJrRi-px%2~Emdz=m$ z|97wqb^LrZzacz}nmFYFQUz`JWfJHl(Sb_p|O-t8R^84oNmX2XOX?rx5d(O_@6EQ z%iHrVqOF7kEvr*v*;@J+nl))^xKmzvWfT9!VE#FrE53EDEmxh z@jn83b!LS3pQDybK*c-ykKN4PW8DT%ACv;4wvyQ5$pk+bG%OVh7r z)w}jR&Suz4r<)1LgNZQ37p>==$++3+ z9XerZGq{zM9;WGx@Sz}mxu!BDD>_eCpyCa75W9CzzLOg)^I7O`w)i$b4wVKAQnTkQz1}{Nl#B7#CbglnDcGa>+#^Oae4fQipxWEUr|?C`D@!?1R4%=PDF5B zGdSjB16YdifMaZkRs{4%rd93Z<|x1V+OXq0fRHXq@JwBH#Js^Ui86d^(9f#xl)@{A z%fYK1MNh*Z!&6#R*OW(zWQe`DO?YJlt{B@?oE=cnI&45C5fzO!V z4nPSpG_Wh;M2%o{Nn!F&&KYCBpEnoJX*eO6gn%$wqE%0il-M{_j}Eu1n@Vu^aB&_x z|4yX0#6(^2t%w{=tG(|(!M8K>BD%J{Cg_tOOwe)Nn#?Wk9Nl^KYN~gK{OgGwz}dU- zR3SrOY!{LGk(Xa}lOrc-o-c*}2#V7QNL`y;D;6B;ctC=vcuo4ULBy%e(Q@LHv=65U}|+Y;Mg}Ey-e0IMzKijM$Ag zwH_EB)7)H4jvc)(3*aUzSdUt3K|HLSE(uDqb#)Dfbsb_4cWAV;9KKk7Ft%b-lK5zn zb7mm1L;GRi4UUN>Ly|beITtFc z+3fEs_M5rNi6KKr{EkP0bBiFJ{pQdFi;+}WUVdv5L?~t?$T|yxbJB7He|j@u>O--x z?1%6Ry)9YDAXnHvFB|k9WqUeWt)goi$W%q+B)`G6?&4xiiV4a(&*wczQaE7j!1@Pm`q2gG~fp9bLfT8I>zOh48oc9b=hz#y5nTo-nk``tdx7O}+qIfCAd0DP?XI}H>ojX&Y_X#ysAS&H=~g5GN&=og2z6B5{#lRo11zR`u5 z1+n}OVQOlx$Yk&myJJ8UF=$zyMQLgm=qOz85*fasdvYvz9xL;h0H9&eUB&tj&VSPV ze%(yn`huzR0QeCHEeo1r9 ze!s?%jU~9--u3lSpwiuyOv@Q8fF*4{Pdo5(#l28&w=Dmq$8IK2fXe1E3?FdG!r(;z;^Q zH87~9T5_h|(cNFbdY78cu!}ytx`Bokyh^kz zV~iMq9wJ?RY-n-u&wgfEtp$`sR`#WnRZ-c|!*A;s{j2uoG#Aq$m?*ItL}hVN2z+Lt zburm>s#mx|@#k119m$EZ+2=yBURoP*kZ1FdjNRk(#frxVe*T~JEdQ4Fe@1{VRd~Ms z;4uqoRW*Og2QTv7sB?RqOF*PP60wC2nAmwT$O8iO(l^{np>5!W*Y{`jtvKKL)Th?Jx;et8IoFPtY3#z@WUqHO%s`c+`VxJj8-{yjQH;p^E{_p97`)7xS3 z;g&o|522c#lKqUMx&ugY$Szr&l08Z9E8W)?nIp2RuiXK_8vRnSdY6eY?}s5^xG?El zWpnQ)b zA-|6X8q-=MoV%zPG3PlRNsG6WsIj$6X@Z_&7NOm-gq zF^EBnvb{-84n-l}%*N?(yr}^7XFt?s7lN8KD6Xz*X3V`$f0G=YYn}JFJQX>skvH|O z_C1{tg;IfBypbQr(XnL^i!rmZu`+k$8CT7Mg7vzm6A!8$)~d&JmHY#|`HybDe!VP~1SU zr@!P(X=C4@1P+Vm6G@@PUab}b%Z>h5hcOSLh9hr{hrcgcgb}Aes-u+z0=7%{_D$== z`C(1^A8Eh#TOAp?*R&=OCh1xV<7_c_b=~r7WtkY-hGYON+D)g* zoL~hG-T}n7gXgjtGF&k5f=>o~Qua6^*QTStpW@^|%18Yb6?Ih8Ox*}K`q)d$TV6qj zZL^itIIG(d&+mLPv_C}QyBzE|HQ}Xr=ONn}F>QK(`H!BISZWt#`!u13Re5GR9m00U zhHu^~t?@2IQ*Bza8pImpmU1Tk*39me8SyE)6$cdWhe@wm;5j-Y7q1k4h)ge~-!6&tT#!J8IQ>CWmq&EFHmfXv93OT9h$a6!QDsnMV}$!shcf^3uk+;gS0_ zh?E$sh=g|b743BpYH*x~Z_X-iFkf8f0v@b8KcMpQPHn{NqcnZNh;4;`uzLPqQ|$?( z1Bl&NEjtF}DZ3#b%&ytkN>EuT+6Y{#<8m*#j&0L_8u4|qp5c%$MI^>7f@5RNWtNl3 zTPn(PA}L23yJ;_PW7H=f&7(L}v9=fNGUoUx40LV8$&GlI?F2awi;ze4lp;YqN*pMj z#oVBy5%kMxKh_9yxowvoH;~gg_ZwHOPD$-Uj_O^<)lf3bC-mr+5+u`8fG0IfAKV|Z z!TOa}*Eil${xL8mOk-C(JYxI6DL0tiW#&s+vo?c@Y9tMo9)-b39nbh@NA`|6e7`Km zxARG^?IX>UhS;^kIeyk*i!>1zH@jYgvu};_x0*-V#U3+_1KW2}&L;yhr^Vu?w#Q_1%?!No~d1d@J_g@75Md1Gd0t!1r{|h5g BC^`TD literal 0 HcmV?d00001 diff --git a/x230_fhd/bootsplash.xcf b/x230_fhd/bootsplash.xcf new file mode 100644 index 0000000000000000000000000000000000000000..7ebc56a50c25176fd5bc440fa0a7728c271806b6 GIT binary patch literal 42124 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 literal 0 HcmV?d00001 diff --git a/x230_fhd/build.sh b/x230_fhd/build.sh new file mode 100755 index 0000000..6886ba3 --- /dev/null +++ b/x230_fhd/build.sh @@ -0,0 +1,82 @@ +#!/bin/bash +source "util/functions.sh" + +warn_not_root + +have_config=0 + +usage() +{ + echo "Skulls for the X230 with FHD mod" + echo " Run this script to rebuild a released image" + echo "" + echo "Usage: $0 [-c ]" + echo "" + echo " -c to use for flashrom" +} + +args=$(getopt -o c:h -- "$@") +if [ $? -ne 0 ] ; then + usage + exit 1 +fi + +eval set -- "$args" +while [ $# -gt 0 ] +do + case "$1" in + -c) + CONFIGFILE=$2 + have_config=1 + shift + ;; + -h) + usage + exit 1 + ;; + --) + shift + break + ;; + *) + echo "Invalid option: $1" + exit 1 + ;; + esac + shift +done + +if [ ! "$have_config" -gt 0 ] ; then + configs_available=$(ls -1 | grep config || true) + if [ -z "${configs_available}" ] ; then + echo "No config file found. Please add -c " + echo "" + usage + exit 1 + fi + + prompt="Please select a configuration to use for building or start with the -c option to use a different one:" + options=( $(find -maxdepth 1 -name "*config*" -print0 | xargs -0) ) + + PS3="$prompt " + select CONFIGFILE in "${options[@]}" "Quit" ; do + if (( REPLY == 1 + ${#options[@]} )) ; then + exit + + elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then + break + + else + echo "Invalid option. Try another one." + fi + done +fi + +rm -f defconfig-* +CONFIGFILE_READY=$(echo $CONFIGFILE | cut -d'-' -f2-) +cp $CONFIGFILE $CONFIGFILE_READY + +cd .. +./build.sh --clean-slate --commit $(ls -1 x230_fhd/defconfig-* | cut -d'-' -f2-) \ + --patchset refs/changes/50/28950/12 x230_fhd +rm -f x230_fhd/defconfig-* diff --git a/x230_fhd/compile.sh b/x230_fhd/compile.sh new file mode 100755 index 0000000..b860019 --- /dev/null +++ b/x230_fhd/compile.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2018, Tom Hiller + +# shellcheck disable=SC1091 +source /home/coreboot/common_scripts/variables.sh +source /home/coreboot/common_scripts/download_coreboot.sh +source /home/coreboot/common_scripts/config_and_make.sh + +################################################################################ +## MODEL VARIABLES +################################################################################ +MAINBOARD="lenovo" +MODEL="x230_fhd" + +################################################################################ + +############################################### +## download/git clone/git pull Coreboot ## +############################################### +downloadOrUpdateCoreboot + +############################## +## Copy config and make ## +############################## +configAndMake + +##################### +## Post build ## +##################### +if [ ! -f "$DOCKER_COREBOOT_DIR/build/coreboot.rom" ]; then + echo "Uh oh. Things did not go according to plan." + exit 1; +else + #split out top BIOS + if [ ! -z "$COREBOOT_COMMIT" ]; then + RELEASEFILE="${MODEL}_coreboot_seabios_$(echo ${COREBOOT_COMMIT} | cut -c 1-10)_top.rom" + else + RELEASEFILE="coreboot_$MAINBOARD-$MODEL-top.rom" + fi + dd if="$DOCKER_COREBOOT_DIR/build/coreboot.rom" of="$DOCKER_COREBOOT_DIR/$RELEASEFILE" bs=1M skip=8 + sha256sum "$DOCKER_COREBOOT_DIR/$RELEASEFILE" > "$DOCKER_COREBOOT_DIR/${RELEASEFILE}".sha256 + echo "==================== result: ======================" + echo "$DOCKER_COREBOOT_DIR/$RELEASEFILE" + echo "===================================================" +fi diff --git a/x230_fhd/external_install_bottom.sh b/x230_fhd/external_install_bottom.sh new file mode 100755 index 0000000..18179d5 --- /dev/null +++ b/x230_fhd/external_install_bottom.sh @@ -0,0 +1,265 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2018, Martin Kepplinger +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' + +set -e + +cd "$(dirname "$0")" + +IFDTOOL=./util/ifdtool/ifdtool +ME_CLEANER_PATH=./util/me_cleaner/me_cleaner.py +have_chipname=0 +have_backupname=0 +me_clean=0 +lock=0 +have_flasher=0 +rpi_frequency=0 + +usage() +{ + echo "Skulls for the X230 with FHD mod" + echo " Run this script on an external computer with a flasher" + echo " connected to the X230's bottom chip (farther away from" + echo " the display, closer to you)." + echo "" + echo "Usage: $0 [-m] [-k ] [-l] [-f ] [-b ] [-c ]" + echo "" + echo " -f supported flashers: rpi, ch341a" + echo " -c flashrom chip name to use" + echo " -m apply me_cleaner -S -d" + echo " -l lock the flash instead of unlocking it" + echo " -k save the current image as" + echo " -b frequency of the RPi SPI bus in Hz. default: 128" +} + +args=$(getopt -o f:mlc:k:hb: -- "$@") +if [ $? -ne 0 ] ; then + usage + exit 1 +fi + +eval set -- "$args" +while [ $# -gt 0 ] +do + case "$1" in + -f) + FLASHER=$2 + have_flasher=1 + shift + ;; + -m) + me_clean=1 + ;; + -l) + lock=1 + ;; + -c) + CHIPNAME=$2 + have_chipname=1 + shift + ;; + -k) + BACKUPNAME=$2 + have_backupname=1 + shift + ;; + -b) + rpi_frequency=$2 + shift + ;; + -h) + usage + exit 1 + ;; + --) + shift + break + ;; + *) + echo "Invalid option: $1" + usage + exit 1 + ;; + esac + shift +done + +command -v flashrom >/dev/null 2>&1 || { echo -e >&2 "${RED}Please install flashrom and run as root${NC}."; exit 1; } +command -v make >/dev/null 2>&1 || { echo -e >&2 "${RED}Please install make and a C compiler${NC}."; exit 1; } +command -v mktemp >/dev/null 2>&1 || { echo -e >&2 "${RED}Please install mktemp (coreutils)${NC}."; exit 1; } + +if [ ! "$have_flasher" -gt 0 ] ; then + echo "Skulls for the X230" + echo "" + echo "Please select the hardware you use:" + PS3='Please select the hardware flasher: ' + options=("Raspberry Pi" "CH341A" "Exit") + select opt in "${options[@]}" + do + case $opt in + "Raspberry Pi") + FLASHER="rpi" + break + ;; + "CH341A") + FLASHER="ch341a" + break + ;; + "Exit") + exit 0 + ;; + *) echo invalid option;; + esac + done +fi + +if [ ! "${rpi_frequency}" -gt 0 ] ; then + rpi_frequency=512 +fi + +programmer="" +if [ "${FLASHER}" = "rpi" ] ; then + echo "Ok. Run this on a Rasperry Pi." + programmer="linux_spi:dev=/dev/spidev0.0,spispeed=${rpi_frequency}" +elif [ "${FLASHER}" = "ch341a" ] ; then + echo "Ok. Connect a CH341A programmer" + programmer="ch341a_spi" +else + echo "invalid flashrom programmer" + usage + exit 1 +fi + +TEMP_DIR=$(mktemp -d) +if [ ! -d "$TEMP_DIR" ]; then + echo -e "${RED}Error:${NC} Could not create temp dir" + rm -rf "${TEMP_DIR}" + exit 1 +fi + +if [ ! "$have_chipname" -gt 0 ] ; then + echo "trying to detect the chip..." + flashrom -p ${programmer} &> "${TEMP_DIR}"/chips || true + flashrom_error="" + flashrom_error=$(cat "${TEMP_DIR}"/chips | grep -i error || true) + if [ ! -z "${flashrom_error}" ] ; then + usage + echo "-------------- flashrom error: ---------------" + cat "${TEMP_DIR}"/chips + rm -rf "${TEMP_DIR}" + exit 1 + fi + + CHIPNAME="" + chip_found=0 + if [ ! "$chip_found" -gt 0 ] ; then + CHIPNAME=$(cat "${TEMP_DIR}"/chips | grep Found | grep "MX25L6406E/MX25L6408E" | grep -oP '"\K[^"\047]+(?=["\047])' || true) + if [ ! -z "${CHIPNAME}" ] ; then + chip_found=1 + fi + fi + + if [ ! "$chip_found" -gt 0 ] ; then + CHIPNAME=$(cat "${TEMP_DIR}"/chips | grep Found | grep "EN25QH64" | grep -o '".*"' | grep -oP '"\K[^"\047]+(?=["\047])' || true) + if [ ! -z "${CHIPNAME}" ] ; then + chip_found=1 + fi + fi + + if [ ! "$chip_found" -gt 0 ] ; then + CHIPNAME=$(cat "${TEMP_DIR}"/chips | grep Found | grep "W25Q64.V" | grep -o '".*"' | grep -oP '"\K[^"\047]+(?=["\047])' || true) + if [ ! -z "${CHIPNAME}" ] ; then + chip_found=1 + fi + fi + + if [ ! "$chip_found" -gt 0 ] ; then + echo "chip not detected." + flashrom -p ${programmer} || true + rm -rf "${TEMP_DIR}" + echo "chip not detected. Please find it manually and rerun with the -c parameter." + exit 1 + else + echo -e "Detected ${GREEN}${CHIPNAME}${NC}." + fi +fi + +make -C util/ifdtool +if [ ! -e ${IFDTOOL} ] ; then + echo "ifdtool not found at ${IFDTOOL}" + exit 1 +fi + +if [ ! "$me_clean" -gt 0 ] ; then + echo -e "Intel ME will ${RED}not${NC} be cleaned. Use -m if it should be." +else + echo -e "Intel ME will be ${GREEN}cleaned${NC}." +fi + +if [ ! "$lock" -gt 0 ] ; then + echo -e "The flash ROM will be ${GREEN}unlocked${NC}." +else + echo -e "The flash ROM will be ${RED}locked${NC}." +fi + +if [ "$me_clean" -gt 0 ] ; then + if [ ! -e ${ME_CLEANER_PATH} ] ; then + echo "me_cleaner not found at ${ME_CLEANER_PATH}" + rm -rf "${TEMP_DIR}" + exit 1 + fi +fi + +echo "Start reading 2 times. Please be patient..." +flashrom -p ${programmer} -c ${CHIPNAME} -r "${TEMP_DIR}"/test1.rom +flashrom -p ${programmer} -c ${CHIPNAME} -r "${TEMP_DIR}"/test2.rom +cmp --silent "${TEMP_DIR}"/test1.rom "${TEMP_DIR}"/test2.rom +if [ "$have_backupname" -gt 0 ] ; then + cp "${TEMP_DIR}"/test1.rom "${BACKUPNAME}" + sha256sum "${TEMP_DIR}"/test1.rom > "${BACKUPNAME}".sha256 + echo "current image saved as ${BACKUPNAME}" +fi + +reference_size=8388608 +TEMP_SIZE=$(wc -c <"$TEMP_DIR/test1.rom") +if [ ! "$reference_size" -eq "$TEMP_SIZE" ] ; then + echo -e "${RED}Error:${NC} didn't read 8M. You might be at the wrong chip." + rm -rf "${TEMP_DIR}" + exit 1 +fi + +echo -e "${GREEN}connection ok${NC}" + +echo "start unlocking ..." +if [ "$me_clean" -gt 0 ] ; then + ${ME_CLEANER_PATH} -d -S -O "${TEMP_DIR}"/work.rom "${TEMP_DIR}"/test1.rom +else + cp "${TEMP_DIR}"/test1.rom "${TEMP_DIR}"/work.rom +fi + +if [ ! "$lock" -gt 0 ] ; then + ${IFDTOOL} -u "${TEMP_DIR}"/work.rom +else + ${IFDTOOL} -l "${TEMP_DIR}"/work.rom +fi + +if [ ! -e "${TEMP_DIR}"/work.rom.new ] ; then + echo -e "${RED}Error:${NC} ifdtool failed. ${TEMP_DIR}/work.rom.new not found." + rm -rf "${TEMP_DIR}" + exit 1 +fi +if [ "$me_clean" -gt 0 ] ; then + echo -e "${GREEN}ifdtool and me_cleaner ok${NC}" +else + echo -e "${GREEN}ifdtool ok${NC}" +fi +make clean -C util/ifdtool + +echo "start writing..." + +flashrom -p ${programmer} -c "${CHIPNAME}" -w "${TEMP_DIR}"/work.rom.new +rm -rf "${TEMP_DIR}" +echo -e "${GREEN}DONE${NC}" diff --git a/x230_fhd/external_install_top.sh b/x230_fhd/external_install_top.sh new file mode 100755 index 0000000..9dd5799 --- /dev/null +++ b/x230_fhd/external_install_top.sh @@ -0,0 +1,219 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2018, Martin Kepplinger +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' + +set -e + +have_input_image=0 +have_chipname=0 +have_backupname=0 +have_flasher=0 +rpi_frequency=0 + +usage() +{ + echo "Skulls for the X230 with FHD mod" + echo " Run this script on an external computer with a flasher" + echo " connected to the X230's top chip (closer to the display" + echo " and farther from you)" + echo "" + echo "Usage: $0 [-i ] [-c ] [-k ] [-f ] [-b ]" + echo "" + echo " -f supported flashers: rpi, ch341a" + echo " -i path to image to flash" + echo " -c to use for flashrom" + echo " -k save the current image as" + echo " -b frequency of the RPi SPI bus in Hz. default: 128" +} + +args=$(getopt -o f:i:c:k:hb: -- "$@") +if [ $? -ne 0 ] ; then + usage + exit 1 +fi + +eval set -- "$args" +while [ $# -gt 0 ] +do + case "$1" in + -f) + FLASHER=$2 + have_flasher=1 + shift + ;; + -i) + INPUT_IMAGE_PATH=$2 + have_input_image=1 + shift + ;; + -c) + CHIPNAME=$2 + have_chipname=1 + shift + ;; + -k) + BACKUPNAME=$2 + have_backupname=1 + shift + ;; + -b) + rpi_frequency=$2 + shift + ;; + -h) + usage + exit 1 + ;; + --) + shift + break + ;; + *) + echo "Invalid option: $1" + exit 1 + ;; + esac + shift +done + +command -v flashrom >/dev/null 2>&1 || { echo -e >&2 "${RED}Please install flashrom and run as root${NC}."; exit 1; } +command -v mktemp >/dev/null 2>&1 || { echo -e >&2 "${RED}Please install mktemp (coreutils)${NC}."; exit 1; } + +if [ ! "$have_input_image" -gt 0 ] ; then + image_available=$(ls -1 | grep x230_coreboot_seabios || true) + if [ -z "${image_available}" ] ; then + echo "No image file found. Please add -i " + echo "" + usage + exit 1 + fi + + prompt="Please select a file to flash or start with the -i option to use a different one:" + options=( $(find -maxdepth 1 -name "*rom" -print0 | xargs -0) ) + + PS3="$prompt " + select INPUT_IMAGE_PATH in "${options[@]}" "Quit" ; do + if (( REPLY == 1 + ${#options[@]} )) ; then + exit + + elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then + break + + else + echo "Invalid option. Try another one." + fi + done +fi + +if [ ! "$have_flasher" -gt 0 ] ; then + echo "Please select the hardware you use:" + PS3='Please select the hardware flasher: ' + options=("Raspberry Pi" "CH341A" "Quit") + select opt in "${options[@]}" + do + case $opt in + "Raspberry Pi") + FLASHER="rpi" + break + ;; + "CH341A") + FLASHER="ch341a" + break + ;; + "Quit") + exit 0 + ;; + *) echo invalid option;; + esac + done +fi + +if [ ! "${rpi_frequency}" -gt 0 ] ; then + rpi_frequency=512 +fi + +programmer="" +if [ "${FLASHER}" = "rpi" ] ; then + programmer="linux_spi:dev=/dev/spidev0.0,spispeed=${rpi_frequency}" +elif [ "${FLASHER}" = "ch341a" ] ; then + programmer="ch341a_spi" +else + echo "invalid flashrom programmer" + usage + exit 1 +fi + +TEMP_DIR=$(mktemp -d) +if [ ! -d "$TEMP_DIR" ]; then + echo "${RED}Error:${NC} Could not create temp dir" + exit 1 +fi + +if [ ! "$have_chipname" -gt 0 ] ; then + echo "trying to detect the chip..." + flashrom -p ${programmer} &> "${TEMP_DIR}"/chips || true + flashrom_error="" + flashrom_error=$(cat "${TEMP_DIR}"/chips | grep -i error || true) + if [ ! -z "${flashrom_error}" ] ; then + cat "${TEMP_DIR}"/chips + rm -rf "${TEMP_DIR}" + exit 1 + fi + + CHIPNAME="" + chip_found=0 + if [ ! "$chip_found" -gt 0 ] ; then + CHIPNAME=$(cat "${TEMP_DIR}"/chips | grep Found | grep MX25L3206E | grep -oP '"\K[^"\047]+(?=["\047])' || true) + if [ ! -z "${CHIPNAME}" ] ; then + chip_found=1 + fi + fi + + if [ ! "$chip_found" -gt 0 ] ; then + CHIPNAME=$(cat "${TEMP_DIR}"/chips | grep Found | grep EN25QH32 | grep -oP '"\K[^"\047]+(?=["\047])' || true) + if [ ! -z "${CHIPNAME}" ] ; then + chip_found=1 + fi + fi + + if [ ! "$chip_found" -gt 0 ] ; then + echo "chip not detected." + flashrom -p ${programmer} || true + rm -rf "${TEMP_DIR}" + echo "Please find it manually in the list above and rerun with the -c parameter." + exit 1 + else + echo -e "Detected ${GREEN}${CHIPNAME}${NC}." + fi +fi + +INPUT_IMAGE_NAME=$(basename "${INPUT_IMAGE_PATH}") +INPUT_IMAGE_SIZE=$(wc -c < "$INPUT_IMAGE_PATH") +reference_filesize=4194304 +if [ ! "$INPUT_IMAGE_SIZE" -eq "$reference_filesize" ] ; then + echo -e "${RED}Error:${NC} input file must be 4MB of size" + exit 1 +fi + +echo "verifying SPI connection by reading 2 times. please wait." +flashrom -p ${programmer} -c ${CHIPNAME} -r ${TEMP_DIR}/test1.rom +flashrom -p ${programmer} -c ${CHIPNAME} -r ${TEMP_DIR}/test2.rom +cmp --silent "${TEMP_DIR}"/test1.rom "${TEMP_DIR}"/test2.rom +if [ "$have_backupname" -gt 0 ] ; then + cp "${TEMP_DIR}"/test1.rom "${BACKUPNAME}" + sha256sum "${TEMP_DIR}"/test1.rom > "${BACKUPNAME}".sha256 + echo "current image saved as ${BACKUPNAME}" +fi +TEMP_SIZE=$(wc -c < "$TEMP_DIR/test1.rom") +if [ ! "$INPUT_IMAGE_SIZE" -eq "$TEMP_SIZE" ] ; then + echo -e "${RED}Error:${NC} read image (${TEMP_SIZE}) has different size that new image $INPUT_IMAGE_NAME (${INPUT_IMAGE_SIZE})" + exit 1 +fi +rm -rf "${TEMP_DIR}" + +echo -e "${GREEN}connection ok${NC}. flashing ${INPUT_IMAGE_NAME}" +flashrom -p ${programmer} -c "${CHIPNAME}" -w "${INPUT_IMAGE_PATH}" +echo -e "${GREEN}DONE${NC}" diff --git a/x230_fhd/free-defconfig-f5b3a49b76 b/x230_fhd/free-defconfig-f5b3a49b76 new file mode 100644 index 0000000..0d71d0e --- /dev/null +++ b/x230_fhd/free-defconfig-f5b3a49b76 @@ -0,0 +1,9 @@ +CONFIG_VENDOR_LENOVO=y +CONFIG_NO_POST=y +CONFIG_CBFS_SIZE=0x400000 +CONFIG_BOARD_LENOVO_X230_FHD=y +# CONFIG_H8_BEEP_ON_DEATH is not set +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y +CONFIG_COREINFO_SECONDARY_PAYLOAD=y +CONFIG_NVRAMCUI_SECONDARY_PAYLOAD=y diff --git a/x230_fhd/front.jpg b/x230_fhd/front.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15f3259461561e6cf6ac80df0f33a7b5b44121ed GIT binary patch literal 73560 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 literal 0 HcmV?d00001 diff --git a/x230_fhd/release.sh b/x230_fhd/release.sh new file mode 100755 index 0000000..76a76b5 --- /dev/null +++ b/x230_fhd/release.sh @@ -0,0 +1,150 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2018, Martin Kepplinger +# +# Script to build release-archives with. This requires a checkout from git. +# WARNING: This script is very dangerous! It may delete any untracked files. +set -e +have_version=0 +have_image=0 +have_image_2=0 + +usage() +{ + echo "Usage: $0 -v version -i release_image -f second_release_image" +} + +args=$(getopt -o v:i:f: -- "$@") +if [ $? -ne 0 ] ; then + usage + exit 1 +fi +eval set -- "$args" +while [ $# -gt 0 ] +do + case "$1" in + -i) + RELEASE_IMAGE=$2 + have_image=1 + shift + ;; + -f) + RELEASE_IMAGE_2=$2 + have_image_2=1 + shift + ;; + -v) + version=$2 + have_version=1 + shift + ;; + --) + shift + break + ;; + *) + echo "Invalid option: $1" + usage + exit 1 + ;; + esac + shift +done + +if [ ! "$have_image" -gt 0 ] ; then + echo "we currently need 2 release images" + usage + exit 1 +fi +if [ ! "$have_image_2" -gt 0 ] ; then + echo "we currently need 2 release images" + usage + exit 1 +fi + +# Do we have a desired version number? +if [ "$have_version" -gt 0 ] ; then + echo "trying to build version $version" +else + echo "please specify a version" + usage + exit 1 +fi + +# Version number sanity check +if grep "${version}" NEWS +then + echo "configurations seems ok" +else + echo "please check the NEWS file" + exit 1 +fi + +# Check that we are on master +branch=$(git rev-parse --abbrev-ref HEAD) +echo "we are on branch $branch" + +if [ ! "${branch}" = "master" ] ; then + echo "you don't seem to be on the master branch" + exit 1 +fi + +if git diff-index --quiet HEAD --; then + # no changes + echo "there are no uncommitted changes (version bump)" + exit 1 +fi +echo "======================================================" +echo " are you fine with the following version bump?" +echo "======================================================" +git diff +echo "======================================================" +read -r -p " Press enter to continue" +echo "======================================================" + +filesize=$(wc -c <"${RELEASE_IMAGE}") +reference_filesize=4194304 +if [ ! "$filesize" -eq "$reference_filesize" ] ; then + echo "filesize of release image is wrong" + exit 1 +fi +filesize=$(wc -c <"${RELEASE_IMAGE_2}") +reference_filesize=4194304 +if [ ! "$filesize" -eq "$reference_filesize" ] ; then + echo "filesize of release image is wrong" + exit 1 +fi + +RELEASE_DIR="skulls-x230_fhd-${version}" +rm -rf "$RELEASE_DIR" +mkdir -p "$RELEASE_DIR" + +# copy-in the ROMs +cp "${RELEASE_IMAGE}" "$RELEASE_DIR" +cp "${RELEASE_IMAGE_2}" "$RELEASE_DIR" + +RELEASE_IMAGE_FILE=$(basename "${RELEASE_IMAGE}") +sha256sum ${RELEASE_DIR}/${RELEASE_IMAGE_FILE} > "${RELEASE_DIR}/${RELEASE_IMAGE_FILE}.sha256" +RELEASE_IMAGE_FILE_2=$(basename "${RELEASE_IMAGE_2}") +sha256sum ${RELEASE_DIR}/${RELEASE_IMAGE_FILE_2} > "${RELEASE_DIR}/${RELEASE_IMAGE_FILE_2}.sha256" + +# copy in device independent stuff +cp ../SOURCE.md "$RELEASE_DIR" +cp -a ../util "$RELEASE_DIR" + +# copy in x230_fhd stuff +cp -a README.md NEWS LICENSE* \ + x230_fhd_skulls.sh \ + external_install_bottom.sh external_install_top.sh \ + "$RELEASE_DIR" + +tar -cJf "$RELEASE_DIR".tar.xz "$RELEASE_DIR" + +rm -rf "$RELEASE_DIR" + +git commit -a -m "release skulls-x230_fhd ${version}" +git tag -s "x230_fhd-${version}" -m "skulls-x230_fhd ${version}" + +sha256sum "$RELEASE_DIR".tar.xz > "$RELEASE_DIR".tar.xz.sha256 +sha512sum "$RELEASE_DIR".tar.xz > "$RELEASE_DIR".tar.xz.sha512 +gpg -b -a "$RELEASE_DIR".tar.xz diff --git a/x230_fhd/util b/x230_fhd/util new file mode 120000 index 0000000..40c3fc5 --- /dev/null +++ b/x230_fhd/util @@ -0,0 +1 @@ +../util \ No newline at end of file diff --git a/x230_fhd/x230_fhd_skulls.sh b/x230_fhd/x230_fhd_skulls.sh new file mode 100755 index 0000000..40cdd36 --- /dev/null +++ b/x230_fhd/x230_fhd_skulls.sh @@ -0,0 +1,224 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2019, Martin Kepplinger + +set -e + +cd "$(dirname "$0")" + +source "util/functions.sh" + +have_input_image=0 +request_update=0 +verbose=0 + +usage() +{ + echo "Skulls for the X230 with FHD mod" + echo " Run this script on the X230 directly." + echo "" + echo " This flashes the BIOS with the given image." + echo " Make sure you booted Linux with iomem=relaxed" + echo "" + echo "Usage: $0 [-i <4mb_top_image>.rom] [-U] [-h]" + echo "Options:" + echo " -i path to the image to flash" + echo " -U update: check for a new Skulls package online" + echo " -v verbose output. prints more information" + echo " -h print this help text" +} + +args=$(getopt -o i:hUv -- "$@") +if [ $? -ne 0 ] ; then + usage + exit 1 +fi + +eval set -- "$args" +while [ $# -gt 0 ] +do + case "$1" in + -i) + INPUT_IMAGE_PATH=$2 + have_input_image=1 + shift + ;; + -h) + usage + exit 1 + ;; + -U) + request_update=1 + ;; + -v) + verbose=1 + ;; + --) + shift + break + ;; + *) + echo "Invalid option: $1" + exit 1 + ;; + esac + shift +done + +if [ "$request_update" -gt 0 ] ; then + warn_not_root + + command -v curl >/dev/null 2>&1 || { echo -e >&2 "${RED}Please install curl.${NC}"; exit 1; } + + CURRENT_VERSION=$(head -2 NEWS | egrep -o "([0-9]{1,}\.)+[0-9]{1,}") + + UPSTREAM_FILE=$(curl -s https://api.github.com/repos/merge/skulls/releases/latest | grep browser_download_url | cut -d'"' -f4 | cut -d'/' -f9 | head -n 1) + + UPSTREAM_VERSION=$(curl -s https://api.github.com/repos/merge/skulls/releases/latest | grep browser_download_url | cut -d'"' -f4 | cut -d'/' -f9 | head -n 1 | egrep -o "([0-9]{1,}\.)+[0-9]{1,}") + + UPSTREAM_X230=$(echo ${UPSTREAM_FILE} | grep x230_fhd) + if [[ -z "$UPSTREAM_X230" ]] ; then + echo "The latest release didn't include the X230_fhd" + exit 0 + fi + + if [[ $verbose -gt 0 ]] ; then + echo "This is v$CURRENT_VERSION and latest is v$UPSTREAM_VERSION" + fi + + if [[ "$CURRENT_VERSION" = "$UPSTREAM_VERSION" ]] ; then + echo -e "${GREEN}You are using the latest version of Skulls for the X230_fhd${NC}" + exit 0 + elif [[ "$CURRENT_VERSION" < "$UPSTREAM_VERSION" ]] ; then + echo -e "${RED}You have ${CURRENT_VERSION} but there is version ${UPSTREAM_VERSION} available for the X230_fhd. Please update.${NC}" + read -r -p "Download it to the parent directory now? [y/N] " response + case "$response" in + [yY][eE][sS]|[yY]) + UPSTREAM_URL=$(curl -s https://api.github.com/repos/merge/skulls/releases/latest | grep browser_download_url | cut -d'"' -f4 | head -n 1) + UPSTREAM_URL_SHA256=$(curl -s https://api.github.com/repos/merge/skulls/releases/latest | grep browser_download_url | cut -d'"' -f4 | head -n 3 | tail -n 1) + cd .. + curl -LO ${UPSTREAM_URL} + curl -LO ${UPSTREAM_URL_SHA256} + sha256sum -c ${UPSTREAM_FILE}.sha256 + mkdir skulls-x230_fhd-${UPSTREAM_VERSION} + tar -xf ${UPSTREAM_FILE} -C skulls-x230_fhd-${UPSTREAM_VERSION}/ + echo "Version ${UPSTREAM_VERSION} extracted to ../skulls-x230_fhd-${UPSTREAM_VERSION}/" + echo "Please continue in the new directory." + ;; + *) + exit 0 + ;; + esac + else + echo "You seem to use a development version. Please use release package skulls-x230_fhd ${UPSTREAM_VERSION} for flashing." + fi + + exit 0 +fi + +force_x230_and_root + +BIOS_VENDOR=$(${DMIDECODE} -t bios | grep Vendor | cut -d':' -f2) +if [[ $BIOS_VENDOR != *"coreboot"* ]] ; then + BIOS_VERSION=$(${DMIDECODE} -s bios-version | grep -o '[1-2].[0-7][0-9]') + bios_major=$(echo "$BIOS_VERSION" | cut -d. -f1) + bios_minor=$(echo "$BIOS_VERSION" | cut -d. -f2) + + if [ "${bios_minor}" -ge "61" ] ; then + echo "Ready to use external_install_bottom.sh and external_install_top.sh" + echo "Please run both scripts from a different computer with a" + echo "hardware SPI flasher." + else + echo -e "The installed original BIOS is very old." + echo -e "${RED}Please upgrade${NC} from lenovo.com before installing coreboot." + fi + exit 0 +fi + +if [[ "$verbose" -gt 0 ]] ; then + if [ -d "/sys/class/power_supply/BAT0" ] ; then + bat_last_full=$(cat /sys/class/power_supply/BAT0/charge_full) + bat_design_cap=$(cat /sys/class/power_supply/BAT0/charge_full_design) + bat_health=$(echo "scale=2 ; $bat_last_full/$bat_design_cap" | bc | sed 's/^\./0./') + echo "INFO: Battery hardware health is $bat_health%" + fi +fi + +if [ ! "$have_input_image" -gt 0 ] ; then + image_available=$(ls -1 | grep x230_fhd_coreboot_seabios || true) + if [ -z "${image_available}" ] ; then + echo "No image file found. Please add -i " + echo "" + usage + exit 1 + fi + + prompt="file not specified. Please select a file to flash. Please read the README for details about the differences:" + options=( $(find -maxdepth 1 -name "x230_fhd_coreboot_seabios*rom" -print0 | xargs -0) ) + + PS3="$prompt " + select INPUT_IMAGE_PATH in "${options[@]}" "Quit" ; do + if (( REPLY == 1 + ${#options[@]} )) ; then + exit + + elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then + break + + else + echo "Invalid option. Try another one." + fi + done +fi + + +OUTPUT_PATH=output +INPUT_IMAGE_NAME=$(basename "${INPUT_IMAGE_PATH}") +OUTPUT_IMAGE_NAME=${INPUT_IMAGE_NAME%%.*}_prepared_12mb.rom +OUTPUT_IMAGE_PATH=${OUTPUT_PATH}/${OUTPUT_IMAGE_NAME} + +echo -e "input: ${INPUT_IMAGE_NAME}" +echo -e "output: ${OUTPUT_IMAGE_PATH}" + +input_filesize=$(wc -c <"$INPUT_IMAGE_PATH") +reference_filesize=4194304 +if [ ! "$input_filesize" -eq "$reference_filesize" ] ; then + echo "Error: input file must be 4MB of size" + exit 1 +fi + +rm -rf ${OUTPUT_PATH} +mkdir ${OUTPUT_PATH} + +dd if=/dev/zero of="${OUTPUT_IMAGE_PATH}" bs=4M count=2 status=none +dd if="${INPUT_IMAGE_PATH}" oflag=append conv=notrunc of="${OUTPUT_IMAGE_PATH}" bs=4M status=none + +LAYOUT_FILENAME="x230-layout.txt" + +echo "0x00000000:0x00000fff ifd" > ${OUTPUT_PATH}/${LAYOUT_FILENAME} +echo "0x00001000:0x00002fff gbe" >> ${OUTPUT_PATH}/${LAYOUT_FILENAME} +echo "0x00003000:0x004fffff me" >> ${OUTPUT_PATH}/${LAYOUT_FILENAME} +echo "0x00500000:0x007fffff unused" >> ${OUTPUT_PATH}/${LAYOUT_FILENAME} +echo "0x00800000:0x00bfffff bios" >> ${OUTPUT_PATH}/${LAYOUT_FILENAME} + +echo -e "${YELLOW}WARNING${NC}: Make sure not to power off your computer or interrupt this process in any way!" +echo -e " Interrupting this process may result in irreparable damage to your computer!" +check_battery +while true; do + read -r -p "Flash the BIOS now? y/N: " yn + case $yn in + [Yy]* ) cd ${OUTPUT_PATH} && ${FLASHROM} --force --noverify-all -p internal:boardmismatch=force,laptop=force_I_want_a_brick --layout ${LAYOUT_FILENAME} --image bios -w "${OUTPUT_IMAGE_NAME}"; break;; + [Nn]* ) exit;; + * ) exit;; + esac +done + +rm -rf ${OUTPUT_PATH} + +while true; do + read -r -p "Power off now? (please do!) Y/n: " yn + case $yn in + [Yy]* ) poweroff ;; + [Nn]* ) exit;; + * ) poweroff ;; + esac +done