1 /*
2  * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef _PICO_BINARY_INFO_STRUCTURE_H
8 #define _PICO_BINARY_INFO_STRUCTURE_H
9 
10 // NOTE: This file may be included by non SDK code, so does not use SDK includes
11 
12 // NOTE: ALL CHANGES MUST BE BACKWARDS COMPATIBLE
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 #include <stdint.h>
19 
20 #ifndef __packed
21 #define __packed __attribute__((packed))
22 #endif
23 
24 typedef struct _binary_info_core binary_info_t;
25 
26 #define BINARY_INFO_TYPE_RAW_DATA 1
27 #define BINARY_INFO_TYPE_SIZED_DATA 2
28 #define BINARY_INFO_TYPE_BINARY_INFO_LIST_ZERO_TERMINATED 3
29 #define BINARY_INFO_TYPE_BSON 4
30 #define BINARY_INFO_TYPE_ID_AND_INT 5
31 #define BINARY_INFO_TYPE_ID_AND_STRING 6
32 // traditional block device
33 #define BINARY_INFO_TYPE_BLOCK_DEVICE 7
34 #define BINARY_INFO_TYPE_PINS_WITH_FUNC 8
35 #define BINARY_INFO_TYPE_PINS_WITH_NAME 9
36 #define BINARY_INFO_TYPE_PINS_WITH_NAMES 9
37 #define BINARY_INFO_TYPE_NAMED_GROUP 10
38 
39 // note plan is to reserve c1 = 0->31 for "collision tags"; i.e.
40 // for which you should always use random IDs with the binary_info,
41 // giving you 4 + 8 + 32 = 44 bits to avoid collisions
42 #define BINARY_INFO_MAKE_TAG(c1, c2) ((((uint)c2&0xffu)<<8u)|((uint)c1&0xffu))
43 
44 // Raspberry Pi defined. do not use
45 #define BINARY_INFO_TAG_RASPBERRY_PI BINARY_INFO_MAKE_TAG('R','P')
46 
47 #define BINARY_INFO_ID_RP_PROGRAM_NAME 0x02031c86
48 #define BINARY_INFO_ID_RP_PROGRAM_VERSION_STRING 0x11a9bc3a
49 #define BINARY_INFO_ID_RP_PROGRAM_BUILD_DATE_STRING 0x9da22254
50 #define BINARY_INFO_ID_RP_BINARY_END 0x68f465de
51 #define BINARY_INFO_ID_RP_PROGRAM_URL 0x1856239a
52 #define BINARY_INFO_ID_RP_PROGRAM_DESCRIPTION 0xb6a07c19
53 #define BINARY_INFO_ID_RP_PROGRAM_FEATURE 0xa1f4b453
54 #define BINARY_INFO_ID_RP_PROGRAM_BUILD_ATTRIBUTE 0x4275f0d3
55 #define BINARY_INFO_ID_RP_SDK_VERSION 0x5360b3ab
56 #define BINARY_INFO_ID_RP_PICO_BOARD 0xb63cffbb
57 #define BINARY_INFO_ID_RP_BOOT2_NAME 0x7f8882e1
58 
59 #if PICO_ON_DEVICE
60 #define bi_ptr_of(x) x *
61 #else
62 #define bi_ptr_of(x) uint32_t
63 #endif
64 typedef struct __packed _binary_info_core {
65         uint16_t type;
66         uint16_t tag;
67 } binary_info_core_t;
68 
69 typedef struct __packed _binary_info_raw_data {
70         struct _binary_info_core core;
71         uint8_t bytes[1];
72 } binary_info_raw_data_t;
73 
74 typedef struct __packed _binary_info_sized_data {
75         struct _binary_info_core core;
76         uint32_t length;
77         uint8_t bytes[1];
78 } binary_info_sized_data_t;
79 
80 typedef struct __packed _binary_info_list_zero_terminated {
81         struct _binary_info_core core;
82         bi_ptr_of(binary_info_t) list;
83 } binary_info_list_zero_terminated_t;
84 
85 typedef struct __packed _binary_info_id_and_int {
86         struct _binary_info_core core;
87         uint32_t id;
88         int32_t value;
89 } binary_info_id_and_int_t;
90 
91 typedef struct __packed _binary_info_id_and_string {
92         struct _binary_info_core core;
93         uint32_t id;
94         bi_ptr_of(const char) value;
95 } binary_info_id_and_string_t;
96 
97 typedef struct __packed _binary_info_block_device {
98         struct _binary_info_core core;
99         bi_ptr_of(const char) name; // optional static name (independent of what is formatted)
100         uint32_t address;
101         uint32_t size;
102         bi_ptr_of(binary_info_t) extra; // additional info
103         uint16_t flags;
104 } binary_info_block_device_t;
105 
106 #define BI_PINS_ENCODING_RANGE 1
107 #define BI_PINS_ENCODING_MULTI 2
108 
109 typedef struct __packed _binary_info_pins_with_func {
110     struct _binary_info_core core;
111     // p4_5 : p3_5 : p2_5 : p1_5 : p0_5 : func_4 : 010_3 //individual pins p0,p1,p2,p3,p4 ... if fewer than 5 then duplicate p
112     //                    phi_5 : plo_5 : func_4 : 001_3 // pin range plo-phi inclusive
113     uint32_t pin_encoding;
114 } binary_info_pins_with_func_t;
115 
116 typedef struct __packed _binary_info_pins_with_name {
117     struct _binary_info_core core;
118     uint32_t pin_mask;
119     bi_ptr_of(const char) label;
120 } binary_info_pins_with_name_t;
121 
122 #define BI_NAMED_GROUP_SHOW_IF_EMPTY   0x0001  // default is to hide
123 #define BI_NAMED_GROUP_SEPARATE_COMMAS 0x0002  // default is newlines
124 #define BI_NAMED_GROUP_SORT_ALPHA      0x0004  // default is no sort
125 #define BI_NAMED_GROUP_ADVANCED        0x0008  // if set, then only shown in say info -a
126 
127 typedef struct __packed _binary_info_named_group {
128     struct _binary_info_core core;
129     uint32_t parent_id;
130     uint16_t flags;
131     uint16_t group_tag;
132     uint32_t group_id;
133     bi_ptr_of(const char) label;
134 } binary_info_named_group_t;
135 
136 enum {
137     BINARY_INFO_BLOCK_DEV_FLAG_READ =
138     1 << 0, // if not readable, then it is basically hidden, but tools may choose to avoid overwriting it
139     BINARY_INFO_BLOCK_DEV_FLAG_WRITE = 1 << 1,
140     BINARY_INFO_BLOCK_DEV_FLAG_REFORMAT = 1 << 2, // may be reformatted..
141 
142     BINARY_INFO_BLOCK_DEV_FLAG_PT_UNKNOWN = 0 << 4, // unknown free to look
143     BINARY_INFO_BLOCK_DEV_FLAG_PT_MBR = 1 << 4, // expect MBR
144     BINARY_INFO_BLOCK_DEV_FLAG_PT_GPT = 2 << 4, // expect GPT
145     BINARY_INFO_BLOCK_DEV_FLAG_PT_NONE = 3 << 4, // no partition table
146 };
147 
148 #ifdef __cplusplus
149 }
150 #endif
151 #endif
152