@@ -15,6 +15,7 @@ enum TbfHeaderTypes {
15
15
PackageName = 3 ,
16
16
PicOption1 = 4 ,
17
17
FixedAddresses = 5 ,
18
+ Permissions = 6 ,
18
19
}
19
20
20
21
#[ repr( C ) ]
@@ -59,6 +60,22 @@ struct TbfHeaderFixedAddresses {
59
60
start_process_flash : u32 ,
60
61
}
61
62
63
+ #[ repr( C ) ]
64
+ #[ derive( Clone , Copy , Debug ) ]
65
+ struct TbfHeaderDriverPermission {
66
+ driver_number : u32 ,
67
+ // Bit 0 of `driver_options` indicates exclusive.
68
+ driver_options : u16 ,
69
+ }
70
+
71
+ #[ repr( C ) ]
72
+ #[ derive( Debug ) ]
73
+ struct TbfHeaderPermissions {
74
+ base : TbfHeaderTlv ,
75
+ array_length : u16 ,
76
+ perms : Vec < TbfHeaderDriverPermission > ,
77
+ }
78
+
62
79
impl fmt:: Display for TbfHeaderBase {
63
80
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
64
81
writeln ! (
@@ -111,12 +128,34 @@ impl fmt::Display for TbfHeaderFixedAddresses {
111
128
}
112
129
}
113
130
131
+ impl fmt:: Display for TbfHeaderPermissions {
132
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
133
+ writeln ! (
134
+ f,
135
+ "
136
+ array_length: {0:>8} {0:>#10X}
137
+ permissions: Number Options" ,
138
+ self . array_length,
139
+ ) ?;
140
+
141
+ for perm in & self . perms {
142
+ writeln ! (
143
+ f,
144
+ " : {0:>#8X} {1:>#10X}" ,
145
+ perm. driver_number, perm. driver_options,
146
+ ) ?;
147
+ }
148
+ Ok ( ( ) )
149
+ }
150
+ }
151
+
114
152
pub struct TbfHeader {
115
153
hdr_base : TbfHeaderBase ,
116
154
hdr_main : TbfHeaderMain ,
117
155
hdr_pkg_name_tlv : Option < TbfHeaderTlv > ,
118
156
hdr_wfr : Vec < TbfHeaderWriteableFlashRegion > ,
119
157
hdr_fixed_addresses : Option < TbfHeaderFixedAddresses > ,
158
+ hdr_permissions : Option < TbfHeaderPermissions > ,
120
159
package_name : String ,
121
160
package_name_pad : usize ,
122
161
}
@@ -144,6 +183,7 @@ impl TbfHeader {
144
183
hdr_pkg_name_tlv : None ,
145
184
hdr_wfr : Vec :: new ( ) ,
146
185
hdr_fixed_addresses : None ,
186
+ hdr_permissions : None ,
147
187
package_name : String :: new ( ) ,
148
188
package_name_pad : 0 ,
149
189
}
@@ -163,6 +203,7 @@ impl TbfHeader {
163
203
package_name : String ,
164
204
fixed_address_ram : Option < u32 > ,
165
205
fixed_address_flash : Option < u32 > ,
206
+ permissions : Vec < ( u32 , u16 ) > ,
166
207
) -> usize {
167
208
// Need to calculate lengths ahead of time.
168
209
// Need the base and the main section.
@@ -232,6 +273,25 @@ impl TbfHeader {
232
273
} ) ;
233
274
}
234
275
276
+ let mut perms: Vec < TbfHeaderDriverPermission > = Vec :: new ( ) ;
277
+ for perm in permissions {
278
+ perms. push ( TbfHeaderDriverPermission {
279
+ driver_number : perm. 0 ,
280
+ driver_options : perm. 1 ,
281
+ } )
282
+ }
283
+
284
+ if perms. len ( ) > 0 {
285
+ self . hdr_permissions = Some ( TbfHeaderPermissions {
286
+ base : TbfHeaderTlv {
287
+ tipe : TbfHeaderTypes :: Permissions ,
288
+ length : 8 ,
289
+ } ,
290
+ array_length : perms. len ( ) as u16 ,
291
+ perms,
292
+ } ) ;
293
+ }
294
+
235
295
// Return the length by generating the header and seeing how long it is.
236
296
self . generate ( )
237
297
. expect ( "No header was generated" )
@@ -348,6 +408,9 @@ impl fmt::Display for TbfHeader {
348
408
}
349
409
self . hdr_fixed_addresses
350
410
. map_or ( Ok ( ( ) ) , |hdr| write ! ( f, "{}" , hdr) ) ?;
411
+ self . hdr_permissions
412
+ . as_ref ( )
413
+ . map_or ( Ok ( ( ) ) , |hdr| write ! ( f, "{}" , hdr) ) ?;
351
414
Ok ( ( ) )
352
415
}
353
416
}
0 commit comments