"""Attempt detection of current chip / CPU."""
|
|
import sys
|
|
|
|
AM33XX = "AM33XX"
|
|
BCM2XXX = "BCM2XXX"
|
|
ESP8266 = "ESP8266"
|
|
SAMD21 = "SAMD21"
|
|
STM32 = "STM32"
|
|
SUN8I = "SUN8I"
|
|
GENERIC_X86 = "GENERIC_X86"
|
|
|
|
class Chip:
|
|
"""Attempt detection of current chip / CPU."""
|
|
def __init__(self, detector):
|
|
self.detector = detector
|
|
|
|
@property
|
|
# pylint: disable=invalid-name
|
|
def id(self):
|
|
"""Return a unique id for the detected chip, if any."""
|
|
platform = sys.platform
|
|
if platform == "linux":
|
|
return self._linux_id()
|
|
if platform == "esp8266":
|
|
return ESP8266
|
|
if platform == "samd21":
|
|
return SAMD21
|
|
if platform == "pyboard":
|
|
return STM32
|
|
return None
|
|
# pylint: enable=invalid-name
|
|
|
|
def _linux_id(self):
|
|
"""Attempt to detect the CPU on a computer running the Linux kernel."""
|
|
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
|
|
elif hardware in ("BCM2708", "BCM2708", "BCM2835"):
|
|
linux_id = BCM2XXX
|
|
elif "AM33XX" in hardware:
|
|
linux_id = AM33XX
|
|
elif "sun8i" in hardware:
|
|
linux_id = SUN8I
|
|
|
|
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
|