🔨 Fix IntelliSense / PIO conflicts (#23058)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>x301
parent
f97635de36
commit
fc2020c6ec
@ -1,123 +1,127 @@
|
|||||||
#
|
#
|
||||||
# sets output_port
|
# upload_extra_script.py
|
||||||
|
# set the output_port
|
||||||
# if target_filename is found then that drive is used
|
# if target_filename is found then that drive is used
|
||||||
# else if target_drive is found then that drive is used
|
# else if target_drive is found then that drive is used
|
||||||
#
|
#
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
target_filename = "FIRMWARE.CUR"
|
import pioutil
|
||||||
target_drive = "REARM"
|
if pioutil.is_pio_build():
|
||||||
|
|
||||||
import os,getpass,platform
|
target_filename = "FIRMWARE.CUR"
|
||||||
|
target_drive = "REARM"
|
||||||
|
|
||||||
current_OS = platform.system()
|
import os,getpass,platform
|
||||||
Import("env")
|
|
||||||
|
|
||||||
def print_error(e):
|
current_OS = platform.system()
|
||||||
print('\nUnable to find destination disk (%s)\n' \
|
Import("env")
|
||||||
'Please select it in platformio.ini using the upload_port keyword ' \
|
|
||||||
'(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \
|
|
||||||
'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \
|
|
||||||
%(e, env.get('PIOENV')))
|
|
||||||
|
|
||||||
def before_upload(source, target, env):
|
def print_error(e):
|
||||||
try:
|
print('\nUnable to find destination disk (%s)\n' \
|
||||||
#
|
'Please select it in platformio.ini using the upload_port keyword ' \
|
||||||
# Find a disk for upload
|
'(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \
|
||||||
#
|
'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \
|
||||||
upload_disk = 'Disk not found'
|
%(e, env.get('PIOENV')))
|
||||||
target_file_found = False
|
|
||||||
target_drive_found = False
|
def before_upload(source, target, env):
|
||||||
if current_OS == 'Windows':
|
try:
|
||||||
#
|
#
|
||||||
# platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
|
# Find a disk for upload
|
||||||
# Windows - doesn't care about the disk's name, only cares about the drive letter
|
#
|
||||||
import subprocess,string
|
upload_disk = 'Disk not found'
|
||||||
from ctypes import windll
|
target_file_found = False
|
||||||
|
target_drive_found = False
|
||||||
|
if current_OS == 'Windows':
|
||||||
|
#
|
||||||
|
# platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
|
||||||
|
# Windows - doesn't care about the disk's name, only cares about the drive letter
|
||||||
|
import subprocess,string
|
||||||
|
from ctypes import windll
|
||||||
|
|
||||||
# getting list of drives
|
# getting list of drives
|
||||||
# https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
|
# https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
|
||||||
drives = []
|
drives = []
|
||||||
bitmask = windll.kernel32.GetLogicalDrives()
|
bitmask = windll.kernel32.GetLogicalDrives()
|
||||||
for letter in string.ascii_uppercase:
|
for letter in string.ascii_uppercase:
|
||||||
if bitmask & 1:
|
if bitmask & 1:
|
||||||
drives.append(letter)
|
drives.append(letter)
|
||||||
bitmask >>= 1
|
bitmask >>= 1
|
||||||
|
|
||||||
for drive in drives:
|
for drive in drives:
|
||||||
final_drive_name = drive + ':\\'
|
final_drive_name = drive + ':\\'
|
||||||
# print ('disc check: {}'.format(final_drive_name))
|
# print ('disc check: {}'.format(final_drive_name))
|
||||||
try:
|
try:
|
||||||
volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
|
volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print ('error:{}'.format(e))
|
print ('error:{}'.format(e))
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
|
if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
|
||||||
target_drive_found = True
|
target_drive_found = True
|
||||||
upload_disk = final_drive_name
|
|
||||||
if target_filename in volume_info:
|
|
||||||
if not target_file_found:
|
|
||||||
upload_disk = final_drive_name
|
upload_disk = final_drive_name
|
||||||
target_file_found = True
|
if target_filename in volume_info:
|
||||||
|
if not target_file_found:
|
||||||
|
upload_disk = final_drive_name
|
||||||
|
target_file_found = True
|
||||||
|
|
||||||
elif current_OS == 'Linux':
|
elif current_OS == 'Linux':
|
||||||
#
|
#
|
||||||
# platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
|
# platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
|
||||||
#
|
#
|
||||||
drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
|
drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
|
||||||
if target_drive in drives: # If target drive is found, use it.
|
if target_drive in drives: # If target drive is found, use it.
|
||||||
target_drive_found = True
|
target_drive_found = True
|
||||||
upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep
|
upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep
|
||||||
else:
|
else:
|
||||||
|
for drive in drives:
|
||||||
|
try:
|
||||||
|
files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive))
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
if target_filename in files:
|
||||||
|
upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep
|
||||||
|
target_file_found = True
|
||||||
|
break
|
||||||
|
#
|
||||||
|
# set upload_port to drive if found
|
||||||
|
#
|
||||||
|
|
||||||
|
if target_file_found or target_drive_found:
|
||||||
|
env.Replace(
|
||||||
|
UPLOAD_FLAGS="-P$UPLOAD_PORT"
|
||||||
|
)
|
||||||
|
|
||||||
|
elif current_OS == 'Darwin': # MAC
|
||||||
|
#
|
||||||
|
# platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
|
||||||
|
#
|
||||||
|
drives = os.listdir('/Volumes') # human readable names
|
||||||
|
if target_drive in drives and not target_file_found: # set upload if not found target file yet
|
||||||
|
target_drive_found = True
|
||||||
|
upload_disk = '/Volumes/' + target_drive + '/'
|
||||||
for drive in drives:
|
for drive in drives:
|
||||||
try:
|
try:
|
||||||
files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive))
|
filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected
|
||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
if target_filename in files:
|
if target_filename in filenames:
|
||||||
upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep
|
if not target_file_found:
|
||||||
|
upload_disk = '/Volumes/' + drive + '/'
|
||||||
target_file_found = True
|
target_file_found = True
|
||||||
break
|
|
||||||
#
|
|
||||||
# set upload_port to drive if found
|
|
||||||
#
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Set upload_port to drive if found
|
||||||
|
#
|
||||||
if target_file_found or target_drive_found:
|
if target_file_found or target_drive_found:
|
||||||
env.Replace(
|
env.Replace(UPLOAD_PORT=upload_disk)
|
||||||
UPLOAD_FLAGS="-P$UPLOAD_PORT"
|
print('\nUpload disk: ', upload_disk, '\n')
|
||||||
)
|
else:
|
||||||
|
print_error('Autodetect Error')
|
||||||
|
|
||||||
elif current_OS == 'Darwin': # MAC
|
except Exception as e:
|
||||||
#
|
print_error(str(e))
|
||||||
# platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
|
|
||||||
#
|
|
||||||
drives = os.listdir('/Volumes') # human readable names
|
|
||||||
if target_drive in drives and not target_file_found: # set upload if not found target file yet
|
|
||||||
target_drive_found = True
|
|
||||||
upload_disk = '/Volumes/' + target_drive + '/'
|
|
||||||
for drive in drives:
|
|
||||||
try:
|
|
||||||
filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
if target_filename in filenames:
|
|
||||||
if not target_file_found:
|
|
||||||
upload_disk = '/Volumes/' + drive + '/'
|
|
||||||
target_file_found = True
|
|
||||||
|
|
||||||
#
|
env.AddPreAction("upload", before_upload)
|
||||||
# Set upload_port to drive if found
|
|
||||||
#
|
|
||||||
if target_file_found or target_drive_found:
|
|
||||||
env.Replace(UPLOAD_PORT=upload_disk)
|
|
||||||
print('\nUpload disk: ', upload_disk, '\n')
|
|
||||||
else:
|
|
||||||
print_error('Autodetect Error')
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print_error(str(e))
|
|
||||||
|
|
||||||
env.AddPreAction("upload", before_upload)
|
|
||||||
|
@ -1,40 +1,43 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py
|
# STM32F103RC_MEEB_3DP.py
|
||||||
#
|
#
|
||||||
try:
|
import pioutil
|
||||||
import configparser
|
if pioutil.is_pio_build():
|
||||||
except ImportError:
|
|
||||||
import ConfigParser as configparser
|
|
||||||
|
|
||||||
import os
|
try:
|
||||||
Import("env", "projenv")
|
import configparser
|
||||||
|
except ImportError:
|
||||||
|
import ConfigParser as configparser
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
import os
|
||||||
config.read("platformio.ini")
|
Import("env", "projenv")
|
||||||
|
|
||||||
#
|
config = configparser.ConfigParser()
|
||||||
# Upload actions
|
config.read("platformio.ini")
|
||||||
#
|
|
||||||
def before_upload(source, target, env):
|
|
||||||
env.Execute("pwd")
|
|
||||||
|
|
||||||
def after_upload(source, target, env):
|
#
|
||||||
env.Execute("pwd")
|
# Upload actions
|
||||||
|
#
|
||||||
|
def before_upload(source, target, env):
|
||||||
|
env.Execute("pwd")
|
||||||
|
|
||||||
env.AddPreAction("upload", before_upload)
|
def after_upload(source, target, env):
|
||||||
env.AddPostAction("upload", after_upload)
|
env.Execute("pwd")
|
||||||
|
|
||||||
flash_size = 0
|
env.AddPreAction("upload", before_upload)
|
||||||
vect_tab_addr = 0
|
env.AddPostAction("upload", after_upload)
|
||||||
|
|
||||||
for define in env['CPPDEFINES']:
|
flash_size = 0
|
||||||
if define[0] == "VECT_TAB_ADDR":
|
vect_tab_addr = 0
|
||||||
vect_tab_addr = define[1]
|
|
||||||
if define[0] == "STM32_FLASH_SIZE":
|
|
||||||
flash_size = define[1]
|
|
||||||
|
|
||||||
print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr))
|
for define in env['CPPDEFINES']:
|
||||||
print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size))
|
if define[0] == "VECT_TAB_ADDR":
|
||||||
|
vect_tab_addr = define[1]
|
||||||
|
if define[0] == "STM32_FLASH_SIZE":
|
||||||
|
flash_size = define[1]
|
||||||
|
|
||||||
import marlin
|
print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr))
|
||||||
marlin.custom_ld_script("STM32F103RC_MEEB_3DP.ld")
|
print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size))
|
||||||
|
|
||||||
|
import marlin
|
||||||
|
marlin.custom_ld_script("STM32F103RC_MEEB_3DP.ld")
|
||||||
|
@ -1,25 +1,28 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py
|
# STM32F103RC_fysetc.py
|
||||||
#
|
#
|
||||||
from os.path import join
|
import pioutil
|
||||||
from os.path import expandvars
|
if pioutil.is_pio_build():
|
||||||
Import("env")
|
import os
|
||||||
|
from os.path import join
|
||||||
|
from os.path import expandvars
|
||||||
|
Import("env")
|
||||||
|
|
||||||
# Custom HEX from ELF
|
# Custom HEX from ELF
|
||||||
env.AddPostAction(
|
env.AddPostAction(
|
||||||
join("$BUILD_DIR", "${PROGNAME}.elf"),
|
join("$BUILD_DIR", "${PROGNAME}.elf"),
|
||||||
env.VerboseAction(" ".join([
|
env.VerboseAction(" ".join([
|
||||||
"$OBJCOPY", "-O ihex", "$TARGET",
|
"$OBJCOPY", "-O ihex", "$TARGET",
|
||||||
"\"" + join("$BUILD_DIR", "${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path
|
"\"" + join("$BUILD_DIR", "${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path
|
||||||
]), "Building $TARGET"))
|
]), "Building $TARGET"))
|
||||||
|
|
||||||
# In-line command with arguments
|
# In-line command with arguments
|
||||||
UPLOAD_TOOL="stm32flash"
|
UPLOAD_TOOL="stm32flash"
|
||||||
platform = env.PioPlatform()
|
platform = env.PioPlatform()
|
||||||
if platform.get_package_dir("tool-stm32duino") != None:
|
if platform.get_package_dir("tool-stm32duino") != None:
|
||||||
UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"")
|
UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"")
|
||||||
|
|
||||||
env.Replace(
|
env.Replace(
|
||||||
UPLOADER=UPLOAD_TOOL,
|
UPLOADER=UPLOAD_TOOL,
|
||||||
UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT")
|
UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT")
|
||||||
)
|
)
|
||||||
|
@ -1,30 +1,32 @@
|
|||||||
#
|
#
|
||||||
# STM32F1_create_variant.py
|
# STM32F1_create_variant.py
|
||||||
#
|
#
|
||||||
import os,shutil,marlin
|
import pioutil
|
||||||
from SCons.Script import DefaultEnvironment
|
if pioutil.is_pio_build():
|
||||||
from platformio import util
|
import os,shutil,marlin
|
||||||
|
from SCons.Script import DefaultEnvironment
|
||||||
|
from platformio import util
|
||||||
|
|
||||||
env = DefaultEnvironment()
|
env = DefaultEnvironment()
|
||||||
platform = env.PioPlatform()
|
platform = env.PioPlatform()
|
||||||
board = env.BoardConfig()
|
board = env.BoardConfig()
|
||||||
|
|
||||||
FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple")
|
FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple")
|
||||||
assert os.path.isdir(FRAMEWORK_DIR)
|
assert os.path.isdir(FRAMEWORK_DIR)
|
||||||
|
|
||||||
source_root = os.path.join("buildroot", "share", "PlatformIO", "variants")
|
source_root = os.path.join("buildroot", "share", "PlatformIO", "variants")
|
||||||
assert os.path.isdir(source_root)
|
assert os.path.isdir(source_root)
|
||||||
|
|
||||||
variant = board.get("build.variant")
|
variant = board.get("build.variant")
|
||||||
variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "variants", variant)
|
variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "variants", variant)
|
||||||
|
|
||||||
source_dir = os.path.join(source_root, variant)
|
source_dir = os.path.join(source_root, variant)
|
||||||
assert os.path.isdir(source_dir)
|
assert os.path.isdir(source_dir)
|
||||||
|
|
||||||
if os.path.isdir(variant_dir):
|
if os.path.isdir(variant_dir):
|
||||||
shutil.rmtree(variant_dir)
|
shutil.rmtree(variant_dir)
|
||||||
|
|
||||||
if not os.path.isdir(variant_dir):
|
if not os.path.isdir(variant_dir):
|
||||||
os.mkdir(variant_dir)
|
os.mkdir(variant_dir)
|
||||||
|
|
||||||
marlin.copytree(source_dir, variant_dir)
|
marlin.copytree(source_dir, variant_dir)
|
||||||
|
@ -1,116 +1,117 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/chitu_crypt.py
|
# chitu_crypt.py
|
||||||
# Customizations for Chitu boards
|
# Customizations for Chitu boards
|
||||||
#
|
#
|
||||||
import os,random,struct,uuid,marlin
|
import pioutil
|
||||||
|
if pioutil.is_pio_build():
|
||||||
|
import os,random,struct,uuid,marlin
|
||||||
|
# Relocate firmware from 0x08000000 to 0x08008800
|
||||||
|
marlin.relocate_firmware("0x08008800")
|
||||||
|
|
||||||
# Relocate firmware from 0x08000000 to 0x08008800
|
def calculate_crc(contents, seed):
|
||||||
marlin.relocate_firmware("0x08008800")
|
accumulating_xor_value = seed;
|
||||||
|
|
||||||
def calculate_crc(contents, seed):
|
for i in range(0, len(contents), 4):
|
||||||
accumulating_xor_value = seed;
|
value = struct.unpack('<I', contents[ i : i + 4])[0]
|
||||||
|
accumulating_xor_value = accumulating_xor_value ^ value
|
||||||
|
return accumulating_xor_value
|
||||||
|
|
||||||
for i in range(0, len(contents), 4):
|
def xor_block(r0, r1, block_number, block_size, file_key):
|
||||||
value = struct.unpack('<I', contents[ i : i + 4])[0]
|
# This is the loop counter
|
||||||
accumulating_xor_value = accumulating_xor_value ^ value
|
loop_counter = 0x0
|
||||||
return accumulating_xor_value
|
|
||||||
|
|
||||||
def xor_block(r0, r1, block_number, block_size, file_key):
|
# This is the key length
|
||||||
# This is the loop counter
|
key_length = 0x18
|
||||||
loop_counter = 0x0
|
|
||||||
|
|
||||||
# This is the key length
|
# This is an initial seed
|
||||||
key_length = 0x18
|
xor_seed = 0x4BAD
|
||||||
|
|
||||||
# This is an initial seed
|
# This is the block counter
|
||||||
xor_seed = 0x4BAD
|
block_number = xor_seed * block_number
|
||||||
|
|
||||||
# This is the block counter
|
#load the xor key from the file
|
||||||
block_number = xor_seed * block_number
|
r7 = file_key
|
||||||
|
|
||||||
#load the xor key from the file
|
for loop_counter in range(0, block_size):
|
||||||
r7 = file_key
|
# meant to make sure different bits of the key are used.
|
||||||
|
xor_seed = int(loop_counter / key_length)
|
||||||
|
|
||||||
for loop_counter in range(0, block_size):
|
# IP is a scratch register / R12
|
||||||
# meant to make sure different bits of the key are used.
|
ip = loop_counter - (key_length * xor_seed)
|
||||||
xor_seed = int(loop_counter / key_length)
|
|
||||||
|
|
||||||
# IP is a scratch register / R12
|
# xor_seed = (loop_counter * loop_counter) + block_number
|
||||||
ip = loop_counter - (key_length * xor_seed)
|
xor_seed = (loop_counter * loop_counter) + block_number
|
||||||
|
|
||||||
# xor_seed = (loop_counter * loop_counter) + block_number
|
# shift the xor_seed left by the bits in IP.
|
||||||
xor_seed = (loop_counter * loop_counter) + block_number
|
xor_seed = xor_seed >> ip
|
||||||
|
|
||||||
# shift the xor_seed left by the bits in IP.
|
# load a byte into IP
|
||||||
xor_seed = xor_seed >> ip
|
ip = r0[loop_counter]
|
||||||
|
|
||||||
# load a byte into IP
|
# XOR the seed with r7
|
||||||
ip = r0[loop_counter]
|
xor_seed = xor_seed ^ r7
|
||||||
|
|
||||||
# XOR the seed with r7
|
# and then with IP
|
||||||
xor_seed = xor_seed ^ r7
|
xor_seed = xor_seed ^ ip
|
||||||
|
|
||||||
# and then with IP
|
#Now store the byte back
|
||||||
xor_seed = xor_seed ^ ip
|
r1[loop_counter] = xor_seed & 0xFF
|
||||||
|
|
||||||
#Now store the byte back
|
#increment the loop_counter
|
||||||
r1[loop_counter] = xor_seed & 0xFF
|
loop_counter = loop_counter + 1
|
||||||
|
|
||||||
#increment the loop_counter
|
def encrypt_file(input, output_file, file_length):
|
||||||
loop_counter = loop_counter + 1
|
input_file = bytearray(input.read())
|
||||||
|
block_size = 0x800
|
||||||
|
key_length = 0x18
|
||||||
|
|
||||||
def encrypt_file(input, output_file, file_length):
|
uid_value = uuid.uuid4()
|
||||||
input_file = bytearray(input.read())
|
file_key = int(uid_value.hex[0:8], 16)
|
||||||
block_size = 0x800
|
|
||||||
key_length = 0x18
|
|
||||||
|
|
||||||
uid_value = uuid.uuid4()
|
xor_crc = 0xEF3D4323;
|
||||||
file_key = int(uid_value.hex[0:8], 16)
|
|
||||||
|
|
||||||
xor_crc = 0xEF3D4323;
|
# the input file is exepcted to be in chunks of 0x800
|
||||||
|
# so round the size
|
||||||
|
while len(input_file) % block_size != 0:
|
||||||
|
input_file.extend(b'0x0')
|
||||||
|
|
||||||
# the input file is exepcted to be in chunks of 0x800
|
# write the file header
|
||||||
# so round the size
|
output_file.write(struct.pack(">I", 0x443D2D3F))
|
||||||
while len(input_file) % block_size != 0:
|
# encrypt the contents using a known file header key
|
||||||
input_file.extend(b'0x0')
|
|
||||||
|
|
||||||
# write the file header
|
# write the file_key
|
||||||
output_file.write(struct.pack(">I", 0x443D2D3F))
|
output_file.write(struct.pack("<I", file_key))
|
||||||
# encrypt the contents using a known file header key
|
|
||||||
|
|
||||||
# write the file_key
|
#TODO - how to enforce that the firmware aligns to block boundaries?
|
||||||
output_file.write(struct.pack("<I", file_key))
|
block_count = int(len(input_file) / block_size)
|
||||||
|
print ("Block Count is ", block_count)
|
||||||
|
for block_number in range(0, block_count):
|
||||||
|
block_offset = (block_number * block_size)
|
||||||
|
block_end = block_offset + block_size
|
||||||
|
block_array = bytearray(input_file[block_offset: block_end])
|
||||||
|
xor_block(block_array, block_array, block_number, block_size, file_key)
|
||||||
|
for n in range (0, block_size):
|
||||||
|
input_file[block_offset + n] = block_array[n]
|
||||||
|
|
||||||
#TODO - how to enforce that the firmware aligns to block boundaries?
|
# update the expected CRC value.
|
||||||
block_count = int(len(input_file) / block_size)
|
xor_crc = calculate_crc(block_array, xor_crc)
|
||||||
print ("Block Count is ", block_count)
|
|
||||||
for block_number in range(0, block_count):
|
|
||||||
block_offset = (block_number * block_size)
|
|
||||||
block_end = block_offset + block_size
|
|
||||||
block_array = bytearray(input_file[block_offset: block_end])
|
|
||||||
xor_block(block_array, block_array, block_number, block_size, file_key)
|
|
||||||
for n in range (0, block_size):
|
|
||||||
input_file[block_offset + n] = block_array[n]
|
|
||||||
|
|
||||||
# update the expected CRC value.
|
# write CRC
|
||||||
xor_crc = calculate_crc(block_array, xor_crc)
|
output_file.write(struct.pack("<I", xor_crc))
|
||||||
|
|
||||||
# write CRC
|
# finally, append the encrypted results.
|
||||||
output_file.write(struct.pack("<I", xor_crc))
|
output_file.write(input_file)
|
||||||
|
return
|
||||||
|
|
||||||
# finally, append the encrypted results.
|
# Encrypt ${PROGNAME}.bin and save it as 'update.cbd'
|
||||||
output_file.write(input_file)
|
def encrypt(source, target, env):
|
||||||
return
|
firmware = open(target[0].path, "rb")
|
||||||
|
update = open(target[0].dir.path + '/update.cbd', "wb")
|
||||||
|
length = os.path.getsize(target[0].path)
|
||||||
|
|
||||||
# Encrypt ${PROGNAME}.bin and save it as 'update.cbd'
|
encrypt_file(firmware, update, length)
|
||||||
def encrypt(source, target, env):
|
|
||||||
firmware = open(target[0].path, "rb")
|
|
||||||
update = open(target[0].dir.path + '/update.cbd', "wb")
|
|
||||||
length = os.path.getsize(target[0].path)
|
|
||||||
|
|
||||||
encrypt_file(firmware, update, length)
|
firmware.close()
|
||||||
|
update.close()
|
||||||
|
|
||||||
firmware.close()
|
marlin.add_post_action(encrypt);
|
||||||
update.close()
|
|
||||||
|
|
||||||
marlin.add_post_action(encrypt);
|
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
#
|
#
|
||||||
# common-dependencies-post.py
|
# post:common-dependencies-post.py
|
||||||
# Convenience script to add build flags for Marlin Enabled Features
|
# Convenience script to add build flags for Marlin Enabled Features
|
||||||
#
|
#
|
||||||
|
import pioutil
|
||||||
|
if pioutil.is_pio_build():
|
||||||
|
Import("env", "projenv")
|
||||||
|
|
||||||
Import("env")
|
def apply_board_build_flags():
|
||||||
Import("projenv")
|
if not 'BOARD_CUSTOM_BUILD_FLAGS' in env['MARLIN_FEATURES']:
|
||||||
|
return
|
||||||
|
projenv.Append(CCFLAGS=env['MARLIN_FEATURES']['BOARD_CUSTOM_BUILD_FLAGS'].split())
|
||||||
|
|
||||||
def apply_board_build_flags():
|
# We need to add the board build flags in a post script
|
||||||
if not 'BOARD_CUSTOM_BUILD_FLAGS' in env['MARLIN_FEATURES']:
|
# so the platform build script doesn't overwrite the custom CCFLAGS
|
||||||
return
|
apply_board_build_flags()
|
||||||
projenv.Append(CCFLAGS=env['MARLIN_FEATURES']['BOARD_CUSTOM_BUILD_FLAGS'].split())
|
|
||||||
|
|
||||||
# We need to add the board build flags in a post script
|
|
||||||
# so the platform build script doesn't overwrite the custom CCFLAGS
|
|
||||||
apply_board_build_flags()
|
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/custom_board.py
|
# custom_board.py
|
||||||
#
|
#
|
||||||
# - For build.address replace VECT_TAB_ADDR to relocate the firmware
|
# - For build.address replace VECT_TAB_ADDR to relocate the firmware
|
||||||
# - For build.ldscript use one of the linker scripts in buildroot/share/PlatformIO/ldscripts
|
# - For build.ldscript use one of the linker scripts in buildroot/share/PlatformIO/ldscripts
|
||||||
#
|
#
|
||||||
import marlin
|
import pioutil
|
||||||
board = marlin.env.BoardConfig()
|
if pioutil.is_pio_build():
|
||||||
|
import marlin
|
||||||
|
board = marlin.env.BoardConfig()
|
||||||
|
|
||||||
address = board.get("build.address", "")
|
address = board.get("build.address", "")
|
||||||
if address:
|
if address:
|
||||||
marlin.relocate_firmware(address)
|
marlin.relocate_firmware(address)
|
||||||
|
|
||||||
ldscript = board.get("build.ldscript", "")
|
ldscript = board.get("build.ldscript", "")
|
||||||
if ldscript:
|
if ldscript:
|
||||||
marlin.custom_ld_script(ldscript)
|
marlin.custom_ld_script(ldscript)
|
||||||
|
@ -1,51 +1,49 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/download_mks_assets.py
|
# download_mks_assets.py
|
||||||
# Added by HAS_TFT_LVGL_UI to download assets from Makerbase repo
|
# Added by HAS_TFT_LVGL_UI to download assets from Makerbase repo
|
||||||
#
|
#
|
||||||
Import("env")
|
import pioutil
|
||||||
import os,requests,zipfile,tempfile,shutil,pioutil
|
if pioutil.is_pio_build():
|
||||||
|
Import("env")
|
||||||
|
import os,requests,zipfile,tempfile,shutil
|
||||||
|
|
||||||
# Detect that 'vscode init' is running
|
url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/0263cdaccf.zip"
|
||||||
if pioutil.is_vscode_init():
|
deps_path = env.Dictionary("PROJECT_LIBDEPS_DIR")
|
||||||
env.Exit(0)
|
zip_path = os.path.join(deps_path, "mks-assets.zip")
|
||||||
|
assets_path = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env.Dictionary("PIOENV"), "assets")
|
||||||
|
|
||||||
url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/0263cdaccf.zip"
|
def download_mks_assets():
|
||||||
deps_path = env.Dictionary("PROJECT_LIBDEPS_DIR")
|
print("Downloading MKS Assets")
|
||||||
zip_path = os.path.join(deps_path, "mks-assets.zip")
|
r = requests.get(url, stream=True)
|
||||||
assets_path = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env.Dictionary("PIOENV"), "assets")
|
# the user may have a very clean workspace,
|
||||||
|
# so create the PROJECT_LIBDEPS_DIR directory if not exits
|
||||||
|
if os.path.exists(deps_path) == False:
|
||||||
|
os.mkdir(deps_path)
|
||||||
|
with open(zip_path, 'wb') as fd:
|
||||||
|
for chunk in r.iter_content(chunk_size=128):
|
||||||
|
fd.write(chunk)
|
||||||
|
|
||||||
def download_mks_assets():
|
def copy_mks_assets():
|
||||||
print("Downloading MKS Assets")
|
print("Copying MKS Assets")
|
||||||
r = requests.get(url, stream=True)
|
output_path = tempfile.mkdtemp()
|
||||||
# the user may have a very clean workspace,
|
zip_obj = zipfile.ZipFile(zip_path, 'r')
|
||||||
# so create the PROJECT_LIBDEPS_DIR directory if not exits
|
zip_obj.extractall(output_path)
|
||||||
if os.path.exists(deps_path) == False:
|
zip_obj.close()
|
||||||
os.mkdir(deps_path)
|
if os.path.exists(assets_path) == True and os.path.isdir(assets_path) == False:
|
||||||
with open(zip_path, 'wb') as fd:
|
os.unlink(assets_path)
|
||||||
for chunk in r.iter_content(chunk_size=128):
|
if os.path.exists(assets_path) == False:
|
||||||
fd.write(chunk)
|
os.mkdir(assets_path)
|
||||||
|
base_path = ''
|
||||||
|
for filename in os.listdir(output_path):
|
||||||
|
base_path = filename
|
||||||
|
for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_font')):
|
||||||
|
shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_font', filename), assets_path)
|
||||||
|
for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_pic')):
|
||||||
|
shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_pic', filename), assets_path)
|
||||||
|
shutil.rmtree(output_path, ignore_errors=True)
|
||||||
|
|
||||||
|
if os.path.exists(zip_path) == False:
|
||||||
|
download_mks_assets()
|
||||||
|
|
||||||
def copy_mks_assets():
|
|
||||||
print("Copying MKS Assets")
|
|
||||||
output_path = tempfile.mkdtemp()
|
|
||||||
zip_obj = zipfile.ZipFile(zip_path, 'r')
|
|
||||||
zip_obj.extractall(output_path)
|
|
||||||
zip_obj.close()
|
|
||||||
if os.path.exists(assets_path) == True and os.path.isdir(assets_path) == False:
|
|
||||||
os.unlink(assets_path)
|
|
||||||
if os.path.exists(assets_path) == False:
|
if os.path.exists(assets_path) == False:
|
||||||
os.mkdir(assets_path)
|
copy_mks_assets()
|
||||||
base_path = ''
|
|
||||||
for filename in os.listdir(output_path):
|
|
||||||
base_path = filename
|
|
||||||
for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_font')):
|
|
||||||
shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_font', filename), assets_path)
|
|
||||||
for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_pic')):
|
|
||||||
shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_pic', filename), assets_path)
|
|
||||||
shutil.rmtree(output_path, ignore_errors=True)
|
|
||||||
|
|
||||||
if os.path.exists(zip_path) == False:
|
|
||||||
download_mks_assets()
|
|
||||||
|
|
||||||
if os.path.exists(assets_path) == False:
|
|
||||||
copy_mks_assets()
|
|
||||||
|
@ -1,32 +1,35 @@
|
|||||||
#
|
#
|
||||||
# fix_framework_weakness.py
|
# fix_framework_weakness.py
|
||||||
#
|
#
|
||||||
from os.path import join, isfile
|
import pioutil
|
||||||
import shutil
|
if pioutil.is_pio_build():
|
||||||
from pprint import pprint
|
|
||||||
|
|
||||||
Import("env")
|
import shutil
|
||||||
|
from os.path import join, isfile
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"):
|
Import("env")
|
||||||
FRAMEWORK_DIR = env.PioPlatform().get_package_dir("framework-arduinoststm32-maple")
|
|
||||||
patchflag_path = join(FRAMEWORK_DIR, ".exc-patching-done")
|
|
||||||
|
|
||||||
# patch file only if we didn't do it before
|
if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"):
|
||||||
if not isfile(patchflag_path):
|
FRAMEWORK_DIR = env.PioPlatform().get_package_dir("framework-arduinoststm32-maple")
|
||||||
print("Patching libmaple exception handlers")
|
patchflag_path = join(FRAMEWORK_DIR, ".exc-patching-done")
|
||||||
original_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S")
|
|
||||||
backup_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S.bak")
|
|
||||||
src_file = join("buildroot", "share", "PlatformIO", "scripts", "exc.S")
|
|
||||||
|
|
||||||
assert isfile(original_file) and isfile(src_file)
|
# patch file only if we didn't do it before
|
||||||
shutil.copyfile(original_file, backup_file)
|
if not isfile(patchflag_path):
|
||||||
shutil.copyfile(src_file, original_file);
|
print("Patching libmaple exception handlers")
|
||||||
|
original_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S")
|
||||||
|
backup_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S.bak")
|
||||||
|
src_file = join("buildroot", "share", "PlatformIO", "scripts", "exc.S")
|
||||||
|
|
||||||
def _touch(path):
|
assert isfile(original_file) and isfile(src_file)
|
||||||
with open(path, "w") as fp:
|
shutil.copyfile(original_file, backup_file)
|
||||||
fp.write("")
|
shutil.copyfile(src_file, original_file);
|
||||||
|
|
||||||
env.Execute(lambda *args, **kwargs: _touch(patchflag_path))
|
def _touch(path):
|
||||||
print("Done patching exception handler")
|
with open(path, "w") as fp:
|
||||||
|
fp.write("")
|
||||||
|
|
||||||
print("Libmaple modified and ready for post mortem debugging")
|
env.Execute(lambda *args, **kwargs: _touch(patchflag_path))
|
||||||
|
print("Done patching exception handler")
|
||||||
|
|
||||||
|
print("Libmaple modified and ready for post mortem debugging")
|
||||||
|
@ -1,39 +1,40 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py
|
# jgaurora_a5s_a1_with_bootloader.py
|
||||||
# Customizations for env:jgaurora_a5s_a1
|
# Customizations for env:jgaurora_a5s_a1
|
||||||
#
|
#
|
||||||
import os,marlin
|
import pioutil
|
||||||
|
if pioutil.is_pio_build():
|
||||||
|
import os,marlin
|
||||||
|
# Append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin'
|
||||||
|
def addboot(source, target, env):
|
||||||
|
firmware = open(target[0].path, "rb")
|
||||||
|
lengthfirmware = os.path.getsize(target[0].path)
|
||||||
|
bootloader_bin = "buildroot/share/PlatformIO/scripts/" + "jgaurora_bootloader.bin"
|
||||||
|
bootloader = open(bootloader_bin, "rb")
|
||||||
|
lengthbootloader = os.path.getsize(bootloader_bin)
|
||||||
|
|
||||||
# Append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin'
|
firmware_with_boothloader_bin = target[0].dir.path + '/firmware_with_bootloader.bin'
|
||||||
def addboot(source, target, env):
|
if os.path.exists(firmware_with_boothloader_bin):
|
||||||
firmware = open(target[0].path, "rb")
|
os.remove(firmware_with_boothloader_bin)
|
||||||
lengthfirmware = os.path.getsize(target[0].path)
|
firmwareimage = open(firmware_with_boothloader_bin, "wb")
|
||||||
bootloader_bin = "buildroot/share/PlatformIO/scripts/" + "jgaurora_bootloader.bin"
|
position = 0
|
||||||
bootloader = open(bootloader_bin, "rb")
|
while position < lengthbootloader:
|
||||||
lengthbootloader = os.path.getsize(bootloader_bin)
|
byte = bootloader.read(1)
|
||||||
|
firmwareimage.write(byte)
|
||||||
|
position += 1
|
||||||
|
position = 0
|
||||||
|
while position < lengthfirmware:
|
||||||
|
byte = firmware.read(1)
|
||||||
|
firmwareimage.write(byte)
|
||||||
|
position += 1
|
||||||
|
bootloader.close()
|
||||||
|
firmware.close()
|
||||||
|
firmwareimage.close()
|
||||||
|
|
||||||
firmware_with_boothloader_bin = target[0].dir.path + '/firmware_with_bootloader.bin'
|
firmware_without_bootloader_bin = target[0].dir.path + '/firmware_for_sd_upload.bin'
|
||||||
if os.path.exists(firmware_with_boothloader_bin):
|
if os.path.exists(firmware_without_bootloader_bin):
|
||||||
os.remove(firmware_with_boothloader_bin)
|
os.remove(firmware_without_bootloader_bin)
|
||||||
firmwareimage = open(firmware_with_boothloader_bin, "wb")
|
os.rename(target[0].path, firmware_without_bootloader_bin)
|
||||||
position = 0
|
#os.rename(target[0].dir.path+'/firmware_with_bootloader.bin', target[0].dir.path+'/firmware.bin')
|
||||||
while position < lengthbootloader:
|
|
||||||
byte = bootloader.read(1)
|
|
||||||
firmwareimage.write(byte)
|
|
||||||
position += 1
|
|
||||||
position = 0
|
|
||||||
while position < lengthfirmware:
|
|
||||||
byte = firmware.read(1)
|
|
||||||
firmwareimage.write(byte)
|
|
||||||
position += 1
|
|
||||||
bootloader.close()
|
|
||||||
firmware.close()
|
|
||||||
firmwareimage.close()
|
|
||||||
|
|
||||||
firmware_without_bootloader_bin = target[0].dir.path + '/firmware_for_sd_upload.bin'
|
marlin.add_post_action(addboot);
|
||||||
if os.path.exists(firmware_without_bootloader_bin):
|
|
||||||
os.remove(firmware_without_bootloader_bin)
|
|
||||||
os.rename(target[0].path, firmware_without_bootloader_bin)
|
|
||||||
#os.rename(target[0].dir.path+'/firmware_with_bootloader.bin', target[0].dir.path+'/firmware.bin')
|
|
||||||
|
|
||||||
marlin.add_post_action(addboot);
|
|
||||||
|
@ -1,47 +1,49 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/lerdge.py
|
# lerdge.py
|
||||||
# Customizations for Lerdge build environments:
|
# Customizations for Lerdge build environments:
|
||||||
# env:LERDGEX env:LERDGEX_usb_flash_drive
|
# env:LERDGEX env:LERDGEX_usb_flash_drive
|
||||||
# env:LERDGES env:LERDGES_usb_flash_drive
|
# env:LERDGES env:LERDGES_usb_flash_drive
|
||||||
# env:LERDGEK env:LERDGEK_usb_flash_drive
|
# env:LERDGEK env:LERDGEK_usb_flash_drive
|
||||||
#
|
#
|
||||||
import os,marlin
|
import pioutil
|
||||||
Import("env")
|
if pioutil.is_pio_build():
|
||||||
|
import os,marlin
|
||||||
|
Import("env")
|
||||||
|
|
||||||
from SCons.Script import DefaultEnvironment
|
from SCons.Script import DefaultEnvironment
|
||||||
board = DefaultEnvironment().BoardConfig()
|
board = DefaultEnvironment().BoardConfig()
|
||||||
|
|
||||||
def encryptByte(byte):
|
def encryptByte(byte):
|
||||||
byte = 0xFF & ((byte << 6) | (byte >> 2))
|
byte = 0xFF & ((byte << 6) | (byte >> 2))
|
||||||
i = 0x58 + byte
|
i = 0x58 + byte
|
||||||
j = 0x05 + byte + (i >> 8)
|
j = 0x05 + byte + (i >> 8)
|
||||||
byte = (0xF8 & i) | (0x07 & j)
|
byte = (0xF8 & i) | (0x07 & j)
|
||||||
return byte
|
return byte
|
||||||
|
|
||||||
def encrypt_file(input, output_file, file_length):
|
def encrypt_file(input, output_file, file_length):
|
||||||
input_file = bytearray(input.read())
|
input_file = bytearray(input.read())
|
||||||
for i in range(len(input_file)):
|
for i in range(len(input_file)):
|
||||||
input_file[i] = encryptByte(input_file[i])
|
input_file[i] = encryptByte(input_file[i])
|
||||||
output_file.write(input_file)
|
output_file.write(input_file)
|
||||||
|
|
||||||
# Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt
|
# Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt
|
||||||
def encrypt(source, target, env):
|
def encrypt(source, target, env):
|
||||||
fwpath = target[0].path
|
fwpath = target[0].path
|
||||||
enname = board.get("build.encrypt")
|
enname = board.get("build.encrypt")
|
||||||
print("Encrypting %s to %s" % (fwpath, enname))
|
print("Encrypting %s to %s" % (fwpath, enname))
|
||||||
fwfile = open(fwpath, "rb")
|
fwfile = open(fwpath, "rb")
|
||||||
enfile = open(target[0].dir.path + "/" + enname, "wb")
|
enfile = open(target[0].dir.path + "/" + enname, "wb")
|
||||||
length = os.path.getsize(fwpath)
|
length = os.path.getsize(fwpath)
|
||||||
|
|
||||||
encrypt_file(fwfile, enfile, length)
|
encrypt_file(fwfile, enfile, length)
|
||||||
|
|
||||||
fwfile.close()
|
fwfile.close()
|
||||||
enfile.close()
|
enfile.close()
|
||||||
os.remove(fwpath)
|
os.remove(fwpath)
|
||||||
|
|
||||||
if 'encrypt' in board.get("build").keys():
|
if 'encrypt' in board.get("build").keys():
|
||||||
if board.get("build.encrypt") != "":
|
if board.get("build.encrypt") != "":
|
||||||
marlin.add_post_action(encrypt)
|
marlin.add_post_action(encrypt)
|
||||||
else:
|
else:
|
||||||
print("LERDGE builds require output file via board_build.encrypt = 'filename' parameter")
|
print("LERDGE builds require output file via board_build.encrypt = 'filename' parameter")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin.py
|
# mks_robin.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08007000", "mks_robin.ld", "Robin.bin")
|
robin.prepare("0x08007000", "mks_robin.ld", "Robin.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_e3.py
|
# mks_robin_e3.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08005000", "mks_robin_e3.ld", "Robin_e3.bin")
|
robin.prepare("0x08005000", "mks_robin_e3.ld", "Robin_e3.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_e3p.py
|
# mks_robin_e3p.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08007000", "mks_robin_e3p.ld", "Robin_e3p.bin")
|
robin.prepare("0x08007000", "mks_robin_e3p.ld", "Robin_e3p.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_lite.py
|
# mks_robin_lite.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08005000", "mks_robin_lite.ld", "mksLite.bin")
|
robin.prepare("0x08005000", "mks_robin_lite.ld", "mksLite.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_lite3.py
|
# mks_robin_lite3.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08005000", "mks_robin_lite.ld", "mksLite3.bin")
|
robin.prepare("0x08005000", "mks_robin_lite.ld", "mksLite3.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_mini.py
|
# mks_robin_mini.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08007000", "mks_robin_mini.ld", "Robin_mini.bin")
|
robin.prepare("0x08007000", "mks_robin_mini.ld", "Robin_mini.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_nano.py
|
# mks_robin_nano.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08007000", "mks_robin_nano.ld", "Robin_nano.bin")
|
robin.prepare("0x08007000", "mks_robin_nano.ld", "Robin_nano.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_nano35.py
|
# mks_robin_nano35.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08007000", "mks_robin_nano.ld", "Robin_nano35.bin")
|
robin.prepare("0x08007000", "mks_robin_nano.ld", "Robin_nano35.bin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/mks_robin_pro.py
|
# mks_robin_pro.py
|
||||||
#
|
#
|
||||||
import robin
|
import robin
|
||||||
robin.prepare("0x08007000", "mks_robin_pro.ld", "Robin_pro.bin")
|
robin.prepare("0x08007000", "mks_robin_pro.ld", "Robin_pro.bin")
|
||||||
|
@ -1,18 +1,20 @@
|
|||||||
#
|
#
|
||||||
# Convert the ELF to an SREC file suitable for some bootloaders
|
# Convert the ELF to an SREC file suitable for some bootloaders
|
||||||
#
|
#
|
||||||
import os,sys
|
import pioutil
|
||||||
from os.path import join
|
if pioutil.is_pio_build():
|
||||||
|
import os,sys
|
||||||
|
from os.path import join
|
||||||
|
|
||||||
Import("env")
|
Import("env")
|
||||||
|
|
||||||
board = env.BoardConfig()
|
board = env.BoardConfig()
|
||||||
board_keys = board.get("build").keys()
|
board_keys = board.get("build").keys()
|
||||||
if 'encrypt' in board_keys:
|
if 'encrypt' in board_keys:
|
||||||
env.AddPostAction(
|
env.AddPostAction(
|
||||||
join("$BUILD_DIR", "${PROGNAME}.bin"),
|
join("$BUILD_DIR", "${PROGNAME}.bin"),
|
||||||
env.VerboseAction(" ".join([
|
env.VerboseAction(" ".join([
|
||||||
"$OBJCOPY", "-O", "srec",
|
"$OBJCOPY", "-O", "srec",
|
||||||
"\"$BUILD_DIR/${PROGNAME}.elf\"", "\"" + join("$BUILD_DIR", board.get("build.encrypt")) + "\""
|
"\"$BUILD_DIR/${PROGNAME}.elf\"", "\"" + join("$BUILD_DIR", board.get("build.encrypt")) + "\""
|
||||||
]), "Building $TARGET")
|
]), "Building $TARGET")
|
||||||
)
|
)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/pioutil.py
|
# pioutil.py
|
||||||
#
|
#
|
||||||
|
|
||||||
# Detect that 'vscode init' is running
|
# Make sure 'vscode init' is not the current command
|
||||||
def is_vscode_init():
|
def is_pio_build():
|
||||||
from SCons.Script import COMMAND_LINE_TARGETS
|
from SCons.Script import COMMAND_LINE_TARGETS
|
||||||
return "idedata" in COMMAND_LINE_TARGETS or "_idedata" in COMMAND_LINE_TARGETS
|
return "idedata" not in COMMAND_LINE_TARGETS and "_idedata" not in COMMAND_LINE_TARGETS
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
#
|
#
|
||||||
# buildroot/share/PlatformIO/scripts/robin.py
|
# robin.py
|
||||||
#
|
#
|
||||||
import marlin
|
|
||||||
|
|
||||||
# Apply customizations for a MKS Robin
|
# Apply customizations for a MKS Robin
|
||||||
def prepare(address, ldname, fwname):
|
def prepare(address, ldname, fwname):
|
||||||
def encrypt(source, target, env):
|
import pioutil
|
||||||
marlin.encrypt_mks(source, target, env, fwname)
|
if pioutil.is_pio_build():
|
||||||
marlin.relocate_firmware(address)
|
import marlin
|
||||||
marlin.custom_ld_script(ldname)
|
def encrypt(source, target, env):
|
||||||
marlin.add_post_action(encrypt);
|
marlin.encrypt_mks(source, target, env, fwname)
|
||||||
|
marlin.relocate_firmware(address)
|
||||||
|
marlin.custom_ld_script(ldname)
|
||||||
|
marlin.add_post_action(encrypt);
|
||||||
|
@ -1,52 +1,54 @@
|
|||||||
#
|
#
|
||||||
|
# simulator.py
|
||||||
# PlatformIO pre: script for simulator builds
|
# PlatformIO pre: script for simulator builds
|
||||||
#
|
#
|
||||||
|
import pioutil
|
||||||
|
if pioutil.is_pio_build():
|
||||||
|
# Get the environment thus far for the build
|
||||||
|
Import("env")
|
||||||
|
|
||||||
# Get the environment thus far for the build
|
#print(env.Dump())
|
||||||
Import("env")
|
|
||||||
|
|
||||||
#print(env.Dump())
|
#
|
||||||
|
# Give the binary a distinctive name
|
||||||
|
#
|
||||||
|
|
||||||
#
|
env['PROGNAME'] = "MarlinSimulator"
|
||||||
# Give the binary a distinctive name
|
|
||||||
#
|
|
||||||
|
|
||||||
env['PROGNAME'] = "MarlinSimulator"
|
#
|
||||||
|
# If Xcode is installed add the path to its Frameworks folder,
|
||||||
|
# or if Mesa is installed try to use its GL/gl.h.
|
||||||
|
#
|
||||||
|
|
||||||
#
|
import sys
|
||||||
# If Xcode is installed add the path to its Frameworks folder,
|
if sys.platform == 'darwin':
|
||||||
# or if Mesa is installed try to use its GL/gl.h.
|
|
||||||
#
|
|
||||||
|
|
||||||
import sys
|
#
|
||||||
if sys.platform == 'darwin':
|
# Silence half of the ranlib warnings. (No equivalent for 'ARFLAGS')
|
||||||
|
#
|
||||||
|
env['RANLIBFLAGS'] += [ "-no_warning_for_no_symbols" ]
|
||||||
|
|
||||||
#
|
# Default paths for Xcode and a lucky GL/gl.h dropped by Mesa
|
||||||
# Silence half of the ranlib warnings. (No equivalent for 'ARFLAGS')
|
xcode_path = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
|
||||||
#
|
mesa_path = "/opt/local/include/GL/gl.h"
|
||||||
env['RANLIBFLAGS'] += [ "-no_warning_for_no_symbols" ]
|
|
||||||
|
|
||||||
# Default paths for Xcode and a lucky GL/gl.h dropped by Mesa
|
import os.path
|
||||||
xcode_path = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
|
|
||||||
mesa_path = "/opt/local/include/GL/gl.h"
|
|
||||||
|
|
||||||
import os.path
|
if os.path.exists(xcode_path):
|
||||||
|
|
||||||
if os.path.exists(xcode_path):
|
env['BUILD_FLAGS'] += [ "-F" + xcode_path ]
|
||||||
|
print("Using OpenGL framework headers from Xcode.app")
|
||||||
|
|
||||||
env['BUILD_FLAGS'] += [ "-F" + xcode_path ]
|
elif os.path.exists(mesa_path):
|
||||||
print("Using OpenGL framework headers from Xcode.app")
|
|
||||||
|
|
||||||
elif os.path.exists(mesa_path):
|
env['BUILD_FLAGS'] += [ '-D__MESA__' ]
|
||||||
|
print("Using OpenGL header from", mesa_path)
|
||||||
|
|
||||||
env['BUILD_FLAGS'] += [ '-D__MESA__' ]
|
else:
|
||||||
print("Using OpenGL header from", mesa_path)
|
|
||||||
|
|
||||||
else:
|
print("\n\nNo OpenGL headers found. Install Xcode for matching headers, or use 'sudo port install mesa' to get a GL/gl.h.\n\n")
|
||||||
|
|
||||||
print("\n\nNo OpenGL headers found. Install Xcode for matching headers, or use 'sudo port install mesa' to get a GL/gl.h.\n\n")
|
# Break out of the PIO build immediately
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
# Break out of the PIO build immediately
|
env.AddCustomTarget("upload", "$BUILD_DIR/${PROGNAME}", "$BUILD_DIR/${PROGNAME}")
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
env.AddCustomTarget("upload", "$BUILD_DIR/${PROGNAME}", "$BUILD_DIR/${PROGNAME}")
|
|
||||||
|
@ -1,59 +1,61 @@
|
|||||||
#
|
#
|
||||||
# stm32_serialbuffer.py
|
# stm32_serialbuffer.py
|
||||||
#
|
#
|
||||||
Import("env")
|
import pioutil
|
||||||
|
if pioutil.is_pio_build():
|
||||||
|
Import("env")
|
||||||
|
|
||||||
# Marlin uses the `RX_BUFFER_SIZE` \ `TX_BUFFER_SIZE` options to
|
# Get a build flag's value or None
|
||||||
# configure buffer sizes for receiving \ transmitting serial data.
|
def getBuildFlagValue(name):
|
||||||
# Stm32duino uses another set of defines for the same purpose, so this
|
for flag in build_flags:
|
||||||
# script gets the values from the configuration and uses them to define
|
if isinstance(flag, list) and flag[0] == name:
|
||||||
# `SERIAL_RX_BUFFER_SIZE` and `SERIAL_TX_BUFFER_SIZE` as global build
|
return flag[1]
|
||||||
# flags so they are available for use by the platform.
|
|
||||||
#
|
|
||||||
# The script will set the value as the default one (64 bytes)
|
|
||||||
# or the user-configured one, whichever is higher.
|
|
||||||
#
|
|
||||||
# Marlin's default buffer sizes are 128 for RX and 32 for TX.
|
|
||||||
# The highest value is taken (128/64).
|
|
||||||
#
|
|
||||||
# If MF_*_BUFFER_SIZE, SERIAL_*_BUFFER_SIZE, USART_*_BUF_SIZE, are
|
|
||||||
# defined, the first of these values will be used as the minimum.
|
|
||||||
build_flags = env.ParseFlags(env.get('BUILD_FLAGS'))["CPPDEFINES"]
|
|
||||||
mf = env["MARLIN_FEATURES"]
|
|
||||||
|
|
||||||
# Get a build flag's value or None
|
return None
|
||||||
def getBuildFlagValue(name):
|
|
||||||
for flag in build_flags:
|
|
||||||
if isinstance(flag, list) and flag[0] == name:
|
|
||||||
return flag[1]
|
|
||||||
|
|
||||||
return None
|
# Get an overriding buffer size for RX or TX from the build flags
|
||||||
|
def getInternalSize(side):
|
||||||
|
return getBuildFlagValue(f"MF_{side}_BUFFER_SIZE") or \
|
||||||
|
getBuildFlagValue(f"SERIAL_{side}_BUFFER_SIZE") or \
|
||||||
|
getBuildFlagValue(f"USART_{side}_BUF_SIZE")
|
||||||
|
|
||||||
# Get an overriding buffer size for RX or TX from the build flags
|
# Get the largest defined buffer size for RX or TX
|
||||||
def getInternalSize(side):
|
def getBufferSize(side, default):
|
||||||
return getBuildFlagValue(f"MF_{side}_BUFFER_SIZE") or \
|
# Get a build flag value or fall back to the given default
|
||||||
getBuildFlagValue(f"SERIAL_{side}_BUFFER_SIZE") or \
|
internal = int(getInternalSize(side) or default)
|
||||||
getBuildFlagValue(f"USART_{side}_BUF_SIZE")
|
flag = side + "_BUFFER_SIZE"
|
||||||
|
# Return the largest value
|
||||||
|
return max(int(mf[flag]), internal) if flag in mf else internal
|
||||||
|
|
||||||
# Get the largest defined buffer size for RX or TX
|
# Add a build flag if it's not already defined
|
||||||
def getBufferSize(side, default):
|
def tryAddFlag(name, value):
|
||||||
# Get a build flag value or fall back to the given default
|
if getBuildFlagValue(name) is None:
|
||||||
internal = int(getInternalSize(side) or default)
|
env.Append(BUILD_FLAGS=[f"-D{name}={value}"])
|
||||||
flag = side + "_BUFFER_SIZE"
|
|
||||||
# Return the largest value
|
|
||||||
return max(int(mf[flag]), internal) if flag in mf else internal
|
|
||||||
|
|
||||||
# Add a build flag if it's not already defined
|
# Marlin uses the `RX_BUFFER_SIZE` \ `TX_BUFFER_SIZE` options to
|
||||||
def tryAddFlag(name, value):
|
# configure buffer sizes for receiving \ transmitting serial data.
|
||||||
if getBuildFlagValue(name) is None:
|
# Stm32duino uses another set of defines for the same purpose, so this
|
||||||
env.Append(BUILD_FLAGS=[f"-D{name}={value}"])
|
# script gets the values from the configuration and uses them to define
|
||||||
|
# `SERIAL_RX_BUFFER_SIZE` and `SERIAL_TX_BUFFER_SIZE` as global build
|
||||||
|
# flags so they are available for use by the platform.
|
||||||
|
#
|
||||||
|
# The script will set the value as the default one (64 bytes)
|
||||||
|
# or the user-configured one, whichever is higher.
|
||||||
|
#
|
||||||
|
# Marlin's default buffer sizes are 128 for RX and 32 for TX.
|
||||||
|
# The highest value is taken (128/64).
|
||||||
|
#
|
||||||
|
# If MF_*_BUFFER_SIZE, SERIAL_*_BUFFER_SIZE, USART_*_BUF_SIZE, are
|
||||||
|
# defined, the first of these values will be used as the minimum.
|
||||||
|
build_flags = env.ParseFlags(env.get('BUILD_FLAGS'))["CPPDEFINES"]
|
||||||
|
mf = env["MARLIN_FEATURES"]
|
||||||
|
|
||||||
# Get the largest defined buffer sizes for RX or TX, using defaults for undefined
|
# Get the largest defined buffer sizes for RX or TX, using defaults for undefined
|
||||||
rxBuf = getBufferSize("RX", 128)
|
rxBuf = getBufferSize("RX", 128)
|
||||||
txBuf = getBufferSize("TX", 64)
|
txBuf = getBufferSize("TX", 64)
|
||||||
|
|
||||||
# Provide serial buffer sizes to the stm32duino platform
|
# Provide serial buffer sizes to the stm32duino platform
|
||||||
tryAddFlag("SERIAL_RX_BUFFER_SIZE", rxBuf)
|
tryAddFlag("SERIAL_RX_BUFFER_SIZE", rxBuf)
|
||||||
tryAddFlag("SERIAL_TX_BUFFER_SIZE", txBuf)
|
tryAddFlag("SERIAL_TX_BUFFER_SIZE", txBuf)
|
||||||
tryAddFlag("USART_RX_BUF_SIZE", rxBuf)
|
tryAddFlag("USART_RX_BUF_SIZE", rxBuf)
|
||||||
tryAddFlag("USART_TX_BUF_SIZE", txBuf)
|
tryAddFlag("USART_TX_BUF_SIZE", txBuf)
|
||||||
|
Loading…
Reference in New Issue