pebble/tools/analyze_mcu_flash_config.py
2025-02-25 19:02:51 +00:00

103 lines
3 KiB
Python

# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import binutils
import os.path
import sh
class Config(object):
def abs_path(self, script_relative_path):
return os.path.join(
os.path.dirname(os.path.realpath(__file__)),
script_relative_path)
def default_elf_abs_path(self):
return self.abs_path(self.rel_elf_path())
def rel_elf_path(self):
raise Exception("Implement me!")
def lib_paths(self):
return []
def lib_symbols(self):
# Array of tuples (use_fast, lib_path):
lib_paths = self.lib_paths()
def extract_symbols(object_path):
nm = binutils.nm_generator(object_path)
return set([s for _, _, s, _, _, _ in nm])
return {path: extract_symbols(path)
for path in lib_paths}
def memory_region_to_analyze(self):
raise Exception("Implement me!")
def apply_tree_tweaks(self, tree):
pass
class TintinElfConfig(Config):
def rel_elf_path(self):
return '../build/src/fw/tintin_fw.elf'
def memory_region_to_analyze(self):
FLASH_START = 0x8008000
FLASH_END = FLASH_START + (512 * 1024)
FLASH_REGION = (FLASH_START, FLASH_END)
return FLASH_REGION
def lib_paths(self):
return []
def apply_tree_tweaks(self, tree):
# Manually add in the bootloader + gap:
tree["Bootloader"] = 0x8000
tree["Bootloader-FW-Gap"] = 0x8000
class DialogElfConfig(Config):
def memory_region_to_analyze(self):
# Just spelling out both regions here in case someone wants to tweak:
sysram_start = 0x7FC0000
sysram_end = sysram_start + (128 * 1024)
cacheram_start = 0x7FE0000
cacheram_end = cacheram_start + (16 * 1024)
return (sysram_start, cacheram_end)
class DialogBootElfConfig(DialogElfConfig):
def rel_elf_path(self):
return '../build/src/bluetooth-fw/da1468x/controller/' \
'boot/bt_da14681_boot.elf'
class DialogMainElfConfig(DialogElfConfig):
def rel_elf_path(self):
return '../build/src/bluetooth-fw/da1468x/controller/' \
'main/bt_da14681_main.elf'
def lib_paths(self):
libble_stack_path = self.abs_path(
'../src/bluetooth-fw/da1468x/vendor/bt-dialog-sdk/sdk/interfaces/'
'ble_stack/DA14681-01-Debug/libble_stack_da14681_01.a')
return [libble_stack_path]
CONFIG_CLASSES = {
'tintin': TintinElfConfig,
'dialog-boot': DialogBootElfConfig,
'dialog-main': DialogMainElfConfig,
}