Skip to content

Commit e43cb3d

Browse files
authored
Merge pull request #13 from RobertZ2011/master
Added support for RK3399
2 parents dd68297 + 49d21c7 commit e43cb3d

File tree

1 file changed

+57
-37
lines changed

1 file changed

+57
-37
lines changed

src/rkflashkit/rktalk.py

+57-37
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
RKFT_OFF_INCR = RKFT_BLOCKSIZE >> 9
1414
RKFT_DISPLAY = 0x1000
1515

16-
RK_VENDER_ID = 0x2207
16+
RK_VENDOR_ID = 0x2207
1717
RK_PRODUCT_IDS = set([
1818
0x290a, # RK2906
1919
0x292a, # RK2928
@@ -29,6 +29,22 @@
2929
0x330c, # RK3399
3030
])
3131

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+
3248
PARTITION_PATTERN = re.compile(r'(-|0x[0-9a-fA-F]+)@(0x[0-9a-fA-F]+)\((.*?)\)')
3349

3450
RKFT_CID = 4
@@ -63,7 +79,7 @@ def prepare_cmd(flag, command, offset, size):
6379

6480

6581
def is_rk_device(device):
66-
return (device.getVendorID() == RK_VENDER_ID and
82+
return (device.getVendorID() == RK_VENDOR_ID and
6783
device.getProductID() in RK_PRODUCT_IDS);
6884

6985

@@ -103,6 +119,10 @@ def __init__(self, logger, bus_id, dev_id):
103119
if (is_rk_device(device)
104120
and device.getBusNumber() == bus_id and
105121
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]
106126
self.__dev_handle = device.open()
107127

108128
if not self.__dev_handle:
@@ -126,9 +146,9 @@ def __init_device(self):
126146
self.__dev_handle.claimInterface(0)
127147

128148
# 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)
132152

133153
# sleep for 20ms
134154
time.sleep(0.02)
@@ -143,10 +163,11 @@ def __cmp_part_with_file(self, offset, size, file_obj):
143163
'\treading flash memory at offset 0x%08X\n' % offset)
144164

145165
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)
150171

151172
if len(block1) == len(block2):
152173
if block1 != block2:
@@ -170,17 +191,17 @@ def load_partitions(self):
170191

171192
self.__logger.print_dividor()
172193
self.__logger.log('\tReading 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)
177198
flash_size = (ord(content[0])) | (ord(content[1]) << 8) | (ord(content[2]) << 16) | (ord(content[3]) << 24)
178199

179200
self.__logger.log('\tLoading 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)
184205

185206
for line in content.split('\n'):
186207
self.__logger.log('\t%s' % line)
@@ -204,10 +225,10 @@ def read_flashinfo(self):
204225

205226
self.__logger.print_dividor()
206227
self.__logger.log('\tReading 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)
211232
# uint32_t flash_size;
212233
# uint16_t block_size;
213234
# uint8_t page_size;
@@ -260,10 +281,10 @@ def __flash_image_file(self, offset, size, file_obj):
260281
self.__logger.log(
261282
'\twriting flash memory at offset 0x%08X\n' % offset)
262283

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)
267288

268289
offset += RKFT_OFF_INCR
269290
size -= RKFT_OFF_INCR
@@ -307,10 +328,10 @@ def __dump_partition(self, offset, size, file_obj):
307328
self.__logger.log(
308329
'\treading flash memory at offset 0x%08X\n' % offset)
309330

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)
314335
if size < RKFT_BLOCKSIZE and len(block) < size:
315336
block = block[:size]
316337
if block:
@@ -346,10 +367,10 @@ def erase_partition(self, offset, size):
346367
self.__logger.log(
347368
'\terasing flash memory at offset 0x%08X\n' % offset)
348369

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)
353374

354375
offset += RKFT_OFF_INCR
355376
size -= RKFT_OFF_INCR
@@ -359,10 +380,9 @@ def erase_partition(self, offset, size):
359380

360381
def reboot(self):
361382
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)
365386
self.__logger.print_dividor()
366387
self.__logger.log('\tRebooting device\n')
367388
self.__logger.print_done()
368-

0 commit comments

Comments
 (0)