parser36
v0.0.1
Published
r36s dts parser
Maintainers
Readme
parser36
A lightweight, dependency-free JavaScript library for parsing, manipulating, and reconstructing r36s dts files.
Overview
Parser36 provides a Proxy-based API that converts complex DTS structures into a manipulatable JavaScript object tree. This allows for programmatic modification of hardware descriptions before stringifying them back into a valid DTS format compatible with the Device Tree Compiler (dtc).
How it Works
1. Tokenization
The parser identifies DTS elements:
- Comments (skipped)
- Directives (e.g.,
/dts-v1/) - Labels and Node names
- Properties (Strings, Cells
<...>, Bytes[...])
2. AST Construction & Proxy Wrapper
The parseDTS(source) function returns a Proxy-wrapped root node.
- Path Access:
dts.get('/path/to/node') - Search:
dts.find('compatible-string') - Native JS Values: Assign numbers, strings, or arrays directly.
3. Manipulation API
node.property = value: Update or create a property.node.add(name, { props }): Inject new child nodes.node.children: Iterate through child nodes.
4. Stringification
node.toString(): Reconstructs the tree into a clean, properly indented DTS file.
Example Usage
import { readFileSync, writeFileSync } from 'fs';
import { parseDTS } from './parser36.js';
const content = readFileSync('my_device.dts', 'utf8');
const dts = parseDTS(content);
// 1. Modify properties via path
const mmc = dts.get('/dwmmc@ff370000');
if (mmc) {
mmc.status = 'okay';
mmc['max-frequency'] = 150000000; // Auto-converts to <0x8f0d180>
}
// 2. Find and update a node by compatible
const panel = dts.find('simple-panel-dsi');
if (panel) {
panel['dsi,flags'] = [0xe03];
}
// 3. Stringify back to DTS
writeFileSync('updated.dts', dts.toString());Validation
The tests/test-md5.js script is provided to ensure the parser's stability. It performs a "round-trip" validation (DTS -> AST -> DTS) and verifies that the output remains functionally identical to the input.
Build & Test
Use the root Makefile to run everything:
make # Patch examples and run tests
make clean # Remove generated files