{"id":48454578,"url":"https://github.com/modm-io/modm-devices","last_synced_at":"2026-04-06T22:03:49.121Z","repository":{"id":15578950,"uuid":"70358557","full_name":"modm-io/modm-devices","owner":"modm-io","description":"Curated device data for all AVR and ARM Cortex-M devices","archived":false,"fork":false,"pushed_at":"2026-03-09T00:18:25.000Z","size":4173,"stargazers_count":54,"open_issues_count":10,"forks_count":30,"subscribers_count":5,"default_branch":"develop","last_synced_at":"2026-03-09T04:12:11.527Z","etag":null,"topics":["avr","cortex-m","data","microcontroller","modm","nrf","sam","stm32"],"latest_commit_sha":null,"homepage":"https://blog.salkinium.com/modm-devices","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/modm-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2016-10-08T21:31:56.000Z","updated_at":"2026-03-09T00:18:28.000Z","dependencies_parsed_at":"2024-06-26T23:02:02.875Z","dependency_job_id":"8f59253a-d329-4ad3-803b-7adff0999214","html_url":"https://github.com/modm-io/modm-devices","commit_stats":{"total_commits":286,"total_committers":16,"mean_commits":17.875,"dds":0.3601398601398601,"last_synced_commit":"e093fe831fe17f1fec54bb31e038e499c22c2830"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/modm-io/modm-devices","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modm-io%2Fmodm-devices","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modm-io%2Fmodm-devices/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modm-io%2Fmodm-devices/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modm-io%2Fmodm-devices/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/modm-io","download_url":"https://codeload.github.com/modm-io/modm-devices/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modm-io%2Fmodm-devices/sbom","scorecard":{"id":656047,"data":{"date":"2025-08-11","repo":{"name":"github.com/modm-io/modm-devices","commit":"908a995df86e1bba9a2dd7a341f24ce402cc684a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.8,"checks":[{"name":"Maintained","score":5,"reason":"7 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":5,"reason":"Found 6/12 approved changesets -- score normalized to 5","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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'actions' permission set to 'write': .github/workflows/tests.yml:137","Warn: no topLevel permission defined: .github/workflows/deloy.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1"],"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Mozilla Public License 2.0: 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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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":"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/deloy.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/deloy.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deloy.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/deloy.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:94: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:96: update your workflow using https://app.stepsecurity.io/secureworkflow/modm-io/modm-devices/tests.yml/develop?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/deloy.yml:20","Warn: pipCommand not pinned by hash: .github/workflows/deloy.yml:21","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:25","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:49","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:50","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:74","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:75","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:101","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:102","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  10 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 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-21T14:39:25.401Z","repository_id":15578950,"created_at":"2025-08-21T14:39:25.401Z","updated_at":"2025-08-21T14:39:25.401Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31491098,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"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":["avr","cortex-m","data","microcontroller","modm","nrf","sam","stm32"],"created_at":"2026-04-06T22:03:48.502Z","updated_at":"2026-04-06T22:03:49.093Z","avatar_url":"https://github.com/modm-io.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Curated data for AVR and STM32 devices\n\nThis repository contains tools for extracting data from vendor sources,\nfiltering and reformatting them into a vendor-independent format.\n\nThis data is used by [the modm project][modm-io] to generate\nits Hardware Abstraction Layer (HAL), startup code and additional support tools.\nPlease have a look [at modm's platform modules][modm-platform] for examples on\nhow to use this data.\n\nThese tools and this data set is maintained and curated by\n[@salkinium][] only at [modm-io/modm-devices][modm-devices].\nIt is licensed under the MPLv2 license.\n\nCurrently data for \u003c!--devicecount--\u003e4660\u003c!--/devicecount--\u003e devices is available.\nPlease open an issue or better yet a pull request for additional support.\n\n\u003c!--devicetable--\u003e\n| Family        | Devices | Family        | Devices | Family        | Devices |\n|:--------------|:--------|:--------------|:--------|:--------------|:--------|\n| AT90          |    12   | ATMEGA        |   352   | ATTINY        |   148   |\n| NRF51         |     9   | NRF52         |     8   | NRF53         |     1   |\n| RP20          |     1   | RP23          |     1   | SAMD1x/D2x/DAx|   304   |\n| SAMD5x/E5x    |   118   | SAME7x/S7x/V7x|    69   | SAMG5x        |    12   |\n| SAML2x        |    82   | STM32C0       |    93   | STM32F0       |   169   |\n| STM32F1       |   174   | STM32F2       |    71   | STM32F3       |   145   |\n| STM32F4       |   354   | STM32F7       |   181   | STM32G0       |   250   |\n| STM32G4       |   338   | STM32H5       |   126   | STM32H7       |   240   |\n| STM32L0       |   352   | STM32L1       |   180   | STM32L4       |   416   |\n| STM32L5       |    44   | STM32U0       |    48   | STM32U3       |    93   |\n| STM32U5       |   177   | STM32WB       |    46   | STM32WL       |    46   |\n\u003c!--/devicetable--\u003e\n\n\n### TL;DR\n\n```sh\ngit clone https://github.com/modm-io/modm-devices.git\ncd modm-devices/tools/generator\n# Generate STM32 device data\nmake generate-stm32\n# Generate SAM device data\nmake generate-sam\n# Generate AVR device data\nmake generate-avr\n```\n\nYou need Python3 with lxml, jinja2, deepdiff, CppHeaderParser and packaging packages.\n\n```sh\npip install lxml jinja2 deepdiff CppHeaderParser packaging\n```\n\n\n### Background\n\nThe device data idea originally comes from [xpcc](http://xpcc.io), which is the\npredecessor to modm. Around 2013 we wanted to remove some of the repetitive\nsteps for building a HAL for AVR and STM32 devices and we chose to extract some\ncommon data and collapse some peripheral drivers into Jinja2 templates.\n\nThis eventually evolved from manually extracted device data to fully generated\ndevice data as soon as we found machine readable data sources from vendors.\nFor AVRs, we use the Atmel Target Description Files and for STM32, we use\ninternal data extracted from the CubeMX code generator.\n\nThus the Device File Generator (DFG) was born. The DFG has been rewritten for\nmodm to make it more maintainable and flexible as well as handling edge cases\nmuch better.\n\nWe've separated the device data from modm, so that it becomes easier for YOU\nto use this data for your own purposes.\n[I've written an blog post with all the details](http://blog.salkinium.com/modm-devices).\n\n\n### Data quality\n\nThe quality of the resulting device data obviously depend heavily on the quality\nof the input data. I reluctantly maintain [a manual patch list][patches] for the bugs I've\nencountered in the vendor sources, that I don't want to write a fix for in the DFG.\nI have sent some of these patches to a contact in ST, however, every new release\nof CubeMX changes a lot of data and can reintroduce some of these bugs.\nI don't have a contact at Atmel to send bug reports to.\n\nIn addition, the CubeMX and AVR data does not contain some very important\ninformation, which has to be assembled manually from hundreds of datasheets and\nis then injected into the DFG. This is extremely labor intensive.\n\nPlease be respectful in asking for more data: I do not like spending hours\nupon hours copying this additional data out of datasheets. It's also much more\nlikely to introduce errors, so automating data extraction is much easier for me\nto maintain. You may of course open an issue about wrong data, but I'd prefer if\nyou opened a pull request that fixes the problem in the DFG instead.\n\nAll fixes MUST BE REPRODUCIBLE by the DFG! This means you need to track down the\nbug to either the raw vendor data (=\u003e update the manual patches) or in the DFG\ndata pipeline (=\u003e fix the DFG).\n\n*DO NOT UNDER ANY CIRCUMSTANCES PUBLISH THE RAW DATA EXTRACTED FROM CUBEMX ANYWHERE!*\nIt is subject to ST's copyright and you are not allowed to distribute it!\n\n\n### Data format\n\nI initially wanted to format this data as [device trees][device-tree],\nhowever, since it is so tied to the Linux kernel, there isn't (or wasn't) much\ntool support available at the time (though now there is a Python parser in Zephyr),\nso we wrote our own tree-based format, which we called \"device files\" since we're\nso creative. It allows lossless overlaying of data trees to reduce the amount of\nduplicate data noise which makes it easier to comprehend as a human.\n\nI do not intend to standardize this **format**, it may change at any time for any\nreason. This allows us maximum flexibility in encoding this complicated\ndevice information. If you want to engage in format discussions, please consider\ncontributing to the device tree specification instead.\n\nSince I may change this data format to accommodate new data, you should write your\n**own formatter** of this data, so that you have much better control over what\nyour tools are expecting!\nSo, if you need this data in the form of a Device Tree, please write your own\ndata converter and maintain it yourself!\n\nFor modm we convert this format to a Python dictionary tree, for details see the\n`DeviceFile` class in `tools/device/modm/device_file.py`.\n\n\n[modm-talk-preview]: https://gist.githubusercontent.com/salkinium/43a303c61b5e15e9a91d34116ea5d07c/raw/ab836c051039421e7bb0875ec9cb93c2d3f76236/modm-devices.png\n[modm-talk]: http://salkinium.com/talks/modm_embo17.pdf\n[modm-platform]: https://github.com/modm-io/modm/tree/develop/src/modm/platform\n[device-tree]: https://www.devicetree.org\n[@salkinium]: http://github.com/salkinium\n[modm-devices]: https://github.com/modm-io/modm-devices\n[modm-io]: https://github.com/modm-io\n[patches]: https://github.com/modm-io/modm-devices/tree/develop/tools/generator/raw-data-extractor/patches\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodm-io%2Fmodm-devices","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmodm-io%2Fmodm-devices","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodm-io%2Fmodm-devices/lists"}