13
13
RKFT_OFF_INCR = RKFT_BLOCKSIZE >> 9
14
14
RKFT_DISPLAY = 0x1000
15
15
16
- RK_VENDER_ID = 0x2207
16
+ RK_VENDOR_ID = 0x2207
17
17
RK_PRODUCT_IDS = set ([
18
18
0x290a , # RK2906
19
19
0x292a , # RK2928
29
29
0x330c , # RK3399
30
30
])
31
31
32
+ #(read endpoint, write endpoint)
33
+ RK_DEVICE_ENDPOINTS = {
34
+ 0x290a : (0x01 , 0x02 ), # RK2906
35
+ 0x292a : (0x01 , 0x02 ), # RK2928
36
+ 0x292c : (0x01 , 0x02 ), # RK3026/RK3028
37
+ 0x281a : (0x01 , 0x02 ),
38
+ 0x300a : (0x01 , 0x02 ), # RK3066
39
+ 0x0010 : (0x01 , 0x02 ), # RK3168 ???
40
+ 0x300b : (0x01 , 0x02 ), # RK3168 ???
41
+ 0x310b : (0x01 , 0x02 ), # RK3188
42
+ 0x310c : (0x01 , 0x02 ), # RK3128
43
+ 0x320a : (0x01 , 0x02 ), # RK3288
44
+ 0x320b : (0x01 , 0x02 ), # RK3229
45
+ 0x330c : (0x81 , 0x01 ), # RK3399
46
+ }
47
+
32
48
PARTITION_PATTERN = re .compile (r'(-|0x[0-9a-fA-F]+)@(0x[0-9a-fA-F]+)\((.*?)\)' )
33
49
34
50
RKFT_CID = 4
@@ -63,7 +79,7 @@ def prepare_cmd(flag, command, offset, size):
63
79
64
80
65
81
def is_rk_device (device ):
66
- return (device .getVendorID () == RK_VENDER_ID and
82
+ return (device .getVendorID () == RK_VENDOR_ID and
67
83
device .getProductID () in RK_PRODUCT_IDS );
68
84
69
85
@@ -103,6 +119,10 @@ def __init__(self, logger, bus_id, dev_id):
103
119
if (is_rk_device (device )
104
120
and device .getBusNumber () == bus_id and
105
121
device .getDeviceAddress () == dev_id ):
122
+
123
+ product_id = device .getProductID ()
124
+ self .__read_endpoint = RK_DEVICE_ENDPOINTS [product_id ][0 ]
125
+ self .__write_endpoint = RK_DEVICE_ENDPOINTS [product_id ][1 ]
106
126
self .__dev_handle = device .open ()
107
127
108
128
if not self .__dev_handle :
@@ -126,9 +146,9 @@ def __init_device(self):
126
146
self .__dev_handle .claimInterface (0 )
127
147
128
148
# Init
129
- self .__dev_handle .bulkWrite (
130
- 2 , '' .join (prepare_cmd (0x80 , 0x00060000 , 0x00000000 , 0x00000000 )))
131
- self .__dev_handle .bulkRead (1 , 13 )
149
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
150
+ '' .join (prepare_cmd (0x80 , 0x00060000 , 0x00000000 , 0x00000000 )))
151
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
132
152
133
153
# sleep for 20ms
134
154
time .sleep (0.02 )
@@ -143,10 +163,11 @@ def __cmp_part_with_file(self, offset, size, file_obj):
143
163
'\t reading flash memory at offset 0x%08X\n ' % offset )
144
164
145
165
block1 = fh .read (RKFT_BLOCKSIZE )
146
- self .__dev_handle .bulkWrite (
147
- 2 , '' .join (prepare_cmd (0x80 , 0x000a1400 , offset , RKFT_OFF_INCR )))
148
- block2 = self .__dev_handle .bulkRead (1 , RKFT_BLOCKSIZE )
149
- self .__dev_handle .bulkRead (1 , 13 )
166
+ self .__dev_handle .bulkWrite (self .__write_endpoint ,
167
+ '' .join (prepare_cmd (0x80 , 0x000a1400 , offset , RKFT_OFF_INCR )))
168
+ block2 = self .__dev_handle .bulkRead (self .__read_endpoint ,
169
+ RKFT_BLOCKSIZE )
170
+ self .__dev_handle .bulkRead (self .__read_endpoint , 13 )
150
171
151
172
if len (block1 ) == len (block2 ):
152
173
if block1 != block2 :
@@ -170,17 +191,17 @@ def load_partitions(self):
170
191
171
192
self .__logger .print_dividor ()
172
193
self .__logger .log ('\t Reading flash information\n ' )
173
- self .__dev_handle .bulkWrite (
174
- 2 , '' .join (prepare_cmd (0x80 , 0x00061a00 , 0x00000000 , 0x00000000 )))
175
- content = self .__dev_handle .bulkRead (1 , 512 )
176
- self .__dev_handle .bulkRead (1 , 13 )
194
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
195
+ '' .join (prepare_cmd (0x80 , 0x00061a00 , 0x00000000 , 0x00000000 )))
196
+ content = self .__dev_handle .bulkRead (self . __read_endpoint , 512 )
197
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
177
198
flash_size = (ord (content [0 ])) | (ord (content [1 ]) << 8 ) | (ord (content [2 ]) << 16 ) | (ord (content [3 ]) << 24 )
178
199
179
200
self .__logger .log ('\t Loading partition information\n ' )
180
- self .__dev_handle .bulkWrite (
181
- 2 , '' .join (prepare_cmd (0x80 , 0x000a1400 , 0x00000000 , PART_OFF_INCR )))
182
- content = self .__dev_handle .bulkRead (1 , PART_BLOCKSIZE )
183
- self .__dev_handle .bulkRead (1 , 13 )
201
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
202
+ '' .join (prepare_cmd (0x80 , 0x000a1400 , 0x00000000 , PART_OFF_INCR )))
203
+ content = self .__dev_handle .bulkRead (self . __read_endpoint , PART_BLOCKSIZE )
204
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
184
205
185
206
for line in content .split ('\n ' ):
186
207
self .__logger .log ('\t %s' % line )
@@ -204,10 +225,10 @@ def read_flashinfo(self):
204
225
205
226
self .__logger .print_dividor ()
206
227
self .__logger .log ('\t Reading flash information\n ' )
207
- self .__dev_handle .bulkWrite (
208
- 2 , '' .join (prepare_cmd (0x80 , 0x00061a00 , 0x00000000 , 0x00000000 )))
209
- content = self .__dev_handle .bulkRead (1 , 512 )
210
- self .__dev_handle .bulkRead (1 , 13 )
228
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
229
+ '' .join (prepare_cmd (0x80 , 0x00061a00 , 0x00000000 , 0x00000000 )))
230
+ content = self .__dev_handle .bulkRead (self . __read_endpoint , 512 )
231
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
211
232
# uint32_t flash_size;
212
233
# uint16_t block_size;
213
234
# uint8_t page_size;
@@ -260,10 +281,10 @@ def __flash_image_file(self, offset, size, file_obj):
260
281
self .__logger .log (
261
282
'\t writing flash memory at offset 0x%08X\n ' % offset )
262
283
263
- self .__dev_handle .bulkWrite (
264
- 2 , '' .join (prepare_cmd (0x80 , 0x000a1500 , offset , RKFT_OFF_INCR )))
265
- self .__dev_handle .bulkWrite (2 , str (buf ))
266
- self .__dev_handle .bulkRead (1 , 13 )
284
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
285
+ '' .join (prepare_cmd (0x80 , 0x000a1500 , offset , RKFT_OFF_INCR )))
286
+ self .__dev_handle .bulkWrite (self . __write_endpoint , str (buf ))
287
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
267
288
268
289
offset += RKFT_OFF_INCR
269
290
size -= RKFT_OFF_INCR
@@ -307,10 +328,10 @@ def __dump_partition(self, offset, size, file_obj):
307
328
self .__logger .log (
308
329
'\t reading flash memory at offset 0x%08X\n ' % offset )
309
330
310
- self .__dev_handle .bulkWrite (
311
- 2 , '' .join (prepare_cmd (0x80 , 0x000a1400 , offset , RKFT_OFF_INCR )))
312
- block = self .__dev_handle .bulkRead (1 , RKFT_BLOCKSIZE )
313
- self .__dev_handle .bulkRead (1 , 13 )
331
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
332
+ '' .join (prepare_cmd (0x80 , 0x000a1400 , offset , RKFT_OFF_INCR )))
333
+ block = self .__dev_handle .bulkRead (self . __read_endpoint , RKFT_BLOCKSIZE )
334
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
314
335
if size < RKFT_BLOCKSIZE and len (block ) < size :
315
336
block = block [:size ]
316
337
if block :
@@ -346,10 +367,10 @@ def erase_partition(self, offset, size):
346
367
self .__logger .log (
347
368
'\t erasing flash memory at offset 0x%08X\n ' % offset )
348
369
349
- self .__dev_handle .bulkWrite (
350
- 2 , '' .join (prepare_cmd (0x80 , 0x000a1500 , offset , RKFT_OFF_INCR )))
351
- self .__dev_handle .bulkWrite (2 , buf )
352
- self .__dev_handle .bulkRead (1 , 13 )
370
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
371
+ '' .join (prepare_cmd (0x80 , 0x000a1500 , offset , RKFT_OFF_INCR )))
372
+ self .__dev_handle .bulkWrite (self . __write_endpoint , buf )
373
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
353
374
354
375
offset += RKFT_OFF_INCR
355
376
size -= RKFT_OFF_INCR
@@ -359,10 +380,9 @@ def erase_partition(self, offset, size):
359
380
360
381
def reboot (self ):
361
382
self .__init_device ()
362
- self .__dev_handle .bulkWrite (
363
- 2 , '' .join (prepare_cmd (0x00 , 0x0006ff00 , 0x00000000 , 0x00 )))
364
- self .__dev_handle .bulkRead (1 , 13 )
383
+ self .__dev_handle .bulkWrite (self . __write_endpoint ,
384
+ '' .join (prepare_cmd (0x00 , 0x0006ff00 , 0x00000000 , 0x00 )))
385
+ self .__dev_handle .bulkRead (self . __read_endpoint , 13 )
365
386
self .__logger .print_dividor ()
366
387
self .__logger .log ('\t Rebooting device\n ' )
367
388
self .__logger .print_done ()
368
-
0 commit comments