From: Grant Likely <grant.likely@xxxxxxx> The current code throws away all the data type and grouping information when parsing the DTS source file, which makes it difficult to reconstruct the data format when emitting a format that can express data types (ie. dts and yaml). Use the marker structure to mark the beginning of each integer array block (<> and []), and the datatype contained in each (8, 16, 32 & 64 bit widths). Signed-off-by: Grant Likely <grant.likely@xxxxxxx> Reviewed-by: Simon Glass <sjg@xxxxxxxxxxxx> Reviewed-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> [robh: s/MARKER_/TYPE_/] Signed-off-by: Rob Herring <robh@xxxxxxxxxx> --- data.c | 4 +++- dtc-parser.y | 15 ++++++++++----- dtc.h | 7 +++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/data.c b/data.c index aa37a16c8891..accdfaef6668 100644 --- a/data.c +++ b/data.c @@ -74,7 +74,8 @@ struct data data_copy_escape_string(const char *s, int len) struct data d; char *q; - d = data_grow_for(empty_data, len + 1); + d = data_add_marker(empty_data, TYPE_STRING, NULL); + d = data_grow_for(d, len + 1); q = d.val; while (i < len) { @@ -94,6 +95,7 @@ struct data data_copy_file(FILE *f, size_t maxlen) { struct data d = empty_data; + d = data_add_marker(d, TYPE_BLOB, NULL); while (!feof(f) && (d.len < maxlen)) { size_t chunksize, ret; diff --git a/dtc-parser.y b/dtc-parser.y index 011a5b25539a..815481a9bb23 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -340,22 +340,27 @@ arrayprefix: DT_BITS DT_LITERAL '<' { unsigned long long bits; + enum markertype type = TYPE_UINT32; bits = $2; - if ((bits != 8) && (bits != 16) && - (bits != 32) && (bits != 64)) { + switch (bits) { + case 8: type = TYPE_UINT8; break; + case 16: type = TYPE_UINT16; break; + case 32: type = TYPE_UINT32; break; + case 64: type = TYPE_UINT64; break; + default: ERROR(&@2, "Array elements must be" " 8, 16, 32 or 64-bits"); bits = 32; } - $$.data = empty_data; + $$.data = data_add_marker(empty_data, type, NULL); $$.bits = bits; } | '<' { - $$.data = empty_data; + $$.data = data_add_marker(empty_data, TYPE_UINT32, NULL); $$.bits = 32; } | arrayprefix integer_prim @@ -499,7 +504,7 @@ integer_unary: bytestring: /* empty */ { - $$ = empty_data; + $$ = data_add_marker(empty_data, TYPE_UINT8, NULL); } | bytestring DT_BYTE { diff --git a/dtc.h b/dtc.h index 6d667701ab6a..e648cdf0210b 100644 --- a/dtc.h +++ b/dtc.h @@ -77,7 +77,14 @@ enum markertype { REF_PHANDLE, REF_PATH, LABEL, + TYPE_UINT8, + TYPE_UINT16, + TYPE_UINT32, + TYPE_UINT64, + TYPE_BLOB, + TYPE_STRING, }; +extern const char *markername(enum markertype markertype); struct marker { enum markertype type; -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree-compiler" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html