Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
257f1df1d5 | ||
|
|
8664c27096 |
@@ -1,41 +0,0 @@
|
|||||||
Checklists for Pull Requests and Releases
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
Maintainer checklists for reviewing pull requests and doing releases.
|
|
||||||
|
|
||||||
Pull Requests
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- If applicable, is there a readable ChangeLog entry?
|
|
||||||
- If any LICENSE file has been updated, has the `.hash` file been updated?
|
|
||||||
- If any change to a Finit `.svc` file, does any run/task linger?
|
|
||||||
I.e., is there a runlevel and/or condition defined to prevent them
|
|
||||||
from running outside of their intended runlevel?
|
|
||||||
- If any change to grub or qemu/qeneth setup, has it been tested in GNS3?
|
|
||||||
- If any change to u-boot/buildroot, has it been tested with `<booloader>_defconfig`
|
|
||||||
- If any change to logging, have the resulting logs been audited?
|
|
||||||
- Check for duplicate entries, misspellings
|
|
||||||
- Check for sneaky severity changes, e.g., error vs note, error vs warning
|
|
||||||
- If new subsystem, or major changes to a subsystem, have the docs been updated?
|
|
||||||
- If change to mDNS, has it been tested with netbrowse?
|
|
||||||
- If change to `_defconfig`, verify `local.mk` and sync with other archs
|
|
||||||
- Test manually as well, e.g., CLI changes do not have ha regression tests
|
|
||||||
- Build from distclean, or use artifacts built by build servers, for manual tests
|
|
||||||
|
|
||||||
Releases
|
|
||||||
--------
|
|
||||||
|
|
||||||
Recommended checkpoints, use at your own discretion:
|
|
||||||
|
|
||||||
- Make at least one -betaN release to verify the GitHub workflow well in time release day
|
|
||||||
- Stuff happens, remember kernelkit/infix#735
|
|
||||||
- Make at least one -rcN to flush out any issues in customer repos
|
|
||||||
- Easy to forget adaptations/hacks in customer repos -- may need Infix change/support
|
|
||||||
- Verify release artifacts (checksums, completeness, no corrupted files)
|
|
||||||
- Test on actual hardware for at least one architecture
|
|
||||||
- Review ChangeLog for completeness
|
|
||||||
- Check for release-blocking issues
|
|
||||||
- Verify generated GNS3 appliance, no marketplace update on -rc builds
|
|
||||||
- Ensure the markdown link for the release diff is updated
|
|
||||||
- Ensure subrepos are tagged (can be automated, see kernelkit/infix#393)
|
|
||||||
- Sync tags for all repo. sync activities
|
|
||||||
@@ -1,48 +1,25 @@
|
|||||||
Contributing Guidelines
|
Contributing to Infix
|
||||||
=======================
|
=====================
|
||||||
|
|
||||||
Thank :heart: you for taking the time to read this!
|
We welcome any and all help in the form of bug reports, fixes, patches
|
||||||
|
to add new features -- *preferably as GitHub pull requests*.
|
||||||
|
|
||||||
We welcome any help in the form of bug reports, fixes, or patches to add
|
If you are unsure of what to do, or how to implement an idea or bug fix,
|
||||||
new features. We *prefer* GitHub pull requests, but are open to other
|
open an issue with `"[RFC]: Unsure if this is a bug ... ?"`, or use the
|
||||||
forms of collaboration as well. [Let's talk!][support] :handshake:
|
[GitHub discussions forum](https://github.com/orgs/kernelkit/discussions).
|
||||||
|
Talking about code and problems first is often the best way to get started
|
||||||
|
before submitting a pull request.
|
||||||
|
|
||||||
If you are unsure how to start implementing an idea or fix:
|
When submitting a bug report, patch, or pull request, please start by
|
||||||
|
stating the version the change is made against, what it does, *and why*.
|
||||||
- :bug: open an issue, there are human friendly templates for _bugs_
|
|
||||||
and _feature requests_ at <https://github.com/kernelkit/infix/issues>
|
|
||||||
- :speech_balloon: use the [Q&A Forum][discuss]
|
|
||||||
- :technologist: The [Developer's Guide][devguide] is also a useful start
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> Talking about code and problems first is often the best way to get
|
|
||||||
> started before submitting a pull request. We have found it always
|
|
||||||
> saves time, yours and ours.
|
|
||||||
|
|
||||||
:sparkles: General Guidelines
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
When submitting bug reports or patches to bugs, please state which
|
|
||||||
version the change is made against, what it does, and, more importantly
|
|
||||||
*why* -- from your perspective, why is it a bug, why does the code need
|
|
||||||
changing in this way. Start with why.
|
|
||||||
|
|
||||||
- :bug: Bug reports need metadata like Infix version or commit hash
|
|
||||||
- :adhesive_bandage: Bug fixes also need version, and (preferably) a
|
|
||||||
corresponding issue number for the ChangeLog
|
|
||||||
- :new: New features, you need to get approval of the YANG model first!
|
|
||||||
:speech_balloon: Please use the [Forum][discuss], e.g., category:
|
|
||||||
*Ideas*, or open a :pray: feature request issue
|
|
||||||
- :white_check_mark: New features also need new regression tests, this
|
|
||||||
can be basic tests or more complex use-case tests comprising multiple
|
|
||||||
subsystems, see [Testing Changes](#test_tube-testing-changes), below
|
|
||||||
|
|
||||||
Please take care to ensure you follow the project coding style and the
|
Please take care to ensure you follow the project coding style and the
|
||||||
commit message format. If you follow these recommendations you help
|
commit message format. If you follow these recommendations you help
|
||||||
the maintainers and make it easier for them to include your code.
|
the maintainer(s) and make it easier for them to include your code.
|
||||||
|
|
||||||
:woman_technologist: Coding Style
|
|
||||||
---------------------------------
|
Coding Style
|
||||||
|
------------
|
||||||
|
|
||||||
Before jumping into code, remember to **document new features** and bug
|
Before jumping into code, remember to **document new features** and bug
|
||||||
fixes. Both the manual and ChangeLog are in the `doc/` sub-directory
|
fixes. Both the manual and ChangeLog are in the `doc/` sub-directory
|
||||||
@@ -50,230 +27,66 @@ and it is expected that you provide a human-readable summary for the
|
|||||||
release notes (ChangeLog) and at least a configuration example in the
|
release notes (ChangeLog) and at least a configuration example in the
|
||||||
manual for new features.
|
manual for new features.
|
||||||
|
|
||||||
> [!TIP]
|
> **Tip:** consider ["Readme driven development"][RDD] for new features.
|
||||||
> Consider ["Readme driven development"][RDD] for new features. It is
|
> It is amazing how many flaws in your own bright ideas come to bare
|
||||||
> amazing how many flaws in your own bright ideas come to bare when you
|
> when you suddenly have to explain them to someone else!
|
||||||
> suddenly have to explain them to someone else!
|
|
||||||
|
|
||||||
We expect code contributions for:
|
We expect code contributions for:
|
||||||
|
|
||||||
- C code in [Linux Coding Style][Linux]
|
- C code in [Linux Coding Style][Linux]
|
||||||
- Python code should follow [PEP-8][]
|
- Python code should follow [PEP-8][]
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> **However,** always submit code that follows the style of surrounding
|
> **However,** always submit code that follows the style of surrounding
|
||||||
> code! Legacy takes precedence, and remember, we read code a lot more
|
> code! Legacy takes precedence, and remember, we read code a lot more
|
||||||
> than write it, so legibility is important.
|
> than write it, so legibility is important.
|
||||||
|
|
||||||
The ChangeLog deserves a separate mention:
|
As a final note, lines are allowed to be longer than 72 characters these
|
||||||
|
days. There is no enforced maximum, but the team usually keep it around
|
||||||
|
100 characters for both C and Python.
|
||||||
|
|
||||||
- Releases are listed in reverse chronological order order, so the
|
|
||||||
latest/next release is at the beginning of the file
|
|
||||||
- Only *user-facing bugs and features* are detailed, so code refactor,
|
|
||||||
new tests, etc. are not listed.
|
|
||||||
- Add your changes/features to the Changes section
|
|
||||||
- Add your Fix line in the Fixes section, in numeric order
|
|
||||||
- Changes and fixes without an issue number are listed after all
|
|
||||||
numbered ones
|
|
||||||
- YANG model changes are documented in their respective model, for
|
|
||||||
standard models, e.g., for `ietf-interfaces.yang`, the corresponding
|
|
||||||
`infix-interfaces.yang` detail augments/deviations as revisions.
|
|
||||||
|
|
||||||
A final note, lines of code are allowed to be longer than 72 characters
|
Commit Messages
|
||||||
these days, unless you live by PEP-8 (see above). There is no enforced
|
---------------
|
||||||
maximum, but the team usually keep it around 100 characters for both C
|
|
||||||
and Python.
|
|
||||||
|
|
||||||
:test_tube: Testing Changes
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
Please test your changes, no matter how trivial or obviously correct
|
|
||||||
they may seem. Nobody is infallible, making mistakes is only human.
|
|
||||||
It is also the best insurance policy for your feature, it ensures your
|
|
||||||
use-case will remain functional as the source base evolves.
|
|
||||||
|
|
||||||
For new functionality we expect new regression tests to be added in
|
|
||||||
the same pull request.
|
|
||||||
|
|
||||||
For help getting started with testing, see the following resources:
|
|
||||||
|
|
||||||
- [Developer's Guide][devguide]
|
|
||||||
- [Regression Testing][testing]
|
|
||||||
|
|
||||||
:memo: Commit Messages
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Commit messages exist to track *why* a change was made. Try to be as
|
Commit messages exist to track *why* a change was made. Try to be as
|
||||||
clear and concise as possible in your commit messages, and always, be
|
clear and concise as possible in your commit messages, and always, be
|
||||||
proud of your work and set up a proper GIT identity for your commits:
|
proud of your work and set up a proper GIT identity for your commits:
|
||||||
|
|
||||||
<img src="../doc/jack.png" width=70 align="right">
|
$ git config --global user.name "Jacky Linker"
|
||||||
|
$ git config --global user.email jacky.linker@example.com
|
||||||
|
|
||||||
```bash
|
Example commit message from the [Pro Git][gitbook] online book, notice
|
||||||
$ git config --global user.name "Jacky Linker"
|
how `git commit -s` is used to automatically add a `Signed-off-by`:
|
||||||
$ git config --global user.email jacky.linker@example.com
|
|
||||||
```
|
|
||||||
|
|
||||||
Example commit message from one of many [online guides][cbeams]. Use
|
subsystem: brief, but clear and concise summary of changes
|
||||||
`git commit -s` to automatically add a `Signed-off-by` for proof of
|
|
||||||
origin, see [DCO][] for more info.
|
More detailed explanatory text, if necessary. Wrap it to about 72
|
||||||
|
characters or so. In some contexts, the first line is treated as
|
||||||
|
the subject of an email and the rest of the text as the body. The
|
||||||
|
empty line separating summary from body is critical. Tools like
|
||||||
|
rebase can get confused if the empty line is missing.
|
||||||
|
|
||||||
|
Further paragraphs should be separated with empty lines.
|
||||||
|
|
||||||
|
- Bullet points are okay, too
|
||||||
|
|
||||||
|
- Typically a hyphen or asterisk is used for the bullet, preceded
|
||||||
|
by a single space, with blank lines in between, but conventions
|
||||||
|
vary here
|
||||||
|
|
||||||
|
Signed-off-by: Jacky Linker <jacky.linker@example.com>
|
||||||
|
|
||||||
```text
|
|
||||||
subsystem: brief, but clear and concise summary of changes
|
|
||||||
|
|
||||||
More detailed explanatory text, if necessary. Wrap it to about 72
|
Code of Conduct
|
||||||
characters or so. In some contexts, the first line is treated as
|
---------------
|
||||||
the subject of an email and the rest of the text as the body. The
|
|
||||||
empty line separating summary from body is critical. Tools like
|
|
||||||
rebase can get confused if the empty line is missing.
|
|
||||||
|
|
||||||
Further paragraphs should be separated with empty lines.
|
|
||||||
|
|
||||||
- Bullet points are okay, too
|
|
||||||
|
|
||||||
- Typically a hyphen or asterisk is used for the bullet, preceded
|
|
||||||
by a single space, with blank lines in between, but conventions
|
|
||||||
vary here
|
|
||||||
|
|
||||||
If you use an issue tracker, put references to them at the bottom,
|
|
||||||
like this:
|
|
||||||
|
|
||||||
Resolves: #123
|
|
||||||
See also: #456, #789
|
|
||||||
|
|
||||||
Signed-off-by: Jacky Linker <jacky.linker@example.com>
|
|
||||||
```
|
|
||||||
|
|
||||||
This is an example of how to [automatically close][closing] an issue
|
|
||||||
when the commit is merged to mainline. Several keywords are available.
|
|
||||||
|
|
||||||
:lock_with_ink_pen: Signing Commits with GPG
|
|
||||||
---------------------------------------------
|
|
||||||
|
|
||||||
To ensure the authenticity and integrity of your contributions, we
|
|
||||||
**require** all commits to be signed with GPG. This cryptographically
|
|
||||||
verifies that commits come from a trusted source.
|
|
||||||
|
|
||||||
### Generating a GPG Key
|
|
||||||
|
|
||||||
If you don't already have a GPG key, generate one:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ gpg --full-generate-key
|
|
||||||
```
|
|
||||||
|
|
||||||
When prompted, choose:
|
|
||||||
- Key type: `RSA and RSA` (default)
|
|
||||||
- Key size: `4096` bits (recommended for security)
|
|
||||||
- Expiration: `0` (key does not expire)
|
|
||||||
- Real name and email: Use the same email as your Git configuration
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> We recommend keys that do not expire for signing commits. Expiration
|
|
||||||
> creates a "usability time bomb" without providing meaningful security
|
|
||||||
> benefits for code signing. See [this article][pgpfan] for details.
|
|
||||||
|
|
||||||
### Configuring Git to Sign Commits
|
|
||||||
|
|
||||||
First, find your GPG key ID:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ gpg --list-secret-keys --keyid-format=long
|
|
||||||
```
|
|
||||||
|
|
||||||
Look for the line starting with `sec`, the key ID is the part after the `/`.
|
|
||||||
For example, in `sec rsa4096/ABCD1234EFGH5678`, the key ID is `ABCD1234EFGH5678`.
|
|
||||||
|
|
||||||
Configure Git to use your GPG key:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ git config --global user.signingkey ABCD1234EFGH5678
|
|
||||||
$ git config --global commit.gpgsign true
|
|
||||||
```
|
|
||||||
|
|
||||||
The second command enables automatic signing for all commits. Alternatively,
|
|
||||||
you can sign individual commits with `git commit -S`.
|
|
||||||
|
|
||||||
### Publishing Your Public Key
|
|
||||||
|
|
||||||
To allow others to verify your signatures, publish your public key to a
|
|
||||||
keyserver:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ gpg --keyserver hkps://keys.openpgp.org --send-keys ABCD1234EFGH5678
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> The keyserver will send a verification email to the address associated
|
|
||||||
> with your key. You **must** click the link in that email to confirm
|
|
||||||
> ownership before your key becomes searchable by email address.
|
|
||||||
|
|
||||||
Alternative keyservers you can use:
|
|
||||||
- `hkps://keyserver.ubuntu.com`
|
|
||||||
- `hkps://pgp.mit.edu`
|
|
||||||
|
|
||||||
### Adding Your GPG Key to GitHub
|
|
||||||
|
|
||||||
For GitHub to show your commits as "Verified", you need to add your public
|
|
||||||
key to your account:
|
|
||||||
|
|
||||||
1. Export your public key:
|
|
||||||
```bash
|
|
||||||
$ gpg --armor --export ABCD1234EFGH5678
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Copy the entire output, including the `-----BEGIN PGP PUBLIC KEY BLOCK-----`
|
|
||||||
and `-----END PGP PUBLIC KEY BLOCK-----` lines.
|
|
||||||
|
|
||||||
3. Go to [GitHub Settings → SSH and GPG keys](https://github.com/settings/keys)
|
|
||||||
|
|
||||||
4. Click **New GPG key** and paste your public key.
|
|
||||||
|
|
||||||
Now your signed commits will display a "Verified" badge on GitHub! :white_check_mark:
|
|
||||||
|
|
||||||
For more details, see GitHub's [official documentation on commit signature verification][gpg-verify].
|
|
||||||
|
|
||||||
:twisted_rightwards_arrows: Pull Requests
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> _The git repository is the canonical location for all information._
|
|
||||||
|
|
||||||
A pull request should preferably address a single issue or change. This
|
|
||||||
may of course include multiple related changes, but what is important to
|
|
||||||
remember is the bandwidth of the maintainers. A smaller well documented
|
|
||||||
PR is more likely to get attention quicker in some reviewer's busy day.
|
|
||||||
|
|
||||||
Well documented here means that each commit message stands on its own,
|
|
||||||
telling the complete story of the change. In fact each commit should,
|
|
||||||
as much as possible, be independent of other changes. This is very
|
|
||||||
important, not only when digging though logs to understand why a piece
|
|
||||||
of code exists, but also when bisecting a problem -- each single commit
|
|
||||||
should also compile and be possible to run.
|
|
||||||
|
|
||||||
If you've worked on projects that send patches, like the Linux kernel or
|
|
||||||
Buildroot, consider the pull request message body similar to the cover
|
|
||||||
letter for a series of patches -- it's a summary of changes, and it is
|
|
||||||
lost when the changes are merged to the mainline branch.
|
|
||||||
|
|
||||||
:balance_scale: Code of Conduct
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
It is expected of everyone to respect the [Code of Conduct][conduct].
|
It is expected of everyone to respect the [Code of Conduct][conduct].
|
||||||
The *"maintainers have the right and responsibility to remove, edit, or
|
The *"maintainers have the right and responsibility to remove, edit, or
|
||||||
reject comments, commits, code, discussion forum threads, issues, and
|
reject comments, commits, code, discussion forum threads, issues, and
|
||||||
other contributions that are not aligned to this Code of Conduct."*
|
other contributions that are not aligned to this Code of Conduct."*
|
||||||
|
|
||||||
[support]: https://github.com/kernelkit/infix/blob/main/.github/SUPPORT.md
|
[Linux]: https://www.kernel.org/doc/html/v6.9/process/coding-style.html
|
||||||
[discuss]: https://github.com/orgs/kernelkit/discussions
|
[PEP-8]: https://peps.python.org/pep-0008/
|
||||||
[testing]: https://github.com/kernelkit/infix/blob/main/doc/testing.md
|
[RDD]: https://tom.preston-werner.com/2010/08/23/readme-driven-development
|
||||||
[devguide]: https://github.com/kernelkit/infix/blob/main/doc/developers-guide.md
|
[gitbook]: https://git-scm.com/book/ch5-2.html
|
||||||
[Linux]: https://www.kernel.org/doc/html/v6.9/process/coding-style.html
|
[conduct]: CODE-OF-CONDUCT.md
|
||||||
[PEP-8]: https://peps.python.org/pep-0008/
|
|
||||||
[RDD]: https://tom.preston-werner.com/2010/08/23/readme-driven-development
|
|
||||||
[cbeams]: https://cbea.ms/git-commit/#seven-rules
|
|
||||||
[conduct]: CODE-OF-CONDUCT.md
|
|
||||||
[DCO]: https://developercertificate.org/
|
|
||||||
[closing]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests
|
|
||||||
[gpg-verify]: https://docs.github.com/en/authentication/managing-commit-signature-verification
|
|
||||||
[pgpfan]: https://articles.59.ca/doku.php?id=pgpfan:expire
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
If you discover a security vulnerability in Infix, please use GitHub's built-in
|
|
||||||
[Report a Vulnerability](https://github.com/kernelkit/infix/security/advisories/new)
|
|
||||||
feature for a private and secure disclosure.
|
|
||||||
|
|
||||||
When reporting, include:
|
|
||||||
|
|
||||||
- A clear description of the vulnerability.
|
|
||||||
- Steps to reproduce the issue.
|
|
||||||
- Potential impact of the vulnerability.
|
|
||||||
|
|
||||||
## Supported Versions
|
|
||||||
|
|
||||||
We provide security updates only for the main branch.
|
|
||||||
|
|
||||||
Individual support contracts are provided by _Wires_. See
|
|
||||||
[Support](https://github.com/kernelkit/infix/blob/main/.github/SUPPORT.md)
|
|
||||||
for more information.
|
|
||||||
|
|
||||||
## Acknowledgments
|
|
||||||
|
|
||||||
We appreciate the efforts of the security community to help improve the security
|
|
||||||
of Infix. Thank you for your responsible disclosure.
|
|
||||||
@@ -1,14 +1 @@
|
|||||||
Limited free support is only available using the online resources of the
|
Paid support and development provided by Addiva Elektronik <https://addiva.se>
|
||||||
project on GitHub, and Discord, see <https://github.com/kernelkit/infix>:
|
|
||||||
|
|
||||||
:house: <https://www.kernelkit.org> — home page, blog, news, howto's and tutorials
|
|
||||||
:package: <https://github.com/kernelkit/infix/releases/latest> — latest release
|
|
||||||
:speech_balloon: <https://github.com/orgs/kernelkit/discussions>
|
|
||||||
:bug: <https://github.com/kernelkit/infix/issues>
|
|
||||||
|
|
||||||
Support contracts, development of new features, fast-tracking of reviews
|
|
||||||
and contributions, customer branding of Infix, and even customer specific
|
|
||||||
features for dedicated products is provided by _Wires_.
|
|
||||||
|
|
||||||
:globe_with_meridians: <https://www.wires.se>
|
|
||||||
:e-mail: <mailto:infix@wires.se>
|
|
||||||
|
|||||||
@@ -5,6 +5,12 @@
|
|||||||
-- Remember: assign a reviewer, or use @mentions if org. member.
|
-- Remember: assign a reviewer, or use @mentions if org. member.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
## Other information
|
||||||
|
|
||||||
|
<!-- Other relevant info, e.g., before/after screenshots -->
|
||||||
|
|
||||||
|
|
||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
Tick *relevant* boxes, this PR is-a or has-a:
|
Tick *relevant* boxes, this PR is-a or has-a:
|
||||||
@@ -17,12 +23,9 @@ Tick *relevant* boxes, this PR is-a or has-a:
|
|||||||
- [ ] Regression tests added?
|
- [ ] Regression tests added?
|
||||||
- [ ] ChangeLog updates (for next release)
|
- [ ] ChangeLog updates (for next release)
|
||||||
- [ ] Documentation added?
|
- [ ] Documentation added?
|
||||||
- [ ] Test changes
|
|
||||||
- [ ] Checked in changed Readme.adoc (make test-spec)
|
|
||||||
- [ ] Added new test to group Readme.adoc and yaml file
|
|
||||||
- [ ] Code style update (formatting, renaming)
|
- [ ] Code style update (formatting, renaming)
|
||||||
- [ ] Refactoring (please detail in commit messages)
|
- [ ] Refactoring (please detail in commit messages)
|
||||||
- [ ] Build related changes
|
- [ ] Build related changes
|
||||||
- [ ] Documentation content changes
|
- [ ] Documentation content changes
|
||||||
- [ ] ChangeLog updated (for major changes)
|
|
||||||
- [ ] Other (please describe):
|
- [ ] Other (please describe):
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
name: Adds all issues to project Infix & C:o
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types:
|
|
||||||
- opened
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
add-to-project:
|
|
||||||
name: Add issue to project Infix&co
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/add-to-project@v2
|
|
||||||
with:
|
|
||||||
project-url: https://github.com/orgs/kernelkit/projects/3
|
|
||||||
github-token: ${{ secrets.ADD_TO_PROJECT }}
|
|
||||||
@@ -1,215 +0,0 @@
|
|||||||
name: bitSign Infix Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
release_version:
|
|
||||||
description: 'Release version (e.g., v25.08.0)'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
push:
|
|
||||||
branches: [ sign-with-bitsign ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
sign-infix-release:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Validate release version format
|
|
||||||
id: validate
|
|
||||||
run: |
|
|
||||||
# Use default version for push events, input version for manual dispatch
|
|
||||||
if [ "${{ github.event_name }}" = "push" ]; then
|
|
||||||
VERSION="v25.08.0"
|
|
||||||
echo "Using default version for push trigger: $VERSION"
|
|
||||||
else
|
|
||||||
VERSION="${{ inputs.release_version }}"
|
|
||||||
echo "Using input version for manual trigger: $VERSION"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if version starts with 'v' and has proper format
|
|
||||||
if ! echo "$VERSION" | grep -qE '^v[0-9]+\.[0-9]+(\.[0-9]+)?(-alpha[0-9]*|-beta[0-9]*|-rc[0-9]*)?$'; then
|
|
||||||
echo "❌ Invalid version format. Expected format: vYY.MM(.PP)(-alphaN|-betaN|-rcN)"
|
|
||||||
echo "Examples: v25.08.0, v25.08.0-alpha1, v25.08.0-rc1"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Extract version without 'v' prefix for filename
|
|
||||||
FILE_VERSION="${VERSION#v}"
|
|
||||||
FILENAME="infix-x86_64-${FILE_VERSION}.tar.gz"
|
|
||||||
RELEASE_URL="https://github.com/kernelkit/infix/releases/download/${VERSION}/${FILENAME}"
|
|
||||||
|
|
||||||
echo "✅ Version format valid"
|
|
||||||
echo "file_version=${FILE_VERSION}" >> $GITHUB_OUTPUT
|
|
||||||
echo "filename=${FILENAME}" >> $GITHUB_OUTPUT
|
|
||||||
echo "release_url=${RELEASE_URL}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Download Infix release
|
|
||||||
run: |
|
|
||||||
RELEASE_URL="${{ steps.validate.outputs.release_url }}"
|
|
||||||
FILENAME="${{ steps.validate.outputs.filename }}"
|
|
||||||
|
|
||||||
echo "Downloading Infix release: $FILENAME"
|
|
||||||
echo "From: $RELEASE_URL"
|
|
||||||
|
|
||||||
if ! curl -L "$RELEASE_URL" -o "$FILENAME" --fail --show-error --progress-bar; then
|
|
||||||
echo "❌ Failed to download release file from: $RELEASE_URL"
|
|
||||||
echo "Please verify that the release version exists and contains the x86_64 build."
|
|
||||||
echo "You can check available releases at: https://github.com/kernelkit/infix/releases"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Verify download
|
|
||||||
if [ -f "$FILENAME" ] && [ -s "$FILENAME" ]; then
|
|
||||||
FILE_SIZE=$(ls -lh "$FILENAME" | awk '{print $5}')
|
|
||||||
echo "✅ Successfully downloaded: $FILENAME ($FILE_SIZE)"
|
|
||||||
else
|
|
||||||
echo "❌ Failed to download release file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create signing request
|
|
||||||
id: create_request
|
|
||||||
run: |
|
|
||||||
FILENAME="${{ steps.validate.outputs.filename }}"
|
|
||||||
FILE_VERSION="${{ steps.validate.outputs.file_version }}"
|
|
||||||
RELEASE="infix-x86_64-${FILE_VERSION}"
|
|
||||||
|
|
||||||
echo "Creating signing request for $FILENAME..."
|
|
||||||
echo "RELEASE parameter: $RELEASE"
|
|
||||||
|
|
||||||
# Create signing request using bitSign API
|
|
||||||
RESPONSE=$(curl -s -X POST "https://portal.bitsign.se/api/v1/requests" \
|
|
||||||
-H "Authorization: Bearer ${{ secrets.BITSIGN_API_KEY }}" \
|
|
||||||
-F "file=@$FILENAME" \
|
|
||||||
-F "key=bit42-Demo1" \
|
|
||||||
-F "job=Infix-x86" \
|
|
||||||
-F "parameters={\"RELEASE\": \"$RELEASE\"}")
|
|
||||||
|
|
||||||
echo "API Response: $RESPONSE"
|
|
||||||
|
|
||||||
# Check if request was successful
|
|
||||||
if echo "$RESPONSE" | jq -e '.success == true' > /dev/null; then
|
|
||||||
REQUEST_ID=$(echo "$RESPONSE" | jq -r '.requestId')
|
|
||||||
echo "✅ Request created successfully with ID: $REQUEST_ID"
|
|
||||||
echo "request_id=$REQUEST_ID" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "❌ Failed to create signing request"
|
|
||||||
echo "$RESPONSE" | jq -r '.error // .message // "Unknown error"'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Wait for signing completion
|
|
||||||
id: wait_completion
|
|
||||||
run: |
|
|
||||||
REQUEST_ID="${{ steps.create_request.outputs.request_id }}"
|
|
||||||
echo "Waiting for signing completion for request: $REQUEST_ID"
|
|
||||||
|
|
||||||
# Poll status for up to 10 minutes (600 seconds) - longer timeout for larger files
|
|
||||||
MAX_WAIT=600
|
|
||||||
WAITED=0
|
|
||||||
|
|
||||||
while [ $WAITED -lt $MAX_WAIT ]; do
|
|
||||||
RESPONSE=$(curl -s -X GET "https://portal.bitsign.se/api/v1/requests/$REQUEST_ID/status" \
|
|
||||||
-H "Authorization: Bearer ${{ secrets.BITSIGN_API_KEY }}")
|
|
||||||
|
|
||||||
STATUS=$(echo "$RESPONSE" | jq -r '.status')
|
|
||||||
echo "Current status: $STATUS (waited ${WAITED}s)"
|
|
||||||
|
|
||||||
if [ "$STATUS" = "completed" ]; then
|
|
||||||
echo "✅ Signing completed successfully!"
|
|
||||||
break
|
|
||||||
elif [ "$STATUS" = "failed" ]; then
|
|
||||||
echo "❌ Signing failed"
|
|
||||||
echo "$RESPONSE" | jq -r '.error // .message // "Unknown error"'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
sleep 10
|
|
||||||
WAITED=$((WAITED + 10))
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $WAITED -ge $MAX_WAIT ]; then
|
|
||||||
echo "❌ Timeout: Signing did not complete within ${MAX_WAIT} seconds"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Download signed file
|
|
||||||
id: download_signed
|
|
||||||
run: |
|
|
||||||
REQUEST_ID="${{ steps.create_request.outputs.request_id }}"
|
|
||||||
FILENAME="${{ steps.validate.outputs.filename }}"
|
|
||||||
FILE_VERSION="${{ steps.validate.outputs.file_version }}"
|
|
||||||
SIGNED_FILENAME="infix-x86_64-${FILE_VERSION}-signed.tar.gz"
|
|
||||||
|
|
||||||
echo "Downloading signed file for request: $REQUEST_ID"
|
|
||||||
echo "Expected signed filename: $SIGNED_FILENAME"
|
|
||||||
|
|
||||||
# Download the signed file
|
|
||||||
curl -X GET "https://portal.bitsign.se/api/v1/requests/$REQUEST_ID/download" \
|
|
||||||
-H "Authorization: Bearer ${{ secrets.BITSIGN_API_KEY }}" \
|
|
||||||
-o "$SIGNED_FILENAME" \
|
|
||||||
--fail --show-error
|
|
||||||
|
|
||||||
if [ -f "$SIGNED_FILENAME" ] && [ -s "$SIGNED_FILENAME" ]; then
|
|
||||||
FILE_SIZE=$(ls -lh "$SIGNED_FILENAME" | awk '{print $5}')
|
|
||||||
echo "Successfully downloaded signed file: $SIGNED_FILENAME ($FILE_SIZE)"
|
|
||||||
echo "signed_filename=$SIGNED_FILENAME" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# Calculate SHA256 checksums for both files
|
|
||||||
ORIGINAL_SHA256=$(sha256sum "$FILENAME" | cut -d' ' -f1)
|
|
||||||
SIGNED_SHA256=$(sha256sum "$SIGNED_FILENAME" | cut -d' ' -f1)
|
|
||||||
echo "original_sha256=$ORIGINAL_SHA256" >> $GITHUB_OUTPUT
|
|
||||||
echo "signed_sha256=$SIGNED_SHA256" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "Failed to download signed file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Upload signed artifacts
|
|
||||||
uses: actions/upload-artifact@v7
|
|
||||||
with:
|
|
||||||
name: signed-infix-${{ steps.validate.outputs.file_version }}
|
|
||||||
path: ${{ steps.download_signed.outputs.signed_filename }}
|
|
||||||
retention-days: 90
|
|
||||||
|
|
||||||
- name: Summary
|
|
||||||
run: |
|
|
||||||
# Determine the actual version used (could be from push or input)
|
|
||||||
if [ "${{ github.event_name }}" = "push" ]; then
|
|
||||||
ACTUAL_VERSION="v25.08.0"
|
|
||||||
else
|
|
||||||
ACTUAL_VERSION="${{ inputs.release_version }}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat >> $GITHUB_STEP_SUMMARY << EOF
|
|
||||||
# bitSign Infix Release Signing Complete
|
|
||||||
|
|
||||||
The Infix release has been successfully signed using the bitSign API.
|
|
||||||
|
|
||||||
## Signing Details
|
|
||||||
|
|
||||||
| Property | Value |
|
|
||||||
|----------|-------|
|
|
||||||
| 📦 **Original File** | \`${{ steps.validate.outputs.filename }}\` (\`${{ steps.download_signed.outputs.original_sha256 }}\`) |
|
|
||||||
| ✍️ **Signed File** | \`${{ steps.download_signed.outputs.signed_filename }}\` (\`${{ steps.download_signed.outputs.signed_sha256 }}\`) |
|
|
||||||
| 🔑 **Signing Key** | \`bit42-Demo1\` |
|
|
||||||
| ⚙️ **Job Type** | \`Infix-x86\` |
|
|
||||||
| 🆔 **Request ID** | \`${{ steps.create_request.outputs.request_id }}\` |
|
|
||||||
| 📋 **Release Version** | \`\$ACTUAL_VERSION\` |
|
|
||||||
| 🌐 **API Endpoint** | \`portal.bitsign.se\` |
|
|
||||||
|
|
||||||
## Download Files
|
|
||||||
|
|
||||||
> **The signed release file is available as a workflow artifact:**
|
|
||||||
> **\`signed-infix-${{ steps.validate.outputs.file_version }}\`**
|
|
||||||
>
|
|
||||||
> The artifact contains the signed file: \`${{ steps.download_signed.outputs.signed_filename }}\`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Next Steps:** The signed release can now be distributed with cryptographic verification of authenticity.
|
|
||||||
EOF
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
name: Build Bootloaders
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
branch:
|
|
||||||
description: 'Branch to build from'
|
|
||||||
default: 'main'
|
|
||||||
type: string
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build ${{ matrix.defconfig }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
defconfig:
|
|
||||||
- aarch64_qemu_boot
|
|
||||||
- bpi_r3_sd_boot
|
|
||||||
- bpi_r3_emmc_boot
|
|
||||||
- bpi_r4_sd_boot
|
|
||||||
- bpi_r4_emmc_boot
|
|
||||||
- bpi_r64_sd_boot
|
|
||||||
- bpi_r64_emmc_boot
|
|
||||||
- cn9130_crb_boot
|
|
||||||
- fireant_boot
|
|
||||||
- nanopi_r2s_boot
|
|
||||||
- rpi2_boot
|
|
||||||
- rpi64_boot
|
|
||||||
- sama7g54_ek_emmc_boot
|
|
||||||
- sama7g54_ek_sd_boot
|
|
||||||
env:
|
|
||||||
MAKEFLAGS: -j5
|
|
||||||
steps:
|
|
||||||
- name: Cleanup Build Folder
|
|
||||||
run: |
|
|
||||||
ls -la ./
|
|
||||||
rm -rf ./* || true
|
|
||||||
rm -rf ./.??* || true
|
|
||||||
ls -la ./
|
|
||||||
|
|
||||||
- name: Checkout infix repo
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.branch || github.ref }}
|
|
||||||
clean: true
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Set Build Variables
|
|
||||||
id: vars
|
|
||||||
run: |
|
|
||||||
defconfig=${{ matrix.defconfig }}
|
|
||||||
version=$(awk -F'"' '/BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE=/ {print $2}' configs/${defconfig}_defconfig)
|
|
||||||
version=${version:-git}
|
|
||||||
filename=$(echo "${defconfig}" | tr '_' '-')
|
|
||||||
|
|
||||||
# TODO: Replace hardcoded rev with actual revision stepping
|
|
||||||
rev="latest"
|
|
||||||
|
|
||||||
archive="${filename}-${version}-${rev}.tar.gz"
|
|
||||||
dirname="${filename}-${version}-${rev}"
|
|
||||||
|
|
||||||
echo "defconfig=${defconfig}" >> $GITHUB_OUTPUT
|
|
||||||
echo "version=${version}" >> $GITHUB_OUTPUT
|
|
||||||
echo "rev=${rev}" >> $GITHUB_OUTPUT
|
|
||||||
echo "archive=${archive}" >> $GITHUB_OUTPUT
|
|
||||||
echo "dirname=${dirname}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
echo "Building ${defconfig}_defconfig, version ${version}-${rev}, artifact ${archive} ..."
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/cache-restore@v1
|
|
||||||
with:
|
|
||||||
target: ${{ matrix.defconfig }}
|
|
||||||
dl-prefix: dl-boot
|
|
||||||
ccache-prefix: ccache-boot
|
|
||||||
|
|
||||||
- name: Configure ${{ matrix.defconfig }}_defconfig
|
|
||||||
run: |
|
|
||||||
make ${{ matrix.defconfig }}_defconfig
|
|
||||||
|
|
||||||
- name: Build ${{ matrix.defconfig }}_defconfig
|
|
||||||
run: |
|
|
||||||
echo "Building ${{ matrix.defconfig }}_defconfig ..."
|
|
||||||
make -j$((`getconf _NPROCESSORS_ONLN` / 2 + 2))
|
|
||||||
|
|
||||||
- name: Resulting size of build
|
|
||||||
run: |
|
|
||||||
printf "Size of output/images/: "
|
|
||||||
ls -l output/images/
|
|
||||||
|
|
||||||
- name: Prepare ${{ matrix.defconfig }} Artifact
|
|
||||||
run: |
|
|
||||||
cd output/
|
|
||||||
mv images ${{ steps.vars.outputs.dirname }}
|
|
||||||
tar cfz ${{ steps.vars.outputs.archive }} ${{ steps.vars.outputs.dirname }}/
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v7
|
|
||||||
with:
|
|
||||||
path: output/${{ steps.vars.outputs.archive }}
|
|
||||||
name: artifact-${{ matrix.defconfig }}
|
|
||||||
|
|
||||||
publish:
|
|
||||||
name: Upload Bootloader Artifacts
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/download-artifact@v8
|
|
||||||
with:
|
|
||||||
pattern: "artifact-*"
|
|
||||||
merge-multiple: true
|
|
||||||
|
|
||||||
- name: Create checksums ...
|
|
||||||
run: |
|
|
||||||
for file in *.tar.gz; do
|
|
||||||
sha256sum $file > $file.sha256
|
|
||||||
done
|
|
||||||
|
|
||||||
- uses: ncipollo/release-action@v1
|
|
||||||
with:
|
|
||||||
allowUpdates: true
|
|
||||||
omitName: true
|
|
||||||
omitBody: true
|
|
||||||
omitBodyDuringUpdate: true
|
|
||||||
prerelease: true
|
|
||||||
tag: "latest-boot"
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
artifacts: "*.tar.gz*"
|
|
||||||
|
|
||||||
- name: Summary
|
|
||||||
run: |
|
|
||||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
|
||||||
# Bootloader Build Complete! :rocket:
|
|
||||||
|
|
||||||
For the public download links of these bootloader artifacts, please see:
|
|
||||||
<https://github.com/kernelkit/infix/releases/tag/latest-boot>
|
|
||||||
EOF
|
|
||||||
@@ -1,272 +0,0 @@
|
|||||||
name: Create Images
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
board:
|
|
||||||
description: 'Board to create image for'
|
|
||||||
type: choice
|
|
||||||
required: true
|
|
||||||
options:
|
|
||||||
- raspberrypi-rpi2
|
|
||||||
- raspberrypi-rpi64
|
|
||||||
- bananapi-bpi-r3
|
|
||||||
- bananapi-bpi-r4
|
|
||||||
- bananapi-bpi-r64
|
|
||||||
- friendlyarm-nanopi-r2s
|
|
||||||
- microchip-sama7g54-ek
|
|
||||||
- acer-connect-vero-w
|
|
||||||
default: 'raspberrypi-rpi64'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
create-image:
|
|
||||||
name: Create images for ${{ inputs.board }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
clean: true
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y \
|
|
||||||
genimage \
|
|
||||||
u-boot-tools \
|
|
||||||
parted \
|
|
||||||
gdisk \
|
|
||||||
qemu-utils \
|
|
||||||
dosfstools \
|
|
||||||
e2fsprogs \
|
|
||||||
genext2fs \
|
|
||||||
mtools \
|
|
||||||
jq
|
|
||||||
|
|
||||||
- name: Prepare build environment
|
|
||||||
run: |
|
|
||||||
# Set up directory structure similar to buildroot build
|
|
||||||
mkdir -p output/images
|
|
||||||
mkdir -p build
|
|
||||||
|
|
||||||
- name: Set bootloaders and targets based on board
|
|
||||||
run: |
|
|
||||||
arch=
|
|
||||||
targets=
|
|
||||||
bootloader_sdcard=
|
|
||||||
bootloader_emmc=
|
|
||||||
|
|
||||||
case "${{ inputs.board }}" in
|
|
||||||
raspberrypi-rpi2)
|
|
||||||
arch=arm
|
|
||||||
targets="sdcard"
|
|
||||||
bootloader_sdcard=rpi2-boot
|
|
||||||
;;
|
|
||||||
raspberrypi-rpi64)
|
|
||||||
arch=aarch64
|
|
||||||
targets="sdcard"
|
|
||||||
bootloader_sdcard=rpi64-boot
|
|
||||||
;;
|
|
||||||
bananapi-bpi-r3)
|
|
||||||
arch=aarch64
|
|
||||||
targets="sdcard emmc"
|
|
||||||
bootloader_sdcard=bpi-r3-sd-boot
|
|
||||||
bootloader_emmc=bpi-r3-emmc-boot
|
|
||||||
;;
|
|
||||||
bananapi-bpi-r4)
|
|
||||||
arch=aarch64
|
|
||||||
targets="sdcard emmc"
|
|
||||||
bootloader_sdcard=bpi-r4-sd-boot
|
|
||||||
bootloader_emmc=bpi-r4-emmc-boot
|
|
||||||
;;
|
|
||||||
bananapi-bpi-r64)
|
|
||||||
arch=aarch64
|
|
||||||
targets="sdcard emmc"
|
|
||||||
bootloader_sdcard=bpi-r64-sd-boot
|
|
||||||
bootloader_emmc=bpi-r64-emmc-boot
|
|
||||||
;;
|
|
||||||
acer-connect-vero-w)
|
|
||||||
arch=aarch64
|
|
||||||
targets="emmc"
|
|
||||||
bootloader_emmc=bpi-r3-emmc-boot
|
|
||||||
;;
|
|
||||||
friendlyarm-nanopi-r2s)
|
|
||||||
arch=aarch64
|
|
||||||
targets="sdcard"
|
|
||||||
bootloader_sdcard=nanopi-r2s-boot
|
|
||||||
;;
|
|
||||||
microchip-sama7g54-ek)
|
|
||||||
arch=arm
|
|
||||||
targets="sdcard emmc"
|
|
||||||
bootloader_sdcard=sama7g54-ek-sd-boot
|
|
||||||
bootloader_emmc=sama7g54-ek-emmc-boot
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Error: Unknown board ${{ inputs.board }}"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "ARCH=$arch" >> $GITHUB_ENV
|
|
||||||
echo "TARGETS=$targets" >> $GITHUB_ENV
|
|
||||||
[ -n "$bootloader_sdcard" ] && echo "BOOTLOADER_SDCARD=$bootloader_sdcard" >> $GITHUB_ENV
|
|
||||||
[ -n "$bootloader_emmc" ] && echo "BOOTLOADER_EMMC=$bootloader_emmc" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
echo "Arch: $arch for board: ${{ inputs.board }}"
|
|
||||||
echo "Targets: $targets"
|
|
||||||
[ -n "$bootloader_sdcard" ] && echo "SD bootloader: $bootloader_sdcard"
|
|
||||||
[ -n "$bootloader_emmc" ] && echo "eMMC bootloader: $bootloader_emmc"
|
|
||||||
|
|
||||||
- name: Download bootloader artifacts
|
|
||||||
run: |
|
|
||||||
for target in $TARGETS; do
|
|
||||||
upper=$(printf '%s' "$target" | tr '[:lower:]' '[:upper:]')
|
|
||||||
bootloader_var="BOOTLOADER_${upper}"
|
|
||||||
bootloader="${!bootloader_var}"
|
|
||||||
temp_dir="temp_bootloader_${target}"
|
|
||||||
out_dir="output_${target}/images"
|
|
||||||
|
|
||||||
echo "Downloading ${target} bootloader: ${bootloader}"
|
|
||||||
mkdir -p "$out_dir"
|
|
||||||
gh release download latest-boot --pattern "*${bootloader}*" --dir "$temp_dir/"
|
|
||||||
tar -xzf "$temp_dir"/*.tar.gz --strip-components=1 -C "$out_dir/"
|
|
||||||
rm -rf "$temp_dir"
|
|
||||||
|
|
||||||
echo "${target} bootloader files:"
|
|
||||||
ls -la "$out_dir/"
|
|
||||||
done
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Download Infix artifacts
|
|
||||||
run: |
|
|
||||||
gh run list --workflow=164295764 --branch=main --limit=1 --status=success --json databaseId --jq '.[0].databaseId' > latest_infix_run_id
|
|
||||||
INFIX_RUN_ID=$(cat latest_infix_run_id)
|
|
||||||
|
|
||||||
gh run download ${INFIX_RUN_ID} --name artifact-${ARCH} --dir temp_infix/
|
|
||||||
|
|
||||||
for target in $TARGETS; do
|
|
||||||
out_dir="output_${target}/images"
|
|
||||||
mkdir -p "$out_dir"
|
|
||||||
tar -xzf temp_infix/*.tar.gz --strip-components=1 -C "$out_dir/"
|
|
||||||
|
|
||||||
echo "Infix files extracted to ${out_dir}:"
|
|
||||||
ls -la "$out_dir/"
|
|
||||||
done
|
|
||||||
|
|
||||||
rm -rf temp_infix/
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Verify extracted files
|
|
||||||
run: |
|
|
||||||
for target in $TARGETS; do
|
|
||||||
echo "Files available for ${target} image:"
|
|
||||||
ls -la "output_${target}/images/"
|
|
||||||
echo ""
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Create images
|
|
||||||
run: |
|
|
||||||
export BUILD_DIR=$PWD/build
|
|
||||||
export BR2_EXTERNAL_INFIX_PATH=$PWD
|
|
||||||
export RELEASE=""
|
|
||||||
export INFIX_ID="infix"
|
|
||||||
|
|
||||||
for target in $TARGETS; do
|
|
||||||
export BINARIES_DIR=$PWD/output_${target}/images
|
|
||||||
./utils/mkimage.sh -t "$target" ${{ inputs.board }}
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Verify created images
|
|
||||||
run: |
|
|
||||||
mkdir -p output/images
|
|
||||||
|
|
||||||
for target in $TARGETS; do
|
|
||||||
src_dir="output_${target}/images"
|
|
||||||
found=false
|
|
||||||
|
|
||||||
echo "${target} image:"
|
|
||||||
ls -lh "$src_dir"/*-"$target".img* 2>/dev/null || true
|
|
||||||
|
|
||||||
for img in "$src_dir"/*-"$target".img; do
|
|
||||||
[ -e "$img" ] || continue
|
|
||||||
found=true
|
|
||||||
echo "- $(basename "$img")"
|
|
||||||
file "$img"
|
|
||||||
fdisk -l "$img" 2>/dev/null || true
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$found" = false ]; then
|
|
||||||
echo "No ${target} image found matching pattern: *-${target}.img"
|
|
||||||
echo "Available files in ${src_dir}:"
|
|
||||||
ls -la "$src_dir/"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
for artifact in "$src_dir"/*-"$target".img*; do
|
|
||||||
[ -e "$artifact" ] || continue
|
|
||||||
cp "$artifact" output/images/
|
|
||||||
done
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Upload images as artifacts
|
|
||||||
uses: actions/upload-artifact@v7
|
|
||||||
with:
|
|
||||||
name: images-${{ inputs.board }}
|
|
||||||
path: |
|
|
||||||
output/images/*-sdcard.img*
|
|
||||||
output/images/*-emmc.img*
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
- name: Create checksums
|
|
||||||
run: |
|
|
||||||
cd output/images/
|
|
||||||
for file in *-sdcard.img *-emmc.img; do
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
sha256sum "$file" > "$file.sha256"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Upload to release
|
|
||||||
uses: ncipollo/release-action@v1
|
|
||||||
with:
|
|
||||||
allowUpdates: true
|
|
||||||
omitName: true
|
|
||||||
omitBody: true
|
|
||||||
omitBodyDuringUpdate: true
|
|
||||||
prerelease: true
|
|
||||||
tag: "latest-boot"
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
artifacts: "output/images/*-sdcard.img*,output/images/*-emmc.img*"
|
|
||||||
|
|
||||||
- name: Generate summary
|
|
||||||
run: |
|
|
||||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
|
||||||
# Image Build Complete! 🚀
|
|
||||||
|
|
||||||
**Board:** ${{ inputs.board }}
|
|
||||||
**Arch:** ${{ env.ARCH }}
|
|
||||||
**Targets:** ${{ env.TARGETS }}
|
|
||||||
**Bootloader Source:** latest-boot release
|
|
||||||
**Infix Source:** Latest workflow run on main
|
|
||||||
|
|
||||||
## Bootloaders
|
|
||||||
$(for target in $TARGETS; do
|
|
||||||
case "$target" in
|
|
||||||
sdcard) bootloader="$BOOTLOADER_SDCARD" ;;
|
|
||||||
emmc) bootloader="$BOOTLOADER_EMMC" ;;
|
|
||||||
esac
|
|
||||||
printf -- '- %s: %s\n' "$target" "$bootloader"
|
|
||||||
done)
|
|
||||||
|
|
||||||
## Created Images
|
|
||||||
$(find output/images/ -name "*.img" -o -name "*.img.bmap" | xargs ls -lh 2>/dev/null | awk '{print "- " $9 " (" $5 ")"}' || echo "- No images found")
|
|
||||||
|
|
||||||
## Download
|
|
||||||
The generated images are available as workflow artifacts above and in the latest-boot release.
|
|
||||||
EOF
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
# Needed for make pkg-stats
|
|
||||||
# sudo apt install python3-aiohttp
|
|
||||||
---
|
|
||||||
name: Build Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
version:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
use_cache:
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build Infix ${{ inputs.version }} [${{ matrix.target }}]
|
|
||||||
runs-on: [self-hosted, release]
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
target: [aarch64, arm, x86_64]
|
|
||||||
fail-fast: false
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
clean: true
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/podman-cleanup@v1
|
|
||||||
|
|
||||||
- name: Set Release Variables
|
|
||||||
id: vars
|
|
||||||
run: |
|
|
||||||
ver=${{ inputs.version }}
|
|
||||||
echo "ver=${ver}" >> $GITHUB_OUTPUT
|
|
||||||
fver=${ver#v}
|
|
||||||
target=${{ matrix.target }}-${fver}
|
|
||||||
echo "dir=infix-$target" >> $GITHUB_OUTPUT
|
|
||||||
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/cache-restore@v1
|
|
||||||
with:
|
|
||||||
target: ${{ matrix.target }}
|
|
||||||
enabled: ${{ inputs.use_cache }}
|
|
||||||
|
|
||||||
- name: Configure & Build
|
|
||||||
env:
|
|
||||||
INFIX_RELEASE: ${{ steps.vars.outputs.ver }}
|
|
||||||
run: |
|
|
||||||
target=${{ matrix.target }}_defconfig
|
|
||||||
echo "Building $target ..."
|
|
||||||
make $target
|
|
||||||
make
|
|
||||||
|
|
||||||
- name: Generate SBOM from Build
|
|
||||||
run: |
|
|
||||||
# Generate manifest files in CSV format for CycloneDX
|
|
||||||
make legal-info
|
|
||||||
# Generate cpe.json for CycloneDX
|
|
||||||
make -s show-info > output/cpe.json
|
|
||||||
# Generate pkg-stats.{json,html} for humans
|
|
||||||
make pkg-stats
|
|
||||||
|
|
||||||
- name: Build test specification
|
|
||||||
run: |
|
|
||||||
make test-spec
|
|
||||||
|
|
||||||
- name: Prepare Artifacts
|
|
||||||
run: |
|
|
||||||
cd output/
|
|
||||||
|
|
||||||
# Collect relevant files for SBOM and CPE info. for more info, see:
|
|
||||||
# https://github.com/CycloneDX/cyclonedx-buildroot
|
|
||||||
mkdir images/sbom
|
|
||||||
mv pkg-stats.* images/sbom/
|
|
||||||
mv cpe.json images/sbom/
|
|
||||||
mv legal-info/*.csv images/sbom/
|
|
||||||
|
|
||||||
# Remove rootfs.squashfs from release (can be extracted from rootfs.itb)
|
|
||||||
# Saves ~131MB per architecture. See issue #858
|
|
||||||
rm -f images/rootfs.squashfs
|
|
||||||
|
|
||||||
mv images ${{ steps.vars.outputs.dir }}
|
|
||||||
ln -s ${{ steps.vars.outputs.dir }} images
|
|
||||||
tar cfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v7
|
|
||||||
with:
|
|
||||||
name: artifact-${{ matrix.target }}
|
|
||||||
path: output/*.tar.gz
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v7
|
|
||||||
with:
|
|
||||||
name: artifact-disk-image-${{ matrix.target }}
|
|
||||||
path: output/images/*.qcow2
|
|
||||||
@@ -1,184 +1,102 @@
|
|||||||
name: Build
|
name: Bob the Builder
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
|
||||||
target:
|
|
||||||
description: "Build target (e.g. aarch64 or aarch64_minimal)"
|
|
||||||
default: "x86_64"
|
|
||||||
type: string
|
|
||||||
parallel:
|
|
||||||
description: 'Massive parallel build of each image'
|
|
||||||
default: true
|
|
||||||
type: boolean
|
|
||||||
name:
|
|
||||||
description: "Name (for spin overrides)"
|
|
||||||
default: "infix"
|
|
||||||
type: string
|
|
||||||
infix_repo:
|
|
||||||
description: 'Repo to checkout (for spin overrides)'
|
|
||||||
default: kernelkit/infix
|
|
||||||
type: string
|
|
||||||
infix_branch:
|
|
||||||
description: 'Branch/tag/commit to checkout (for spin overrides)'
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
target:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
name:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
infix_repo:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: kernelkit/infix
|
|
||||||
infix_branch:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
description: 'Branch/tag/commit to checkout (for spin overrides). Defaults to github.ref if not specified'
|
|
||||||
parallel:
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: true
|
|
||||||
pre_build_script:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
description: 'Optional script to run after checkout (for spin customization)'
|
|
||||||
secrets:
|
|
||||||
CHECKOUT_TOKEN:
|
|
||||||
required: false
|
|
||||||
description: 'Token for cross-repository access'
|
|
||||||
|
|
||||||
env:
|
|
||||||
NAME: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }}
|
|
||||||
TARGET: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
|
|
||||||
INFIX_REPO: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_repo || inputs.infix_repo }}
|
|
||||||
INFIX_BRANCH: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_branch || inputs.infix_branch }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
|
name: Build Infix ${{ matrix.target }}
|
||||||
runs-on: [ self-hosted, latest ]
|
runs-on: [ self-hosted, latest ]
|
||||||
env:
|
|
||||||
PARALLEL: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.parallel == 'true' || github.event_name != 'workflow_dispatch' && inputs.parallel == true }}
|
|
||||||
strategy:
|
strategy:
|
||||||
|
matrix:
|
||||||
|
target: [aarch64, x86_64]
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
outputs:
|
|
||||||
build_id: ${{ steps.vars.outputs.INFIX_BUILD_ID }}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Cleanup Build Folder
|
- uses: actions/checkout@v4
|
||||||
run: |
|
|
||||||
ls -la ./
|
|
||||||
rm -rf ./* || true
|
|
||||||
rm -rf ./.??* || true
|
|
||||||
ls -la ./
|
|
||||||
|
|
||||||
- name: Checkout infix repo
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
with:
|
||||||
repository: ${{ env.INFIX_REPO }}
|
|
||||||
ref: ${{ env.INFIX_BRANCH != '' && env.INFIX_BRANCH || github.ref }}
|
|
||||||
clean: true
|
clean: true
|
||||||
fetch-depth: 0
|
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
token: ${{ secrets.CHECKOUT_TOKEN || github.token }}
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/podman-cleanup@v1
|
|
||||||
|
|
||||||
- name: Run pre-build script
|
|
||||||
if: ${{ inputs.pre_build_script != '' }}
|
|
||||||
run: |
|
|
||||||
cat > ./pre-build.sh << 'EOF'
|
|
||||||
${{ inputs.pre_build_script }}
|
|
||||||
EOF
|
|
||||||
chmod +x ./pre-build.sh
|
|
||||||
bash ./pre-build.sh
|
|
||||||
|
|
||||||
- name: Set Build Variables
|
- name: Set Build Variables
|
||||||
id: vars
|
id: vars
|
||||||
run: |
|
run: |
|
||||||
if [ -n "${{ github.event.pull_request.head.sha }}" ]; then
|
target=${{ matrix.target }}
|
||||||
# Since PRs are built from an internally generated merge
|
echo "dir=infix-$target" >> $GITHUB_OUTPUT
|
||||||
# commit, reverse lookups of PRs and/or commits from
|
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
|
||||||
# image version information are cumbersome. Therefore:
|
|
||||||
# explicitly set a build id that references both the PR
|
|
||||||
# and the commit.
|
|
||||||
printf "INFIX_BUILD_ID=pr%d.%.7s\n" \
|
|
||||||
"${{ github.event.number }}" "${{ github.event.pull_request.head.sha }}" \
|
|
||||||
| tee -a $GITHUB_OUTPUT $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
|
|
||||||
target=${{ env.TARGET }}
|
- name: Restore Cache of dl/
|
||||||
name=${{ env.NAME }}
|
uses: actions/cache@v4
|
||||||
echo "dir=${name}-${target}" >> $GITHUB_OUTPUT
|
|
||||||
echo "tgz=${name}-${target}.tar.gz" >> $GITHUB_OUTPUT
|
|
||||||
echo "Building target ${target}_defconfig"
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/cache-restore@v1
|
|
||||||
with:
|
with:
|
||||||
target: ${{ env.TARGET }}
|
path: dl/
|
||||||
|
key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
|
||||||
|
restore-keys: |
|
||||||
|
dl-
|
||||||
|
|
||||||
- name: Configure ${{ env.TARGET }}
|
- name: Restore Cache of .ccache/
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: .ccache/
|
||||||
|
key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
|
||||||
|
restore-keys: |
|
||||||
|
ccache-${{ matrix.target }}-
|
||||||
|
ccache-
|
||||||
|
|
||||||
|
- name: Configure & Build
|
||||||
run: |
|
run: |
|
||||||
make ${{ env.TARGET }}_defconfig
|
target=${{ matrix.target }}_defconfig
|
||||||
|
echo "Building $target ..."
|
||||||
|
make $target
|
||||||
|
make
|
||||||
|
|
||||||
- name: Cleanup stale containers and ports
|
- name: Prepare Artifact
|
||||||
run: |
|
|
||||||
podman rm -af || true
|
|
||||||
pkill -9 -f rootlessport || true
|
|
||||||
|
|
||||||
- name: Prepare parallel build
|
|
||||||
id: parallel
|
|
||||||
run: |
|
|
||||||
|
|
||||||
if [ "$PARALLEL" == "true" ]; then
|
|
||||||
echo "BR2_PER_PACKAGE_DIRECTORIES=y" >> output/.config
|
|
||||||
MAKE="make -j$((`getconf _NPROCESSORS_ONLN` / 2 + 2))"
|
|
||||||
echo "Building in parallel with -j$((`getconf _NPROCESSORS_ONLN` / 2 + 2))"
|
|
||||||
else
|
|
||||||
echo "Disabling parallel build"
|
|
||||||
MAKE="make"
|
|
||||||
fi
|
|
||||||
echo "MAKE=$MAKE" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build ${{ env.TARGET }}
|
|
||||||
run: |
|
|
||||||
echo "Building ${{ env.TARGET }}_defconfig ..."
|
|
||||||
eval "${{ steps.parallel.outputs.MAKE }}"
|
|
||||||
|
|
||||||
- name: Check SBOM from Build
|
|
||||||
run: |
|
|
||||||
make legal-info
|
|
||||||
|
|
||||||
- name: Build test specification
|
|
||||||
run: |
|
|
||||||
make test-spec
|
|
||||||
|
|
||||||
- name: Resulting size of build
|
|
||||||
run: |
|
|
||||||
printf "Size of complete tree : "
|
|
||||||
du -sh .
|
|
||||||
printf "Size of output/ : "
|
|
||||||
du -sh output
|
|
||||||
printf "Size of dl/ : "
|
|
||||||
du -sh dl
|
|
||||||
printf "Size of output/images/: "
|
|
||||||
ls -l output/images/
|
|
||||||
|
|
||||||
- name: Prepare ${{ env.TARGET }} Artifact
|
|
||||||
run: |
|
run: |
|
||||||
cd output/
|
cd output/
|
||||||
mv images ${{ steps.vars.outputs.dir }}
|
mv images ${{ steps.vars.outputs.dir }}
|
||||||
ln -s ${{ steps.vars.outputs.dir }} images
|
ln -s ${{ steps.vars.outputs.dir }} images
|
||||||
tar cfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
|
tar chfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v7
|
- name: Test
|
||||||
|
if: matrix.target == 'x86_64'
|
||||||
|
run: |
|
||||||
|
make test
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: output/${{ steps.vars.outputs.tgz }}
|
path: output/${{ steps.vars.outputs.tgz }}
|
||||||
name: artifact-${{ env.TARGET }}
|
name: artifact-${{ matrix.target }}
|
||||||
|
|
||||||
|
release:
|
||||||
|
if: ${{github.repository_owner == 'kernelkit' && github.ref_name == 'main'}}
|
||||||
|
name: Upload Latest Build
|
||||||
|
needs: build
|
||||||
|
runs-on: [ self-hosted, latest ]
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
pattern: "artifact-*"
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- uses: ncipollo/release-action@v1
|
||||||
|
with:
|
||||||
|
allowUpdates: true
|
||||||
|
omitName: true
|
||||||
|
omitBody: true
|
||||||
|
omitBodyDuringUpdate: true
|
||||||
|
prerelease: true
|
||||||
|
tag: "latest"
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
artifacts: "*.tar.gz"
|
||||||
|
|
||||||
|
- name: Summary
|
||||||
|
run: |
|
||||||
|
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
||||||
|
# Latest Build Complete! :rocket:
|
||||||
|
|
||||||
|
For the public download links of these build artifacts, please see:
|
||||||
|
<https://github.com/kernelkit/infix/releases/tag/latest>
|
||||||
|
EOF
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
name: Check Kernel 6.18 Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 3 * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-kernel:
|
|
||||||
if: github.repository == 'kernelkit/infix'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out infix repository
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
|
|
||||||
|
|
||||||
- name: Fetch kernel.org and check for 6.18 release
|
|
||||||
id: check
|
|
||||||
run: |
|
|
||||||
set -e -o pipefail
|
|
||||||
# Fetch the kernel.org frontpage and extract 6.18 version
|
|
||||||
CURRENT_VERSION=$(curl -s https://www.kernel.org/ | grep -oP '6\.18\.\d+' | head -n1)
|
|
||||||
|
|
||||||
if [ -z "$CURRENT_VERSION" ]; then
|
|
||||||
echo "Failed to fetch kernel version"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
|
|
||||||
echo "Current 6.18 kernel version: $CURRENT_VERSION"
|
|
||||||
|
|
||||||
# Get the version from infix defconfig
|
|
||||||
INFIX_VERSION=$(grep 'BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE=' configs/aarch64_defconfig | cut -d'"' -f2)
|
|
||||||
|
|
||||||
echo "infix_version=$INFIX_VERSION" >> $GITHUB_OUTPUT
|
|
||||||
echo "Infix kernel version: $INFIX_VERSION"
|
|
||||||
|
|
||||||
if [ "$CURRENT_VERSION" != "$INFIX_VERSION" ]; then
|
|
||||||
# Check if there's already an open PR for this version
|
|
||||||
PR_EXISTS=$(gh pr list --state open --search "Upgrade to kernel $CURRENT_VERSION in:title" --json number --jq 'length')
|
|
||||||
|
|
||||||
if [ "$PR_EXISTS" -gt 0 ]; then
|
|
||||||
echo "new_release=false" >> $GITHUB_OUTPUT
|
|
||||||
echo "PR already exists for kernel $CURRENT_VERSION, skipping"
|
|
||||||
else
|
|
||||||
echo "new_release=true" >> $GITHUB_OUTPUT
|
|
||||||
echo "🎉 New 6.18 kernel released: $CURRENT_VERSION (infix version: $INFIX_VERSION)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "new_release=false" >> $GITHUB_OUTPUT
|
|
||||||
echo "No change - still at $CURRENT_VERSION"
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.KERNEL_UPDATE_TOKEN }}
|
|
||||||
|
|
||||||
- name: Generate branch name
|
|
||||||
if: steps.check.outputs.new_release == 'true'
|
|
||||||
id: branch
|
|
||||||
run: |
|
|
||||||
BRANCH_NAME="kernel-upgrade-$(uuidgen | tr '[:upper:]' '[:lower:]')"
|
|
||||||
echo "name=$BRANCH_NAME" >> $GITHUB_OUTPUT
|
|
||||||
echo "Branch name: $BRANCH_NAME"
|
|
||||||
|
|
||||||
- name: Import GPG key
|
|
||||||
if: steps.check.outputs.new_release == 'true'
|
|
||||||
run: |
|
|
||||||
# Import the GPG key
|
|
||||||
echo "${{ secrets.AEL_BOT_GPG_PRIVATE_KEY }}" | gpg --batch --import
|
|
||||||
|
|
||||||
# Get the key ID
|
|
||||||
GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format=long | grep '^sec' | head -1 | awk '{print $2}' | cut -d'/' -f2)
|
|
||||||
echo "GPG_KEY_ID=$GPG_KEY_ID" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
# Configure GPG agent for non-interactive use
|
|
||||||
echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
|
|
||||||
echo "pinentry-mode loopback" >> ~/.gnupg/gpg.conf
|
|
||||||
gpg-connect-agent reloadagent /bye || true
|
|
||||||
|
|
||||||
- name: Set up git credentials
|
|
||||||
if: steps.check.outputs.new_release == 'true'
|
|
||||||
run: |
|
|
||||||
set -e -o pipefail
|
|
||||||
git config --global user.email "ael-bot@users.noreply.github.com"
|
|
||||||
git config --global user.name "ael-bot"
|
|
||||||
git config --global commit.gpgsign true
|
|
||||||
git config --global user.signingkey ${{ env.GPG_KEY_ID }}
|
|
||||||
|
|
||||||
# Configure git to use the token for HTTPS operations
|
|
||||||
git config --global url."https://ael-bot:${{ secrets.KERNEL_UPDATE_TOKEN }}@github.com/".insteadOf "git@github.com:"
|
|
||||||
git config --global url."https://ael-bot:${{ secrets.KERNEL_UPDATE_TOKEN }}@github.com/".insteadOf "https://github.com/"
|
|
||||||
|
|
||||||
- name: Run kernel upgrade script
|
|
||||||
if: steps.check.outputs.new_release == 'true'
|
|
||||||
env:
|
|
||||||
GIT_TERMINAL_PROMPT: 0
|
|
||||||
BRANCH_NAME: ${{ steps.branch.outputs.name }}
|
|
||||||
run: |
|
|
||||||
set -e -o pipefail
|
|
||||||
./utils/kernel-upgrade.sh linux 6.18 "$BRANCH_NAME"
|
|
||||||
|
|
||||||
- name: Create pull request
|
|
||||||
if: steps.check.outputs.new_release == 'true'
|
|
||||||
uses: actions/github-script@v9
|
|
||||||
with:
|
|
||||||
github-token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
|
|
||||||
script: |
|
|
||||||
const { data: pulls } = await github.rest.pulls.list({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
head: `${context.repo.owner}:kernel-upgrade`,
|
|
||||||
state: 'open'
|
|
||||||
});
|
|
||||||
|
|
||||||
if (pulls.length === 0) {
|
|
||||||
const { data: pr } = await github.rest.pulls.create({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
title: `Upgrade to kernel ${{ steps.check.outputs.current_version }}`,
|
|
||||||
head: '${{ steps.branch.outputs.name }}',
|
|
||||||
base: 'main',
|
|
||||||
body: `Automated kernel upgrade to version ${{ steps.check.outputs.current_version }}.\n\n**Previous version:** ${{ steps.check.outputs.infix_version }}\n**New version:** ${{ steps.check.outputs.current_version }}\n**Source:** https://www.kernel.org/\n\nThis PR was automatically created by the kernel release monitoring workflow.`
|
|
||||||
});
|
|
||||||
|
|
||||||
await github.rest.issues.addLabels({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
issue_number: pr.number,
|
|
||||||
labels: ['ci:main']
|
|
||||||
});
|
|
||||||
|
|
||||||
await github.rest.pulls.requestReviewers({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
pull_number: pr.number,
|
|
||||||
reviewers: ['troglobit', 'wkz', 'mattiaswal']
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -2,21 +2,19 @@ name: Coverity Scan
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '5 0 * * 6'
|
- cron: '5 0 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
PROJECT_NAME: Infix
|
PROJECT_NAME: Infix
|
||||||
CONTACT_EMAIL: troglobit@gmail.com
|
CONTACT_EMAIL: troglobit@gmail.com
|
||||||
LIBYANG_VERSION: 4.2.2
|
|
||||||
SYSREPO_VERSION: 4.2.10
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
coverity:
|
coverity:
|
||||||
if: ${{github.repository_owner == 'kernelkit'}}
|
if: ${{github.repository_owner == 'kernelkit'}}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
- name: Fetch latest Coverity Scan MD5
|
- name: Fetch latest Coverity Scan MD5
|
||||||
id: var
|
id: var
|
||||||
env:
|
env:
|
||||||
@@ -27,7 +25,7 @@ jobs:
|
|||||||
-O coverity-latest.tar.gz.md5
|
-O coverity-latest.tar.gz.md5
|
||||||
echo "md5=$(cat coverity-latest.tar.gz.md5)" | tee -a $GITHUB_OUTPUT
|
echo "md5=$(cat coverity-latest.tar.gz.md5)" | tee -a $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/cache@v5
|
- uses: actions/cache@v4
|
||||||
id: cache
|
id: cache
|
||||||
with:
|
with:
|
||||||
path: coverity-latest.tar.gz
|
path: coverity-latest.tar.gz
|
||||||
@@ -56,33 +54,23 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
sudo apt-get -y install pkg-config libjansson-dev libev-dev \
|
sudo apt-get -y install pkg-config libjansson-dev libev-dev \
|
||||||
libcrypt-dev libglib2.0-dev libpcre2-dev \
|
libaugeas-dev libglib2.0-dev libpcre2-dev \
|
||||||
libuev-dev libavahi-client-dev
|
libuev-dev libite-dev
|
||||||
|
|
||||||
- name: Build dependencies
|
- name: Build dependencies
|
||||||
run: |
|
run: |
|
||||||
git clone -b v${LIBYANG_VERSION} --depth 1 https://github.com/CESNET/libyang.git
|
git clone https://github.com/CESNET/libyang.git
|
||||||
for p in patches/libyang/${LIBYANG_VERSION}/*.patch; do
|
|
||||||
git -C libyang apply < "$p"
|
|
||||||
done
|
|
||||||
mkdir libyang/build
|
mkdir libyang/build
|
||||||
(cd libyang/build && cmake .. && make all && sudo make install)
|
(cd libyang/build && cmake .. && make all && sudo make install)
|
||||||
|
git clone https://github.com/sysrepo/sysrepo.git
|
||||||
git clone -b v${SYSREPO_VERSION} --depth 1 https://github.com/sysrepo/sysrepo.git
|
|
||||||
for p in patches/sysrepo/${SYSREPO_VERSION}/*.patch; do
|
|
||||||
git -C sysrepo apply < "$p"
|
|
||||||
done
|
|
||||||
mkdir sysrepo/build
|
mkdir sysrepo/build
|
||||||
(cd sysrepo/build && cmake .. && make all && sudo make install)
|
(cd sysrepo/build && cmake .. && make all && sudo make install)
|
||||||
|
|
||||||
git clone https://github.com/troglobit/libite.git
|
|
||||||
(cd libite && ./autogen.sh && ./configure && make && sudo make install)
|
|
||||||
make dep
|
make dep
|
||||||
|
|
||||||
- name: Build applications for Coverity
|
- name: Check applications
|
||||||
run: |
|
run: |
|
||||||
export PATH=`pwd`/coverity/bin:$PATH
|
export PATH=`pwd`/coverity/bin:$PATH
|
||||||
cov-build --dir cov-int make coverity
|
cov-build --dir cov-int make check
|
||||||
|
|
||||||
- name: Submit results to Coverity Scan
|
- name: Submit results to Coverity Scan
|
||||||
env:
|
env:
|
||||||
@@ -98,7 +86,7 @@ jobs:
|
|||||||
https://scan.coverity.com/builds?project=${PROJECT_NAME}
|
https://scan.coverity.com/builds?project=${PROJECT_NAME}
|
||||||
|
|
||||||
- name: Upload build.log
|
- name: Upload build.log
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: coverity-build.log
|
name: coverity-build.log
|
||||||
path: cov-int/build-log.txt
|
path: cov-int/build-log.txt
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
name: User Guide Generator
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- doc
|
|
||||||
- main
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
paths:
|
|
||||||
- 'doc/**'
|
|
||||||
- 'mkdocs.yml'
|
|
||||||
- '.github/workflows/docs.yml'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: "docs-${{ github.ref }}"
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
docs:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v6
|
|
||||||
with:
|
|
||||||
python-version: '3.x'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
pipx install mkdocs
|
|
||||||
pipx inject mkdocs mkdocs-material
|
|
||||||
pipx inject mkdocs pymdown-extensions
|
|
||||||
pipx inject mkdocs mkdocs-callouts
|
|
||||||
pipx inject mkdocs mike
|
|
||||||
pipx inject mkdocs mkdocs-to-pdf
|
|
||||||
pipx inject mkdocs mkdocs-glightbox
|
|
||||||
# Workaround, if pipx inject fails to install symlink
|
|
||||||
ln -s "$(pipx environment -V PIPX_LOCAL_VENVS)/mkdocs/bin/mike" \
|
|
||||||
"$(pipx environment -V PIPX_BIN_DIR)/mike" || true
|
|
||||||
|
|
||||||
- name: Configure Git
|
|
||||||
run: |
|
|
||||||
git config --global user.name "github-actions[bot]"
|
|
||||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
|
|
||||||
- name: Deploy dev version
|
|
||||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/doc' || github.ref == 'refs/heads/main')
|
|
||||||
run: |
|
|
||||||
mike deploy --push --update-aliases dev latest
|
|
||||||
mike set-default --push latest
|
|
||||||
|
|
||||||
- name: Deploy tagged version
|
|
||||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
|
||||||
run: |
|
|
||||||
TAG=${GITHUB_REF#refs/tags/v}
|
|
||||||
# Extract YEAR.MONTH from tag (e.g., v25.06.0-beta1 -> 25.06)
|
|
||||||
VERSION=$(echo $TAG | sed -E 's/^([0-9]+\.[0-9]+)(\.[0-9]+)?(-.*)?$/\1/')
|
|
||||||
echo "Deploying tag $TAG as docs version $VERSION"
|
|
||||||
mike deploy --push --update-aliases $VERSION latest
|
|
||||||
mike set-default --push latest
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
name: Generic X86 GitHub Build
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
if: github.repository != 'kernelkit/infix'
|
|
||||||
name: Infix x86_64
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Free Disk Space
|
|
||||||
uses: jlumbroso/free-disk-space@main
|
|
||||||
with:
|
|
||||||
tool-cache: true
|
|
||||||
android: true
|
|
||||||
dotnet: true
|
|
||||||
haskell: true
|
|
||||||
large-packages: true
|
|
||||||
docker-images: true
|
|
||||||
swap-storage: false
|
|
||||||
|
|
||||||
- name: Install build dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y \
|
|
||||||
bc binutils build-essential bzip2 cpio \
|
|
||||||
diffutils file findutils git gzip \
|
|
||||||
libncurses-dev libssl-dev perl patch \
|
|
||||||
python3 rsync sed tar unzip wget \
|
|
||||||
autopoint bison flex autoconf automake \
|
|
||||||
mtools
|
|
||||||
|
|
||||||
- name: Checkout infix repo
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
repository: ${{ github.repository }}
|
|
||||||
ref: ${{ github.ref }}
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Set Build Variables
|
|
||||||
id: vars
|
|
||||||
run: |
|
|
||||||
echo "INFIX_BUILD_ID=${{ github.run_id }}" >> $GITHUB_OUTPUT
|
|
||||||
echo "dir=Infix-x86_64" >> $GITHUB_OUTPUT
|
|
||||||
echo "tgz=Infix-x86_64.tar.gz" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Configure x86_64_minimal
|
|
||||||
run: |
|
|
||||||
make x86_64_minimal_defconfig
|
|
||||||
|
|
||||||
- name: Unit Test x86_64
|
|
||||||
run: |
|
|
||||||
make test-unit
|
|
||||||
|
|
||||||
- name: Build x86_64_minimal
|
|
||||||
run: |
|
|
||||||
make
|
|
||||||
|
|
||||||
- name: Check SBOM
|
|
||||||
run: |
|
|
||||||
make legal-info
|
|
||||||
|
|
||||||
- name: Report Build Size
|
|
||||||
run: |
|
|
||||||
du -sh .
|
|
||||||
du -sh output
|
|
||||||
du -sh dl || true
|
|
||||||
ls -l output/images/
|
|
||||||
|
|
||||||
- name: Prepare Artifact
|
|
||||||
run: |
|
|
||||||
cd output/
|
|
||||||
mv images Infix-x86_64
|
|
||||||
ln -s Infix-x86_64 images
|
|
||||||
tar cfz Infix-x86_64.tar.gz Infix-x86_64
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v7
|
|
||||||
with:
|
|
||||||
path: output/Infix-x86_64.tar.gz
|
|
||||||
name: artifact-x86_64
|
|
||||||
|
|
||||||
@@ -44,11 +44,23 @@ jobs:
|
|||||||
checkout:
|
checkout:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
- uses: kernelkit/actions/cache-restore@v1
|
- name: Restore Cache of dl/
|
||||||
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
target: x86_64
|
path: dl/
|
||||||
dl-prefix: dl-netconf
|
key: dl-netconf-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
|
||||||
|
restore-keys: |
|
||||||
|
dl-netconf-
|
||||||
|
dl-
|
||||||
|
- name: Restore Cache of .ccache/
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: .ccache/
|
||||||
|
key: ccache-x86_64-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
|
||||||
|
restore-keys: |
|
||||||
|
ccache-x86_64-
|
||||||
|
ccache-
|
||||||
- name: Disk inventory (2/2) ...
|
- name: Disk inventory (2/2) ...
|
||||||
run: |
|
run: |
|
||||||
echo "df -h ========================================================================="
|
echo "df -h ========================================================================="
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
name: Publish latest Infix
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
workflow_call:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish:
|
|
||||||
name: Upload Latest Build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/download-artifact@v8
|
|
||||||
with:
|
|
||||||
pattern: "artifact-*"
|
|
||||||
merge-multiple: true
|
|
||||||
|
|
||||||
- name: Create checksums ...
|
|
||||||
run: |
|
|
||||||
for file in *.tar.gz; do
|
|
||||||
sha256sum $file > $file.sha256
|
|
||||||
done
|
|
||||||
|
|
||||||
- uses: ncipollo/release-action@v1
|
|
||||||
with:
|
|
||||||
allowUpdates: true
|
|
||||||
replacesArtifacts: true
|
|
||||||
omitName: true
|
|
||||||
omitBody: true
|
|
||||||
omitBodyDuringUpdate: true
|
|
||||||
prerelease: true
|
|
||||||
tag: "latest"
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
artifacts: "*.tar.gz*"
|
|
||||||
|
|
||||||
- name: Summary
|
|
||||||
run: |
|
|
||||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
|
||||||
# Latest Build Complete! :rocket:
|
|
||||||
|
|
||||||
For the public download links of these build artifacts, please see:
|
|
||||||
<https://github.com/kernelkit/infix/releases/tag/latest>
|
|
||||||
EOF
|
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
name: Reggie Regression
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Regression Testing ${{ matrix.target }}
|
||||||
|
runs-on: [ self-hosted, regression ]
|
||||||
|
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
target: [aarch64, x86_64]
|
||||||
|
fail-fast: false
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
clean: true
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Clean up cruft ...
|
||||||
|
run: |
|
||||||
|
./test/env -c
|
||||||
|
|
||||||
|
- name: Set Build Variables
|
||||||
|
id: vars
|
||||||
|
run: |
|
||||||
|
target=${{ matrix.target }}
|
||||||
|
echo "dir=infix-$target" >> $GITHUB_OUTPUT
|
||||||
|
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Restore Cache of dl/
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: dl/
|
||||||
|
key: dl-netconf-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
|
||||||
|
restore-keys: |
|
||||||
|
dl-
|
||||||
|
|
||||||
|
- name: Restore Cache of .ccache/
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: .ccache/
|
||||||
|
key: ccache-x86_64-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
|
||||||
|
restore-keys: |
|
||||||
|
ccache-${{ matrix.target }}-
|
||||||
|
ccache-
|
||||||
|
|
||||||
|
- name: Configure ${{ matrix.target }}
|
||||||
|
run: |
|
||||||
|
target=${{ matrix.target }}_defconfig
|
||||||
|
echo "Building $target ..."
|
||||||
|
make $target
|
||||||
|
|
||||||
|
- name: Unit Test
|
||||||
|
run: |
|
||||||
|
make test-unit
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
make
|
||||||
|
|
||||||
|
- name: Prepare Artifact
|
||||||
|
run: |
|
||||||
|
cd output/
|
||||||
|
mv images ${{ steps.vars.outputs.dir }}
|
||||||
|
ln -s ${{ steps.vars.outputs.dir }} images
|
||||||
|
tar cfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
|
||||||
|
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
path: output/${{ steps.vars.outputs.tgz }}
|
||||||
|
name: artifact-${{ matrix.target }}
|
||||||
|
|
||||||
|
- name: Regression Test
|
||||||
|
if: matrix.target == 'x86_64'
|
||||||
|
run: |
|
||||||
|
make test
|
||||||
|
|
||||||
|
- name: Publish Test Result
|
||||||
|
# Ensure this runs even if Regression Test fails
|
||||||
|
if: always()
|
||||||
|
run: cat test/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY
|
||||||
@@ -18,42 +18,90 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
set-version:
|
build:
|
||||||
if: github.repository == 'kernelkit/infix' && startsWith(github.ref, 'refs/tags/')
|
if: github.repository == 'kernelkit/infix' && startsWith(github.ref, 'refs/tags/')
|
||||||
runs-on: ubuntu-latest
|
name: Build Infix ${{ github.ref_name }} [${{ matrix.target }}]
|
||||||
outputs:
|
runs-on: [ self-hosted, release ]
|
||||||
version: ${{ steps.set-ver.outputs.version }}
|
strategy:
|
||||||
|
matrix:
|
||||||
|
target: [aarch64, x86_64]
|
||||||
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- id: set-ver
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
clean: true
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Set Release Variables
|
||||||
|
id: vars
|
||||||
run: |
|
run: |
|
||||||
if [ -n "${{ inputs.version }}" ]; then
|
if [ -n "${{ inputs.version }}" ]; then
|
||||||
ver=${{ inputs.version }}
|
ver=${{ inputs.version }}
|
||||||
else
|
else
|
||||||
ver=${GITHUB_REF#refs/tags/}
|
ver=${GITHUB_REF#refs/tags/}
|
||||||
fi
|
fi
|
||||||
echo "version=${ver}" >> $GITHUB_OUTPUT
|
echo "ver=${ver}" >> $GITHUB_OUTPUT
|
||||||
|
fver=${ver#v}
|
||||||
|
target=${{ matrix.target }}-${fver}
|
||||||
|
echo "dir=infix-$target" >> $GITHUB_OUTPUT
|
||||||
|
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
build:
|
- name: Restore Cache of dl/
|
||||||
needs: set-version
|
uses: actions/cache@v4
|
||||||
uses: ./.github/workflows/build-release.yml
|
with:
|
||||||
with:
|
path: dl/
|
||||||
version: ${{ needs.set-version.outputs.version }}
|
key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
|
||||||
use_cache: true
|
restore-keys: |
|
||||||
|
dl-
|
||||||
|
|
||||||
|
- name: Restore Cache of .ccache/
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: .ccache/
|
||||||
|
key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
|
||||||
|
restore-keys: |
|
||||||
|
ccache-${{ matrix.target }}-
|
||||||
|
ccache-
|
||||||
|
|
||||||
|
- name: Configure & Build
|
||||||
|
env:
|
||||||
|
INFIX_RELEASE: ${{ steps.vars.outputs.ver }}
|
||||||
|
run: |
|
||||||
|
target=${{ matrix.target }}_defconfig
|
||||||
|
echo "Building $target ..."
|
||||||
|
make $target
|
||||||
|
make
|
||||||
|
|
||||||
|
- name: Generate SBOM from Build
|
||||||
|
run: |
|
||||||
|
make legal-info
|
||||||
|
|
||||||
|
- name: Prepare Artifacts
|
||||||
|
run: |
|
||||||
|
cd output/
|
||||||
|
mv images ${{ steps.vars.outputs.dir }}
|
||||||
|
ln -s ${{ steps.vars.outputs.dir }} images
|
||||||
|
tar chfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
|
||||||
|
|
||||||
|
mv legal-info legal-info-$target
|
||||||
|
tar chfz legal-info-$target.tar.gz legal-info-$target
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: artifact-${{ matrix.target }}
|
||||||
|
path: output/*.tar.gz
|
||||||
|
|
||||||
release:
|
release:
|
||||||
name: Release Infix ${{ github.ref_name }}
|
name: Release Infix ${{ github.ref_name }}
|
||||||
needs: build
|
needs: build
|
||||||
runs-on: [self-hosted, release]
|
runs-on: [ self-hosted, release ]
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
discussions: write
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: 'true'
|
submodules: 'true'
|
||||||
|
|
||||||
- uses: kernelkit/actions/podman-cleanup@v1
|
|
||||||
|
|
||||||
- name: Set Release Variables
|
- name: Set Release Variables
|
||||||
id: rel
|
id: rel
|
||||||
run: |
|
run: |
|
||||||
@@ -63,14 +111,12 @@ jobs:
|
|||||||
ver=${GITHUB_REF#refs/tags/}
|
ver=${GITHUB_REF#refs/tags/}
|
||||||
fi
|
fi
|
||||||
echo "ver=${ver}" >> $GITHUB_OUTPUT
|
echo "ver=${ver}" >> $GITHUB_OUTPUT
|
||||||
echo "cat=" >> $GITHUB_OUTPUT
|
|
||||||
if echo $ver | grep -qE 'v[0-9.]+(-alpha|-beta|-rc)[0-9]*'; then
|
if echo $ver | grep -qE 'v[0-9.]+(-alpha|-beta|-rc)[0-9]*'; then
|
||||||
echo "pre=true" >> $GITHUB_OUTPUT
|
echo "pre=true" >> $GITHUB_OUTPUT
|
||||||
echo "latest=false" >> $GITHUB_OUTPUT
|
echo "latest=false" >> $GITHUB_OUTPUT
|
||||||
elif echo $ver | grep -qE '^v[0-9]+\.[0-9]+(\.0)?$'; then
|
elif echo $ver | grep -qE '^v[0-9.]+\.[0-9.]+(\.[0-9]+)?$'; then
|
||||||
echo "pre=false" >> $GITHUB_OUTPUT
|
echo "pre=false" >> $GITHUB_OUTPUT
|
||||||
echo "latest=true" >> $GITHUB_OUTPUT
|
echo "latest=true" >> $GITHUB_OUTPUT
|
||||||
echo "cat=Releases" >> $GITHUB_OUTPUT
|
|
||||||
else
|
else
|
||||||
echo "pre=false" >> $GITHUB_OUTPUT
|
echo "pre=false" >> $GITHUB_OUTPUT
|
||||||
echo "latest=false" >> $GITHUB_OUTPUT
|
echo "latest=false" >> $GITHUB_OUTPUT
|
||||||
@@ -78,7 +124,7 @@ jobs:
|
|||||||
echo "pre=${{ steps.rel.outputs.pre }}"
|
echo "pre=${{ steps.rel.outputs.pre }}"
|
||||||
echo "latest=${{ steps.rel.outputs.latest }}"
|
echo "latest=${{ steps.rel.outputs.latest }}"
|
||||||
|
|
||||||
- uses: actions/download-artifact@v8
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
pattern: "artifact-*"
|
pattern: "artifact-*"
|
||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
@@ -88,15 +134,11 @@ jobs:
|
|||||||
for file in *.tar.gz; do
|
for file in *.tar.gz; do
|
||||||
sha256sum $file > $file.sha256
|
sha256sum $file > $file.sha256
|
||||||
done
|
done
|
||||||
if ls *.qcow2 &>/dev/null; then
|
|
||||||
for file in *.qcow2; do
|
|
||||||
sha256sum "$file" > "$file.sha256"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Extract ChangeLog entry ...
|
- name: Extract ChangeLog entry ...
|
||||||
run: |
|
run: |
|
||||||
cat doc/ChangeLog.md | ./utils/extract-changelog.sh > release.md
|
awk '/^-----*$/{if (x == 1) exit; x=1;next}x' doc/ChangeLog.md \
|
||||||
|
|head -n -1 > release.md
|
||||||
cat release.md
|
cat release.md
|
||||||
|
|
||||||
- uses: ncipollo/release-action@v1
|
- uses: ncipollo/release-action@v1
|
||||||
@@ -104,15 +146,14 @@ jobs:
|
|||||||
name: Infix ${{ github.ref_name }}
|
name: Infix ${{ github.ref_name }}
|
||||||
prerelease: ${{ steps.rel.outputs.pre }}
|
prerelease: ${{ steps.rel.outputs.pre }}
|
||||||
makeLatest: ${{ steps.rel.outputs.latest }}
|
makeLatest: ${{ steps.rel.outputs.latest }}
|
||||||
discussionCategory: ${{ steps.rel.outputs.cat }}
|
bodyFile: release.md
|
||||||
bodyFile: release.md
|
artifacts: "*.tar.gz*"
|
||||||
artifacts: "*.tar.gz*,*.qcow2*"
|
|
||||||
|
|
||||||
- name: Summary
|
- name: Summary
|
||||||
run: |
|
run: |
|
||||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
||||||
# Infix ${{ github.ref_name }} Released! :rocket:
|
# Infix ${{ github.ref_name }} Released! :rocket:
|
||||||
|
|
||||||
For the public download links of this release, please see:
|
For the public download links of this release, please see:
|
||||||
<https://github.com/kernelkit/infix/releases/tag/${{ github.ref_name }}>
|
<https://github.com/kernelkit/infix/releases/tag/${{ github.ref_name }}>
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# To enable automatic sync of your Infix fork every day, or on dispatch,
|
||||||
|
# set the repoistory or organisation variable (not secret):
|
||||||
|
#
|
||||||
|
# SYNC_FORK = true
|
||||||
|
#
|
||||||
|
# You also need a GH_SYNC_REPO token allowed to update workflows. For
|
||||||
|
# more information on variables and secrets, see the GitHub docs.
|
||||||
|
# See https://docs.github.com/en/actions/learn-github-actions/variables
|
||||||
|
name: Synchronize your fork of Infix with upstream
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: 42 2 * * *
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync_fork:
|
||||||
|
if: ${{github.repository_owner != 'kernelkit' && vars.SYNC_FORK == 'true' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: TobKed/github-forks-sync-action@master
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GH_SYNC_REPO }}
|
||||||
|
upstream_repository: KernelKit/infix
|
||||||
|
upstream_branch: main
|
||||||
|
target_branch: main
|
||||||
|
force: false
|
||||||
|
tags: true
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
name: Test Infix
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
infix_repo:
|
|
||||||
description: 'Repo to checkout (for spin overrides)'
|
|
||||||
required: false
|
|
||||||
default: kernelkit/infix
|
|
||||||
type: string
|
|
||||||
infix_branch:
|
|
||||||
description: 'Branch/tag/commit to checkout (for spin overrides)'
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
target:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
name:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
infix_repo:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: kernelkit/infix
|
|
||||||
infix_branch:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
description: 'Branch/tag/commit to checkout (for spin overrides). Defaults to github.ref if not specified'
|
|
||||||
ninepm-conf:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
test-path:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: 'test'
|
|
||||||
pre_test_script:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
description: 'Optional script to run after checkout (for spin customization)'
|
|
||||||
release:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
description: 'Release version (e.g. v26.04.0), sets INFIX_RELEASE so make test finds versioned artifacts'
|
|
||||||
secrets:
|
|
||||||
CHECKOUT_TOKEN:
|
|
||||||
required: false
|
|
||||||
description: 'Token for cross-repository access'
|
|
||||||
|
|
||||||
env:
|
|
||||||
TARGET: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
|
|
||||||
INFIX_REPO: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_repo || inputs.infix_repo }}
|
|
||||||
INFIX_BRANCH: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_branch || inputs.infix_branch }}
|
|
||||||
NINEPM_CONF: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.ninepm-conf || inputs.ninepm-conf }}
|
|
||||||
TEST_PATH: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.test-path || inputs.test-path }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: Regression Test ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
|
|
||||||
runs-on: [self-hosted, regression]
|
|
||||||
steps:
|
|
||||||
- name: Checkout infix repo
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
repository: ${{ env.INFIX_REPO }}
|
|
||||||
ref: ${{ env.INFIX_BRANCH != '' && env.INFIX_BRANCH || github.ref }}
|
|
||||||
clean: true
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: recursive
|
|
||||||
token: ${{ secrets.CHECKOUT_TOKEN || github.token }}
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/podman-cleanup@v1
|
|
||||||
|
|
||||||
- name: Run pre-test script
|
|
||||||
if: ${{ inputs.pre_test_script != '' }}
|
|
||||||
run: |
|
|
||||||
cat > ./pre-test.sh << 'EOF'
|
|
||||||
${{ inputs.pre_test_script }}
|
|
||||||
EOF
|
|
||||||
chmod +x ./pre-test.sh
|
|
||||||
bash ./pre-test.sh
|
|
||||||
|
|
||||||
- name: Set Build Variables
|
|
||||||
id: vars
|
|
||||||
run: |
|
|
||||||
if [ -n "${{ needs.build.outputs.build_id }}" ]; then
|
|
||||||
echo "INFIX_BUILD_ID=${{ needs.build.outputs.build_id }}" \
|
|
||||||
>>$GITHUB_ENV
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Configure ${{ env.TARGET }}
|
|
||||||
run: |
|
|
||||||
make ${{ env.TARGET }}_defconfig
|
|
||||||
|
|
||||||
- uses: actions/download-artifact@v8
|
|
||||||
with:
|
|
||||||
pattern: "artifact-*"
|
|
||||||
merge-multiple: true
|
|
||||||
|
|
||||||
- name: Restore ${{ env.TARGET }} output/
|
|
||||||
run: |
|
|
||||||
target=${{ env.TARGET }}
|
|
||||||
name=${{ inputs.name }}
|
|
||||||
|
|
||||||
ls -l
|
|
||||||
mkdir -p output
|
|
||||||
tarfile=$(ls ${name}-${target}*.tar.gz | head -1)
|
|
||||||
mv "$tarfile" output/
|
|
||||||
cd output/
|
|
||||||
tar xf "$tarfile"
|
|
||||||
ln -s "${tarfile%.tar.gz}" images
|
|
||||||
|
|
||||||
- name: Regression Test ${{ env.TARGET }}
|
|
||||||
env:
|
|
||||||
INFIX_RELEASE: ${{ inputs.release }}
|
|
||||||
run: |
|
|
||||||
if [ -n "$NINEPM_CONF" ]; then
|
|
||||||
export NINEPM_PROJ_CONFIG="${GITHUB_WORKSPACE}/$NINEPM_CONF"
|
|
||||||
echo "DEBUG: NINEPM_PROJ_CONFIG is '$NINEPM_PROJ_CONFIG'"
|
|
||||||
fi
|
|
||||||
make test
|
|
||||||
|
|
||||||
- name: Publish Test Result for ${{ env.TARGET }}
|
|
||||||
# Ensure this runs even if Regression Test fails
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
cat $TEST_PATH/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY
|
|
||||||
|
|
||||||
- name: Generate Test Report for ${{ env.TARGET }}
|
|
||||||
# Ensure this runs even if Regression Test fails
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
make test-dir="$(pwd)/$TEST_PATH" test-report
|
|
||||||
|
|
||||||
- name: Upload Test Report as Artifact
|
|
||||||
uses: actions/upload-artifact@v7
|
|
||||||
with:
|
|
||||||
name: test-report
|
|
||||||
path: output/images/test-report.pdf
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened, synchronize, reopened, labeled]
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- ci-work
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ci-${{ github.event.pull_request.number || github.ref }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Gate all builds through this check to prevent wasted runs. Only run on
|
|
||||||
# 'labeled' events when the label is actually 'ci:main'. Concurrency control
|
|
||||||
# above handles canceling the 'opened' event when 'labeled' arrives quickly
|
|
||||||
# after (e.g., when creating a PR with ci:main already attached). See #1154.
|
|
||||||
check-trigger:
|
|
||||||
if: |
|
|
||||||
startsWith(github.repository, 'kernelkit/') &&
|
|
||||||
(github.event_name != 'pull_request' ||
|
|
||||||
github.event.action != 'labeled' ||
|
|
||||||
github.event.label.name == 'ci:main')
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
x86_64_target: ${{ steps.set-targets.outputs.x86_64_target }}
|
|
||||||
aarch64_target: ${{ steps.set-targets.outputs.aarch64_target }}
|
|
||||||
arm_target: ${{ steps.set-targets.outputs.arm_target }}
|
|
||||||
steps:
|
|
||||||
- run: |
|
|
||||||
echo "Triggering build, logging meta data ..."
|
|
||||||
echo "Event : ${{ github.event_name }}"
|
|
||||||
echo "Action : ${{ github.event.action }}"
|
|
||||||
echo "Ref : ${{ github.ref }}"
|
|
||||||
echo "PR : ${{ github.event.pull_request.number }}"
|
|
||||||
echo "Label : ${{ github.event.label.name }}"
|
|
||||||
- id: set-targets
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "pull_request" ]] && \
|
|
||||||
! echo '${{ toJSON(github.event.pull_request.labels.*.name) }}' \
|
|
||||||
| grep -q "ci:main"; then
|
|
||||||
echo "x86_64_target=x86_64_minimal" >> $GITHUB_OUTPUT
|
|
||||||
echo "aarch64_target=aarch64_minimal" >> $GITHUB_OUTPUT
|
|
||||||
echo "arm_target=arm_minimal" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "x86_64_target=x86_64" >> $GITHUB_OUTPUT
|
|
||||||
echo "aarch64_target=aarch64" >> $GITHUB_OUTPUT
|
|
||||||
echo "arm_target=arm" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
unit-test:
|
|
||||||
needs: check-trigger
|
|
||||||
uses: ./.github/workflows/unit-test.yml
|
|
||||||
with:
|
|
||||||
name: "infix"
|
|
||||||
target: ${{ needs.check-trigger.outputs.x86_64_target }}
|
|
||||||
|
|
||||||
build-x86_64:
|
|
||||||
needs: [check-trigger, unit-test]
|
|
||||||
uses: ./.github/workflows/build.yml
|
|
||||||
with:
|
|
||||||
name: "infix"
|
|
||||||
target: ${{ needs.check-trigger.outputs.x86_64_target }}
|
|
||||||
|
|
||||||
build-aarch64:
|
|
||||||
needs: [check-trigger, unit-test]
|
|
||||||
uses: ./.github/workflows/build.yml
|
|
||||||
with:
|
|
||||||
name: "infix"
|
|
||||||
target: ${{ needs.check-trigger.outputs.aarch64_target }}
|
|
||||||
|
|
||||||
build-arm:
|
|
||||||
needs: [check-trigger, unit-test]
|
|
||||||
uses: ./.github/workflows/build.yml
|
|
||||||
with:
|
|
||||||
name: "infix"
|
|
||||||
target: ${{ needs.check-trigger.outputs.arm_target }}
|
|
||||||
|
|
||||||
test-run-x86_64:
|
|
||||||
needs: [check-trigger, build-x86_64]
|
|
||||||
uses: ./.github/workflows/test.yml
|
|
||||||
with:
|
|
||||||
target: ${{ needs.check-trigger.outputs.x86_64_target }}
|
|
||||||
name: "infix"
|
|
||||||
|
|
||||||
test-publish-x86_64:
|
|
||||||
if: ${{ github.repository_owner == 'kernelkit' && github.ref_name == 'main' }}
|
|
||||||
needs: test-run-x86_64
|
|
||||||
uses: ./.github/workflows/publish.yml
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
name: unit-test
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
target:
|
|
||||||
description: "Build target (e.g. aarch64 or aarch64_minimal)"
|
|
||||||
default: "x86_64"
|
|
||||||
type: string
|
|
||||||
parallel:
|
|
||||||
description: 'Massive parallel build of each image'
|
|
||||||
default: true
|
|
||||||
type: boolean
|
|
||||||
name:
|
|
||||||
description: "Name (for spin overrides)"
|
|
||||||
default: "infix"
|
|
||||||
type: string
|
|
||||||
infix_repo:
|
|
||||||
description: 'Repo to checkout (for spin overrides)'
|
|
||||||
default: kernelkit/infix
|
|
||||||
type: string
|
|
||||||
infix_branch:
|
|
||||||
description: 'Branch/tag/commit to checkout (for spin overrides)'
|
|
||||||
default: ''
|
|
||||||
type: string
|
|
||||||
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
target:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
name:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
infix_repo:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: kernelkit/infix
|
|
||||||
infix_branch:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
description: 'Branch/tag/commit to checkout (for spin overrides). Defaults to github.ref if not specified'
|
|
||||||
parallel:
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: true
|
|
||||||
pre_build_script:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ''
|
|
||||||
description: 'Optional script to run after checkout (for spin customization)'
|
|
||||||
secrets:
|
|
||||||
CHECKOUT_TOKEN:
|
|
||||||
required: false
|
|
||||||
description: 'Token for cross-repository access'
|
|
||||||
|
|
||||||
env:
|
|
||||||
NAME: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }}
|
|
||||||
TARGET: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
|
|
||||||
INFIX_REPO: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_repo || inputs.infix_repo }}
|
|
||||||
INFIX_BRANCH: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_branch || inputs.infix_branch }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
unit-tests:
|
|
||||||
name: Build ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
|
|
||||||
runs-on: [ self-hosted, latest ]
|
|
||||||
env:
|
|
||||||
PARALLEL: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.parallel == 'true' || github.event_name != 'workflow_dispatch' && inputs.parallel == true }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
steps:
|
|
||||||
- name: Cleanup Build Folder
|
|
||||||
run: |
|
|
||||||
ls -la ./
|
|
||||||
rm -rf ./* || true
|
|
||||||
rm -rf ./.??* || true
|
|
||||||
ls -la ./
|
|
||||||
|
|
||||||
- name: Checkout infix repo
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
repository: ${{ env.INFIX_REPO }}
|
|
||||||
ref: ${{ env.INFIX_BRANCH != '' && env.INFIX_BRANCH || github.ref }}
|
|
||||||
clean: true
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: recursive
|
|
||||||
token: ${{ secrets.CHECKOUT_TOKEN || github.token }}
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/podman-cleanup@v1
|
|
||||||
|
|
||||||
- name: Run pre-build script
|
|
||||||
if: ${{ inputs.pre_build_script != '' }}
|
|
||||||
run: |
|
|
||||||
cat > ./pre-build.sh << 'EOF'
|
|
||||||
${{ inputs.pre_build_script }}
|
|
||||||
EOF
|
|
||||||
chmod +x ./pre-build.sh
|
|
||||||
bash ./pre-build.sh
|
|
||||||
|
|
||||||
- uses: kernelkit/actions/cache-restore@v1
|
|
||||||
with:
|
|
||||||
target: ${{ env.TARGET }}
|
|
||||||
|
|
||||||
- name: Configure ${{ env.TARGET }}
|
|
||||||
run: |
|
|
||||||
make ${{ env.TARGET }}_defconfig
|
|
||||||
|
|
||||||
- name: Cleanup stale containers and ports
|
|
||||||
run: |
|
|
||||||
podman rm -af || true
|
|
||||||
pkill -9 -f rootlessport || true
|
|
||||||
|
|
||||||
- name: Unit Test ${{ env.TARGET }}
|
|
||||||
run: |
|
|
||||||
make test-unit
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
# Weekly release build to catch flaky tests and verify clean builds.
|
|
||||||
# Runs without caches (ccache) to ensure reproducibility. See issue #1003.
|
|
||||||
name: Weekly Build
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '5 0 * * 6' # Saturday at 00:05 UTC, same as Coverity
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
if: github.repository == 'kernelkit/infix'
|
|
||||||
uses: ./.github/workflows/build-release.yml
|
|
||||||
with:
|
|
||||||
version: "latest"
|
|
||||||
use_cache: false
|
|
||||||
|
|
||||||
publish:
|
|
||||||
name: Publish Weekly Build
|
|
||||||
needs: build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/download-artifact@v8
|
|
||||||
with:
|
|
||||||
pattern: "artifact-*"
|
|
||||||
merge-multiple: true
|
|
||||||
|
|
||||||
- name: Create checksums
|
|
||||||
run: |
|
|
||||||
for file in *.tar.gz; do
|
|
||||||
sha256sum $file > $file.sha256
|
|
||||||
done
|
|
||||||
if ls *.qcow2 &>/dev/null; then
|
|
||||||
for file in *.qcow2; do
|
|
||||||
sha256sum "$file" > "$file.sha256"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
- uses: ncipollo/release-action@v1
|
|
||||||
with:
|
|
||||||
tag: latest
|
|
||||||
name: "Latest Weekly Build"
|
|
||||||
prerelease: true
|
|
||||||
makeLatest: false
|
|
||||||
allowUpdates: true
|
|
||||||
removeArtifacts: true
|
|
||||||
body: |
|
|
||||||
Automated weekly build from `${{ github.sha }}`.
|
|
||||||
|
|
||||||
This build runs without caches to catch potential flaky tests and build issues.
|
|
||||||
Not intended for production use - use official releases instead.
|
|
||||||
|
|
||||||
**Commit:** ${{ github.sha }}
|
|
||||||
**Built:** ${{ github.run_id }}
|
|
||||||
artifacts: "*.tar.gz*,*.qcow2*"
|
|
||||||
|
|
||||||
- name: Summary
|
|
||||||
run: |
|
|
||||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
|
||||||
# Weekly Build Published! :package:
|
|
||||||
|
|
||||||
Latest artifacts uploaded to:
|
|
||||||
<https://github.com/kernelkit/infix/releases/tag/latest>
|
|
||||||
|
|
||||||
Built from commit: \`${{ github.sha }}\`
|
|
||||||
EOF
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
*~
|
*~
|
||||||
.claude
|
|
||||||
.gdb_history
|
.gdb_history
|
||||||
.claude
|
|
||||||
AGENTS.md
|
|
||||||
/.backup
|
/.backup
|
||||||
/.ccache
|
/.ccache
|
||||||
/dl
|
/dl
|
||||||
@@ -11,4 +8,3 @@ AGENTS.md
|
|||||||
/test/.venv
|
/test/.venv
|
||||||
/test/.log
|
/test/.log
|
||||||
/local.mk
|
/local.mk
|
||||||
/test/spec/Readme.adoc
|
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/Config.in"
|
|
||||||
|
|
||||||
menu "Branding"
|
menu "Branding"
|
||||||
|
|
||||||
config INFIX_VENDOR
|
config INFIX_VENDOR
|
||||||
@@ -54,20 +52,9 @@ config INFIX_IMAGE_ID
|
|||||||
Mandatory. When INFIX_RELEASE is set, this string is appended to
|
Mandatory. When INFIX_RELEASE is set, this string is appended to
|
||||||
the IMAGE_ID with a '-' separator.
|
the IMAGE_ID with a '-' separator.
|
||||||
|
|
||||||
config INFIX_COMPATIBLE
|
|
||||||
string "Operating system compatible string"
|
|
||||||
default "${INFIX_IMAGE_ID}"
|
|
||||||
help
|
|
||||||
A lower-case string (no spaces or other characters outside of 0–9,
|
|
||||||
a–z, ".", "_" and "-"), used for image identification at upgrade.
|
|
||||||
E.g., the RAUC [system] compatible string.
|
|
||||||
|
|
||||||
Mandatory. Defaults to $INFIX_IMAGE_ID, which in turn is composed
|
|
||||||
of $INFIX_ID-$BR2_ARCH.
|
|
||||||
|
|
||||||
config INFIX_TAGLINE
|
config INFIX_TAGLINE
|
||||||
string "Operating system tagline"
|
string "Operating system tagline"
|
||||||
default "Infix OS — Immutable.Friendly.Secure"
|
default "Infix -- a Network Operating System"
|
||||||
help
|
help
|
||||||
Mandatory. Used for identifying the OS, e.g. as PRETTY_NAME in
|
Mandatory. Used for identifying the OS, e.g. as PRETTY_NAME in
|
||||||
/etc/os-release and description in the GNS3 appliance.
|
/etc/os-release and description in the GNS3 appliance.
|
||||||
@@ -125,6 +112,10 @@ config INFIX_ARCH
|
|||||||
default "riscv64" if BR2_riscv
|
default "riscv64" if BR2_riscv
|
||||||
default "x86_64" if BR2_x86_64
|
default "x86_64" if BR2_x86_64
|
||||||
|
|
||||||
|
menu "Packages"
|
||||||
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/package/Config.in"
|
source "$BR2_EXTERNAL_INFIX_PATH/package/Config.in"
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/package/Config.in.host"
|
|
||||||
|
endmenu
|
||||||
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/common/Config.in"
|
source "$BR2_EXTERNAL_INFIX_PATH/board/common/Config.in"
|
||||||
|
|||||||
@@ -1,24 +1,18 @@
|
|||||||
export BR2_EXTERNAL ?= $(CURDIR)
|
export BR2_EXTERNAL := $(CURDIR)
|
||||||
export PATH := $(CURDIR)/bin:$(PATH)
|
export PATH := $(CURDIR)/bin:$(PATH)
|
||||||
|
|
||||||
ARCH ?= $(shell uname -m)
|
ARCH ?= $(shell uname -m)
|
||||||
O ?= output
|
O ?= $(CURDIR)/output
|
||||||
|
|
||||||
# If a relative output path is specified, we have to translate it to
|
config := $(O)/.config
|
||||||
# an absolute one before handing over control to Buildroot, which will
|
bmake = $(MAKE) -C buildroot O=$(O) $1
|
||||||
# otherwise treat it as relative to ./buildroot.
|
|
||||||
override O := $(if $(filter /%,$O),$O,$(CURDIR)/$O)
|
|
||||||
|
|
||||||
config := $(O)/.config
|
|
||||||
bmake = $(MAKE) -C buildroot O=$(O) $1
|
|
||||||
SNIPPETS_DIR := $(CURDIR)/configs/snippets
|
|
||||||
MERGE_CONFIG := $(CURDIR)/buildroot/support/kconfig/merge_config.sh
|
|
||||||
|
|
||||||
|
|
||||||
all: $(config) buildroot/Makefile
|
all: $(config) buildroot/Makefile
|
||||||
@+$(call bmake,$@)
|
@+$(call bmake,$@)
|
||||||
|
|
||||||
check dep coverity:
|
check dep:
|
||||||
|
@echo "Starting local check, stage $@ ..."
|
||||||
@make -C src $@
|
@make -C src $@
|
||||||
|
|
||||||
$(config):
|
$(config):
|
||||||
@@ -28,34 +22,12 @@ $(config):
|
|||||||
@echo "'make <board>_defconfig' before building an image."
|
@echo "'make <board>_defconfig' before building an image."
|
||||||
@exit 1
|
@exit 1
|
||||||
|
|
||||||
apply-%: $(SNIPPETS_DIR)/%.conf | $(config)
|
|
||||||
@KCONFIG_CONFIG=$(config) $(MERGE_CONFIG) -m $(config) $<
|
|
||||||
@+$(call bmake,olddefconfig)
|
|
||||||
@echo "Applied snippet: $<"
|
|
||||||
|
|
||||||
list-snippets:
|
|
||||||
@echo "Available snippets (use 'make apply-<name>'):"
|
|
||||||
@ls $(SNIPPETS_DIR)/*.conf 2>/dev/null | sed 's|.*/||; s|\.conf$$||; s|^| |'
|
|
||||||
|
|
||||||
dev: | $(config)
|
|
||||||
@for s in $(SNIPPETS_DIR)/*.conf; do \
|
|
||||||
KCONFIG_CONFIG=$(config) $(MERGE_CONFIG) -m $(config) $$s; \
|
|
||||||
echo "Applied snippet: $$s"; \
|
|
||||||
done
|
|
||||||
@+$(call bmake,olddefconfig)
|
|
||||||
@+$(call bmake,all)
|
|
||||||
|
|
||||||
%: | buildroot/Makefile
|
%: | buildroot/Makefile
|
||||||
@+$(call bmake,$@)
|
@+$(call bmake,$@)
|
||||||
|
|
||||||
legal-info: | buildroot/Makefile
|
legal-info: | buildroot/Makefile
|
||||||
$(call bmake,legal-info LINUX_LICENSE_FILES=COPYING)
|
$(call bmake,legal-info LINUX_LICENSE_FILES=COPYING)
|
||||||
|
|
||||||
cyclonedx: | buildroot/Makefile
|
|
||||||
@echo "Generating package information..."
|
|
||||||
@$(MAKE) --no-print-directory -C buildroot O=$(O) show-info | ./buildroot/utils/generate-cyclonedx > $(O)/cyclonedx-sbom.json
|
|
||||||
@echo "CycloneDX SBOM generated: $(O)/cyclonedx-sbom.json"
|
|
||||||
|
|
||||||
# Workaround, see board/x86_64/board.mk
|
# Workaround, see board/x86_64/board.mk
|
||||||
test:
|
test:
|
||||||
@+$(call bmake,$@)
|
@+$(call bmake,$@)
|
||||||
@@ -63,4 +35,4 @@ test:
|
|||||||
buildroot/Makefile:
|
buildroot/Makefile:
|
||||||
@git submodule update --init
|
@git submodule update --init
|
||||||
|
|
||||||
.PHONY: all check coverity dep test cyclonedx list-snippets dev
|
.PHONY: all check test
|
||||||
|
|||||||
@@ -1,78 +1,66 @@
|
|||||||
[![License Badge][]][License] [![Release Badge][]][Release] [![GitHub Status][]][GitHub] [![Coverity Status][]][Coverity Scan] [![Discord][discord-badge]][discord-url]
|
[![License Badge][]][License] [![GitHub Status][]][GitHub] [![Coverity Status][]][Coverity Scan] [![Discord][discord-badge]][discord-url]
|
||||||
|
|
||||||
<img align="right" src="doc/logo.png" alt="Infix — Immutable.Friendly.Secure" width=480 padding=10>
|
<img align="right" src="doc/logo.png" alt="Infix - Linux <3 NETCONF" width=480 border=10>
|
||||||
|
|
||||||
Turn any ARM or x86 device into a powerful, manageable network appliance
|
Infix is a free, Linux based, immutable Network Operating System (NOS)
|
||||||
in minutes. From $35 Raspberry Pi boards to enterprise switches — deploy
|
built on [Buildroot][1], and [sysrepo][2]. A powerful mix that ease
|
||||||
routers, IoT gateways, edge devices, or custom network solutions that
|
porting to different platforms, simplify long-term maintenance, and
|
||||||
just work.
|
provide made-easy management using NETCONF[^1] or the built-in command
|
||||||
|
line interface (CLI) from a console or SSH login.
|
||||||
|
|
||||||
## Our Values
|
> Click the **▶ Example CLI Session** foldout below for an example, or
|
||||||
|
> head on over to the [Infix Documentation](doc/README.md) for more
|
||||||
|
> information on how to set up the system.
|
||||||
|
|
||||||
**🔒 Immutable**
|
Although primarily focused on switches and routers, the core values
|
||||||
Your system never breaks. Read-only filesystem with atomic upgrades
|
may be appealing for other use-cases as well:
|
||||||
means no configuration drift, no corrupted updates, and instant rollback
|
|
||||||
if something goes wrong. Deploy once, trust forever.
|
|
||||||
|
|
||||||
**🤝 Friendly**
|
- Runs from a squashfs image on a read-only partition
|
||||||
Actually easy to use. Auto-generated CLI from standard YANG models comes
|
- Single configuration file on a separate partition
|
||||||
with built-in help for every command — just hit <kbd>?</kbd> or
|
- Built around YANG with standard IETF models
|
||||||
<kbd>TAB</kbd> for context-aware assistance.
|
- Linux switchdev provides open switch APIs
|
||||||
|
- Atomic upgrades to secondary partition
|
||||||
|
- Highly security focused
|
||||||
|
|
||||||
Familiar NETCONF & RESTCONF APIs and [comprehensive documentation][4]
|
An immutable[^2] operating system enhances security and inherently makes
|
||||||
mean you're never stuck. Whether you're learning networking or managing
|
it maintenance-free. Configuration and data, e.g, containers, is stored
|
||||||
enterprise infrastructure.
|
on separate partitions to ensure complete separation from system files
|
||||||
|
and allow for seamless backup, restore, and provisioning.
|
||||||
|
|
||||||
**🛡️ Secure**
|
In itself Infix is perfectly suited for dedicated networking tasks and
|
||||||
Built with security as a foundation, not an afterthought. Minimal
|
native support for Docker containers provides a versatile platform that
|
||||||
attack surface, separation between system and data, and container
|
can easily be adapted to any customer need. Be it legacy applications,
|
||||||
isolation. Sleep better knowing your infrastructure is protected.
|
network protocols, process monitoring, or edge data analysis, it can run
|
||||||
|
close to end equipment. Either directly connected on dedicated Ethernet
|
||||||
|
ports or indirectly using virtual network cables to exist on the same
|
||||||
|
LAN as other connected equipment.
|
||||||
|
|
||||||
## Why Choose Infix
|
The simple design of Infix provides complete control over both system
|
||||||
|
and data, minimal cognitive burden, and makes it incredibly easy to get
|
||||||
|
started.
|
||||||
|
|
||||||
**Hardware Flexibility**: Start with a $35 Raspberry Pi, scale to
|
<details><summary><b>Example CLI Session</b></summary>
|
||||||
enterprise switching hardware. Same OS, same tools, same reliability.
|
|
||||||
|
|
||||||
**Standards-Based**: Built around YANG models and IETF standards. Learn
|
The CLI configure context is automatically generated from the loaded
|
||||||
once, use everywhere - no vendor lock-in.
|
YANG models and their corresponding [sysrepo][2] plugins. The following
|
||||||
|
is brief example of how to set the IP address of an interface:
|
||||||
|
|
||||||
**Container Ready**: Run your applications alongside networking
|
```
|
||||||
functions. GPIO access, dedicated Ethernet ports, custom protocols —
|
admin@infix-12-34-56:/> configure
|
||||||
your device, your rules.
|
admin@infix-12-34-56:/config/> edit interface eth0
|
||||||
|
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 <TAB>
|
||||||
## Use Cases
|
address autoconf bind-ni-name enabled
|
||||||
|
forwarding mtu neighbor
|
||||||
1. **Home Labs & Hobbyists**:
|
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
|
||||||
Transform a Raspberry Pi into a full-featured router with WiFi
|
admin@infix-12-34-56:/config/interface/eth0/> show
|
||||||
1. **IoT & Edge Computing**:
|
|
||||||
Bridge devices to the cloud with reliable, updatable gateways
|
|
||||||
1. **Small Business Networks**:
|
|
||||||
Enterprise-grade features without the complexity or cost
|
|
||||||
1. **Developers & Makers**:
|
|
||||||
Test networking concepts, prototype IoT solutions, or build custom
|
|
||||||
appliances
|
|
||||||
1. **Network Professionals**:
|
|
||||||
Consistent tooling from development to production deployment.
|
|
||||||
How about a digital twin using raw Qemu or [GNS3](https://gns3.com/infix)!
|
|
||||||
|
|
||||||
## Quick Example
|
|
||||||
|
|
||||||
Configure an interface in seconds - the CLI guides you with built-in help:
|
|
||||||
|
|
||||||
<pre><code>admin@infix-12-34-56:/> <b>configure</b>
|
|
||||||
admin@infix-12-34-56:/config/> <b>edit interface eth0</b>
|
|
||||||
admin@infix-12-34-56:/config/interface/eth0/> <b>set ipv4</b> <kbd>TAB</kbd>
|
|
||||||
address autoconf bind-ni-name dhcp
|
|
||||||
enabled forwarding mtu neighbor
|
|
||||||
admin@infix-12-34-56:/config/interface/eth0/> <b>set ipv4 address 192.168.2.200 prefix-length 24</b>
|
|
||||||
admin@infix-12-34-56:/config/interface/eth0/> <b>show</b>
|
|
||||||
type ethernet;
|
type ethernet;
|
||||||
ipv4 {
|
ipv4 {
|
||||||
address 192.168.2.200 {
|
address 192.168.2.200 {
|
||||||
prefix-length 24;
|
prefix-length 24;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
admin@infix-12-34-56:/config/interface/eth0/> <b>diff</b>
|
ipv6
|
||||||
|
admin@infix-12-34-56:/config/interface/eth0/> diff
|
||||||
interfaces {
|
interfaces {
|
||||||
interface eth0 {
|
interface eth0 {
|
||||||
+ ipv4 {
|
+ ipv4 {
|
||||||
@@ -82,100 +70,55 @@ interfaces {
|
|||||||
+ }
|
+ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
admin@infix-12-34-56:/config/interface/eth0/> <b>leave</b>
|
admin@infix-12-34-56:/config/interface/eth0/> leave
|
||||||
admin@infix-12-34-56:/> <b>show interfaces</b>
|
admin@infix-12-34-56:/> show interfaces
|
||||||
<u>INTERFACE PROTOCOL STATE DATA </u>
|
INTERFACE PROTOCOL STATE DATA
|
||||||
lo ethernet UP 00:00:00:00:00:00
|
|
||||||
ipv4 127.0.0.1/8 (static)
|
|
||||||
ipv6 ::1/128 (static)
|
|
||||||
eth0 ethernet UP 52:54:00:12:34:56
|
eth0 ethernet UP 52:54:00:12:34:56
|
||||||
ipv4 192.168.2.200/24 (static)
|
ipv4 192.168.2.200/24 (static)
|
||||||
ipv6 fe80::5054:ff:fe12:3456/64 (link-layer)
|
ipv6 fe80::5054:ff:fe12:3456/64 (link-layer)
|
||||||
admin@infix-12-34-56:/> <b>copy running startup</b>
|
lo ethernet UP 00:00:00:00:00:00
|
||||||
</code></pre>
|
ipv4 127.0.0.1/8 (static)
|
||||||
|
ipv6 ::1/128 (static)
|
||||||
|
admin@infix-12-34-56:/> copy running-config startup-config
|
||||||
|
```
|
||||||
|
|
||||||
Notice how <kbd>TAB</kbd> completion shows available options, `show`
|
[Click here][3] for more details.
|
||||||
displays current config, and `diff` shows exactly what changed before
|
</details>
|
||||||
you commit your changes with the `leave` command.
|
|
||||||
|
|
||||||
For more information, see [CLI documentation][3].
|
Infix can run on many different types of architectures and boards, much
|
||||||
|
thanks to Linux and Buildroot. Currently the focus is on 64-bit ARM
|
||||||
|
devices, optionally with switching fabric supported by Linux switchdev.
|
||||||
|
The [following boards](board/aarch64/README.md) are fully supported:
|
||||||
|
|
||||||
## Get Started
|
- Marvell CN9130 CRB
|
||||||
|
- Marvell EspressoBIN
|
||||||
|
- Microchip SparX-5i PCB135 (eMMC)
|
||||||
|
- NanoPi R2S
|
||||||
|
|
||||||
Get [pre-built images][5] for your hardware. Use the CLI, web
|
An x86_64 build is also available, primarily intended for development
|
||||||
interface, or standard NETCONF/RESTCONF tools, e.g., `curl`. Add
|
and testing, but can also be used for evaluation and demo purposes. For
|
||||||
containers for any custom functionality you need.
|
more information, see: [Infix in Virtual Environments](doc/virtual.md).
|
||||||
|
|
||||||
### Supported Platforms
|
> See the [GitHub Releases](https://github.com/kernelkit/infix/releases)
|
||||||
|
> page for our pre-built images. The *[Latest Build][]* has bleeding
|
||||||
|
> edge images, if possible we recommend using a versioned release.
|
||||||
|
>
|
||||||
|
> For *customer specific builds* of Infix, see your product repository.
|
||||||
|
|
||||||
- **Raspberry Pi 2B/3B/4B/CM4** - Perfect for home labs, learning, and prototyping
|
[^1]: NETCONF or RESTCONF, <https://datatracker.ietf.org/doc/html/rfc8040>
|
||||||
- **Banana Pi-R3** - Your next home router and gateway
|
|
||||||
- **NanoPi R2S** - Compact dual-port router in a tiny package
|
|
||||||
- **x86_64** - Run in VMs or on mini PCs for development and testing
|
|
||||||
- **Marvell CN9130 CRB, EspressoBIN** - High-performance ARM64 platforms
|
|
||||||
- **Microchip SparX-5i** - Enterprise switching capabilities
|
|
||||||
- **Microchip SAMA7G54-EK** - ARM Cortex-A7
|
|
||||||
- **NXP i.MX8MP EVK** - Highly capable ARM64 SoC
|
|
||||||
- **StarFive VisionFive2** - RISC-V architecture support
|
|
||||||
|
|
||||||
*Why start with Raspberry Pi?* It's affordable, widely available, has
|
[^2]: An immutable operating system is one with read-only file systems,
|
||||||
built-in WiFi + Ethernet, and runs the exact same Infix OS you'd deploy
|
atomic updates, rollbacks, declarative configuration, and workload
|
||||||
in production. Perfect for learning, prototyping, or even small-scale
|
isolation. All to improve reliability, scalability, and security.
|
||||||
deployments.
|
For more information, see <https://ceur-ws.org/Vol-3386/paper9.pdf>
|
||||||
|
and <https://www.zdnet.com/article/what-is-immutable-linux-heres-why-youd-run-an-immutable-linux-distro/>.
|
||||||
|
|
||||||
> 📖 **[Complete documentation][4]** • 💬 **[Join our Discord][discord-url]**
|
[1]: https://buildroot.org/
|
||||||
|
[2]: https://www.sysrepo.org/
|
||||||
## Technical Details
|
[3]: doc/cli/introduction.md
|
||||||
|
[Latest Build]: https://github.com/kernelkit/infix/releases/tag/latest
|
||||||
<a href="https://bitsign.se">
|
|
||||||
<picture>
|
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="https://bitsign.se/assets/badges/bitsign-badge-dark-mode.png">
|
|
||||||
<source media="(prefers-color-scheme: light)" srcset="https://bitsign.se/assets/badges/bitsign-badge-light-mode.png">
|
|
||||||
<img alt="bitSign - Code Signing" src="https://bitsign.se/assets/badges/bitsign-badge-light-mode.png" align="right" width=150 padding=10>
|
|
||||||
</picture>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
Built on proven open-source foundations: [Linux][0], [Buildroot][1], and
|
|
||||||
[sysrepo][2] — for reliability you can trust:
|
|
||||||
|
|
||||||
- **Immutable OS**: Read-only filesystem, atomic updates, instant rollback
|
|
||||||
- **YANG Configuration**: Industry-standard models with auto-generated tooling
|
|
||||||
- **Hardware Acceleration**: Linux switchdev support for wire-speed packet processing
|
|
||||||
- **Container Integration**: Docker support with flexible network and hardware access
|
|
||||||
- **Memory Efficient**: Runs comfortably on devices with as little as 256 MB RAM
|
|
||||||
- **Code Signing**: Releases are cryptographically signed for integrity verification
|
|
||||||
|
|
||||||
Perfect for everything from resource-constrained edge devices to
|
|
||||||
high-throughput network appliances.
|
|
||||||
|
|
||||||
With the entire system modeled in YANG, scalability is no longer an
|
|
||||||
issue, be it in development, testing, or end users deploying and
|
|
||||||
monitoring their devices. All knobs and dials are accessible from the
|
|
||||||
CLI (console/SSH), or remotely using the native NETCONF or RESTCONF
|
|
||||||
APIs.
|
|
||||||
|
|
||||||
> Check the *[Latest Build][]* for bleeding-edge features.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<a href="https://github.com/wires-se"><img src="https://raw.githubusercontent.com/wires-se/.github/main/profile/play.svg" width=300></a>
|
|
||||||
<br />Infix development is sponsored by <a href="https://wires.se">Wires</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
[0]: https://www.kernel.org
|
|
||||||
[1]: https://buildroot.org/ "Buildroot Homepage"
|
|
||||||
[2]: https://www.sysrepo.org/ "Sysrepo Homepage"
|
|
||||||
[3]: https://www.kernelkit.org/infix/latest/cli/introduction/
|
|
||||||
[4]: https://www.kernelkit.org/infix/
|
|
||||||
[5]: https://github.com/kernelkit/infix/releases/latest
|
|
||||||
[Latest Build]: https://github.com/kernelkit/infix/releases/tag/latest "Latest build"
|
|
||||||
[License]: https://en.wikipedia.org/wiki/GPL_license
|
[License]: https://en.wikipedia.org/wiki/GPL_license
|
||||||
[License Badge]: https://img.shields.io/badge/License-GPL%20v2-blue.svg
|
[License Badge]: https://img.shields.io/badge/License-GPL%20v2-blue.svg
|
||||||
[Release]: https://github.com/kernelkit/infix/releases/latest
|
|
||||||
[Release Badge]: https://img.shields.io/github/v/release/kernelkit/infix
|
|
||||||
[GitHub]: https://github.com/kernelkit/infix/actions/workflows/build.yml/
|
[GitHub]: https://github.com/kernelkit/infix/actions/workflows/build.yml/
|
||||||
[GitHub Status]: https://github.com/kernelkit/infix/actions/workflows/build.yml/badge.svg
|
[GitHub Status]: https://github.com/kernelkit/infix/actions/workflows/build.yml/badge.svg
|
||||||
[Coverity Scan]: https://scan.coverity.com/projects/29393
|
[Coverity Scan]: https://scan.coverity.com/projects/29393
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
menu "Board Support"
|
|
||||||
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/arm/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/riscv64/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/x86_64/Config.in"
|
|
||||||
|
|
||||||
endmenu
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
Board Support
|
|
||||||
=============
|
|
||||||
|
|
||||||
The board support for an architecture always starts with Qemu support,
|
|
||||||
this is what each `linux_defconfig` at the very least sets up. Then
|
|
||||||
each `$BR2_ARCH` has additional BSPs, e.g., Banana Pi BPI-R3.
|
|
||||||
|
|
||||||
The `board/` directory is matched with the `configs/*_defconfigs` and
|
|
||||||
the only execption is `board/common/`, which holds all shared files for
|
|
||||||
Infix builds.
|
|
||||||
|
|
||||||
Each `board/$BR2_ARCH/` can then have vendor/product sub-directories
|
|
||||||
for the BSPs which may contain "fixups" to the base kernel config and
|
|
||||||
any additional device tree files that should be included as well.
|
|
||||||
|
|
||||||
To rebuild a board-specific package, e.g. NanoPi R2S:
|
|
||||||
|
|
||||||
make friendlyarm-nanopi-r2s-rebuild all
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
if BR2_aarch64
|
|
||||||
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/alder-alder/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/acer-connect-vero-w6m/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/bananapi-bpi-r3/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/bananapi-bpi-r4/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/bananapi-bpi-r64/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/freescale-imx8mp-evk/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/friendlyarm-nanopi-r2s/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/marvell-cn9130-crb/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/marvell-espressobin/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/microchip-sparx5-pcb135/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/raspberrypi-rpi64/Config.in"
|
|
||||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/styx-dcp-sc-28p/Config.in"
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -3,13 +3,5 @@ aarch64
|
|||||||
|
|
||||||
Board Specific Documentation
|
Board Specific Documentation
|
||||||
----------------------------
|
----------------------------
|
||||||
|
- [Marvell CN9130-CRB](cn9130-crb/)
|
||||||
- [Acer Connect Vero W6m](acer-connect-vero-w6m/)
|
- [Microchip SparX-5i PCB135 (eMMC)](sparx5-pcb135/)
|
||||||
- [Banana Pi BPi-R3](bananapi-bpi-r3/)
|
|
||||||
- [Banana Pi BPi-R4](bananapi-bpi-r4/)
|
|
||||||
- [Banana Pi BPi-R64](bananapi-bpi-r64/)
|
|
||||||
- [Marvell CN9130-CRB](marvell-cn9130-crb/)
|
|
||||||
- [Marvell ESPRESSObin](marvell-espressobin/)
|
|
||||||
- [Microchip SparX-5i PCB135 (eMMC)](microchip-sparx5-pcb135/)
|
|
||||||
- [NanoPi R2S](friendlyarm-nanopi-r2s/)
|
|
||||||
- [Raspberry Pi 64-bit](raspberrypi-rpi64/)
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
config BR2_PACKAGE_ACER_CONNECT_VERO_W6M
|
|
||||||
bool "Acer Connect Vero W6m"
|
|
||||||
depends on BR2_aarch64
|
|
||||||
select BR2_PACKAGE_BANANAPI_BPI_R3
|
|
||||||
help
|
|
||||||
Build Acer Connect Vero W6m
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Copyright (c) 2026 The KernelKit Authors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
# Acer Connect Vero W6m
|
|
||||||
|
|
||||||
<img src="connect_vero_w6m_case.jpg" alt="Acer Connect Vero W6m" width=400 padding=10>
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
The Acer Connect Vero W6m is a compact WiFi 6/6E router platform based
|
|
||||||
on the MediaTek MT7986A SoC. In Infix it is supported as an eMMC-based
|
|
||||||
target that reuses the factory secure boot chain while replacing the
|
|
||||||
system partitions with an Infix installation.
|
|
||||||
|
|
||||||
The Acer Connect Vero W6m is based on the same MT7986a SoC as the
|
|
||||||
BPI-R3, with tri-band WiFi (2.4 GHz + 5 GHz + 6 GHz) using a PCIe
|
|
||||||
MT7916 module and the SoC's built-in MT7976 DBDC radio.
|
|
||||||
|
|
||||||
## Default WiFi Layout
|
|
||||||
|
|
||||||
The factory configuration on this branch enables all three radios in AP
|
|
||||||
mode and bridges them into the default LAN bridge `br0`:
|
|
||||||
|
|
||||||
- `radio0` / `wifi0-ap`: 2.4 GHz, SSID `Infix`
|
|
||||||
- `radio1` / `wifi1-ap`: 6 GHz, SSID `Infix6G`
|
|
||||||
- `radio2` / `wifi2-ap`: 5 GHz, SSID `Infix5G`
|
|
||||||
|
|
||||||
6 GHz operation is enabled in the MT7915e driver configuration, and all
|
|
||||||
three APs use the same default passphrase `infixinfix` from the factory
|
|
||||||
configuration.
|
|
||||||
|
|
||||||
Secure boot is enabled on this device, so the factory bootloader
|
|
||||||
(partitions 1-4: bl2, u-boot-env, factory, fip) must not be modified.
|
|
||||||
Infix is installed by replacing partitions 5+ while keeping the
|
|
||||||
factory bootloader intact. The stock U-Boot chainloads the Infix
|
|
||||||
U-Boot from the first partition after fip.
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
- Serial console access (115200 8N1) — required to interrupt U-Boot.
|
|
||||||
Disassembly is needed to reach the UART header. See the [OpenWrt
|
|
||||||
Vero W6m page][vero-openwrt] for details.
|
|
||||||
- TFTP server on the local network with `u-boot.bin` for the initial
|
|
||||||
RAM boot.
|
|
||||||
- SSH access from the running Infix system to a host that stores
|
|
||||||
`infix-vero-w-emmc.img`.
|
|
||||||
- Ethernet cable connected between the PC and the Vero Internet/WAN
|
|
||||||
port.
|
|
||||||
- DHCP server running on the PC, serving addresses on that link during
|
|
||||||
installation.
|
|
||||||
- **Save the MAC addresses** from the stock U-Boot environment before
|
|
||||||
installing. Interrupt autoboot and run `printenv` to note down:
|
|
||||||
`2gMAC`, `5gMAC`, `6gMAC`, `LANMAC`, and `WANMAC`.
|
|
||||||
|
|
||||||
## Required Files
|
|
||||||
|
|
||||||
Prepare these files on a host reachable from the Vero:
|
|
||||||
|
|
||||||
1. **Infix Vero image:**
|
|
||||||
- [infix-vero-w-emmc.img][1] (Complete system image)
|
|
||||||
2. **eMMC bootloader** (extracted from):
|
|
||||||
- [bpi-r3-emmc-boot-2025.01-latest.tar.gz][2]
|
|
||||||
- Extract `u-boot.bin` from the tarball to your TFTP server
|
|
||||||
|
|
||||||
## Installing Infix
|
|
||||||
|
|
||||||
Connect the PC directly to the Vero Internet/WAN port before starting
|
|
||||||
the installation. The PC should provide DHCP service on that link so
|
|
||||||
the stock U-Boot and the temporary Infix system can reach the TFTP/SSH
|
|
||||||
host.
|
|
||||||
|
|
||||||
1. **RAM-load Infix U-Boot** from the stock U-Boot serial console
|
|
||||||
(hit any key to stop autoboot):
|
|
||||||
|
|
||||||
```
|
|
||||||
setenv serverip <TFTP_SERVER_IP>
|
|
||||||
setenv ipaddr <VERO_IP>
|
|
||||||
setenv bootmenu_default 7
|
|
||||||
tftpboot 0x46000000 u-boot.bin
|
|
||||||
go 0x46000000
|
|
||||||
```
|
|
||||||
|
|
||||||
`serverip` must point to your TFTP server and `ipaddr` must be a free
|
|
||||||
address for the Vero on the same subnet. `bootmenu_default 7`
|
|
||||||
bypasses secure boot verification. The Infix U-Boot will
|
|
||||||
automatically netboot the Infix system.
|
|
||||||
|
|
||||||
2. **From running Infix**, stream the image directly to eMMC:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ssh <USER>@<HOST> "dd if=/path/to/infix-vero-w-emmc.img bs=512 skip=17408 status=none" | \
|
|
||||||
dd of=/dev/mmcblk0 bs=512 seek=17408 conv=fsync
|
|
||||||
sync
|
|
||||||
```
|
|
||||||
|
|
||||||
This writes only the Infix partitions (starting after fip at sector
|
|
||||||
17408), leaving the factory bootloader and calibration data intact.
|
|
||||||
Do not interrupt the transfer; if it fails, rerun the command from
|
|
||||||
the beginning.
|
|
||||||
|
|
||||||
3. **Update the GPT** to replace stock partitions 5+ with the Infix
|
|
||||||
layout:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo sgdisk --zap-all /dev/mmcblk0
|
|
||||||
sudo sgdisk -a 1 \
|
|
||||||
-n2:8192:9215 -c2:u-boot-env \
|
|
||||||
-n3:9216:13311 -c3:factory \
|
|
||||||
-n4:13312:17407 -c4:fip \
|
|
||||||
-n5:17408:+32M -c5:infix-uboot \
|
|
||||||
-n6:0:+8M -c6:aux \
|
|
||||||
-n7:0:+250M -c7:primary \
|
|
||||||
-n8:0:+250M -c8:secondary \
|
|
||||||
-n9:0:+128M -c9:cfg \
|
|
||||||
-n10:0:+128M -c10:var \
|
|
||||||
-p /dev/mmcblk0
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Configure U-Boot to chainload Infix permanently** — reboot and
|
|
||||||
interrupt stock U-Boot again:
|
|
||||||
|
|
||||||
```
|
|
||||||
setenv bootmenu_default 7
|
|
||||||
setenv bootcmd 'mmc read 0x46000000 0x4400 0x10000; go 0x46000000'
|
|
||||||
saveenv
|
|
||||||
reset
|
|
||||||
```
|
|
||||||
|
|
||||||
The `bootcmd` reads the Infix U-Boot (at sector 0x4400/17408)
|
|
||||||
into RAM and jumps to it. After `reset`, Infix boots from eMMC.
|
|
||||||
|
|
||||||
[vero-openwrt]: https://openwrt.org/toh/acer/predator_vero_w6m
|
|
||||||
[1]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-vero-w-emmc.img
|
|
||||||
[2]: https://github.com/kernelkit/infix/releases/download/latest-boot/bpi-r3-emmc-boot-2025.01-latest.tar.gz
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Locally calculated
|
|
||||||
sha256 d48246c717b505cc11df95171f2fd548b389e1a463f1af4c68d0b69fe0d1009b LICENSE
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
$(eval $(ix-board))
|
|
||||||
$(eval $(generic-package))
|
|
||||||
|
Before Width: | Height: | Size: 18 KiB |
@@ -1 +0,0 @@
|
|||||||
dtb-y += mediatek/mt7986a-acer-connect-vero-w6m.dtb
|
|
||||||
@@ -1,425 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
|
||||||
|
|
||||||
#include <dt-bindings/input/input.h>
|
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
|
||||||
#include <dt-bindings/leds/common.h>
|
|
||||||
#include <dt-bindings/pinctrl/mt65xx.h>
|
|
||||||
|
|
||||||
#include <arm64/mediatek/mt7986a.dtsi>
|
|
||||||
|
|
||||||
/ {
|
|
||||||
chosen {
|
|
||||||
stdout-path = "serial0:115200n8";
|
|
||||||
infix {
|
|
||||||
/* Default admin user password: 'admin' */
|
|
||||||
factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
memory@40000000 {
|
|
||||||
reg = <0 0x40000000 0 0x20000000>;
|
|
||||||
device_type = "memory";
|
|
||||||
};
|
|
||||||
|
|
||||||
reg_1p8v: regulator-1p8v {
|
|
||||||
compatible = "regulator-fixed";
|
|
||||||
regulator-name = "fixed-1.8V";
|
|
||||||
regulator-min-microvolt = <1800000>;
|
|
||||||
regulator-max-microvolt = <1800000>;
|
|
||||||
regulator-boot-on;
|
|
||||||
regulator-always-on;
|
|
||||||
};
|
|
||||||
|
|
||||||
reg_3p3v: regulator-3p3v {
|
|
||||||
compatible = "regulator-fixed";
|
|
||||||
regulator-name = "fixed-3.3V";
|
|
||||||
regulator-min-microvolt = <3300000>;
|
|
||||||
regulator-max-microvolt = <3300000>;
|
|
||||||
regulator-boot-on;
|
|
||||||
regulator-always-on;
|
|
||||||
};
|
|
||||||
|
|
||||||
reg_5v: regulator-5v {
|
|
||||||
compatible = "regulator-fixed";
|
|
||||||
regulator-name = "fixed-5V";
|
|
||||||
regulator-min-microvolt = <5000000>;
|
|
||||||
regulator-max-microvolt = <5000000>;
|
|
||||||
regulator-boot-on;
|
|
||||||
regulator-always-on;
|
|
||||||
};
|
|
||||||
|
|
||||||
gpio-keys {
|
|
||||||
compatible = "gpio-keys";
|
|
||||||
|
|
||||||
factory {
|
|
||||||
label = "factory";
|
|
||||||
linux,code = <KEY_RESTART>;
|
|
||||||
gpios = <&pio 9 GPIO_ACTIVE_LOW>;
|
|
||||||
};
|
|
||||||
|
|
||||||
wps {
|
|
||||||
label = "wps";
|
|
||||||
linux,code = <KEY_WPS_BUTTON>;
|
|
||||||
gpios = <&pio 10 GPIO_ACTIVE_LOW>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&watchdog {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&pio {
|
|
||||||
wifi_rst_hog: wifi-reset-hog {
|
|
||||||
gpio-hog;
|
|
||||||
gpios = <6 GPIO_ACTIVE_LOW>;
|
|
||||||
output-low;
|
|
||||||
line-name = "wifi-reset";
|
|
||||||
};
|
|
||||||
|
|
||||||
mmc0_pins_default: mmc0-pins {
|
|
||||||
mux {
|
|
||||||
function = "emmc";
|
|
||||||
groups = "emmc_51";
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-cmd-dat {
|
|
||||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
|
||||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
|
||||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
|
||||||
input-enable;
|
|
||||||
drive-strength = <MTK_DRIVE_4mA>;
|
|
||||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-clk {
|
|
||||||
pins = "EMMC_CK";
|
|
||||||
drive-strength = <MTK_DRIVE_6mA>;
|
|
||||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-ds {
|
|
||||||
pins = "EMMC_DSL";
|
|
||||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-rst {
|
|
||||||
pins = "EMMC_RSTB";
|
|
||||||
drive-strength = <MTK_DRIVE_4mA>;
|
|
||||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mmc0_pins_uhs: mmc0-uhs-pins {
|
|
||||||
mux {
|
|
||||||
function = "emmc";
|
|
||||||
groups = "emmc_51";
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-cmd-dat {
|
|
||||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
|
||||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
|
||||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
|
||||||
input-enable;
|
|
||||||
drive-strength = <MTK_DRIVE_4mA>;
|
|
||||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-clk {
|
|
||||||
pins = "EMMC_CK";
|
|
||||||
drive-strength = <MTK_DRIVE_6mA>;
|
|
||||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-ds {
|
|
||||||
pins = "EMMC_DSL";
|
|
||||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
|
||||||
};
|
|
||||||
|
|
||||||
conf-rst {
|
|
||||||
pins = "EMMC_RSTB";
|
|
||||||
drive-strength = <MTK_DRIVE_4mA>;
|
|
||||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie_pins: pcie-pins {
|
|
||||||
mux {
|
|
||||||
function = "pcie";
|
|
||||||
groups = "pcie_pereset";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
wf_2g_5g_pins: wf_2g_5g-pins {
|
|
||||||
mux {
|
|
||||||
function = "wifi";
|
|
||||||
groups = "wf_2g", "wf_5g";
|
|
||||||
};
|
|
||||||
conf {
|
|
||||||
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
|
||||||
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
|
||||||
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
|
||||||
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
|
||||||
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
|
||||||
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
|
||||||
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
|
||||||
drive-strength = <MTK_DRIVE_4mA>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
wf_dbdc_pins: wf-dbdc-pins {
|
|
||||||
mux {
|
|
||||||
function = "wifi";
|
|
||||||
groups = "wf_dbdc";
|
|
||||||
};
|
|
||||||
conf {
|
|
||||||
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
|
||||||
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
|
||||||
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
|
||||||
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
|
||||||
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
|
||||||
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
|
||||||
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
|
||||||
drive-strength = <MTK_DRIVE_4mA>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
i2c_pins: i2c-pins {
|
|
||||||
mux {
|
|
||||||
function = "i2c";
|
|
||||||
groups = "i2c";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&trng {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&crypto {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&uart0 {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&i2c0 {
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&i2c_pins>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&mmc0 {
|
|
||||||
status = "okay";
|
|
||||||
pinctrl-names = "default", "state_uhs";
|
|
||||||
pinctrl-0 = <&mmc0_pins_default>;
|
|
||||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
|
||||||
bus-width = <0x08>;
|
|
||||||
max-frequency = <200000000>;
|
|
||||||
cap-mmc-highspeed;
|
|
||||||
mmc-hs200-1_8v;
|
|
||||||
mmc-hs400-1_8v;
|
|
||||||
hs400-ds-delay = <0x14014>;
|
|
||||||
vmmc-supply = <®_3p3v>;
|
|
||||||
vqmmc-supply = <®_1p8v>;
|
|
||||||
non-removable;
|
|
||||||
no-sd;
|
|
||||||
no-sdio;
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
card@0 {
|
|
||||||
compatible = "mmc-card";
|
|
||||||
reg = <0>;
|
|
||||||
|
|
||||||
block {
|
|
||||||
compatible = "block-device";
|
|
||||||
|
|
||||||
partitions {
|
|
||||||
block-partition-factory {
|
|
||||||
partname = "factory";
|
|
||||||
|
|
||||||
nvmem: nvmem-layout {
|
|
||||||
compatible = "fixed-layout";
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <1>;
|
|
||||||
|
|
||||||
eeprom_factory_0: eeprom@0 {
|
|
||||||
reg = <0x0 0x1000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
precal_factory_1010: precal@1010 {
|
|
||||||
reg = <0x1010 0x62810>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&pcie {
|
|
||||||
pinctrl-names = "default";
|
|
||||||
pinctrl-0 = <&pcie_pins>;
|
|
||||||
num-lanes = <1>;
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
slot0: pcie@0,0 {
|
|
||||||
reg = <0x0000 0 0 0 0>;
|
|
||||||
#address-cells = <0x03>;
|
|
||||||
#size-cells = <0x02>;
|
|
||||||
|
|
||||||
pcie_wifi: wifi@0,0 {
|
|
||||||
compatible = "mediatek,mt76";
|
|
||||||
reg = <0x0000 0 0 0 0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&pcie_phy {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&pcie_port {
|
|
||||||
clocks = <&clk40m>, <&topckgen CLK_TOP_PCIE_PHY_SEL>;
|
|
||||||
clock-names = "ref", "da_ref";
|
|
||||||
};
|
|
||||||
|
|
||||||
ð {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
gmac0: mac@0 {
|
|
||||||
compatible = "mediatek,eth-mac";
|
|
||||||
reg = <0>;
|
|
||||||
phy-mode = "2500base-x";
|
|
||||||
|
|
||||||
fixed-link {
|
|
||||||
speed = <2500>;
|
|
||||||
full-duplex;
|
|
||||||
pause;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mdio: mdio-bus {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
switch: switch@1f {
|
|
||||||
compatible = "mediatek,mt7531";
|
|
||||||
reg = <31>;
|
|
||||||
reset-gpios = <&pio 5 GPIO_ACTIVE_HIGH>;
|
|
||||||
|
|
||||||
ports {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
swport0: port@0 {
|
|
||||||
reg = <0>;
|
|
||||||
phy-handle = <&swphy0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
port@1 {
|
|
||||||
reg = <1>;
|
|
||||||
label = "lan1";
|
|
||||||
phy-handle = <&swphy1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
port@2 {
|
|
||||||
reg = <2>;
|
|
||||||
label = "lan2";
|
|
||||||
phy-handle = <&swphy2>;
|
|
||||||
};
|
|
||||||
|
|
||||||
port@3 {
|
|
||||||
reg = <3>;
|
|
||||||
label = "lan3";
|
|
||||||
phy-handle = <&swphy3>;
|
|
||||||
};
|
|
||||||
|
|
||||||
port@6 {
|
|
||||||
reg = <6>;
|
|
||||||
label = "cpu";
|
|
||||||
ethernet = <&gmac0>;
|
|
||||||
phy-mode = "2500base-x";
|
|
||||||
|
|
||||||
fixed-link {
|
|
||||||
speed = <2500>;
|
|
||||||
full-duplex;
|
|
||||||
pause;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mdio {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
swphy0: phy@0 {
|
|
||||||
reg = <0>;
|
|
||||||
|
|
||||||
mediatek,led-config = <
|
|
||||||
0x21 0x8008 /* BASIC_CTRL */
|
|
||||||
0x22 0x0c00 /* ON_DURATION */
|
|
||||||
0x23 0x1400 /* BLINK_DURATION */
|
|
||||||
0x24 0xc001 /* LED0_ON_CTRL */
|
|
||||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
|
||||||
0x26 0xc006 /* LED1_ON_CTRL */
|
|
||||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
|
|
||||||
swphy1: phy@1 {
|
|
||||||
reg = <1>;
|
|
||||||
|
|
||||||
mediatek,led-config = <
|
|
||||||
0x21 0x8008 /* BASIC_CTRL */
|
|
||||||
0x22 0x0c00 /* ON_DURATION */
|
|
||||||
0x23 0x1400 /* BLINK_DURATION */
|
|
||||||
0x24 0xc001 /* LED0_ON_CTRL */
|
|
||||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
|
||||||
0x26 0xc006 /* LED1_ON_CTRL */
|
|
||||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
|
|
||||||
swphy2: phy@2 {
|
|
||||||
reg = <2>;
|
|
||||||
|
|
||||||
mediatek,led-config = <
|
|
||||||
0x21 0x8008 /* BASIC_CTRL */
|
|
||||||
0x22 0x0c00 /* ON_DURATION */
|
|
||||||
0x23 0x1400 /* BLINK_DURATION */
|
|
||||||
0x24 0xc001 /* LED0_ON_CTRL */
|
|
||||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
|
||||||
0x26 0xc006 /* LED1_ON_CTRL */
|
|
||||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
|
|
||||||
swphy3: phy@3 {
|
|
||||||
reg = <3>;
|
|
||||||
|
|
||||||
mediatek,led-config = <
|
|
||||||
0x21 0x8008 /* BASIC_CTRL */
|
|
||||||
0x22 0x0c00 /* ON_DURATION */
|
|
||||||
0x23 0x1400 /* BLINK_DURATION */
|
|
||||||
0x24 0xc001 /* LED0_ON_CTRL */
|
|
||||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
|
||||||
0x26 0xc006 /* LED1_ON_CTRL */
|
|
||||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&wifi {
|
|
||||||
nvmem-cells = <&eeprom_factory_0>, <&precal_factory_1010>;
|
|
||||||
nvmem-cell-names = "eeprom", "precal";
|
|
||||||
pinctrl-names = "default", "dbdc";
|
|
||||||
pinctrl-0 = <&wf_2g_5g_pins>;
|
|
||||||
pinctrl-1 = <&wf_dbdc_pins>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
@@ -1,263 +0,0 @@
|
|||||||
/* Factory EEPROM for MT7976 WMAC (DBDC) - Acer Connect Vero W */
|
|
||||||
/* Band 1 patched from 5GHz-only to 5GHz+6GHz selectable */
|
|
||||||
|
|
||||||
&wifi {
|
|
||||||
mediatek,eeprom-data = <
|
|
||||||
0x86790100 0x000c4326 0x60100000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x01000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000800 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x12525353 0x003c003f 0x3a100700 0x15030000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x0000be00 0x00000000
|
|
||||||
0x0000c100 0x00000000 0x00000000 0xc3000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000009 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000303 0x03030303 0x03030303
|
|
||||||
0x03030303 0x03030303 0x03040303 0x03040303
|
|
||||||
0x03040303 0x03040000 0x00161b18 0x1b1a1a1a
|
|
||||||
0x1a0d0008 0x0f0d0209 0x0e0d0209 0x0e0d0209
|
|
||||||
0x0e0c020a 0x0e0c020a 0x0e0c020a 0x0e0b020b
|
|
||||||
0x0e2b2b2b 0x2b222222 0x22222222 0x22222222
|
|
||||||
0x22222222 0x22222222 0x22000000 0x00000000
|
|
||||||
0x00000000 0x002a2a2a 0x2a282828 0x282a2a2a
|
|
||||||
0x2a282828 0x282a2a2a 0x2a282828 0x282a2a2a
|
|
||||||
0x2a282828 0x28000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x007f7f20 0x2530363c 0x41014847 0x4c52575c
|
|
||||||
0x7f7f7f7f 0x1b222a33 0x3a40014d 0x464c525a
|
|
||||||
0x5e7f7f7f 0x7f252834 0x3c424a01 0x4a4f555d
|
|
||||||
0x636e7f7f 0x7f7f202a 0x303b444a 0x014a5158
|
|
||||||
0x5f666e7f 0x7f7f7f7f 0x8080c5c5 0xd1d1dddd
|
|
||||||
0xe5e5f3f3 0x40408080 0xcfcfdbdb 0xe3e3efef
|
|
||||||
0xf7f74040 0x8080bfbf 0xcbcbd9d9 0xe5e5eded
|
|
||||||
0x40408080 0xb9b9c5c5 0xd3d3dfdf 0xe7e74040
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0xc0a0c0e0 0xfcfcafe0 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x02200220 0x02200220 0x02300230 0x02300230
|
|
||||||
0x02300230 0x02300230 0x02300230 0x02300230
|
|
||||||
0x02240224 0x02240224 0x02240224 0x02240224
|
|
||||||
0x02240224 0x02240224 0x02240224 0x02240224
|
|
||||||
0x000000c4 0xc4c4c4c4 0x0000c4c4 0xc4c4c1c1
|
|
||||||
0x008282c3 0xc3000000 0x00838300 0xc4c4c4c1
|
|
||||||
0xc1008282 0x8383c3c3 0xc2c10000 0x83838484
|
|
||||||
0xc4c4c4c1 0xc1008282 0x8383c4c4 0xc4c1c100
|
|
||||||
0x82828383 0xc4c4c4c1 0xc1008282 0x8383c4c4
|
|
||||||
0xc3c100c4 0x81c4c3c2 0x00818181 0xc4c4c3c2
|
|
||||||
0x00818282 0x00c4c4c2 0xc2008182 0x8200c4c4
|
|
||||||
0xc3c20081 0x82828484 0xc4c4c3c2 0x00818282
|
|
||||||
0x8484c4c4 0xc2c20081 0x82828484 0xc4c4c2c1
|
|
||||||
0x81828383 0x8585c4c4 0xc3c20081 0x82828484
|
|
||||||
0xc4c4c3c2 0x00818282 0x8484c4c4 0xc3c20081
|
|
||||||
0x82828484 0xc6c5c3c1 0x00c5c5c3 0xc2008182
|
|
||||||
0x828484c5 0xc5c3c200 0x81828284 0x84c4c4c3
|
|
||||||
0xc2008182 0x828484c4 0xc4c2c181 0x82838385
|
|
||||||
0x85c5c5c3 0xc2008182 0x828484c5 0xc5c3c200
|
|
||||||
0x81828284 0x84c5c5c3 0xc2008182 0x82848400
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x378a6e05 0x0ae64a6c 0x00000000 0x50050000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00b40000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x86828786 0x87c8cb8a 0x8380c982 0x00c8ca86
|
|
||||||
0x8383c583 0x83c1c58c 0x8883c78b 0x8780c28c
|
|
||||||
0x8485c682 0xc3c4c4c4 0xc5c6c7c8 0xcfcecdcc
|
|
||||||
0xcccdcec1 0xc1c1c1c2 0xc4c6c7ce 0xcecfcfcf
|
|
||||||
0xcecec6c7 0xc8c9caca 0xcbcbd2d2 0xd2d2d0ce
|
|
||||||
0xcc8100c1 0xc3c5c6c7 0xc8d0d0d1 0xd1d1d0cf
|
|
||||||
0xdeee6be7 0x5fede2eb 0xce08ce09 0xce0ace0a
|
|
||||||
0x4e0b4f0b 0x4f0c4f0c 0x4f0d4f0d 0x540a540b
|
|
||||||
0x540c540b 0x540c510a 0x510b510c 0xd10c510d
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0xde0fde10 0xde115e12
|
|
||||||
0xde12de12 0xde135e14 0x5e0cde0d 0xde0e5e10
|
|
||||||
0x5e105e10 0x5e11de11 0xde0ede0f 0xde10de11
|
|
||||||
0x5e12de12 0x5e135e13 0xde0f5e11 0x5e12de13
|
|
||||||
0x5e13de13 0xde14de14 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00848484 0x84848484 0x84000000 0x00e4d5d4
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
@@ -1,263 +0,0 @@
|
|||||||
/* Factory EEPROM for PCIe MT7916 radio - Acer Connect Vero W */
|
|
||||||
/* Offset 0xa0000 in the "factory" GPT partition on eMMC */
|
|
||||||
|
|
||||||
&pcie_wifi {
|
|
||||||
mediatek,eeprom-data = <
|
|
||||||
0x16790000 0x000c4326 0x60000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x50750000 0x07670700 0x00000400 0x50710000
|
|
||||||
0x00000000 0x00000400 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0xb101e748 0xf57f5e99
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000800 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x12924848 0x003e003f 0x3a100000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x81a3a380
|
|
||||||
0xa4910091 0x00910091 0x00910000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x000a0000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x0000c500 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000013 0x12120000 0x00000000
|
|
||||||
0x00000000 0x00000303 0x03030303 0x03030303
|
|
||||||
0x03030303 0x03030505 0x05050505 0x05050505
|
|
||||||
0x05050505 0x05050000 0x001b1919 0x19181818
|
|
||||||
0x180f0006 0x1c0e080a 0x170e080a 0x170d0809
|
|
||||||
0x170d020a 0x0e0d020a 0x0e0d020a 0x0e0b020a
|
|
||||||
0x0e22222c 0x2c2b2b2b 0x2b2b2b2b 0x2b2b2b2b
|
|
||||||
0x2b2b2b2b 0x2b2b2b2b 0x2b000000 0x00000000
|
|
||||||
0x00000000 0x001e201e 0x201e2020 0x201e201e
|
|
||||||
0x20201e20 0x20272929 0x29272727 0x27272929
|
|
||||||
0x29272727 0x27000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00cdcfcf 0xcfcfcf00 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x007f7f20 0x2530363c 0x41014347 0x4c52575c
|
|
||||||
0x7f7f0000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x0000007f 0x7f252834 0x3c424a01 0x4d4f555f
|
|
||||||
0x636e7f7f 0x7f7f202a 0x303b444a 0x014d5158
|
|
||||||
0x5f666e7f 0x7f7f7f7f 0x8080c5c5 0xcbcbd9d9
|
|
||||||
0xe1e1ebeb 0x40408080 0xcfcfdbdb 0xe3e3efef
|
|
||||||
0xf7f74040 0x8080c1c1 0xcdcdd5d5 0xe1e1eded
|
|
||||||
0x40408080 0xbbbbc7c7 0xcfcfdbdb 0xe7e74040
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0xb0900000 0x0000c0f0 0xf8000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x02000200 0x02000200 0x02000200 0x02000200
|
|
||||||
0x02000200 0x02000200 0x02000200 0x02000200
|
|
||||||
0x02000200 0x02000200 0x02000200 0x02000200
|
|
||||||
0x02000200 0x02000200 0x02000200 0x02000200
|
|
||||||
0x000000c6 0xc6c6c6c4 0x0000c5c5 0xc5c4c1c1
|
|
||||||
0x818383c3 0xc3c2c100 0x81848400 0xc5c5c4c1
|
|
||||||
0xc1818383 0x8585c3c3 0xc2c10081 0x84848686
|
|
||||||
0xc5c5c4c1 0xc1818383 0x8585c5c5 0xc4c1c181
|
|
||||||
0x83838585 0xc5c5c4c1 0xc1818383 0x8585c6c6
|
|
||||||
0xc4c300c6 0x00c6c4c3 0xc1008181 0xc6c6c4c3
|
|
||||||
0xc1008181 0x00c5c5c3 0xc2008182 0x8200c6c6
|
|
||||||
0xc4c3c100 0x81818686 0xc6c6c4c3 0xc1008181
|
|
||||||
0x8686c5c5 0xc3c20081 0x82828787 0xc5c5c3c2
|
|
||||||
0x00818282 0x8787c6c6 0xc4c3c100 0x81818686
|
|
||||||
0xc6c6c4c3 0xc1008181 0x8686c6c6 0xc4c3c100
|
|
||||||
0x81818686 0xc6c6c4c3 0x00c6c6c4 0xc3c10081
|
|
||||||
0x818686c6 0xc6c4c3c1 0x00818186 0x86c5c5c3
|
|
||||||
0xc2008182 0x828787c5 0xc5c3c281 0x82838388
|
|
||||||
0x88c6c6c4 0xc3c10081 0x818686c6 0xc6c4c3c1
|
|
||||||
0x00818186 0x86c6c6c4 0xc3c10081 0x81868600
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00b70000 0x00b70000 0x00000000 0x00000000
|
|
||||||
0x01000000 0x0000c400 0xb8008700 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0xc7c60000 0x89898987 0x87858381 0x898a8b8b
|
|
||||||
0x8a898785 0x88898988 0x87868584 0x00000000
|
|
||||||
0x00000000 0xcccfcecd 0xcdcacecd 0xcbcfcece
|
|
||||||
0xcfcfcfc7 0xcececdce 0xc7cfcec7 0xcfcfcfcf
|
|
||||||
0xcfcf0000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x7fe2f0e4 0x00000000 0xa4de24df 0xa4e0a4e1
|
|
||||||
0xa4e1a4de 0x24dfa4e0 0xa4e1a4e1 0xa4dea4df
|
|
||||||
0xa4e0a4e1 0xa4e1a4de 0xa4df24e0 0xa4e1a4e1
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0xde0fde0f 0xde0fde10
|
|
||||||
0xde11de11 0x5e12de12 0xde10de10 0xde10de11
|
|
||||||
0xde12de12 0xde13de13 0x5a085a09 0x5a0a5a0a
|
|
||||||
0x5a0a5a0a 0x5a0a5a0a 0x5a055a06 0x5a075a08
|
|
||||||
0x5a085a09 0x5a095a09 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00ded453
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
|
||||||
|
|
||||||
/dts-v1/;
|
|
||||||
#include "mt7986a-acer-connect-vero-w6m-common.dtsi"
|
|
||||||
#include "mt7986a-acer-connect-vero-w6m-pcie-eeprom.dtsi"
|
|
||||||
|
|
||||||
/ {
|
|
||||||
model = "Acer Connect Vero W6m";
|
|
||||||
compatible = "acer,connect-vero-w", "mediatek,mt7986a";
|
|
||||||
|
|
||||||
aliases {
|
|
||||||
serial0 = &uart0;
|
|
||||||
led-boot = &led_status;
|
|
||||||
led-failsafe = &led_status;
|
|
||||||
led-running = &led_status;
|
|
||||||
led-upgrade = &led_status;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&i2c0 {
|
|
||||||
led-controller@30 {
|
|
||||||
compatible = "kinetic,ktd2026";
|
|
||||||
reg = <0x30>;
|
|
||||||
vin-supply = <®_5v>;
|
|
||||||
vio-supply = <®_3p3v>;
|
|
||||||
|
|
||||||
led_status: multi-led {
|
|
||||||
color = <LED_COLOR_ID_RGB>;
|
|
||||||
function = LED_FUNCTION_STATUS;
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
led@0 {
|
|
||||||
reg = <0>;
|
|
||||||
color = <LED_COLOR_ID_RED>;
|
|
||||||
};
|
|
||||||
|
|
||||||
led@1 {
|
|
||||||
reg = <1>;
|
|
||||||
color = <LED_COLOR_ID_GREEN>;
|
|
||||||
};
|
|
||||||
|
|
||||||
led@2 {
|
|
||||||
reg = <2>;
|
|
||||||
color = <LED_COLOR_ID_BLUE>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&nvmem {
|
|
||||||
eeprom_factory_a0000: eeprom@a0000 {
|
|
||||||
reg = <0xa0000 0x1000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
precal_factory_a1010: precal@a1010 {
|
|
||||||
reg = <0xa1010 0x62810>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
&swport0 {
|
|
||||||
label = "internet";
|
|
||||||
};
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
image cfg.ext4 {
|
|
||||||
empty = true
|
|
||||||
temporary = true
|
|
||||||
size = 128M
|
|
||||||
ext4 {
|
|
||||||
label = "cfg"
|
|
||||||
use-mke2fs = true
|
|
||||||
features = "uninit_bg"
|
|
||||||
extraargs = "-m 0 -i 4096"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
image var.ext4 {
|
|
||||||
empty = true
|
|
||||||
temporary = true
|
|
||||||
size = 128M
|
|
||||||
ext4 {
|
|
||||||
label = "var"
|
|
||||||
use-mke2fs = true
|
|
||||||
features = "uninit_bg"
|
|
||||||
extraargs = "-m 0 -i 4096"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
image #INFIX_ID##VERSION#-vero-w-#TARGET#.img {
|
|
||||||
hdimage {
|
|
||||||
partition-table-type = "gpt"
|
|
||||||
gpt-no-backup = true
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Factory partitions (1-4) -- secure boot, do not overwrite.
|
|
||||||
* Offsets and sizes match the stock Acer GPT exactly.
|
|
||||||
* No image data is written, preserving factory content.
|
|
||||||
*/
|
|
||||||
partition u-boot-env {
|
|
||||||
offset = 8192s
|
|
||||||
size = 1024s
|
|
||||||
}
|
|
||||||
|
|
||||||
partition factory {
|
|
||||||
offset = 9216s
|
|
||||||
size = 4096s
|
|
||||||
}
|
|
||||||
|
|
||||||
partition fip {
|
|
||||||
offset = 13312s
|
|
||||||
size = 4096s
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Infix U-Boot, chainloaded by stock bootloader */
|
|
||||||
partition infix-uboot {
|
|
||||||
offset = 17408s
|
|
||||||
image = "u-boot.bin"
|
|
||||||
size = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
partition aux {
|
|
||||||
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
|
|
||||||
image = "aux.ext4"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition primary {
|
|
||||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
|
||||||
bootable = true
|
|
||||||
size = 250M
|
|
||||||
image = "rootfs.squashfs"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition secondary {
|
|
||||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
|
||||||
bootable = true
|
|
||||||
size = 250M
|
|
||||||
image = "rootfs.squashfs"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition cfg {
|
|
||||||
partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105
|
|
||||||
image = "cfg.ext4"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition var {
|
|
||||||
partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F
|
|
||||||
image = "var.ext4"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,488 +0,0 @@
|
|||||||
{
|
|
||||||
"ieee802-dot1ab-lldp:lldp": {
|
|
||||||
"infix-lldp:enabled": true
|
|
||||||
},
|
|
||||||
"ietf-hardware:hardware": {
|
|
||||||
"component": [
|
|
||||||
{
|
|
||||||
"name": "USB",
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"name": "USB2",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "radio0",
|
|
||||||
"class": "infix-hardware:wifi",
|
|
||||||
"infix-hardware:wifi-radio": {
|
|
||||||
"country-code": "DE",
|
|
||||||
"band": "2.4GHz",
|
|
||||||
"channel": "auto"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "radio1",
|
|
||||||
"class": "infix-hardware:wifi",
|
|
||||||
"infix-hardware:wifi-radio": {
|
|
||||||
"country-code": "DE",
|
|
||||||
"band": "6GHz",
|
|
||||||
"channel": "auto"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "radio2",
|
|
||||||
"class": "infix-hardware:wifi",
|
|
||||||
"infix-hardware:wifi-radio": {
|
|
||||||
"country-code": "DE",
|
|
||||||
"band": "5GHz",
|
|
||||||
"channel": "auto"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-interfaces:interfaces": {
|
|
||||||
"interface": [
|
|
||||||
{
|
|
||||||
"name": "br0",
|
|
||||||
"type": "infix-if-type:bridge",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "192.168.0.1",
|
|
||||||
"prefix-length": 24
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan1",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan2",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan3",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lo",
|
|
||||||
"type": "infix-if-type:loopback",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "127.0.0.1",
|
|
||||||
"prefix-length": 8
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "::1",
|
|
||||||
"prefix-length": 128
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "internet",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"infix-dhcp-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "broadcast"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "hostname",
|
|
||||||
"value": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "netmask"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "vendor-class",
|
|
||||||
"value": "Acer Connect Vero W"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"infix-dhcpv6-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "client-fqdn"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain-search"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wifi0-ap",
|
|
||||||
"type": "infix-if-type:wifi",
|
|
||||||
"infix-interfaces:wifi": {
|
|
||||||
"radio": "radio0",
|
|
||||||
"access-point": {
|
|
||||||
"ssid": "Infix",
|
|
||||||
"security": {
|
|
||||||
"secret": "wifi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wifi1-ap",
|
|
||||||
"type": "infix-if-type:wifi",
|
|
||||||
"infix-interfaces:wifi": {
|
|
||||||
"radio": "radio1",
|
|
||||||
"access-point": {
|
|
||||||
"ssid": "Infix6G",
|
|
||||||
"security": {
|
|
||||||
"secret": "wifi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wifi2-ap",
|
|
||||||
"type": "infix-if-type:wifi",
|
|
||||||
"infix-interfaces:wifi": {
|
|
||||||
"radio": "radio2",
|
|
||||||
"access-point": {
|
|
||||||
"ssid": "Infix5G",
|
|
||||||
"security": {
|
|
||||||
"secret": "wifi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-keystore:keystore": {
|
|
||||||
"asymmetric-keys": {
|
|
||||||
"asymmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "genkey",
|
|
||||||
"public-key-format": "infix-crypto-types:ssh-public-key-format",
|
|
||||||
"public-key": "",
|
|
||||||
"private-key-format": "infix-crypto-types:rsa-private-key-format",
|
|
||||||
"cleartext-private-key": "",
|
|
||||||
"certificates": {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"symmetric-keys": {
|
|
||||||
"symmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "wifi",
|
|
||||||
"cleartext-symmetric-key": "aW5maXhpbmZpeA==",
|
|
||||||
"key-format": "infix-crypto-types:passphrase-key-format"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-netconf-acm:nacm": {
|
|
||||||
"enable-nacm": true,
|
|
||||||
"read-default": "permit",
|
|
||||||
"write-default": "permit",
|
|
||||||
"exec-default": "permit",
|
|
||||||
"groups": {
|
|
||||||
"group": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"user-name": [
|
|
||||||
"admin"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator",
|
|
||||||
"user-name": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest",
|
|
||||||
"user-name": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"rule-list": [
|
|
||||||
{
|
|
||||||
"name": "admin-acl",
|
|
||||||
"group": [
|
|
||||||
"admin"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-all",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Allow 'admin' group complete access to all operations and data."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator-acl",
|
|
||||||
"group": [
|
|
||||||
"operator"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-system-rpcs",
|
|
||||||
"module-name": "ietf-system",
|
|
||||||
"rpc-name": "*",
|
|
||||||
"access-operations": "exec",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Operators can reboot, shutdown, and set system time."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest-acl",
|
|
||||||
"group": [
|
|
||||||
"guest"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-all-write+exec",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "create update delete exec",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "Guests cannot change anything or exec rpcs."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "default-deny-all",
|
|
||||||
"group": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-password-access",
|
|
||||||
"path": "/ietf-system:system/authentication/user/password",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access password hashes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-keystore-access",
|
|
||||||
"module-name": "ietf-keystore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access cryptographic keys."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-truststore-access",
|
|
||||||
"module-name": "ietf-truststore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access trust store."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-netconf-server:netconf-server": {
|
|
||||||
"listen": {
|
|
||||||
"endpoints": {
|
|
||||||
"endpoint": [
|
|
||||||
{
|
|
||||||
"name": "default-ssh",
|
|
||||||
"ssh": {
|
|
||||||
"tcp-server-parameters": {
|
|
||||||
"local-bind": [
|
|
||||||
{
|
|
||||||
"local-address": "::"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ssh-server-parameters": {
|
|
||||||
"server-identity": {
|
|
||||||
"host-key": [
|
|
||||||
{
|
|
||||||
"name": "default-key",
|
|
||||||
"public-key": {
|
|
||||||
"central-keystore-reference": "genkey"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-system:system": {
|
|
||||||
"hostname": "acer-connect-%m",
|
|
||||||
"ntp": {
|
|
||||||
"server": [
|
|
||||||
{
|
|
||||||
"name": "default",
|
|
||||||
"udp": {
|
|
||||||
"address": "pool.ntp.org"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"authentication": {
|
|
||||||
"user": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"password": "$factory$",
|
|
||||||
"infix-system:shell": "bash"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
|
|
||||||
},
|
|
||||||
"infix-dhcp-server:dhcp-server": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router",
|
|
||||||
"address": "auto"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"subnet": [
|
|
||||||
{
|
|
||||||
"subnet": "192.168.0.0/24",
|
|
||||||
"pool": {
|
|
||||||
"start-address": "192.168.0.100",
|
|
||||||
"end-address": "192.168.0.250"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-firewall:firewall": {
|
|
||||||
"default": "wan",
|
|
||||||
"zone": [
|
|
||||||
{
|
|
||||||
"name": "lan",
|
|
||||||
"action": "accept",
|
|
||||||
"interface": [
|
|
||||||
"br0"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"action": "drop",
|
|
||||||
"interface": [
|
|
||||||
"internet"
|
|
||||||
],
|
|
||||||
"service": [
|
|
||||||
"dhcpv6-client"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"policy": [
|
|
||||||
{
|
|
||||||
"name": "lan-to-wan",
|
|
||||||
"action": "accept",
|
|
||||||
"ingress": [
|
|
||||||
"lan"
|
|
||||||
],
|
|
||||||
"egress": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"masquerade": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-meta:meta": {
|
|
||||||
"version": "1.7"
|
|
||||||
},
|
|
||||||
"infix-services:mdns": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"infix-services:ssh": {
|
|
||||||
"enabled": true,
|
|
||||||
"hostkey": [
|
|
||||||
"genkey"
|
|
||||||
],
|
|
||||||
"listen": [
|
|
||||||
{
|
|
||||||
"name": "ipv4",
|
|
||||||
"address": "0.0.0.0",
|
|
||||||
"port": 22
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ipv6",
|
|
||||||
"address": "::",
|
|
||||||
"port": 22
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-services:web": {
|
|
||||||
"enabled": true,
|
|
||||||
"console": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"netbrowse": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"restconf": {
|
|
||||||
"enabled": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
config BR2_PACKAGE_ALDER_ALDER
|
|
||||||
bool "Alder"
|
|
||||||
depends on BR2_aarch64
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_INSIDE_SECURE_MINIFW
|
|
||||||
help
|
|
||||||
Alder
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Copyright (c) 2024 The KernelKit Authors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Locally calculated
|
|
||||||
sha256 d2f96418893ac66156d0e691cda189b0d85ae1d814065d1d9aa1845383100f46 LICENSE
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
$(eval $(ix-board))
|
|
||||||
$(eval $(generic-package))
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
dtb-y += alder/alder.dtb
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
config BR2_PACKAGE_BANANAPI_BPI_R3
|
|
||||||
bool "Banana Pi R3"
|
|
||||||
depends on BR2_aarch64
|
|
||||||
select BR2_PACKAGE_FEATURE_WIFI
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7986
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_AIROHA_EN8811H
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7916
|
|
||||||
select SDCARD_AUX
|
|
||||||
help
|
|
||||||
Build Banana PI R3 support
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Copyright (c) 2025 The KernelKit Authors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
@@ -1,275 +0,0 @@
|
|||||||
# Banana Pi BPI-R3 / BPI-R3 Mini
|
|
||||||
|
|
||||||
<img src="bananapi-bpi-r3.webp" alt="The board" width=800 padding=10>
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
The Banana Pi BPI-R3 and BPI-R3 Mini are high-performance networking
|
|
||||||
boards with full Infix support for all enabled features including
|
|
||||||
Ethernet, WiFi, and SFP interfaces.
|
|
||||||
|
|
||||||
Both boards share the same SoC and most peripherals. The key
|
|
||||||
differences are:
|
|
||||||
|
|
||||||
| Feature | BPI-R3 | BPI-R3 Mini |
|
|
||||||
|-----------------|--------------------|-------------------------|
|
|
||||||
| Ethernet switch | Yes (4x LAN + WAN) | No (WAN/LAN ports only) |
|
|
||||||
| SD card slot | Yes | No |
|
|
||||||
|
|
||||||
### Hardware Features
|
|
||||||
|
|
||||||
- MediaTek MT7986 ARM Cortex-A53 quad-core processor @ 2.0 GHz
|
|
||||||
- 2 GB DDR4 RAM
|
|
||||||
- 8 GB eMMC storage
|
|
||||||
- microSD card slot (BPI-R3 only)
|
|
||||||
- 5x Gigabit Ethernet ports with switch core (BPI-R3 only)
|
|
||||||
- 2x SFP cages for fiber connectivity (1G/2.5G) (BPI-R3 only)
|
|
||||||
- Dual-band WiFi (2.4 GHz + 5 GHz)
|
|
||||||
- USB 3.0 port
|
|
||||||
- Mini PCIe slot
|
|
||||||
|
|
||||||
### Default Network Configuration
|
|
||||||
|
|
||||||
Infix comes preconfigured with:
|
|
||||||
|
|
||||||
- **LAN ports** (lan1-lan4): Bridged for internal networking (BPI-R3 only)
|
|
||||||
- **WAN port**: DHCP client enabled for internet connectivity
|
|
||||||
- **SFP ports** (sfp1, sfp2): Available for configuration (BPI-R3 only)
|
|
||||||
- **WiFi interfaces** (wifi0, wifi1): Available for configuration
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
### BPI-R3: Quick Start with SD Card
|
|
||||||
|
|
||||||
The easiest way to get started with the BPI-R3 is using an SD card:
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> SD card boot works but we have observed stability issues. For production
|
|
||||||
> use or long-term reliability, we recommend installing to eMMC (see below).
|
|
||||||
|
|
||||||
1. **Download the SD card image:** [infix-bpi-r3-sdcard.img][2]
|
|
||||||
2. **Flash the image to an SD card:** see [this guide][0]
|
|
||||||
3. **Set boot switches:**
|
|
||||||
- Set DIP switches to **0000** (SD card boot mode)
|
|
||||||
- Switch positions are on the underside of the board near the SD slot
|
|
||||||
4. **Boot the board:**
|
|
||||||
- Insert the SD card
|
|
||||||
- Connect power
|
|
||||||
- Connect to LAN port or console (115200 8N1)
|
|
||||||
- Default login: `admin` / `admin`
|
|
||||||
|
|
||||||
### BPI-R3 Mini: Getting Started
|
|
||||||
|
|
||||||
The BPI-R3 Mini does not have an SD card slot, so you must install
|
|
||||||
directly to eMMC. See [Installing to eMMC — BPI-R3
|
|
||||||
Mini](#bpi-r3-mini) below.
|
|
||||||
|
|
||||||
### Boot Switch Reference
|
|
||||||
|
|
||||||
The BPI-R3 has a 4-position DIP switch that controls boot media:
|
|
||||||
|
|
||||||
<img align="right" src="bootstrap-switch.webp" alt="DIP switches" width=200 padding=10>
|
|
||||||
|
|
||||||
| ABCD | Mode | Description |
|
|
||||||
|------|----------|---------------------------------------|
|
|
||||||
| 0000 | SD card | Boot from microSD card |
|
|
||||||
| 0101 | SPI NAND | Boot from SPI NAND (advanced users) |
|
|
||||||
| 1001 | eMMC | Boot from internal eMMC (recommended) |
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> Switch position is read from left to right: "0" = OFF, "1" = ON.
|
|
||||||
> When the DIP switch is in the "UP" position it is OFF(0).
|
|
||||||
|
|
||||||
## Installing to eMMC
|
|
||||||
|
|
||||||
For production deployments or better performance, you can install Infix
|
|
||||||
to the internal eMMC storage.
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> While Infix boots on both SD card and eMMC on the BPI-R3, we have
|
|
||||||
> observed stability issues with SD cards on this platform. **eMMC is
|
|
||||||
> recommended** for reliable operation.
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
- FTDI USB-to-serial cable (3.3V) for console access
|
|
||||||
- USB flash drive (FAT32 formatted)
|
|
||||||
- microSD card with Infix, for initial boot (BPI-R3 only)
|
|
||||||
- Downloaded files (see below)
|
|
||||||
|
|
||||||
### Required Files
|
|
||||||
|
|
||||||
Download and place these files on a FAT32-formatted USB drive:
|
|
||||||
|
|
||||||
1. **Infix eMMC image:**
|
|
||||||
- [infix-bpi-r3-emmc.img][3] (Complete system image)
|
|
||||||
2. **eMMC bootloader** (extracted from):
|
|
||||||
- [bpi-r3-emmc-boot-2025.01-latest.tar.gz][4]
|
|
||||||
- Extract `bl2.img` from the tarball to your USB drive
|
|
||||||
3. **Intermediate NAND bootloader** (BPI-R3 only, from Frank-W's U-Boot):
|
|
||||||
- [bpi-r3_spim-nand_bl2.img][5] (BL2 loader)
|
|
||||||
- [bpi-r3_spim-nand_fip.bin][6] (FIP image)
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> The following process involves multiple boot mode changes. Take your
|
|
||||||
> time and verify each step carefully.
|
|
||||||
|
|
||||||
### BPI-R3
|
|
||||||
|
|
||||||
#### Step 1: Boot from SD card
|
|
||||||
|
|
||||||
1. Set boot switches to **0000** (SD card mode)
|
|
||||||
2. Insert SD card with Infix
|
|
||||||
3. Power on and break into U-Boot (press Ctrl-C during boot)
|
|
||||||
|
|
||||||
#### Step 2: Flash intermediate NAND bootloader
|
|
||||||
|
|
||||||
This step installs a temporary bootloader to NAND that will help us
|
|
||||||
flash the eMMC. From the U-Boot prompt:
|
|
||||||
|
|
||||||
```
|
|
||||||
usb start
|
|
||||||
mtd erase spi-nand0
|
|
||||||
fatload usb 0:1 0x50000000 bpi-r3_spim-nand_bl2.img
|
|
||||||
mtd write spi-nand0 0x50000000 0x0 0x100000
|
|
||||||
fatload usb 0:1 0x50000000 bpi-r3_spim-nand_fip.bin
|
|
||||||
mtd write spi-nand0 0x50000000 0x380000 0x200000
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Step 3: Boot from NAND
|
|
||||||
|
|
||||||
1. Power off the board
|
|
||||||
2. Set boot switches to **1010** (NAND mode)
|
|
||||||
3. Power on - you should boot into U-Boot again
|
|
||||||
|
|
||||||
#### Step 4: Write Infix image to eMMC
|
|
||||||
|
|
||||||
From the U-Boot prompt:
|
|
||||||
|
|
||||||
```
|
|
||||||
usb start
|
|
||||||
fatload usb 0:1 0x50000000 infix-bpi-r3-emmc.img
|
|
||||||
setexpr blocks ${filesize} / 0x200
|
|
||||||
mmc dev 0
|
|
||||||
mmc write 0x50000000 0x0 ${blocks}
|
|
||||||
```
|
|
||||||
|
|
||||||
This writes the complete Infix system (partitions, rootfs, etc.) to eMMC.
|
|
||||||
|
|
||||||
#### Step 5: Configure eMMC boot
|
|
||||||
|
|
||||||
Now configure the eMMC boot partition and write the bootloader:
|
|
||||||
|
|
||||||
```
|
|
||||||
mmc partconf 0 1 1 1
|
|
||||||
mmc erase 0x0 0x400
|
|
||||||
fatload usb 0:1 0x50000000 bl2.img
|
|
||||||
mmc write 0x50000000 0x0 0x400
|
|
||||||
mmc partconf 0 1 1 0
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Step 6: Boot from eMMC
|
|
||||||
|
|
||||||
1. Power off the board
|
|
||||||
2. Set boot switches to **0110** (eMMC mode)
|
|
||||||
3. Remove SD card (optional, but recommended to verify eMMC boot)
|
|
||||||
4. Power on
|
|
||||||
|
|
||||||
Your BPI-R3 should now boot Infix from internal eMMC storage!
|
|
||||||
|
|
||||||
### BPI-R3 Mini
|
|
||||||
|
|
||||||
The BPI-R3 Mini does not have an SD card slot, so you have to go
|
|
||||||
through the factory-installed Linux (OpenWRT) to flash the Infix
|
|
||||||
bootloader and OS to eMMC.
|
|
||||||
|
|
||||||
#### Step 1: Boot from NAND (factory default)
|
|
||||||
|
|
||||||
<img src="r3mini_nandboot2.png" alt="BPI-R3 Mini NAND boot switch position" width=400>
|
|
||||||
|
|
||||||
1. Ensure boot switches are set to NAND mode (factory default)
|
|
||||||
2. Place `infix-bpi-r3-emmc.img` and `bl2.img` on a USB drive
|
|
||||||
3. Power on and boot into Linux
|
|
||||||
4. Mount the USB drive to `/mnt`
|
|
||||||
|
|
||||||
#### Step 2: Flash Infix to eMMC
|
|
||||||
|
|
||||||
From the Linux shell:
|
|
||||||
|
|
||||||
```
|
|
||||||
echo 0 > /proc/sys/kernel/printk
|
|
||||||
dd if=/mnt/infix-bpi-r3-emmc.img of=/dev/mmcblk0
|
|
||||||
echo 0 > /sys/block/mmcblk0boot0/force_ro
|
|
||||||
dd if=/mnt/bl2.img of=/dev/mmcblk0boot0
|
|
||||||
sync
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Step 3: Boot from eMMC
|
|
||||||
|
|
||||||
<img src="r3mini_emmcboot.png" alt="BPI-R3 Mini eMMC boot switch position" width=400>
|
|
||||||
|
|
||||||
1. Power off the board
|
|
||||||
2. Set boot switches to eMMC mode (see image above)
|
|
||||||
3. Power on
|
|
||||||
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Board won't boot
|
|
||||||
|
|
||||||
- Verify boot switch positions (check twice!)
|
|
||||||
- Ensure power supply provides adequate current (12V/2A recommended)
|
|
||||||
- Try booting from SD card with switches at **0000** (BPI-R3 only)
|
|
||||||
|
|
||||||
### Can't break into U-Boot
|
|
||||||
|
|
||||||
- Ensure serial console is connected properly (115200 8N1, 3.3V)
|
|
||||||
- Press Ctrl-C immediately when you see boot messages
|
|
||||||
- Try power cycling and pressing Ctrl-C repeatedly
|
|
||||||
|
|
||||||
### eMMC boot fails after installation
|
|
||||||
|
|
||||||
- Boot from NAND (**1010**) and verify eMMC image was written
|
|
||||||
- Check USB drive contents - ensure all files are present
|
|
||||||
- Re-run the eMMC boot configuration step
|
|
||||||
|
|
||||||
### Reverting to SD card (BPI-R3 only)
|
|
||||||
|
|
||||||
Simply set boot switches back to **0000** and boot from SD card. The
|
|
||||||
eMMC installation does not affect SD card functionality.
|
|
||||||
|
|
||||||
## Additional Resources
|
|
||||||
|
|
||||||
- [Infix Documentation][1]
|
|
||||||
- [Official BPI-R3 Wiki][7]
|
|
||||||
- [Release Downloads][8]
|
|
||||||
|
|
||||||
## Building Custom Images
|
|
||||||
|
|
||||||
See the main Infix documentation for building from source. To build both
|
|
||||||
SD card and eMMC images locally:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build bootloaders for both SD and eMMC
|
|
||||||
make x-bpi-r3-sd-boot
|
|
||||||
make x-bpi-r3-emmc-boot
|
|
||||||
|
|
||||||
# Build main system
|
|
||||||
make aarch64
|
|
||||||
|
|
||||||
# Create SD card image
|
|
||||||
./utils/mkimage.sh -od bananapi-bpi-r3
|
|
||||||
|
|
||||||
# Create eMMC image
|
|
||||||
./utils/mkimage.sh -odt emmc bananapi-bpi-r3
|
|
||||||
```
|
|
||||||
|
|
||||||
[0]: https://www.kernelkit.org/posts/flashing-sdcard/
|
|
||||||
[1]: https://www.kernelkit.org/infix/latest/
|
|
||||||
[2]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r3-sdcard.img
|
|
||||||
[3]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r3-emmc.img
|
|
||||||
[4]: https://github.com/kernelkit/infix/releases/download/latest-boot/bpi-r3-emmc-boot-2025.01-latest.tar.gz
|
|
||||||
[5]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2025-10-bpi-2025.10-2025-10-13_1032/bpi-r3_spim-nand_bl2.img
|
|
||||||
[6]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2025-10-bpi-2025.10-2025-10-13_1032/bpi-r3_spim-nand_fip.bin
|
|
||||||
[7]: https://wiki.banana-pi.org/Banana_Pi_BPI-R3
|
|
||||||
[8]: https://github.com/kernelkit/infix/releases/tag/latest-boot
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Locally calculated
|
|
||||||
sha256 dbe4eae8debbba8135297e15f24aeefef0b4c03781f3f9328db4398d58a728b3 LICENSE
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
define BANANAPI_BPI_R3_LINUX_CONFIG_FIXUPS
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_MEDIATEK)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MACH_MT7986)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_PINCTRL_MT7986)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_MT6577)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_I2C_GPIO,y)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MTK_THERMAL,m)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_UART)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_WATCHDOG)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_GE_PHY)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_REALTEK_PHY)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_AIR_EN8811H_PHY,m)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_MEDIATEK)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_MEDIATEK_SOC)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_NET_DSA_MT7530,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MT7915E,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PCIE_MEDIATEK_GEN3,m)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_SCPSYS)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_MTK)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_HSDMA)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MT7915E,m)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MT798X_WMAC)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MTK_SOC_THERMAL,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_I2C_MT65XX,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_USB_XHCI_MTK,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PHY_MTK_TPHY,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PHY_MTK_XSPHY,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_REGULATOR_GPIO,y)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_REGULATOR_MT6380,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PWM_MEDIATEK,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_SENSORS_PWM_FAN,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_NVMEM_MTK_EFUSE,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_CRYPTO_DEV_SAFEXCEL,m)
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(eval $(ix-board))
|
|
||||||
$(eval $(generic-package))
|
|
||||||
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 49 KiB |
@@ -1 +0,0 @@
|
|||||||
dtb-y += mediatek/mt7986a-bananapi-bpi-r3-sd.dtb mediatek/mt7986a-bananapi-bpi-r3-emmc.dtb mediatek/mt7986a-bananapi-bpi-r3-mini.dtb
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3.dts>
|
|
||||||
|
|
||||||
#include "mt7986a-bananapi-bpi-r3.dtsi"
|
|
||||||
#include "mt7986a-bananapi-bpi-r3-emmc.dtsi"
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2021 MediaTek Inc.
|
|
||||||
* Author: Sam.Shih <sam.shih@mediatek.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is copied from linux where it is an overlay, unfortunatly it is not
|
|
||||||
possible to use dtbo in sysboot unless present in syslinux.conf
|
|
||||||
*/
|
|
||||||
&{/soc/mmc@11230000} {
|
|
||||||
bus-width = <8>;
|
|
||||||
max-frequency = <200000000>;
|
|
||||||
cap-mmc-highspeed;
|
|
||||||
mmc-hs200-1_8v;
|
|
||||||
mmc-hs400-1_8v;
|
|
||||||
hs400-ds-delay = <0x14014>;
|
|
||||||
non-removable;
|
|
||||||
no-sd;
|
|
||||||
no-sdio;
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
card@0 {
|
|
||||||
compatible = "mmc-card";
|
|
||||||
reg = <0>;
|
|
||||||
|
|
||||||
partitions {
|
|
||||||
compatible = "gpt-partitions";
|
|
||||||
|
|
||||||
partition-factory {
|
|
||||||
partname = "factory";
|
|
||||||
|
|
||||||
nvmem-layout {
|
|
||||||
compatible = "fixed-layout";
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <1>;
|
|
||||||
|
|
||||||
eeprom_factory_wmac: eeprom@0 {
|
|
||||||
reg = <0x0 0x1000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
eeprom_factory_pcie: eeprom@a0000 {
|
|
||||||
reg = <0xa0000 0x1000>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3-mini.dts>
|
|
||||||
|
|
||||||
#include "mt7986a-bananapi-bpi-r3.dtsi"
|
|
||||||
#include "mt7986a-bananapi-bpi-r3-emmc.dtsi"
|
|
||||||
|
|
||||||
&phy0 {
|
|
||||||
compatible = "ethernet-phy-id03a2.a411";
|
|
||||||
};
|
|
||||||
&phy1 {
|
|
||||||
compatible = "ethernet-phy-id03a2.a411";
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#include "mt7986a-bananapi-bpi-r3.dtsi"
|
|
||||||
#include "mt7986a-bananapi-bpi-r3-emmc.dtsi"
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3.dts>
|
|
||||||
|
|
||||||
#include "mt7986a-bananapi-bpi-r3.dtsi"
|
|
||||||
#include "mt7986a-bananapi-bpi-r3-sd.dtsi"
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2021 MediaTek Inc.
|
|
||||||
* Author: Sam.Shih <sam.shih@mediatek.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is copied from linux where it is an overlay, unfortunatly it is not
|
|
||||||
possible to use dtbo in sysboot unless present in syslinux.conf
|
|
||||||
*/
|
|
||||||
&{/soc/mmc@11230000} {
|
|
||||||
bus-width = <4>;
|
|
||||||
max-frequency = <52000000>;
|
|
||||||
cap-sd-highspeed;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
/ {
|
|
||||||
chosen {
|
|
||||||
infix {
|
|
||||||
/* Default admin user password: 'admin' */
|
|
||||||
factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A";
|
|
||||||
usb-ports = <&ssusb>;
|
|
||||||
usb-port-names = "USB";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
From 236317dd4e55512933dcdaec3d0b4a0824f5e5bd Mon Sep 17 00:00:00 2001
|
|
||||||
From: Shiji Yang <yangshiji66@outlook.com>
|
|
||||||
Date: Sun, 10 Aug 2025 18:11:01 +0800
|
|
||||||
Subject: [PATCH] arm64: dts: mediatek: mt7986: increase ATF reserved memory to
|
|
||||||
256 kiB
|
|
||||||
|
|
||||||
The latest Mediatek open-source Trusted Firmware-A project has
|
|
||||||
reserved 256 KiB for BL2 and BL31. It is better to increase the
|
|
||||||
reserved memory region in the Linux kernel to protect the data.
|
|
||||||
|
|
||||||
https://github.com/openwrt/openwrt/blob/main/target/linux/mediatek/patches-6.12/199-arm64-dts-mediatek-mt7986-increase-ATF-reserved-memo.patch
|
|
||||||
*/
|
|
||||||
&secmon_reserved {
|
|
||||||
reg = <0 0x43000000 0 0x40000>;
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* The T-PHY's pcie-phy sub-node only claims clk40m ("ref") in the SoC
|
|
||||||
* dtsi. CLK_TOP_PCIE_PHY_SEL ("da_ref") is left unclaimed, so the
|
|
||||||
* kernel's clk_disable_unused late_initcall gates it — killing the
|
|
||||||
* PCIe REFCLK output to the endpoint mid-probe. Wire it here so the
|
|
||||||
* clock stays enabled while the PHY is active.
|
|
||||||
*/
|
|
||||||
&pcie_port {
|
|
||||||
clocks = <&clk40m>, <&topckgen CLK_TOP_PCIE_PHY_SEL>;
|
|
||||||
clock-names = "ref", "da_ref";
|
|
||||||
};
|
|
||||||
|
|
||||||
&cpu_thermal {
|
|
||||||
/delete-node/ trips;
|
|
||||||
/delete-node/ cooling-maps;
|
|
||||||
trips {
|
|
||||||
cpu_trip_active_cool: cpu-trip-active-cool {
|
|
||||||
temperature = <40000>; // 40°C
|
|
||||||
hysteresis = <2000>; // 2°C hysteresis
|
|
||||||
type = "active";
|
|
||||||
};
|
|
||||||
cpu_trip_active_low: cpu-trip-active-low {
|
|
||||||
temperature = <45000>; // 40°C
|
|
||||||
hysteresis = <2000>; // 2°C hysteresis
|
|
||||||
type = "active";
|
|
||||||
};
|
|
||||||
cpu_trip_active_med: cpu-trip-active-med {
|
|
||||||
temperature = <60000>; // 60°C
|
|
||||||
hysteresis = <2000>; // 2°C hysteresis
|
|
||||||
type = "active";
|
|
||||||
};
|
|
||||||
cpu_trip_hot: cpu-trip-hot {
|
|
||||||
temperature = <80000>; // 80°C
|
|
||||||
hysteresis = <2000>; // 2°C hysteresis
|
|
||||||
type = "hot";
|
|
||||||
};
|
|
||||||
cpu_trip_critical: cpu-trip-critical {
|
|
||||||
temperature = <90000>; // 90°C
|
|
||||||
hysteresis = <2000>; // 2°C hysteresis
|
|
||||||
type = "critical";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
cooling-maps {
|
|
||||||
map-cpu-40deg {
|
|
||||||
cooling-device = <&fan 0 0>;
|
|
||||||
trip = <&cpu_trip_active_cool>;
|
|
||||||
};
|
|
||||||
map-cpu-45deg {
|
|
||||||
cooling-device = <&fan 1 1>;
|
|
||||||
trip = <&cpu_trip_active_low>;
|
|
||||||
};
|
|
||||||
map-cpu-60deg {
|
|
||||||
cooling-device = <&fan 2 2>;
|
|
||||||
trip = <&cpu_trip_active_med>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
image cfg.ext4 {
|
|
||||||
empty = true
|
|
||||||
temporary = true
|
|
||||||
size = 128M
|
|
||||||
ext4 {
|
|
||||||
label = "cfg"
|
|
||||||
use-mke2fs = true
|
|
||||||
features = "uninit_bg"
|
|
||||||
extraargs = "-m 0 -i 4096"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# The /var partition will be expanded automatically at first boot
|
|
||||||
# to use the full size of the SD-card or eMMC media.
|
|
||||||
image var.ext4 {
|
|
||||||
empty = true
|
|
||||||
temporary = true
|
|
||||||
size = 128M
|
|
||||||
ext4 {
|
|
||||||
label = "var"
|
|
||||||
use-mke2fs = true
|
|
||||||
features = "uninit_bg"
|
|
||||||
extraargs = "-m 0 -i 4096"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
image #INFIX_ID##VERSION#-bpi-r3-#TARGET#.img {
|
|
||||||
hdimage {
|
|
||||||
partition-table-type = "gpt"
|
|
||||||
|
|
||||||
}
|
|
||||||
# BL2 bootloader partition (MediaTek official location)
|
|
||||||
partition bl2 {
|
|
||||||
image = "bl2.img"
|
|
||||||
offset = 1024s # 0x80000 = sector 1024
|
|
||||||
size = 4M # 0x400000
|
|
||||||
bootable = true
|
|
||||||
}
|
|
||||||
|
|
||||||
# Factory/calibration data (sectors 9216-13311)
|
|
||||||
partition factory {
|
|
||||||
offset = 4608K # 0x480000
|
|
||||||
size = 2M # 0x200000
|
|
||||||
}
|
|
||||||
|
|
||||||
# FIP partition - BL31 + U-Boot (sectors 13312-17407)
|
|
||||||
partition fip {
|
|
||||||
# partition-type = 0x83 # Linux filesystem
|
|
||||||
image = "fip.bin"
|
|
||||||
offset = 13312s
|
|
||||||
size = 4096s
|
|
||||||
}
|
|
||||||
|
|
||||||
partition en8811h_fw {
|
|
||||||
size = 10M
|
|
||||||
image = "en8811h-fw.bin"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition aux {
|
|
||||||
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
|
|
||||||
image = "aux.ext4"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition primary {
|
|
||||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
|
||||||
bootable = true
|
|
||||||
size = 250M
|
|
||||||
image = "rootfs.squashfs"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition secondary {
|
|
||||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
|
||||||
bootable = true
|
|
||||||
size = 250M
|
|
||||||
image = "rootfs.squashfs"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition cfg {
|
|
||||||
partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105
|
|
||||||
image = "cfg.ext4"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition var {
|
|
||||||
partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F
|
|
||||||
image = "var.ext4"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 110 KiB |
@@ -1,480 +0,0 @@
|
|||||||
{
|
|
||||||
"ieee802-dot1ab-lldp:lldp": {
|
|
||||||
"infix-lldp:enabled": true
|
|
||||||
},
|
|
||||||
"ietf-hardware:hardware": {
|
|
||||||
"component": [
|
|
||||||
{
|
|
||||||
"name": "USB",
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"name": "USB2",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "radio0",
|
|
||||||
"class": "infix-hardware:wifi",
|
|
||||||
"infix-hardware:wifi-radio": {
|
|
||||||
"country-code": "DE",
|
|
||||||
"band": "2.4GHz",
|
|
||||||
"channel": "auto"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "radio1",
|
|
||||||
"class": "infix-hardware:wifi",
|
|
||||||
"infix-hardware:wifi-radio": {
|
|
||||||
"country-code": "DE",
|
|
||||||
"band": "5GHz",
|
|
||||||
"channel": "auto"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-interfaces:interfaces": {
|
|
||||||
"interface": [
|
|
||||||
{
|
|
||||||
"name": "br0",
|
|
||||||
"type": "infix-if-type:bridge",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "192.168.0.1",
|
|
||||||
"prefix-length": 24
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan1",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan2",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan3",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan4",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lo",
|
|
||||||
"type": "infix-if-type:loopback",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "127.0.0.1",
|
|
||||||
"prefix-length": 8
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "::1",
|
|
||||||
"prefix-length": 128
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "sfp1",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "sfp2",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"infix-dhcp-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "broadcast"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "hostname",
|
|
||||||
"value": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "netmask"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "vendor-class",
|
|
||||||
"value": "Banana Pi BPI-R3"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"infix-dhcpv6-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "client-fqdn"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain-search"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wifi0-ap",
|
|
||||||
"type": "infix-if-type:wifi",
|
|
||||||
"infix-interfaces:wifi": {
|
|
||||||
"radio": "radio0",
|
|
||||||
"access-point": {
|
|
||||||
"ssid": "Infix",
|
|
||||||
"security": {
|
|
||||||
"secret": "wifi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wifi1-ap",
|
|
||||||
"type": "infix-if-type:wifi",
|
|
||||||
"infix-interfaces:wifi": {
|
|
||||||
"radio": "radio1",
|
|
||||||
"access-point": {
|
|
||||||
"ssid": "Infix5Ghz",
|
|
||||||
"security": {
|
|
||||||
"secret": "wifi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-keystore:keystore": {
|
|
||||||
"asymmetric-keys": {
|
|
||||||
"asymmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "genkey",
|
|
||||||
"public-key-format": "infix-crypto-types:ssh-public-key-format",
|
|
||||||
"public-key": "",
|
|
||||||
"private-key-format": "infix-crypto-types:rsa-private-key-format",
|
|
||||||
"cleartext-private-key": "",
|
|
||||||
"certificates": {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"symmetric-keys": {
|
|
||||||
"symmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "wifi",
|
|
||||||
"cleartext-symmetric-key": "aW5maXhpbmZpeA==",
|
|
||||||
"key-format": "infix-crypto-types:passphrase-key-format"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-netconf-acm:nacm": {
|
|
||||||
"enable-nacm": true,
|
|
||||||
"read-default": "permit",
|
|
||||||
"write-default": "permit",
|
|
||||||
"exec-default": "permit",
|
|
||||||
"groups": {
|
|
||||||
"group": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"user-name": [
|
|
||||||
"admin"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator",
|
|
||||||
"user-name": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest",
|
|
||||||
"user-name": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"rule-list": [
|
|
||||||
{
|
|
||||||
"name": "admin-acl",
|
|
||||||
"group": [
|
|
||||||
"admin"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-all",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Allow 'admin' group complete access to all operations and data."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator-acl",
|
|
||||||
"group": [
|
|
||||||
"operator"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-system-rpcs",
|
|
||||||
"module-name": "ietf-system",
|
|
||||||
"rpc-name": "*",
|
|
||||||
"access-operations": "exec",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Operators can reboot, shutdown, and set system time."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest-acl",
|
|
||||||
"group": [
|
|
||||||
"guest"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-all-write+exec",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "create update delete exec",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "Guests cannot change anything or exec rpcs."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "default-deny-all",
|
|
||||||
"group": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-password-access",
|
|
||||||
"path": "/ietf-system:system/authentication/user/password",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access password hashes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-keystore-access",
|
|
||||||
"module-name": "ietf-keystore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access cryptographic keys."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-truststore-access",
|
|
||||||
"module-name": "ietf-truststore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access trust store."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-netconf-server:netconf-server": {
|
|
||||||
"listen": {
|
|
||||||
"endpoints": {
|
|
||||||
"endpoint": [
|
|
||||||
{
|
|
||||||
"name": "default-ssh",
|
|
||||||
"ssh": {
|
|
||||||
"tcp-server-parameters": {
|
|
||||||
"local-bind": [
|
|
||||||
{
|
|
||||||
"local-address": "::"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ssh-server-parameters": {
|
|
||||||
"server-identity": {
|
|
||||||
"host-key": [
|
|
||||||
{
|
|
||||||
"name": "default-key",
|
|
||||||
"public-key": {
|
|
||||||
"central-keystore-reference": "genkey"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-system:system": {
|
|
||||||
"hostname": "bpi-%m",
|
|
||||||
"ntp": {
|
|
||||||
"server": [
|
|
||||||
{
|
|
||||||
"name": "default",
|
|
||||||
"udp": {
|
|
||||||
"address": "pool.ntp.org"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"authentication": {
|
|
||||||
"user": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"password": "$factory$",
|
|
||||||
"infix-system:shell": "bash"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
|
|
||||||
},
|
|
||||||
"infix-dhcp-server:dhcp-server": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router",
|
|
||||||
"address": "auto"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"subnet": [
|
|
||||||
{
|
|
||||||
"subnet": "192.168.0.0/24",
|
|
||||||
"pool": {
|
|
||||||
"start-address": "192.168.0.100",
|
|
||||||
"end-address": "192.168.0.250"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-firewall:firewall": {
|
|
||||||
"default": "wan",
|
|
||||||
"zone": [
|
|
||||||
{
|
|
||||||
"name": "lan",
|
|
||||||
"action": "accept",
|
|
||||||
"interface": [
|
|
||||||
"br0"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"action": "drop",
|
|
||||||
"interface": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"service": [
|
|
||||||
"dhcpv6-client"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"policy": [
|
|
||||||
{
|
|
||||||
"name": "lan-to-wan",
|
|
||||||
"action": "accept",
|
|
||||||
"ingress": [
|
|
||||||
"lan"
|
|
||||||
],
|
|
||||||
"egress": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"masquerade": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-meta:meta": {
|
|
||||||
"version": "1.7"
|
|
||||||
},
|
|
||||||
"infix-services:mdns": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"infix-services:ssh": {
|
|
||||||
"enabled": true,
|
|
||||||
"hostkey": [
|
|
||||||
"genkey"
|
|
||||||
],
|
|
||||||
"listen": [
|
|
||||||
{
|
|
||||||
"name": "ipv4",
|
|
||||||
"address": "0.0.0.0",
|
|
||||||
"port": 22
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ipv6",
|
|
||||||
"address": "::",
|
|
||||||
"port": 22
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-services:web": {
|
|
||||||
"enabled": true,
|
|
||||||
"console": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"netbrowse": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"restconf": {
|
|
||||||
"enabled": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"sfp1": {
|
|
||||||
"comment": "Reports it supports autoneg, but if setting it, dagger crashes",
|
|
||||||
"broken-autoneg": true
|
|
||||||
},
|
|
||||||
"sfp2": {
|
|
||||||
"comment": "Reports it supports autoneg, but if setting it, dagger crashes",
|
|
||||||
"broken-autoneg": true
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth1", NAME="sfp1"
|
|
||||||
@@ -1,446 +0,0 @@
|
|||||||
{
|
|
||||||
"ieee802-dot1ab-lldp:lldp": {
|
|
||||||
"infix-lldp:enabled": true
|
|
||||||
},
|
|
||||||
"ietf-hardware:hardware": {
|
|
||||||
"component": [
|
|
||||||
{
|
|
||||||
"name": "USB",
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"name": "USB2",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "radio0",
|
|
||||||
"class": "infix-hardware:wifi",
|
|
||||||
"infix-hardware:wifi-radio": {
|
|
||||||
"country-code": "DE",
|
|
||||||
"band": "2.4GHz",
|
|
||||||
"channel": "auto"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "radio1",
|
|
||||||
"class": "infix-hardware:wifi",
|
|
||||||
"infix-hardware:wifi-radio": {
|
|
||||||
"country-code": "DE",
|
|
||||||
"band": "5GHz",
|
|
||||||
"channel": "auto"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-interfaces:interfaces": {
|
|
||||||
"interface": [
|
|
||||||
{
|
|
||||||
"name": "br0",
|
|
||||||
"type": "infix-if-type:bridge",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "192.168.0.1",
|
|
||||||
"prefix-length": 24
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lo",
|
|
||||||
"type": "infix-if-type:loopback",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "127.0.0.1",
|
|
||||||
"prefix-length": 8
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "::1",
|
|
||||||
"prefix-length": 128
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"infix-dhcp-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "broadcast"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "hostname",
|
|
||||||
"value": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "netmask"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "vendor-class",
|
|
||||||
"value": "Banana Pi BPI-R3"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"infix-dhcpv6-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "client-fqdn"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain-search"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wifi0-ap",
|
|
||||||
"type": "infix-if-type:wifi",
|
|
||||||
"infix-interfaces:wifi": {
|
|
||||||
"radio": "radio0",
|
|
||||||
"access-point": {
|
|
||||||
"ssid": "Infix",
|
|
||||||
"security": {
|
|
||||||
"secret": "wifi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wifi1-ap",
|
|
||||||
"type": "infix-if-type:wifi",
|
|
||||||
"infix-interfaces:wifi": {
|
|
||||||
"radio": "radio1",
|
|
||||||
"access-point": {
|
|
||||||
"ssid": "Infix5Ghz",
|
|
||||||
"security": {
|
|
||||||
"secret": "wifi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-keystore:keystore": {
|
|
||||||
"asymmetric-keys": {
|
|
||||||
"asymmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "genkey",
|
|
||||||
"public-key-format": "infix-crypto-types:ssh-public-key-format",
|
|
||||||
"public-key": "",
|
|
||||||
"private-key-format": "infix-crypto-types:rsa-private-key-format",
|
|
||||||
"cleartext-private-key": "",
|
|
||||||
"certificates": {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"symmetric-keys": {
|
|
||||||
"symmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "wifi",
|
|
||||||
"cleartext-symmetric-key": "aW5maXhpbmZpeA==",
|
|
||||||
"key-format": "infix-crypto-types:passphrase-key-format"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-netconf-acm:nacm": {
|
|
||||||
"enable-nacm": true,
|
|
||||||
"read-default": "permit",
|
|
||||||
"write-default": "permit",
|
|
||||||
"exec-default": "permit",
|
|
||||||
"groups": {
|
|
||||||
"group": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"user-name": [
|
|
||||||
"admin"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator",
|
|
||||||
"user-name": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest",
|
|
||||||
"user-name": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"rule-list": [
|
|
||||||
{
|
|
||||||
"name": "admin-acl",
|
|
||||||
"group": [
|
|
||||||
"admin"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-all",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Allow 'admin' group complete access to all operations and data."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator-acl",
|
|
||||||
"group": [
|
|
||||||
"operator"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-system-rpcs",
|
|
||||||
"module-name": "ietf-system",
|
|
||||||
"rpc-name": "*",
|
|
||||||
"access-operations": "exec",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Operators can reboot, shutdown, and set system time."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest-acl",
|
|
||||||
"group": [
|
|
||||||
"guest"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-all-write+exec",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "create update delete exec",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "Guests cannot change anything or exec rpcs."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "default-deny-all",
|
|
||||||
"group": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-password-access",
|
|
||||||
"path": "/ietf-system:system/authentication/user/password",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access password hashes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-keystore-access",
|
|
||||||
"module-name": "ietf-keystore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access cryptographic keys."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-truststore-access",
|
|
||||||
"module-name": "ietf-truststore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access trust store."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-netconf-server:netconf-server": {
|
|
||||||
"listen": {
|
|
||||||
"endpoints": {
|
|
||||||
"endpoint": [
|
|
||||||
{
|
|
||||||
"name": "default-ssh",
|
|
||||||
"ssh": {
|
|
||||||
"tcp-server-parameters": {
|
|
||||||
"local-bind": [
|
|
||||||
{
|
|
||||||
"local-address": "::"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ssh-server-parameters": {
|
|
||||||
"server-identity": {
|
|
||||||
"host-key": [
|
|
||||||
{
|
|
||||||
"name": "default-key",
|
|
||||||
"public-key": {
|
|
||||||
"central-keystore-reference": "genkey"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-system:system": {
|
|
||||||
"hostname": "bpi-%m",
|
|
||||||
"ntp": {
|
|
||||||
"server": [
|
|
||||||
{
|
|
||||||
"name": "default",
|
|
||||||
"udp": {
|
|
||||||
"address": "pool.ntp.org"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"authentication": {
|
|
||||||
"user": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"password": "$factory$",
|
|
||||||
"infix-system:shell": "bash"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
|
|
||||||
},
|
|
||||||
"infix-dhcp-server:dhcp-server": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router",
|
|
||||||
"address": "auto"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"subnet": [
|
|
||||||
{
|
|
||||||
"subnet": "192.168.0.0/24",
|
|
||||||
"pool": {
|
|
||||||
"start-address": "192.168.0.100",
|
|
||||||
"end-address": "192.168.0.250"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-firewall:firewall": {
|
|
||||||
"default": "wan",
|
|
||||||
"zone": [
|
|
||||||
{
|
|
||||||
"name": "lan",
|
|
||||||
"action": "accept",
|
|
||||||
"interface": [
|
|
||||||
"br0"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"action": "drop",
|
|
||||||
"interface": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"service": [
|
|
||||||
"dhcpv6-client"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"policy": [
|
|
||||||
{
|
|
||||||
"name": "lan-to-wan",
|
|
||||||
"action": "accept",
|
|
||||||
"ingress": [
|
|
||||||
"lan"
|
|
||||||
],
|
|
||||||
"egress": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"masquerade": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-meta:meta": {
|
|
||||||
"version": "1.7"
|
|
||||||
},
|
|
||||||
"infix-services:mdns": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"infix-services:ssh": {
|
|
||||||
"enabled": true,
|
|
||||||
"hostkey": [
|
|
||||||
"genkey"
|
|
||||||
],
|
|
||||||
"listen": [
|
|
||||||
{
|
|
||||||
"name": "ipv4",
|
|
||||||
"address": "0.0.0.0",
|
|
||||||
"port": 22
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ipv6",
|
|
||||||
"address": "::",
|
|
||||||
"port": 22
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-services:web": {
|
|
||||||
"enabled": true,
|
|
||||||
"console": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"netbrowse": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"restconf": {
|
|
||||||
"enabled": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth0", NAME="lan"
|
|
||||||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth1", NAME="wan"
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
CONFIG_DEVICE_TREE_INCLUDES="infix-env.dtsi infix-key.dtsi mt7986-emmc-env.dtsi"
|
|
||||||
BR2_TARGET_ARM_TRUSTED_FIRMWARE_ADDITIONAL_VARIABLES="BOOT_DEVICE=emmc DRAM_USE_DDR4=1 USE_MKIMAGE=1 MKIMAGE=$(HOST_DIR)/bin/mkimage"
|
|
||||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
CONFIG_AUTOBOOT=y
|
|
||||||
CONFIG_BOOTDELAY=2
|
|
||||||
# CONFIG_MMC_PCI is not set
|
|
||||||
CONFIG_ENV_IS_NOWHERE=y
|
|
||||||
# CONFIG_ENV_IS_IN_MMC is not set
|
|
||||||
CONFIG_MULTI_DTB_FIT=y
|
|
||||||
CONFIG_OF_LIST="mt7986a-bpi-r3-sd mt7986a-bpi-r3-emmc mt7986a-bpi-r3-mini mt7986a-acer-connect-vero-w6m"
|
|
||||||
|
|
||||||
CONFIG_USB=y
|
|
||||||
CONFIG_USB_XHCI_HCD=y
|
|
||||||
CONFIG_USB_XHCI_MTK=y
|
|
||||||
CONFIG_USB_MTU3=y
|
|
||||||
CONFIG_PHY=y
|
|
||||||
CONFIG_PHY_MTK_TPHY=y
|
|
||||||
|
|
||||||
CONFIG_MTK_SPIM=y
|
|
||||||
CONFIG_SPI=y
|
|
||||||
CONFIG_DM_SPI=y
|
|
||||||
CONFIG_SPI_FLASH=y
|
|
||||||
CONFIG_DM_SPI_FLASH=y
|
|
||||||
CONFIG_SPI_FLASH_MTD=y
|
|
||||||
CONFIG_SPI_FLASH_MACRONIX=y
|
|
||||||
CONFIG_SPI_FLASH_WINBOND=y
|
|
||||||
CONFIG_SPI_FLASH_GIGADEVICE=y
|
|
||||||
CONFIG_MTD=y
|
|
||||||
CONFIG_DM_MTD=y
|
|
||||||
CONFIG_MTD_PARTITIONS=y
|
|
||||||
CONFIG_MTD_SPI_NAND=y
|
|
||||||
CONFIG_MTK_SPIM=y
|
|
||||||
CONFIG_MTK_SNOR=y
|
|
||||||
|
|
||||||
CONFIG_DM_MDIO=y
|
|
||||||
CONFIG_DM_ETH_PHY=y
|
|
||||||
CONFIG_PHY_ETHERNET_ID=y
|
|
||||||
|
|
||||||
CONFIG_PHY_AIROHA=y
|
|
||||||
CONFIG_PHY_AIROHA_EN8811H=y
|
|
||||||
CONFIG_PHY_AIROHA_FW_IN_MMC=y
|
|
||||||
|
|
||||||
CONFIG_CMD_SF=y
|
|
||||||
CONFIG_CMD_USB=y
|
|
||||||
CONFIG_CMD_MTD=y
|
|
||||||
CONFIG_CMD_MDIO=y
|
|
||||||
CONFIG_CMD_MTDPARTS=y
|
|
||||||
CONFIG_CMD_DM=y
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#include <mt7986-env.dtsi>
|
|
||||||
|
|
||||||
&env {
|
|
||||||
fdtfile = "mediatek/mt7986a-bananapi-bpi-r3-emmc.dtb";
|
|
||||||
};
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/ {
|
|
||||||
config {
|
|
||||||
env: environment {
|
|
||||||
/* After the MMC driver has enabled bus power,
|
|
||||||
* the controller seems to sometimes detect a
|
|
||||||
* card removal state , which causes it to
|
|
||||||
* disable power again. This hack re-enables the
|
|
||||||
* bus power in those cases.
|
|
||||||
*/
|
|
||||||
bootcmd = "run ixboot";
|
|
||||||
boot_targets = "mmc0";
|
|
||||||
ethprime = "eth0";
|
|
||||||
fdt_addr_r = "0x43f00000";
|
|
||||||
kernel_addr_r = "0x44000000";
|
|
||||||
scriptaddr = "0x48000000";
|
|
||||||
ramdisk_addr_r = "0x4A000000";
|
|
||||||
|
|
||||||
en8811h_fw_part = "0#en8811h_fw";
|
|
||||||
en8811h_fw_dm_dir = "EthMD32.dm.bin";
|
|
||||||
en8811h_fw_dsp_dir = "EthMD32.DSP.bin";
|
|
||||||
|
|
||||||
/* This is a development platform, keep
|
|
||||||
* developer mode statically enabled.
|
|
||||||
*/
|
|
||||||
ixbtn-devmode = "setenv dev_mode yes; echo Enabled";
|
|
||||||
ixbtn-factory = "echo \"No button available, use bootmenu\"";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#include <mt7986-env.dtsi>
|
|
||||||
|
|
||||||
&env {
|
|
||||||
fdtfile = "mediatek/mt7986a-bananapi-bpi-r3-sd.dtb";
|
|
||||||
};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
CONFIG_DEVICE_TREE_INCLUDES="infix-env.dtsi infix-key.dtsi mt7986-sd-env.dtsi"
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
config BR2_PACKAGE_BANANAPI_BPI_R4
|
|
||||||
bool "Banana Pi R4"
|
|
||||||
depends on BR2_aarch64
|
|
||||||
select BR2_PACKAGE_FEATURE_WIFI
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7988
|
|
||||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7996
|
|
||||||
select SDCARD_AUX
|
|
||||||
help
|
|
||||||
Build Banana PI R4 support
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Copyright (c) 2026 The KernelKit Authors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
@@ -1,402 +0,0 @@
|
|||||||
# Banana Pi BPI-R4 / BPI-R4-2g5 / BPI-R4P
|
|
||||||
|
|
||||||
<img src="banana_pi_bpi-r4_poe.jpg" alt="The board" width=800 padding=10>
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
The Banana Pi BPI-R4 is a high-performance networking board built around the
|
|
||||||
MediaTek MT7988A SoC (Filogic 880). It is a successor to the BPI-R3 and
|
|
||||||
represents a significant step up: the CPU switches from in-order Cortex-A53
|
|
||||||
cores to out-of-order Cortex-A73 cores, and the MT7531 switch is now part of
|
|
||||||
the SOC. The base model comes with two SFP+ cages supporting 1.25/2.5/5/10
|
|
||||||
Gbps, and the R4P model comes with one SFP+ cage and one 2.5 Gbps RJ45 jack,
|
|
||||||
which with an optional PoE board means the board can act as PD. Unlike the
|
|
||||||
BPi-R3, however, there is no on-board WiFi support, that requires an external
|
|
||||||
tri-band WiFi 7 (IEEE 802.11be) card.
|
|
||||||
|
|
||||||
### Variants
|
|
||||||
|
|
||||||
| **Feature** | **BPI-R4** | **BPI-R4-2g5** | **BPI-R4P** |
|
|
||||||
|------------------|------------------|-------------------|---------------------------|
|
|
||||||
| 1G switch ports | wan, lan1–lan3 | lan0–lan3 | lan0–lan3 |
|
|
||||||
| 2.5G RJ45 (WAN) | — | wan | wan (PoE input) |
|
|
||||||
| SFP+ port(s) | sfp1, sfp2 (10G) | sfp1 (10G) | sfp1 (10G) |
|
|
||||||
| Linux DT | bpi-r4 | bpi-r4-2g5 | bpi-r4-2g5 (same) |
|
|
||||||
|
|
||||||
On the standard BPI-R4 the four 1G switch ports are labeled `wan`, `lan1`, `lan2`,
|
|
||||||
and `lan3`. On the R4-2g5 and R4P, the port that would otherwise be `wan` on the
|
|
||||||
switch is relabeled `lan0` via a device tree overlay, since the actual WAN port on
|
|
||||||
those variants is the dedicated 2.5G internal PHY on the separate RJ45 jack.
|
|
||||||
|
|
||||||
The BPI-R4P is mechanically and electrically identical to the BPI-R4-2g5
|
|
||||||
with an additional PoE daughterboard header. From a Linux kernel and
|
|
||||||
Infix perspective the two boards are treated identically.
|
|
||||||
|
|
||||||
### SoC: MediaTek MT7988A vs MT7986 (BPI-R3)
|
|
||||||
|
|
||||||
The MT7988A (Filogic 880) and MT7986 (Filogic 820) may look similar from
|
|
||||||
their part numbers, but they are built on entirely different silicon with
|
|
||||||
distinct system architectures:
|
|
||||||
|
|
||||||
| **Aspect** | **MT7988A (BPI-R4)** | **MT7986 (BPI-R3)** |
|
|
||||||
|------------------|--------------------------|---------------------------|
|
|
||||||
| CPU cores | 4x Cortex-A73 @ 1.8 GHz | 4x Cortex-A53 @ 2.0 GHz |
|
|
||||||
| CPU architecture | ARMv8-A, out-of-order | ARMv8-A, in-order |
|
|
||||||
| Internal switch | 1 Gbps per port | 1 Gbps per port |
|
|
||||||
| Uplinks | USXGMII (native 10 Gbps) | USXGMII (native 2.5 Gbps) |
|
|
||||||
| WiFi | MT7996E PCIe module | MT7915E (built-in) |
|
|
||||||
| WiFi standard | WiFi 7 (802.11be) | WiFi 6 (802.11ax) |
|
|
||||||
| WiFi bands | 2.4 / 5 / 6 GHz | 2.4 / 5 GHz |
|
|
||||||
| Hardware crypto | EIP-197 NPU | EIP-93 |
|
|
||||||
| PCIe slots | 4 (2x mPCIe, 2x M.2) | 1 mPCIe |
|
|
||||||
| Boot ROM offset | Sector 1024 (0x80000) | Sector 1024 (0x80000) |
|
|
||||||
|
|
||||||
### Hardware Features
|
|
||||||
|
|
||||||
- **SoC:** MediaTek MT7988A (Filogic 880)
|
|
||||||
- **CPU:** Quad-core ARM Cortex-A73, up to 1.8 GHz
|
|
||||||
- **RAM:** 4 GB DDR4
|
|
||||||
- **Storage:** 8 GB eMMC, microSD card slot, SPI NAND flash
|
|
||||||
- **Ethernet switch:** 4-port 1 GbE (10/100/1000) internal DSA switch
|
|
||||||
- **SFP+ ports:** 2x 10 Gbps USXGMII (standard R4) or 1x SFP+ (R4-2g5/R4P)
|
|
||||||
- **WiFi:** optional MediaTek MT7996E PCIe module — tri-band WiFi 7 (2.4/5/6 GHz)
|
|
||||||
- **USB:** 1x USB 3.0 (xHCI)
|
|
||||||
- **PCIe:** 2x mPCIe (SIM2/SIM3), 1x M.2 Key-B (SIM1), 1x M.2 Key-M (SSD)
|
|
||||||
- **RTC:** PCF8563 on I2C
|
|
||||||
- **Fan:** PWM-controlled cooling with thermal management
|
|
||||||
- **Console:** UART at 115200 8N1 (3.3 V, USB-to-serial adapter required)
|
|
||||||
|
|
||||||
### Default Network Configuration
|
|
||||||
|
|
||||||
Infix ships with the following factory defaults.
|
|
||||||
|
|
||||||
**Standard BPI-R4:**
|
|
||||||
|
|
||||||
- **LAN bridge** (`br0`, 192.168.0.1/24): `lan1`, `lan2`, `lan3` (1G switch ports)
|
|
||||||
- **WAN port** (`wan`): DHCP client, used for internet uplink (1G switch port)
|
|
||||||
- **SFP+ ports** (`sfp1`, `sfp2`): Present but unconfigured
|
|
||||||
|
|
||||||
**BPI-R4-2g5 and BPI-R4P:**
|
|
||||||
|
|
||||||
- **LAN bridge** (`br0`, 192.168.0.1/24): `lan0`, `lan1`, `lan2`, `lan3` (1G switch ports)
|
|
||||||
- **WAN port** (`wan`): DHCP client, used for internet uplink (2.5G internal PHY)
|
|
||||||
- **SFP+ port** (`sfp1`): Present but unconfigured
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> If an optional WiFi 7 (MT7996E) PCIe card is installed, the radio interfaces
|
|
||||||
> are bridged into the LAN as access points. WiFi is not included with the board
|
|
||||||
> and is not part of the factory default configuration.
|
|
||||||
|
|
||||||
## SIM Card Installation
|
|
||||||
|
|
||||||
The BPI-R4 has three SIM holders, one per PCIe slot:
|
|
||||||
|
|
||||||
| Slot | PCIe socket | Typical use |
|
|
||||||
|----------|-------------|--------------------------|
|
|
||||||
| **SIM1** | M.2 Key-B | 4G/5G WWAN modem |
|
|
||||||
| **SIM2** | mPCIe #1 | Cellular or other modem |
|
|
||||||
| **SIM3** | mPCIe #2 | Cellular or other modem |
|
|
||||||
|
|
||||||
All three take **nano-SIM (4FF)** cards.
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> The official Banana Pi pages show an older board revision with a sliding
|
|
||||||
> "sled" holder. Newer boards ship with a fixed friction-fit holder instead:
|
|
||||||
> there is no lid to lift and no spring eject. The [closest matching photo on
|
|
||||||
> bananapi.org][15] shows the current mechanism.
|
|
||||||
|
|
||||||
### Inserting a SIM
|
|
||||||
|
|
||||||
1. Orient the card with the gold contacts facing the PCB (printed
|
|
||||||
side up) and the cut corner pointing toward the M.2/mPCIe socket,
|
|
||||||
which on this board is also toward the outer edge. The silkscreen
|
|
||||||
next to each holder shows the same outline.
|
|
||||||
2. Push the SIM straight in until it is fully seated. There is no
|
|
||||||
click and the holder is not spring-loaded, so press firmly until
|
|
||||||
the contacts engage and the rear edge of the card sits flush with
|
|
||||||
the holder.
|
|
||||||
3. A SIM that still protrudes is not fully inserted; push again.
|
|
||||||
|
|
||||||
### Removing a SIM
|
|
||||||
|
|
||||||
The friction grip on these holders is tight. Gently pry the card out
|
|
||||||
with a fingernail or a thin plastic spudger. Avoid metal tweezers
|
|
||||||
near the contacts. Removing the front panel of the metal case is
|
|
||||||
absolutely necessary to access the SIM holder.
|
|
||||||
|
|
||||||
For software configuration once the modem is recognised, see the
|
|
||||||
[Cellular Modem User's Guide][16].
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
<img align="right" src="console-header.png" alt="Console header pins" width=200 padding=10>
|
|
||||||
|
|
||||||
### Quick Start with SD Card
|
|
||||||
|
|
||||||
1. **Download the SD card image:** [infix-bpi-r4-sdcard.img][2]
|
|
||||||
2. **Flash the image to an SD card:** see [this guide][0]
|
|
||||||
3. **Set boot switches to SD card mode** (see Boot Switch Reference below)
|
|
||||||
4. **Insert the SD card, connect power and a serial console (115200 8N1)**
|
|
||||||
5. Default login: `admin` / `admin`
|
|
||||||
|
|
||||||
### Boot Switch Reference
|
|
||||||
|
|
||||||
<img align="right" src="bootstrap-sw3.png" alt="DIP switches" width=140 padding=10>
|
|
||||||
|
|
||||||
The BPI-R4 has a 2-position DIP switch (SW3) that selects the boot media.
|
|
||||||
Switch positions are printed on the board near the SD card slot.
|
|
||||||
|
|
||||||
| A | B | Boot media (SW3) |
|
|
||||||
|-----|-----|------------------|
|
|
||||||
| OFF | ON | SPI NAND |
|
|
||||||
| ON | OFF | eMMC |
|
|
||||||
| ON | ON | SD card |
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> "OFF" = switch in the UP position = logical 0.
|
|
||||||
|
|
||||||
## Installing to eMMC
|
|
||||||
|
|
||||||
For production use or better reliability, install Infix to the internal
|
|
||||||
eMMC storage.
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> The MT7988A has a single MMC controller that can only operate in one mode
|
|
||||||
> (SD or eMMC) per boot session. The SD card U-Boot cannot switch to eMMC
|
|
||||||
> mode mid-session, so an intermediate NAND bootloader step is required to
|
|
||||||
> write the eMMC — the same approach as BPi-R3.
|
|
||||||
>
|
|
||||||
> The MT7988A boot chain is: **BROM → BL2 → FIP (BL31 + U-Boot)**. The FIP
|
|
||||||
> (Firmware Image Package) bundles ARM Trusted Firmware (BL31) and U-Boot
|
|
||||||
> together; it is not just a U-Boot binary. When BL2 runs, it loads the FIP
|
|
||||||
> from a fixed offset and hands off to BL31, which then jumps into U-Boot.
|
|
||||||
>
|
|
||||||
> The factory SPI NAND contains a minimal recovery U-Boot that only supports
|
|
||||||
> TFTP — it has no USB command. You cannot use it to load files from a USB
|
|
||||||
> drive. Similarly, the factory eMMC ships with a basic OpenWRT image.
|
|
||||||
> You must first flash a full-featured U-Boot (from Frank-W) to SPI NAND via
|
|
||||||
> the SD card U-Boot before you can write the eMMC.
|
|
||||||
>
|
|
||||||
> This process involves three boot mode changes and multiple flash operations.
|
|
||||||
> Take your time and verify each step carefully.
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
- USB-to-serial adapter (3.3 V) for console access
|
|
||||||
- USB flash drive (FAT32 formatted)
|
|
||||||
- microSD card with Infix SD image, for initial boot
|
|
||||||
- Downloaded files (see below)
|
|
||||||
|
|
||||||
### Required Files
|
|
||||||
|
|
||||||
Place these files on a FAT32-formatted USB drive:
|
|
||||||
|
|
||||||
1. **Infix eMMC image:** [infix-bpi-r4-emmc.img][3]
|
|
||||||
2. **eMMC bootloader** (from): [bpi-r4-emmc-boot-2026.01-latest.tar.gz][4]
|
|
||||||
- Extract `bl2.img` from the tarball to your USB drive
|
|
||||||
3. **Intermediate NAND bootloader** from Frank-W's U-Boot (for BPI-R4, SPI NAND):
|
|
||||||
- [bpi-r4_spim-nand_bl2.img][13] — BL2 first-stage loader
|
|
||||||
- [bpi-r4_spim-nand_fip.bin][14] — FIP image (BL31 + U-Boot)
|
|
||||||
|
|
||||||
### Step 1: Boot from SD card
|
|
||||||
|
|
||||||
1. Set boot switches to **SD card mode** (SW3: A=ON, B=ON)
|
|
||||||
2. Insert the SD card with the Infix image
|
|
||||||
3. Power on and break into U-Boot (press Ctrl-C during countdown)
|
|
||||||
|
|
||||||
### Step 2: Flash intermediate NAND bootloader
|
|
||||||
|
|
||||||
This installs a full-featured U-Boot to SPI NAND so the board can load files
|
|
||||||
from USB in the next step. From the SD card U-Boot prompt:
|
|
||||||
|
|
||||||
```
|
|
||||||
usb start
|
|
||||||
mtd erase spi-nand0
|
|
||||||
fatload usb 0:1 0x50000000 bpi-r4_spim-nand_bl2.img
|
|
||||||
mtd write spi-nand0 0x50000000 0x0 0x100000
|
|
||||||
fatload usb 0:1 0x50000000 bpi-r4_spim-nand_fip.bin
|
|
||||||
mtd write spi-nand0 0x50000000 0x580000 0x200000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 3: Boot from NAND
|
|
||||||
|
|
||||||
1. Power off the board
|
|
||||||
2. Set boot switches to **SPI NAND mode** (SW3: A=OFF, B=ON)
|
|
||||||
3. Power on — you should boot into U-Boot again
|
|
||||||
|
|
||||||
### Step 4: Write Infix image to eMMC
|
|
||||||
|
|
||||||
From the U-Boot prompt:
|
|
||||||
|
|
||||||
```
|
|
||||||
usb start
|
|
||||||
fatload usb 0:1 0x50000000 infix-bpi-r4-emmc.img
|
|
||||||
setexpr blocks ${filesize} / 0x200
|
|
||||||
mmc write 0x50000000 0x0 ${blocks}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 5: Configure eMMC boot partition
|
|
||||||
|
|
||||||
Write the BL2 bootloader to the eMMC boot partition:
|
|
||||||
|
|
||||||
```
|
|
||||||
mmc partconf 0 1 1 1
|
|
||||||
mmc erase 0x0 0x400
|
|
||||||
fatload usb 0:1 0x50000000 bl2.img
|
|
||||||
mmc write 0x50000000 0x0 0x400
|
|
||||||
mmc partconf 0 1 1 0
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 6: Boot from eMMC
|
|
||||||
|
|
||||||
1. Power off the board
|
|
||||||
2. Set boot switches to **eMMC mode** (SW3: A=ON, B=OFF)
|
|
||||||
3. Remove the SD card (optional, recommended to verify eMMC boot)
|
|
||||||
4. Power on
|
|
||||||
|
|
||||||
Your BPI-R4 should now boot Infix from internal eMMC storage.
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Board won't boot
|
|
||||||
|
|
||||||
- Verify boot switch positions — double-check against the wiki
|
|
||||||
- Ensure the power supply provides adequate current (12 V / 3 A recommended)
|
|
||||||
- Check the serial console output at 115200 8N1
|
|
||||||
|
|
||||||
### Can't break into U-Boot
|
|
||||||
|
|
||||||
- Connect the serial console before powering on
|
|
||||||
- Press Ctrl-C immediately when boot messages appear
|
|
||||||
- Try power cycling and pressing Ctrl-C repeatedly during the countdown
|
|
||||||
|
|
||||||
### eMMC boot fails after installation
|
|
||||||
|
|
||||||
- Boot from NAND (SW3=ON) and verify the eMMC write completed without errors
|
|
||||||
- Re-run the `mmc partconf` sequence — a missed step is the most common
|
|
||||||
cause of failure
|
|
||||||
- Use `mmc info` to confirm the eMMC is detected
|
|
||||||
|
|
||||||
### No network connectivity
|
|
||||||
|
|
||||||
The interface names on BPI-R4 differ from BPI-R3. Confirm what Linux
|
|
||||||
has created with `ip link` and compare with the factory configuration:
|
|
||||||
|
|
||||||
- `wan`, `lan1`–`lan3`: 1G switch ports (standard R4)
|
|
||||||
- `wan`, `lan0`–`lan3`: on R4-2g5/R4P, `wan` is the 2.5G internal PHY; `lan0`–`lan3` are 1G switch ports
|
|
||||||
- `sfp1` (and `sfp2` on standard R4): 10G SFP+ cage(s)
|
|
||||||
|
|
||||||
If interface renames look wrong, check `dmesg | grep renamed` and if
|
|
||||||
you spot any errors, please report as an issue to the Infix tracker
|
|
||||||
on GitHub.
|
|
||||||
|
|
||||||
## Board Variants
|
|
||||||
|
|
||||||
### BPI-R4
|
|
||||||
|
|
||||||
The base model BPi-R4 ports look like this, the `wan` port is the same physical
|
|
||||||
switch port as `lan0` on the R4-2g5/R4P, but here it serves as the WAN port in
|
|
||||||
the factory default configuration.
|
|
||||||
|
|
||||||
```
|
|
||||||
.-.
|
|
||||||
| | .-----.-----.-----.-----.
|
|
||||||
| | _______ _______ | | | | | .---.
|
|
||||||
| | | | | | | | | | | | | .-----.
|
|
||||||
'-' '-------' '-------' '-----'-----'-----'-----' '---' '-----'
|
|
||||||
USB1 sfp1 sfp2 wan lan1 lan2 lan3 DC12V PD20V
|
|
||||||
```
|
|
||||||
|
|
||||||
### BPI-R4-2g5 and BPI-R4P
|
|
||||||
|
|
||||||
These variants substitute one SFP+ cage for an internal 2.5 Gbps PHY
|
|
||||||
connected to a standard RJ45 jack. From a kernel perspective they use
|
|
||||||
the `mt7988a-bananapi-bpi-r4-2g5` device tree.
|
|
||||||
|
|
||||||
The BPI-R4P additionally supports an optional PoE input daughterboard on
|
|
||||||
the 2.5 Gbps RJ45 port. The PoE circuitry is passive with respect to
|
|
||||||
Linux — no special kernel driver is required for basic operation.
|
|
||||||
|
|
||||||
For these board variants, the WAN role moves to the dedicated 2.5G internal PHY,
|
|
||||||
so all four switch ports become LAN ports (`lan0`–`lan3`) instead of three:
|
|
||||||
|
|
||||||
```
|
|
||||||
.-.
|
|
||||||
| | .-----. .-----.-----.-----.-----.
|
|
||||||
| | _______ | | | | | | | .---.
|
|
||||||
| | | | | | | | | | | | | .-----.
|
|
||||||
'-' '-------' '-----' '-----'-----'-----'-----' '---' '-----'
|
|
||||||
USB1 sfp1 wan lan0 lan1 lan2 lan3 DC12V PD20V
|
|
||||||
```
|
|
||||||
|
|
||||||
### Selecting the Board Variant
|
|
||||||
|
|
||||||
U-Boot cannot automatically distinguish the standard R4 from the R4-2g5/R4P at
|
|
||||||
boot time (the on-board EEPROM is not programmed from factory). Instead, the
|
|
||||||
variant is read from the persistent U-Boot environment on the `aux` partition,
|
|
||||||
and you have to set it manually using `fw_setenv` from a UNIX shell:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# For BPI-R4-2g5 or BPI-R4P (1x SFP+ + 1x 2.5 Gbps RJ45):
|
|
||||||
sudo fw_setenv BOARD_VARIANT 2g5
|
|
||||||
|
|
||||||
# To revert to the standard BPI-R4 (2x SFP+) clear the setting:
|
|
||||||
sudo fw_setenv BOARD_VARIANT
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> The change takes effect on the next reboot. No re-flashing is required, but
|
|
||||||
> you may want to do a factory reset to activate the changes in your system
|
|
||||||
> `startup-config`: `sudo factory -y` from shell, or the CLI.
|
|
||||||
|
|
||||||
`fw_setenv` writes to the `uboot.env` file on the aux partition. U-Boot
|
|
||||||
reads this at every boot (before loading the kernel) and selects the
|
|
||||||
matching device tree:
|
|
||||||
|
|
||||||
| `BOARD_VARIANT` | Device tree loaded |
|
|
||||||
|-----------------|-----------------------------------|
|
|
||||||
| *(unset)* | `mt7988a-bananapi-bpi-r4.dtb` |
|
|
||||||
| `2g5` | `mt7988a-bananapi-bpi-r4-2g5.dtb` |
|
|
||||||
|
|
||||||
## Additional Resources
|
|
||||||
|
|
||||||
- [Infix Documentation][1]
|
|
||||||
- [Official BPI-R4 Page][7]
|
|
||||||
- [BPI-R4 Forum][8]
|
|
||||||
- [Frank-W's site][9]
|
|
||||||
- [Release Downloads][10]
|
|
||||||
- [Bootloader Builds][11]
|
|
||||||
|
|
||||||
## Building Custom Images
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build bootloaders for SD and eMMC
|
|
||||||
make x-bpi-r4-sd-boot
|
|
||||||
make x-bpi-r4-emmc-boot
|
|
||||||
|
|
||||||
# Build main system
|
|
||||||
make aarch64
|
|
||||||
|
|
||||||
# Create SD card image
|
|
||||||
./utils/mkimage.sh -od bananapi-bpi-r4
|
|
||||||
|
|
||||||
# Create eMMC image
|
|
||||||
./utils/mkimage.sh -odt emmc bananapi-bpi-r4
|
|
||||||
```
|
|
||||||
|
|
||||||
[0]: https://www.kernelkit.org/posts/flashing-sdcard/
|
|
||||||
[1]: https://www.kernelkit.org/infix/latest/
|
|
||||||
[2]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r4-sdcard.img
|
|
||||||
[3]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r4-emmc.img
|
|
||||||
[4]: https://github.com/kernelkit/infix/releases/download/latest-boot/bpi-r4-emmc-boot-2026.01-latest.tar.gz
|
|
||||||
[7]: https://docs.banana-pi.org/en/BPI-R4/BananaPi_BPI-R4
|
|
||||||
[8]: https://forum.banana-pi.org/
|
|
||||||
[9]: https://wiki.fw-web.de/doku.php?id=en:bpi-r4:start
|
|
||||||
[10]: https://github.com/kernelkit/infix/releases/tag/latest
|
|
||||||
[11]: https://github.com/kernelkit/infix/releases/tag/latest-boot
|
|
||||||
[12]: https://github.com/frank-w/u-boot/releases
|
|
||||||
[13]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2026-01-bpi-2026.01-2026-01-15_2013/bpi-r4_spim-nand_bl2.img
|
|
||||||
[14]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2026-01-bpi-2026.01-2026-01-15_2013/bpi-r4_spim-nand_fip.bin
|
|
||||||
[15]: https://docs.banana-pi.org/bpi-r4/bpi-r4_4g5g_2.jpg
|
|
||||||
[16]: https://www.kernelkit.org/infix/latest/modem/
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 92 KiB |
@@ -1,2 +0,0 @@
|
|||||||
# Locally calculated
|
|
||||||
sha256 d48246c717b505cc11df95171f2fd548b389e1a463f1af4c68d0b69fe0d1009b LICENSE
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
define BANANAPI_BPI_R4_LINUX_CONFIG_FIXUPS
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_MEDIATEK)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MACH_MT7988)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_PINCTRL_MT7988)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_MT6577)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_I2C_GPIO,y)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MTK_THERMAL,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MTK_LVTS_THERMAL,m)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_UART)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_WATCHDOG)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_GE_PHY)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_GE_SOC_PHY)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_MEDIATEK)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_MEDIATEK_SOC)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_NET_DSA_MT7530,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MT7996E,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PCIE_MEDIATEK_GEN3,m)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_SCPSYS)
|
|
||||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_MTK)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_I2C_MT65XX,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_USB_XHCI_MTK,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PHY_MTK_TPHY,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PHY_MTK_XSPHY,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PHY_MTK_XFI_TPHY,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PCS_STANDALONE,y)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PCS_MTK_USXGMII,y)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_PWM_MEDIATEK,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_SENSORS_PWM_FAN,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_NVMEM_MTK_EFUSE,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_MEDIATEK_2P5GE_PHY,m)
|
|
||||||
$(call KCONFIG_SET_OPT,CONFIG_CRYPTO_DEV_SAFEXCEL,m)
|
|
||||||
endef
|
|
||||||
|
|
||||||
LINUX_DTS_MT7988 = $(LINUX_DIR)/arch/arm64/boot/dts/mediatek
|
|
||||||
|
|
||||||
define BANANAPI_BPI_R4_KERNEL_DTBS_INSTALL_TARGET
|
|
||||||
@$(call MESSAGE,"Installing kernel DTBs and DTBOs for BPI-R4")
|
|
||||||
$(foreach f, \
|
|
||||||
mt7988a-bananapi-bpi-r4.dtb \
|
|
||||||
mt7988a-bananapi-bpi-r4-2g5.dtb \
|
|
||||||
mt7988a-bananapi-bpi-r4-sd.dtbo \
|
|
||||||
mt7988a-bananapi-bpi-r4-emmc.dtbo, \
|
|
||||||
$(INSTALL) -D $(LINUX_DTS_MT7988)/$(f) \
|
|
||||||
$(TARGET_DIR)/boot/mediatek/$(f)$(sep))
|
|
||||||
endef
|
|
||||||
BANANAPI_BPI_R4_POST_INSTALL_TARGET_HOOKS += BANANAPI_BPI_R4_KERNEL_DTBS_INSTALL_TARGET
|
|
||||||
|
|
||||||
$(eval $(ix-board))
|
|
||||||
$(eval $(generic-package))
|
|
||||||
|
Before Width: | Height: | Size: 348 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 282 KiB |
@@ -1,2 +0,0 @@
|
|||||||
dtb-y += infix/bananapi,bpi-r4.dtbo
|
|
||||||
dtb-y += infix/bananapi,bpi-r4-2g5.dtbo
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
|
||||||
/dts-v1/;
|
|
||||||
/plugin/;
|
|
||||||
|
|
||||||
/ {
|
|
||||||
compatible = "bananapi,bpi-r4-2g5";
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On the 2g5 variant, GMAC1 uses the internal 2.5G PHY (eth1 renamed to
|
|
||||||
* "wan" by udev). The switch's port0, which is labeled "wan" in the base
|
|
||||||
* DTS, would cause a name collision when the switch driver registers it.
|
|
||||||
* Rename it to "lan0" here so the kernel names it correctly from the start.
|
|
||||||
*/
|
|
||||||
&gsw_port0 {
|
|
||||||
label = "lan0";
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The upstream mt7988a.dtsi sets compatible = "ethernet-phy-ieee802.3-c45"
|
|
||||||
* on the internal 2.5G PHY node. That gives genphy_c45 (built-in) OF-match
|
|
||||||
* priority over the PHY-ID-based mtk-2p5ge driver, leaving the PHY powered
|
|
||||||
* down and unclaimed. Replace it with the standard ethernet-phy-idXXXX.XXXX
|
|
||||||
* form so of_get_phy_id() registers the PHY as C22 with explicit ID 0x00339c11.
|
|
||||||
* mtk-2p5ge then matches via PHY_ID_MATCH_VENDOR(0x00339c00) instead of
|
|
||||||
* genphy_c45 winning via OF-match.
|
|
||||||
* Note: /delete-property/ is not used because U-Boot fdt apply does not
|
|
||||||
* implement property deletion in overlays.
|
|
||||||
*/
|
|
||||||
&int_2p5g_phy {
|
|
||||||
compatible = "ethernet-phy-id0033.9c11";
|
|
||||||
};
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
|
||||||
/dts-v1/;
|
|
||||||
/plugin/;
|
|
||||||
|
|
||||||
/ {
|
|
||||||
compatible = "bananapi,bpi-r4", "mediatek,mt7988a";
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The upstream mt7988a-bananapi-bpi-r4.dtsi sets stdout-path = "serial0:..."
|
|
||||||
* but the aliases node there only has ethernet entries. Linux resolves
|
|
||||||
* stdout-path by looking in /aliases, so we must add serial0 here.
|
|
||||||
* Path references in overlay aliases cannot use &label, so use the full path.
|
|
||||||
*/
|
|
||||||
&{/} {
|
|
||||||
aliases {
|
|
||||||
serial0 = "/soc/serial@11000000";
|
|
||||||
};
|
|
||||||
|
|
||||||
chosen {
|
|
||||||
infix {
|
|
||||||
/* Default admin user password: 'admin' */
|
|
||||||
factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A";
|
|
||||||
usb-ports = <&ssusb1>;
|
|
||||||
usb-port-names = "USB";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
image cfg.ext4 {
|
|
||||||
empty = true
|
|
||||||
temporary = true
|
|
||||||
size = 128M
|
|
||||||
ext4 {
|
|
||||||
label = "cfg"
|
|
||||||
use-mke2fs = true
|
|
||||||
features = "uninit_bg"
|
|
||||||
extraargs = "-m 0 -i 4096"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# The /var partition will be expanded automatically at first boot
|
|
||||||
# to use the full size of the SD-card or eMMC media.
|
|
||||||
image var.ext4 {
|
|
||||||
empty = true
|
|
||||||
temporary = true
|
|
||||||
size = 128M
|
|
||||||
ext4 {
|
|
||||||
label = "var"
|
|
||||||
use-mke2fs = true
|
|
||||||
features = "uninit_bg"
|
|
||||||
extraargs = "-m 0 -i 4096"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
image #INFIX_ID##VERSION#-bpi-r4-#TARGET#.img {
|
|
||||||
hdimage {
|
|
||||||
partition-table-type = "gpt"
|
|
||||||
gpt-no-backup = true
|
|
||||||
}
|
|
||||||
# BL2 bootloader partition (MediaTek official location)
|
|
||||||
partition bl2 {
|
|
||||||
image = "bl2.img"
|
|
||||||
offset = 1024s # 0x80000 = sector 1024
|
|
||||||
size = 4M # 0x400000
|
|
||||||
bootable = true
|
|
||||||
}
|
|
||||||
|
|
||||||
# Factory/calibration data (sectors 9216-13311)
|
|
||||||
partition factory {
|
|
||||||
offset = 4608K # 0x480000
|
|
||||||
size = 2M # 0x200000
|
|
||||||
}
|
|
||||||
|
|
||||||
# FIP partition - BL31 + U-Boot (sectors 13312-17407)
|
|
||||||
partition fip {
|
|
||||||
image = "fip.bin"
|
|
||||||
offset = 13312s
|
|
||||||
size = 4096s
|
|
||||||
}
|
|
||||||
|
|
||||||
partition aux {
|
|
||||||
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
|
|
||||||
image = "aux.ext4"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition primary {
|
|
||||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
|
||||||
bootable = true
|
|
||||||
size = 250M
|
|
||||||
image = "rootfs.squashfs"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition secondary {
|
|
||||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
|
||||||
bootable = true
|
|
||||||
size = 250M
|
|
||||||
image = "rootfs.squashfs"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition cfg {
|
|
||||||
partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105
|
|
||||||
image = "cfg.ext4"
|
|
||||||
}
|
|
||||||
|
|
||||||
partition var {
|
|
||||||
partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F
|
|
||||||
image = "var.ext4"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
label Infix (aarch64)
|
|
||||||
kernel /boot/Image
|
|
||||||
fdtdir /boot
|
|
||||||
fdtoverlays /boot/mediatek/mt7988a-bananapi-bpi-r4-emmc.dtbo /boot/infix/bananapi,bpi-r4.dtbo /boot/infix/bananapi,bpi-r4-2g5.dtbo
|
|
||||||
append ${bootargs_root} ${bootargs_log} usbcore.authorized_default=2 -- ${bootargs_user}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
label Infix (aarch64)
|
|
||||||
kernel /boot/Image
|
|
||||||
fdtdir /boot
|
|
||||||
fdtoverlays /boot/mediatek/mt7988a-bananapi-bpi-r4-sd.dtbo /boot/infix/bananapi,bpi-r4.dtbo /boot/infix/bananapi,bpi-r4-2g5.dtbo
|
|
||||||
append ${bootargs_root} ${bootargs_log} usbcore.authorized_default=2 -- ${bootargs_user}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
label Infix (aarch64)
|
|
||||||
kernel /boot/Image
|
|
||||||
fdtdir /boot
|
|
||||||
fdtoverlays /boot/mediatek/mt7988a-bananapi-bpi-r4-emmc.dtbo /boot/infix/bananapi,bpi-r4.dtbo
|
|
||||||
append ${bootargs_root} ${bootargs_log} usbcore.authorized_default=2 -- ${bootargs_user}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
label Infix (aarch64)
|
|
||||||
kernel /boot/Image
|
|
||||||
fdtdir /boot
|
|
||||||
fdtoverlays /boot/mediatek/mt7988a-bananapi-bpi-r4-sd.dtbo /boot/infix/bananapi,bpi-r4.dtbo
|
|
||||||
append ${bootargs_root} ${bootargs_log} usbcore.authorized_default=2 -- ${bootargs_user}
|
|
||||||
@@ -1,411 +0,0 @@
|
|||||||
{
|
|
||||||
"ieee802-dot1ab-lldp:lldp": {
|
|
||||||
"infix-lldp:enabled": true
|
|
||||||
},
|
|
||||||
"ietf-hardware:hardware": {
|
|
||||||
"component": [
|
|
||||||
{
|
|
||||||
"name": "USB",
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "USB2",
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-interfaces:interfaces": {
|
|
||||||
"interface": [
|
|
||||||
{
|
|
||||||
"name": "br0",
|
|
||||||
"type": "infix-if-type:bridge",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "192.168.0.1",
|
|
||||||
"prefix-length": 24
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan0",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan1",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan2",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan3",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lo",
|
|
||||||
"type": "infix-if-type:loopback",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "127.0.0.1",
|
|
||||||
"prefix-length": 8
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "::1",
|
|
||||||
"prefix-length": 128
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"infix-dhcp-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "broadcast"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "hostname",
|
|
||||||
"value": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "netmask"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "vendor-class",
|
|
||||||
"value": "Banana Pi BPI-R4"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"infix-dhcpv6-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "client-fqdn"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain-search"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-keystore:keystore": {
|
|
||||||
"asymmetric-keys": {
|
|
||||||
"asymmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "genkey",
|
|
||||||
"public-key-format": "infix-crypto-types:ssh-public-key-format",
|
|
||||||
"public-key": "",
|
|
||||||
"private-key-format": "infix-crypto-types:rsa-private-key-format",
|
|
||||||
"cleartext-private-key": "",
|
|
||||||
"certificates": {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-netconf-acm:nacm": {
|
|
||||||
"enable-nacm": true,
|
|
||||||
"read-default": "permit",
|
|
||||||
"write-default": "permit",
|
|
||||||
"exec-default": "permit",
|
|
||||||
"groups": {
|
|
||||||
"group": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"user-name": [
|
|
||||||
"admin"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator",
|
|
||||||
"user-name": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest",
|
|
||||||
"user-name": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"rule-list": [
|
|
||||||
{
|
|
||||||
"name": "admin-acl",
|
|
||||||
"group": [
|
|
||||||
"admin"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-all",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Allow 'admin' group complete access to all operations and data."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator-acl",
|
|
||||||
"group": [
|
|
||||||
"operator"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-system-rpcs",
|
|
||||||
"module-name": "ietf-system",
|
|
||||||
"rpc-name": "*",
|
|
||||||
"access-operations": "exec",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Operators can reboot, shutdown, and set system time."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest-acl",
|
|
||||||
"group": [
|
|
||||||
"guest"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-all-write+exec",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "create update delete exec",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "Guests cannot change anything or exec rpcs."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "default-deny-all",
|
|
||||||
"group": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-password-access",
|
|
||||||
"path": "/ietf-system:system/authentication/user/password",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access password hashes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-keystore-access",
|
|
||||||
"module-name": "ietf-keystore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access cryptographic keys."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-truststore-access",
|
|
||||||
"module-name": "ietf-truststore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access trust store."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-netconf-server:netconf-server": {
|
|
||||||
"listen": {
|
|
||||||
"endpoints": {
|
|
||||||
"endpoint": [
|
|
||||||
{
|
|
||||||
"name": "default-ssh",
|
|
||||||
"ssh": {
|
|
||||||
"tcp-server-parameters": {
|
|
||||||
"local-bind": [
|
|
||||||
{
|
|
||||||
"local-address": "::"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ssh-server-parameters": {
|
|
||||||
"server-identity": {
|
|
||||||
"host-key": [
|
|
||||||
{
|
|
||||||
"name": "default-key",
|
|
||||||
"public-key": {
|
|
||||||
"central-keystore-reference": "genkey"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-system:system": {
|
|
||||||
"hostname": "bpi-%m",
|
|
||||||
"ntp": {
|
|
||||||
"server": [
|
|
||||||
{
|
|
||||||
"name": "default",
|
|
||||||
"udp": {
|
|
||||||
"address": "pool.ntp.org"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"authentication": {
|
|
||||||
"user": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"password": "$factory$",
|
|
||||||
"infix-system:shell": "bash"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
|
|
||||||
},
|
|
||||||
"infix-dhcp-server:dhcp-server": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router",
|
|
||||||
"address": "auto"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"subnet": [
|
|
||||||
{
|
|
||||||
"subnet": "192.168.0.0/24",
|
|
||||||
"pool": {
|
|
||||||
"start-address": "192.168.0.100",
|
|
||||||
"end-address": "192.168.0.250"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-firewall:firewall": {
|
|
||||||
"default": "wan",
|
|
||||||
"zone": [
|
|
||||||
{
|
|
||||||
"name": "lan",
|
|
||||||
"action": "accept",
|
|
||||||
"interface": [
|
|
||||||
"br0"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"action": "drop",
|
|
||||||
"interface": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"service": [
|
|
||||||
"dhcpv6-client"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"policy": [
|
|
||||||
{
|
|
||||||
"name": "lan-to-wan",
|
|
||||||
"action": "accept",
|
|
||||||
"ingress": [
|
|
||||||
"lan"
|
|
||||||
],
|
|
||||||
"egress": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"masquerade": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-meta:meta": {
|
|
||||||
"version": "1.8"
|
|
||||||
},
|
|
||||||
"infix-services:mdns": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"infix-services:ssh": {
|
|
||||||
"enabled": true,
|
|
||||||
"hostkey": [
|
|
||||||
"genkey"
|
|
||||||
],
|
|
||||||
"listen": [
|
|
||||||
{
|
|
||||||
"name": "ipv4",
|
|
||||||
"address": "0.0.0.0",
|
|
||||||
"port": 22
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ipv6",
|
|
||||||
"address": "::",
|
|
||||||
"port": 22
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-services:web": {
|
|
||||||
"enabled": true,
|
|
||||||
"console": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"netbrowse": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"restconf": {
|
|
||||||
"enabled": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# The mtk-2p5ge PHY driver uses MDIO PHY ID matching, not OF compatible
|
|
||||||
# matching. udev auto-loading is based on MODALIAS, which for DT-described
|
|
||||||
# devices is "of:N...C<compatible>" — a format that never matches the driver's
|
|
||||||
# "mdio:..." module alias. Match on OF_COMPATIBLE_0 explicitly instead.
|
|
||||||
ACTION=="add", SUBSYSTEM=="mdio_bus", ENV{OF_COMPATIBLE_0}=="ethernet-phy-id0033.9c11", RUN+="/sbin/modprobe -b mtk-2p5ge"
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth1", NAME="wan"
|
|
||||||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth2", NAME="sfp1"
|
|
||||||
@@ -1,403 +0,0 @@
|
|||||||
{
|
|
||||||
"ieee802-dot1ab-lldp:lldp": {
|
|
||||||
"infix-lldp:enabled": true
|
|
||||||
},
|
|
||||||
"ietf-hardware:hardware": {
|
|
||||||
"component": [
|
|
||||||
{
|
|
||||||
"name": "USB",
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "USB2",
|
|
||||||
"class": "infix-hardware:usb",
|
|
||||||
"state": {
|
|
||||||
"admin-state": "unlocked"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-interfaces:interfaces": {
|
|
||||||
"interface": [
|
|
||||||
{
|
|
||||||
"name": "br0",
|
|
||||||
"type": "infix-if-type:bridge",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "192.168.0.1",
|
|
||||||
"prefix-length": 24
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan1",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan2",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lan3",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv6": {},
|
|
||||||
"infix-interfaces:bridge-port": {
|
|
||||||
"bridge": "br0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lo",
|
|
||||||
"type": "infix-if-type:loopback",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "127.0.0.1",
|
|
||||||
"prefix-length": 8
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"address": [
|
|
||||||
{
|
|
||||||
"ip": "::1",
|
|
||||||
"prefix-length": 128
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"type": "infix-if-type:ethernet",
|
|
||||||
"ietf-ip:ipv4": {
|
|
||||||
"infix-dhcp-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "broadcast"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "hostname",
|
|
||||||
"value": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "netmask"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "vendor-class",
|
|
||||||
"value": "Banana Pi BPI-R4"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-ip:ipv6": {
|
|
||||||
"infix-dhcpv6-client:dhcp": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "client-fqdn"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "domain-search"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-keystore:keystore": {
|
|
||||||
"asymmetric-keys": {
|
|
||||||
"asymmetric-key": [
|
|
||||||
{
|
|
||||||
"name": "genkey",
|
|
||||||
"public-key-format": "infix-crypto-types:ssh-public-key-format",
|
|
||||||
"public-key": "",
|
|
||||||
"private-key-format": "infix-crypto-types:rsa-private-key-format",
|
|
||||||
"cleartext-private-key": "",
|
|
||||||
"certificates": {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-netconf-acm:nacm": {
|
|
||||||
"enable-nacm": true,
|
|
||||||
"read-default": "permit",
|
|
||||||
"write-default": "permit",
|
|
||||||
"exec-default": "permit",
|
|
||||||
"groups": {
|
|
||||||
"group": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"user-name": [
|
|
||||||
"admin"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator",
|
|
||||||
"user-name": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest",
|
|
||||||
"user-name": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"rule-list": [
|
|
||||||
{
|
|
||||||
"name": "admin-acl",
|
|
||||||
"group": [
|
|
||||||
"admin"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-all",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Allow 'admin' group complete access to all operations and data."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "operator-acl",
|
|
||||||
"group": [
|
|
||||||
"operator"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "permit-system-rpcs",
|
|
||||||
"module-name": "ietf-system",
|
|
||||||
"rpc-name": "*",
|
|
||||||
"access-operations": "exec",
|
|
||||||
"action": "permit",
|
|
||||||
"comment": "Operators can reboot, shutdown, and set system time."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "guest-acl",
|
|
||||||
"group": [
|
|
||||||
"guest"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-all-write+exec",
|
|
||||||
"module-name": "*",
|
|
||||||
"access-operations": "create update delete exec",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "Guests cannot change anything or exec rpcs."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "default-deny-all",
|
|
||||||
"group": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"rule": [
|
|
||||||
{
|
|
||||||
"name": "deny-password-access",
|
|
||||||
"path": "/ietf-system:system/authentication/user/password",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access password hashes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-keystore-access",
|
|
||||||
"module-name": "ietf-keystore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access cryptographic keys."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "deny-truststore-access",
|
|
||||||
"module-name": "ietf-truststore",
|
|
||||||
"access-operations": "*",
|
|
||||||
"action": "deny",
|
|
||||||
"comment": "No user except admins can access trust store."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ietf-netconf-server:netconf-server": {
|
|
||||||
"listen": {
|
|
||||||
"endpoints": {
|
|
||||||
"endpoint": [
|
|
||||||
{
|
|
||||||
"name": "default-ssh",
|
|
||||||
"ssh": {
|
|
||||||
"tcp-server-parameters": {
|
|
||||||
"local-bind": [
|
|
||||||
{
|
|
||||||
"local-address": "::"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ssh-server-parameters": {
|
|
||||||
"server-identity": {
|
|
||||||
"host-key": [
|
|
||||||
{
|
|
||||||
"name": "default-key",
|
|
||||||
"public-key": {
|
|
||||||
"central-keystore-reference": "genkey"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ietf-system:system": {
|
|
||||||
"hostname": "bpi-%m",
|
|
||||||
"ntp": {
|
|
||||||
"server": [
|
|
||||||
{
|
|
||||||
"name": "default",
|
|
||||||
"udp": {
|
|
||||||
"address": "pool.ntp.org"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"authentication": {
|
|
||||||
"user": [
|
|
||||||
{
|
|
||||||
"name": "admin",
|
|
||||||
"password": "$factory$",
|
|
||||||
"infix-system:shell": "bash"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
|
|
||||||
},
|
|
||||||
"infix-dhcp-server:dhcp-server": {
|
|
||||||
"option": [
|
|
||||||
{
|
|
||||||
"id": "ntp-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dns-server",
|
|
||||||
"address": "auto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "router",
|
|
||||||
"address": "auto"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"subnet": [
|
|
||||||
{
|
|
||||||
"subnet": "192.168.0.0/24",
|
|
||||||
"pool": {
|
|
||||||
"start-address": "192.168.0.100",
|
|
||||||
"end-address": "192.168.0.250"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-firewall:firewall": {
|
|
||||||
"default": "wan",
|
|
||||||
"zone": [
|
|
||||||
{
|
|
||||||
"name": "lan",
|
|
||||||
"action": "accept",
|
|
||||||
"interface": [
|
|
||||||
"br0"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wan",
|
|
||||||
"action": "drop",
|
|
||||||
"interface": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"service": [
|
|
||||||
"dhcpv6-client"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"policy": [
|
|
||||||
{
|
|
||||||
"name": "lan-to-wan",
|
|
||||||
"action": "accept",
|
|
||||||
"ingress": [
|
|
||||||
"lan"
|
|
||||||
],
|
|
||||||
"egress": [
|
|
||||||
"wan"
|
|
||||||
],
|
|
||||||
"masquerade": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-meta:meta": {
|
|
||||||
"version": "1.8"
|
|
||||||
},
|
|
||||||
"infix-services:mdns": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"infix-services:ssh": {
|
|
||||||
"enabled": true,
|
|
||||||
"hostkey": [
|
|
||||||
"genkey"
|
|
||||||
],
|
|
||||||
"listen": [
|
|
||||||
{
|
|
||||||
"name": "ipv4",
|
|
||||||
"address": "0.0.0.0",
|
|
||||||
"port": 22
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ipv6",
|
|
||||||
"address": "::",
|
|
||||||
"port": 22
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"infix-services:web": {
|
|
||||||
"enabled": true,
|
|
||||||
"console": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"netbrowse": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"restconf": {
|
|
||||||
"enabled": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||