{"id":13427732,"url":"https://github.com/olofk/serv","last_synced_at":"2026-02-25T06:36:08.144Z","repository":{"id":33704179,"uuid":"155514739","full_name":"olofk/serv","owner":"olofk","description":"SERV - The SErial RISC-V CPU","archived":false,"fork":false,"pushed_at":"2026-02-12T20:00:51.000Z","size":13102,"stargazers_count":1751,"open_issues_count":32,"forks_count":244,"subscribers_count":43,"default_branch":"main","last_synced_at":"2026-02-13T03:51:19.597Z","etag":null,"topics":["asic","fpga","risc-v","verilog"],"latest_commit_sha":null,"homepage":"","language":"Verilog","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/olofk.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-10-31T07:15:00.000Z","updated_at":"2026-02-12T20:01:22.000Z","dependencies_parsed_at":"2026-02-12T22:04:51.707Z","dependency_job_id":null,"html_url":"https://github.com/olofk/serv","commit_stats":{"total_commits":393,"total_committers":35,"mean_commits":"11.228571428571428","dds":0.1628498727735369,"last_synced_commit":"ed4b8198ac4950cd36239af0b1326848eb7707c1"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/olofk/serv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olofk%2Fserv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olofk%2Fserv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olofk%2Fserv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olofk%2Fserv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/olofk","download_url":"https://codeload.github.com/olofk/serv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olofk%2Fserv/sbom","scorecard":{"id":705594,"data":{"date":"2025-08-11","repo":{"name":"github.com/olofk/serv","commit":"c45b427929cc6cdc2c2702100a870b270cdb1faf"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":1,"reason":"Found 4/30 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/formal.yml:1","Warn: no topLevel permission defined: .github/workflows/lint.yml:1","Warn: no topLevel permission defined: .github/workflows/openlane.yml:1","Warn: no topLevel permission defined: .github/workflows/pages.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/formal.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/formal.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/formal.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/formal.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/formal.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/formal.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/openlane.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/openlane.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/openlane.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/openlane.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pages.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/pages.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pages.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/pages.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pages.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/olofk/serv/pages.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:18","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:19","Warn: pipCommand not pinned by hash: .github/workflows/lint.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/openlane.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/pages.yml:19","Warn: pipCommand not pinned by hash: .github/workflows/pages.yml:20","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   6 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: ISC License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T06:27:25.947Z","repository_id":33704179,"created_at":"2025-08-22T06:27:25.948Z","updated_at":"2025-08-22T06:27:25.948Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29812618,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T05:36:42.804Z","status":"ssl_error","status_checked_at":"2026-02-25T05:36:31.934Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asic","fpga","risc-v","verilog"],"created_at":"2024-07-31T01:00:39.470Z","updated_at":"2026-02-25T06:36:08.139Z","avatar_url":"https://github.com/olofk.png","language":"Verilog","funding_links":[],"categories":["Opensource ядра на базе RISC-V","Verilog","CPU cores","Cores","CPUs","Open Source Implementations","CPU RISC-V","Open Source implementations","Applications","Open Source Core Implementations"],"sub_categories":["Industry","Cores","网络服务_其他"],"readme":"\u003cimg align=\"right\" src=\"https://svg.wavedrom.com/{signal:[{wave:'0.P...'},{wave:'023450',data:'S E R V'}]}\"/\u003e\n\n# SERV\n\n[![Join the chat at https://gitter.im/librecores/serv](https://badges.gitter.im/librecores/serv.svg)](https://gitter.im/librecores/serv?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n[![Compliance tests](https://github.com/olofk/serv/actions/workflows/ci.yml/badge.svg)](https://github.com/olofk/serv/actions/workflows/ci.yml)\n[![Documentation Status](https://readthedocs.org/projects/serv/badge/?version=latest)](https://serv.readthedocs.io/en/latest/?badge=latest)\n\nSERV is an award-winning bit-serial RISC-V core\n\nIn fact, the award-winning SERV is the world's smallest RISC-V CPU. It's the perfect companion whenever you need a bit of computation and silicon real estate is at a premium.\n\nHow small is it then? Synthesizing the latest version of SERV in its most minimal form, yields the following results for some popular FPGA architectures and a typical CMOS process.\n\n| Lattice iCE40 | Intel Cyclone 10LP | AMD Artix-7 | CMOS   |\n| ------------- | ------------------ | ----------- | ------ |\n| 198 LUT       | 239 LUT            | 125 LUT     | 2.1kGE |\n| 164 FF        | 164 FF             | 164 FF      |        |\n\n\nIf you want to know more about SERV, what a bit-serial CPU is and what it's good for, I recommend starting out by watching the fantastic short SERV movies\n* [introduction to SERV](https://www.award-winning.me/serv-introduction/)\n* [SERV : RISC-V for a fistful of gates](https://www.award-winning.me/serv-for-a-fistful-of-gates/)\n* [SERV: 32-bit is the New 8-bit](https://www.award-winning.me/serv-32-bit-is-the-new-8-bit/)\n* [Bit by bit - How to fit 8 RISC V cores in a $38 FPGA board (presentation from the Zürich 2019 RISC-V workshop)](https://www.youtube.com/watch?v=xjIxORBRaeQ)\n\nAll SERV videos and more can also be found [here](https://www.award-winning.me/videos/).\n\nApart from being the world's smallest RISC-V CPU, SERV also aims at being the best documented RISC-V CPU. For this there is an official [SERV user manual](https://serv.readthedocs.io/en/latest/#) with block diagrams that are correct to the gate-level, cycle-accurate timing diagrams and an in-depth description of how things work.\n\nSERV is open source released under the ISC license. If you need a commercial license with patent grants, professional paid support or added features, please contact \u003colof@award-winning.me\u003e\n\n## Systems using SERV\n\nSERV can be easily integrated into any design, but if you are looking at just quickly trying it out, here is a list of some systems that are already using SERV:\n\n[Servant](https://serv.readthedocs.io/en/latest/servant.html) is the reference platform for SERV. It is a very basic SoC that contains just enough to run Zephyr RTOS. Servant is intended for FPGAs and has been ported to around 20 different FPGA boards. It is also used to run the RISC-V regression test suite.\n\n[CoreScore](https://corescore.store/) is an award-giving benchmark for FPGAs and their synthesis/P\u0026R tools. It tests how many SERV cores that can be put into a particular FPGA.\n\n[Observer](https://github.com/olofk/observer) is a configurable and software-programmable sensor aggregation platform for heterogeneous sensors.\n\n[Subservient](https://github.com/olofk/subservient/) is a small technology-independent SERV-based SoC intended for ASIC implementations together with a single-port SRAM.\n\n[Litex](https://github.com/enjoy-digital/litex) is a Python-based framework for creating FPGA SoCs. SERV is one of the 30+ supported cores. A Litex-generated SoC has been used to run DooM on SERV.\n\n\n\n\n## Getting started\n\n:o: Create a directory to keep all the different parts of the project together.\n        \n        $ mkdir servWorkspace\n        $ cd servWorkspace\n\n- Create and export an environment variable, WORKSPACE, for easy reference to that directory:\n\n        $ export WORKSPACE=$(pwd)\n\nEach of the following commands should be run from the workspace directory:\n\n- Install FuseSoC\n\n        $ pip install fusesoc\n- Add the FuseSoC standard library \n\n        $ fusesoc library add fusesoc_cores https://github.com/fusesoc/fusesoc-cores\n  \n- The FuseSoC standard library already contain a version of SERV, but if we want to make changes to SERV, run the bundled example or use the Zephyr support, it is better to add SERV as a separate library into the workspace\n\n        $ fusesoc library add serv https://github.com/olofk/serv\n\n:blue_book: The SERV repo will now be available in `$WORKSPACE/fusesoc_libraries/serv`. We will refer to that directory as `$SERV`.\n- Create and export its environment variable\n\n        $ export SERV=\"$WORKSPACE/fusesoc_libraries/serv\"\n    \n- Install the latest version of [Verilator](https://www.veripool.org/wiki/verilator)\n- (Optional) To support RISC-V M extension, Multiplication and Division unit (MDU) can be included in SERV as a separate library.\n\n        $ fusesoc library add mdu https://github.com/zeeshanrafique23/mdu\n    MDU will be available in `$WORKSPACE/fusesoc_libraries/mdu`\n  \n\n:green_book: We are now ready to do our first exercises with SERV. If everything above is done correctly, we can use Verilator as a linter to check the SERV source code.\n\n    $ fusesoc run --target=lint serv\n\nIf everything worked, the output should look like\n\n    INFO: Preparing award-winning:serv:serv:1.4.0\n    INFO: Setting up project\n\n    INFO: Building simulation model\n    INFO: Running\n\nAfter performing all the steps that are mentioned above, the directory structure from the `$WORKSPACE` should look like this:\n\n    .\n    $WORKSPACE\n    |\n    ├── build\n    │   └── ...\n    ├── fusesoc.conf\n    └── fusesoc_libraries\n        ├── fusesoc_cores\n        │   └── ...\n        ├── mdu\n        │   └── ...\n        └── serv\n            └── ...\n\n\n## Running pre-built test software\n\nBuild and run the single threaded zephyr hello world example with verilator (should be stopped with Ctrl-C):\n\n    fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/sw/zephyr_hello.hex\n\n..or... the multithreaded version\n\n    fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/sw/zephyr_hello_mt.hex --memsize=16384\n\nBoth should yield an output ending with\n\n    ***** Booting Zephyr OS zephyr-v1.14.1-4-gc7c2d62513fe *****\n    Hello World! service\n\nFor a more advanced example, we can also run the Dining philosophers demo\n\n    fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/sw/zephyr_phil.hex --memsize=32768\n\n...or... the synchronization example\n\n    fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/sw/zephyr_sync.hex --memsize=16384\n\n...or... the blinky example (note that the ```uart_baudrate``` should not be defined for the blinky test)\n\n    fusesoc run --target=verilator_tb servant --firmware=$SERV/sw/blinky.hex --memsize=16384\n\n\n\nIf the [toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain) is installed, other applications can be tested by compiling the assembly program and converting to bin and then hex with makehex.py found in [`$SERV/sw`](/sw/). \n\n:bulb:RISC-V Compressed Extension can be enabled by passing `--compressed=1` parameter. \n\n## Verification\nSERV is verified using RISC-V compliance tests for the base ISA (RV32I) and the implemented extensions (M, C, Zicsr). The instructions on running Compliance tests using RISCOF framework are given in [verif](/verif/) directory.\n\n\n## Other targets\n\nThe above targets are run on the servant SoC, but there are some targets defined for the CPU itself. Verilator can be run in lint mode to check for design problems by running\n\n    fusesoc run --target=lint serv\n\nIt's also possible to just synthesise for different targets to check resource usage and such. To do that for the iCE40 devices, run\n\n    fusesoc run --tool=icestorm serv --pnr=none\n\n...or to synthesize with vivado for Xilinx targets, run\n\n    fusesoc run --tool=vivado serv --pnr=none\n\nThis will synthesize for the default Vivado part. To synthesise for a specific device, run e.g.\n\n    fusesoc run --tool=vivado serv --pnr=none --part=xc7a100tcsg324-1\n\n## Zephyr support\n\nSERV, or rather the Servant SoC, can run the [Zephyr RTOS](https://www.zephyrproject.org). The Servant-specific drivers and BSP is located in the zephyr subdirectory of the SERV repository. In order to use Zephyr on Servant, a project directory structure must be set up that allows Zephyr to load the Servant-specific files as a module.\n\nFirst, the Zephyr SDK and the \"west\" build tool must be installed. The [Zephyr getting started guide](https://docs.zephyrproject.org/latest/getting_started/index.html) describes these steps in more detail.\n\nAssuming that SERV was installed into `$WORKSPACE/fusesoc_libraries/serv` as per the prerequisites, run the following command to make the workspace also work as a Zephyr workspace.\n\n    west init\n\nSpecify the SERV repository as the manifest repository, meaning it will be the main entry point when Zephyr is looking for modules.\n\n    west config manifest.path $SERV\n\nGet the right versions of all Zephyr submodules\n\n    west update\n\nIt should now be possible to build Zephyr applications for the Servant SoC within the workspace. This can be tested e.g. by building the Zephyr Hello world samples application\n\n    cd zephyr/samples/hello_world\n    west build -b service\n\nAfter a successful build, Zephyr will create an elf and a bin file of the application in `build/zephyr/zephyr.{elf,bin}`. The bin file can be converted to a verilog hex file, which in turn can be preloaded to FPGA on-chip memories and run on a target board, or loaded into simulated RAM model when running simulations.\n\nTo convert the newly built hello world example into a Verilog hex file, run\n\n    python3 $SERV/sw/makehex.py zephyr/samples/hello_world/build/zephyr/zephyr.bin 4096 \u003e hello.hex\n\n4096 is the number of 32-bit words to write and must be at least the size of the application binary. `hello.hex` is the resulting hex file. Running a simulation can now be done as described in [Running pre-built test software](#running-pre-built-test-software), e.g.\n\n    fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=/path/to/hello.hex\n\nOr to create an FPGA image with the application preloaded to on-chip RAM, e.g. for a Nexys A7 board, run\n\n    fusesoc run --target=nexys_a7 servant --memfile=/path/to/hello.hex\n\n## Good to know\n\nDon't feed serv any illegal instructions after midnight. Many logic expressions are hand-optimized using the old-fashioned method with Karnaugh maps on paper, and shamelessly take advantage of the fact that some opcodes aren't supposed to appear. As serv was written with 4-input LUT FPGAs as target, and opcodes are 5 bits, this can save quite a bit of resources in the decoder.\n\nThe bus interface is kind of Wishbone, but with most signals removed. There's an important difference though. Don't send acks on the instruction or data buses unless serv explicitly asks for something by raising its cyc signal. Otherwise serv becomes very confused.\n\nDon't go changing the clock frequency on a whim when running Zephyr. Or well, it's ok I guess, but since the UART is bitbanged, this will change the baud rate as well. As of writing, the UART is running at 115200 baud rate when the CPU is 32 MHz. There are two NOPs in the driver to slow it down a bit, so if those are removed I think it could achieve baud rate 115200 on a 24MHz clock.. in case someone wants to try\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folofk%2Fserv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Folofk%2Fserv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folofk%2Fserv/lists"}