2
0
forked from Ivasoft/DSView

Update sdcard_sd decoder (fix issue #296)

This commit is contained in:
DreamSourceLab
2020-04-06 11:31:52 +08:00
parent 10e3fefd13
commit 5b3f19b3c5
3 changed files with 342 additions and 201 deletions

View File

@@ -144,42 +144,8 @@ accepted_voltages = {
# All other values: "not defined".
}
card_status = {
0: 'Reserved for manufacturer test mode',
1: 'Reserved for manufacturer test mode',
2: 'Reserved for application specific commands',
3: 'AKE_SEQ_ERROR',
4: 'Reserved for SDIO card',
5: 'APP_CMD',
6: 'Unknown',
7: 'Unknown',
8: 'READY_FOR_DATA',
9: 'CURRENT_STATE', # CURRENT_STATE is a 4-bit value (decimal: 0..15).
10: 'CURRENT_STATE',
11: 'CURRENT_STATE',
12: 'CURRENT_STATE',
13: 'ERASE_RESET',
14: 'CARD_ECC_DISABLED',
15: 'WP_ERASE_SKIP',
16: 'CSD_OVERWRITE',
17: 'Reserved for DEFERRED_RESPONSE', # See eSD addendum
18: 'Reserved',
19: 'ERROR',
20: 'CC_ERROR',
21: 'CARD_ECC_FAILED',
22: 'ILLEGAL_COMMAND',
23: 'COM_CRC_ERROR',
24: 'LOCK_UNLOCK_FAILED',
25: 'CARD_IS_LOCKED',
26: 'WP_VIOLATION',
27: 'ERASE_PARAM',
28: 'ERASE_SEQ_ERROR',
29: 'BLOCK_LEN_ERROR',
30: 'ADDRESS_ERROR',
31: 'OUT_OF_RANGE',
}
sd_status = {
# 311:0: Reserved for manufacturer
# 391:312: Reserved
}

View File

@@ -1,7 +1,7 @@
##
## This file is part of the libsigrokdecode project.
##
## Copyright (C) 2012-2014 Uwe Hermann <uwe@hermann-uwe.de>
## Copyright (C) 2012-2020 Uwe Hermann <uwe@hermann-uwe.de>
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -17,6 +17,10 @@
## along with this program; if not, see <http://www.gnu.org/licenses/>.
##
from enum import Enum, IntEnum, unique
from itertools import chain
import re
# Return the specified BCD number (max. 8 bits) as integer.
def bcd2int(b):
return (b & 0x0f) + ((b >> 4) * 10)
@@ -34,3 +38,47 @@ def bitunpack(num, minbits=0):
num >>= 1
minbits -= 1
return tuple(res)
@unique
class SrdStrEnum(Enum):
@classmethod
def from_list(cls, name, l):
# Keys are limited/converted to [A-Z0-9_], values can be any string.
items = [(re.sub('[^A-Z0-9_]', '_', l[i]), l[i]) for i in range(len(l))]
return cls(name, items)
@classmethod
def from_str(cls, name, s):
return cls.from_list(name, s.split())
@unique
class SrdIntEnum(IntEnum):
@classmethod
def _prefix(cls, p):
return tuple([a.value for a in cls if a.name.startswith(p)])
@classmethod
def prefixes(cls, prefix_list):
if isinstance(prefix_list, str):
prefix_list = prefix_list.split()
return tuple(chain(*[cls._prefix(p) for p in prefix_list]))
@classmethod
def _suffix(cls, s):
return tuple([a.value for a in cls if a.name.endswith(s)])
@classmethod
def suffixes(cls, suffix_list):
if isinstance(suffix_list, str):
suffix_list = suffix_list.split()
return tuple(chain(*[cls._suffix(s) for s in suffix_list]))
@classmethod
def from_list(cls, name, l):
# Manually construct (Python 3.4 is missing the 'start' argument).
# Python defaults to start=1, but we want start=0.
return cls(name, [(l[i], i) for i in range(len(l))])
@classmethod
def from_str(cls, name, s):
return cls.from_list(name, s.split())