mirror of
https://github.com/xtacocorex/CHIP_IO
synced 2025-07-20 04:43:21 +00:00
Totally forgot to add the OverlayManager code in the last commit. This update is for #10
This commit is contained in:
192
CHIP_IO/OverlayManager.py
Normal file
192
CHIP_IO/OverlayManager.py
Normal file
@ -0,0 +1,192 @@
|
||||
import os
|
||||
import shutil
|
||||
import time
|
||||
|
||||
DEBUG = False
|
||||
|
||||
OVERLAYINSTALLPATH = "/lib/firmware/chip_io"
|
||||
OVERLAYCONFIGPATH = "/sys/kernel/config/device-tree/overlays"
|
||||
CUSTOMOVERLAYFILEPATH = ""
|
||||
|
||||
PWMSYSFSPATH = "/sys/class/pwm/pwmchip0"
|
||||
I2C1SYSFSPATH = "/sys/class/i2c-dev/i2c-1"
|
||||
|
||||
# LOADED VARIABLES
|
||||
# DO NOT MODIFY BY HAND WHEN USING
|
||||
# AS IT COULD BREAK FUNCTIONALITY
|
||||
_LOADED = {
|
||||
"I2C1" : False,
|
||||
"SPI2" : False,
|
||||
"PWM0" : False,
|
||||
"CUST" : False
|
||||
}
|
||||
|
||||
_OVERLAYS = {
|
||||
"I2C1" : "chip-i2c1.dtbo",
|
||||
"SPI2" : "chip-spi2.dtbo",
|
||||
"PWM0" : "chip-pwm0.dtbo",
|
||||
"CUST" : ""
|
||||
}
|
||||
|
||||
_FOLDERS = {
|
||||
"I2C1" : "chip-i2c",
|
||||
"SPI2" : "chip-spi",
|
||||
"PWM0" : "chip-pwm",
|
||||
"CUST" : "chip-cust"
|
||||
}
|
||||
|
||||
def enable_debug():
|
||||
global DEBUG
|
||||
DEBUG = True
|
||||
|
||||
def get_i2c_loaded():
|
||||
"""
|
||||
get_i2c_loaded - Returns True/False based upon if the i2c-1 Overlay is loaded
|
||||
"""
|
||||
global _LOADED
|
||||
return _LOADED["I2C1"]
|
||||
|
||||
def get_spi_loaded():
|
||||
"""
|
||||
get_spi_loaded - Returns True/False based upon if the spi2 Overlay is loaded
|
||||
"""
|
||||
global _LOADED
|
||||
return _LOADED["SPI2"]
|
||||
|
||||
def get_pwm_loaded():
|
||||
"""
|
||||
get_pwm_loaded - Returns True/False based upon if the pwm0 Overlay is loaded
|
||||
"""
|
||||
global _LOADED
|
||||
return _LOADED["PWM0"]
|
||||
|
||||
def get_custom_loaded():
|
||||
"""
|
||||
get_custom_loaded - Returns True/False based upon if a Custom Overlay is loaded
|
||||
"""
|
||||
global _LOADED
|
||||
return _LOADED["CUST"]
|
||||
|
||||
def _set_overlay_verify(name, overlay_path, config_path):
|
||||
"""
|
||||
_set_overlay_verify - Function to load the overlay and verify it was setup properly
|
||||
"""
|
||||
global DEBUG
|
||||
# VERIFY PATH IS NOT THERE
|
||||
if os.path.exists(config_path):
|
||||
print("Config path already exists! Not moving forward")
|
||||
print("config_path: {0}".format(config_path))
|
||||
return -1
|
||||
|
||||
# MAKE THE CONFIGURATION PATH
|
||||
os.makedirs(config_path)
|
||||
|
||||
# CAT THE OVERLAY INTO THE CONFIG FILESYSTEM
|
||||
with open(config_path + "/dtbo", 'wb') as outfile:
|
||||
with open(overlay_path, 'rb') as infile:
|
||||
shutil.copyfileobj(infile, outfile)
|
||||
|
||||
# SLEEP TO ENABLE THE KERNEL TO DO ITS JOB
|
||||
time.sleep(0.2)
|
||||
|
||||
# VERIFY
|
||||
if name == "PWM0":
|
||||
if os.path.exists(PWMSYSFSPATH):
|
||||
if DEBUG:
|
||||
print("PWM IS LOADED!")
|
||||
return 0
|
||||
else:
|
||||
if DEBUG:
|
||||
print("ERROR LOAIDNG PWM0")
|
||||
return 1
|
||||
elif name == "I2C1":
|
||||
if os.path.exists(I2C1SYSFSPATH):
|
||||
if DEBUG:
|
||||
print("I2C-1 IS LOADED!")
|
||||
return 0
|
||||
else:
|
||||
if DEBUG:
|
||||
print("ERROR LOADING I2C-1")
|
||||
return 1
|
||||
|
||||
def load(overlay, path=""):
|
||||
"""
|
||||
load - Load a DTB Overlay
|
||||
|
||||
Inputs:
|
||||
overlay - Overlay Key: I2C1, SPI2, PWM0, CUST
|
||||
path - Full Path to where the custom overlay is stored
|
||||
|
||||
Returns:
|
||||
0 - Successful Load
|
||||
1 - Unsuccessful Load
|
||||
2 - Overlay was previously set
|
||||
"""
|
||||
global DEBUG
|
||||
global _LOADED
|
||||
if DEBUG:
|
||||
print("LOAD OVERLAY")
|
||||
print("OVERLAY: {0}".format(overlay))
|
||||
print("PATH: {0}".format(path))
|
||||
# SEE IF OUR OVERLAY NAME IS IN THE KEYS
|
||||
if overlay.upper() in _OVERLAYS.keys():
|
||||
cpath = OVERLAYCONFIGPATH + "/" + _FOLDERS[overlay.upper()]
|
||||
if DEBUG:
|
||||
print("VALID OVERLAY")
|
||||
print("CONFIG PATH: {0}".format(cpath))
|
||||
# CHECK TO SEE IF WE HAVE A PATH FOR CUSTOM OVERLAY
|
||||
if overlay.upper() == "CUST" and path == "":
|
||||
raise ValueError("Path must be specified for Custom Overlay Choice")
|
||||
elif overlay.upper() == "CUST" and _LOADED[overlay.upper()]:
|
||||
print("Custom Overlay already loaded")
|
||||
return 2
|
||||
elif overlay.upper() == "CUST":
|
||||
opath = OVERLAYINSTALLPATH + "/" + _OVERLAYS[overlay.upper()]
|
||||
print("Custom Overlay not implemented yet")
|
||||
return 1
|
||||
|
||||
# SET UP THE OVERLAY PATH FOR OUR USE
|
||||
if overlay.upper() != "CUST":
|
||||
opath = OVERLAYINSTALLPATH + "/" + _OVERLAYS[overlay.upper()]
|
||||
else:
|
||||
opath = path
|
||||
if DEBUG:
|
||||
print("OVERLAY PATH: {0}".format(opath))
|
||||
|
||||
if overlay.upper() == "PWM0" and _LOADED[overlay.upper()]:
|
||||
print("PWM0 Overlay already loaded")
|
||||
return 2
|
||||
|
||||
if overlay.upper() == "I2C1" and _LOADED[overlay.upper()]:
|
||||
print("I2C1 Overlay already loaded")
|
||||
return 2
|
||||
|
||||
if overlay.upper() == "SPI2" and _LOADED[overlay.upper()]:
|
||||
print("SPI2 Overlay already loaded")
|
||||
return 2
|
||||
|
||||
# LOAD THE OVERLAY
|
||||
errc = _set_overlay_verify(overlay.upper(), opath, cpath)
|
||||
if DEBUG:
|
||||
print("ERRC: {0}".format(errc))
|
||||
if errc == 0:
|
||||
_LOADED[overlay.upper()] = True
|
||||
|
||||
else:
|
||||
raise ValueError("Invalid Overlay name specified! Choose between: I2C1, SPI2, PWM0, CUST")
|
||||
|
||||
def unload(overlay):
|
||||
global DEBUG
|
||||
global _LOADED
|
||||
if DEBUG:
|
||||
print("UNLOAD OVERLAY")
|
||||
print(overlay)
|
||||
# SEE IF OUR OVERLAY NAME IS IN THE KEYS
|
||||
if overlay.upper() in _OVERLAYS.keys():
|
||||
# BRUTE FORCE REMOVE AS THE DIRECTORY CONTAINS FILES
|
||||
os.system('rmdir \"{}\"'.format(OVERLAYCONFIGPATH + "/" + _FOLDERS[overlay.upper()]))
|
||||
_LOADED[overlay.upper()] = False
|
||||
else:
|
||||
raise ValueError("Invalid Overlay name specified! Choose between: I2C1, SPI2, PWM0, CUST")
|
||||
|
||||
|
Reference in New Issue
Block a user