|
|
- """Attempt detection of current chip / CPU."""
- import sys
- import os
-
- AM33XX = "AM33XX"
- IMX8MX = "IMX8MX"
- BCM2XXX = "BCM2XXX"
- ESP8266 = "ESP8266"
- SAMD21 = "SAMD21"
- STM32 = "STM32"
- SUN8I = "SUN8I"
- S805 = "S805"
- S905 = "S905"
- S922X = "S922X"
- SAMA5 = "SAMA5"
- T210 = "T210"
- T186 = "T186"
- T194 = "T194"
- APQ8016 = "APQ8016"
- GENERIC_X86 = "GENERIC_X86"
- FT232H = "FT232H"
- HFU540 = "HFU540"
- MCP2221 = "MCP2221"
- BINHO = "BINHO"
- MIPS24KC = "MIPS24KC"
- MIPS24KEC = "MIPS24KEC"
-
- class Chip:
- """Attempt detection of current chip / CPU."""
- def __init__(self, detector):
- self.detector = detector
-
- @property
- def id(self): # pylint: disable=invalid-name,too-many-branches,too-many-return-statements
- """Return a unique id for the detected chip, if any."""
- # There are some times we want to trick the platform detection
- # say if a raspberry pi doesn't have the right ID, or for testing
- try:
- return os.environ['BLINKA_FORCECHIP']
- except KeyError: # no forced chip, continue with testing!
- pass
-
- # Special cases controlled by environment var
- if os.environ.get('BLINKA_FT232H'):
- from pyftdi.usbtools import UsbTools # pylint: disable=import-error
- # look for it based on PID/VID
- count = len(UsbTools.find_all([(0x0403, 0x6014)]))
- if count == 0:
- raise RuntimeError('BLINKA_FT232H environment variable ' + \
- 'set, but no FT232H device found')
- return FT232H
- if os.environ.get('BLINKA_MCP2221'):
- import hid # pylint: disable=import-error
- # look for it based on PID/VID
- for dev in hid.enumerate():
- if dev['vendor_id'] == 0x04D8 and dev['product_id'] == 0x00DD:
- return MCP2221
- raise RuntimeError('BLINKA_MCP2221 environment variable ' + \
- 'set, but no MCP2221 device found')
- if os.environ.get('BLINKA_NOVA'):
- return BINHO
-
- platform = sys.platform
- if platform == "linux" or platform == "linux2":
- return self._linux_id()
- if platform == "esp8266":
- return ESP8266
- if platform == "samd21":
- return SAMD21
- if platform == "pyboard":
- return STM32
- # nothing found!
- return None
- # pylint: enable=invalid-name
-
- def _linux_id(self): # pylint: disable=too-many-branches
- """Attempt to detect the CPU on a computer running the Linux kernel."""
-
- if self.detector.check_dt_compatible_value("qcom,apq8016"):
- return APQ8016
-
- if self.detector.check_dt_compatible_value("fu500"):
- return HFU540
-
- linux_id = None
- hardware = self.detector.get_cpuinfo_field("Hardware")
-
- if hardware is None:
- vendor_id = self.detector.get_cpuinfo_field("vendor_id")
- if vendor_id in ("GenuineIntel", "AuthenticAMD"):
- linux_id = GENERIC_X86
-
- compatible = self.detector.get_device_compatible()
- if compatible and 'tegra' in compatible:
- if 'cv' in compatible or 'nano' in compatible:
- linux_id = T210
- elif 'quill' in compatible:
- linux_id = T186
- elif 'xavier' in compatible:
- linux_id = T194
- if compatible and 'imx8m' in compatible:
- linux_id = IMX8MX
- if compatible and 'odroid-c2' in compatible:
- linux_id = S905
- if compatible and 'amlogic, g12b' in compatible:
- linux_id = S922X
-
- cpu_model = self.detector.get_cpuinfo_field("cpu model")
- if cpu_model is not None:
- if "MIPS 24Kc" in cpu_model:
- linux_id = MIPS24KC
- elif "MIPS 24KEc" in cpu_model:
- linux_id = MIPS24KEC
-
- elif hardware in ("BCM2708", "BCM2709", "BCM2835"):
- linux_id = BCM2XXX
- elif "AM33XX" in hardware:
- linux_id = AM33XX
- elif "sun8i" in hardware:
- linux_id = SUN8I
- elif "ODROIDC" in hardware:
- linux_id = S805
- elif "ODROID-C2" in hardware:
- linux_id = S905
- elif "ODROID-N2" in hardware:
- linux_id = S922X
- elif "SAMA5" in hardware:
- linux_id = SAMA5
-
- return linux_id
-
- def __getattr__(self, attr):
- """
- Detect whether the given attribute is the currently-detected chip. See
- list of constants at the top of this module for available options.
- """
- if self.id == attr:
- return True
- return False
|