Option Bytes Programming
This chapter describes how to inspect or / and modify Option bytes.
For Option Bytes programming on RH850 G3 devices, you can:
•use the Option Bytes plugin or
•program Option Bytes with a Python script.
From winIDEA build 9.21.23 and newer you can configure the FP5 clock via service call. Default value is 1500. If the default value is being used, no need to specify it in the service call. Example for changing FP5 clock to 1MHz: out = ideCtrl.serviceCall("/IOPEN/HW.SoC.RH850_FP5", "GetSecurityMaskOptions:true, Clock_kHz: 1000") |
This page describes ICUM usage in RH850 1st Gen devices (where cores are shown as PE1/PE2/ICUM...). On U2A, ICUM enabling/disabling is performed through Hardware Property Area - see Technical Note. |
To inspect Option bytes use a service call via the isystem.connect. Below is an example of a Python script for reading the RH850 Option bytes via Renesas FP5 protocol. Any errors are logged to winIDEA log file.
# ReadOPBTs.py
import isystem.connect as ic import time
device_family = 'Ignore' # Possible families: 'Ignore', 'F1x', 'E1x', 'E1M', 'P1x', 'D1x', 'F1H', 'F1KM', 'F1KH' class OPBT_cfg: __default_service_call_options = 'GetSecurityMaskOptions:true' def __init__(self,df): self.__device_family = df # Private Methods def __winIDEA_supports_new_startup(self, ideCtrl): if -1 == ideCtrl.getWinIDEAVersion().compare(ic.CWinIDEAVersion('9.21.51.0')): return False return True def __get_service_call_URL(self, ideCtrl): if -1 == ideCtrl.getWinIDEAVersion().compare(ic.CWinIDEAVersion('9.21.7.0')): return '/IOPEN/HW.Debug.V850Fx4_FLASH' # Old URL return '/IOPEN/HW.SoC.RH850_FP5'
def __get_service_call_options(self, ideCtrl): service_call_Options = self.__default_service_call_options if -1 != ideCtrl.getWinIDEAVersion().compare(ic.CWinIDEAVersion('9.21.74.0')): service_call_Options += ', Family:' + self.__device_family return service_call_Options
def __prepare_winIDEA(self, session, dbg, ideCtrl): if self.__winIDEA_supports_new_startup(ideCtrl): print('>preparing session...') session.end() session.begin_prepare() else: print('>performing debug reset...') dbg.reset() def __parse_output_string(self, out): tokens = out.split(',') # convert to a readable form parsedTokens = {} for item in tokens: key, value = item.split(':') key = key.replace('[', '').replace(']', '') value = value.strip() key = key.strip() if value.isdigit(): intValue = int(value) parsedTokens[key] = format(intValue, '08X') else: parsedTokens[key] = value return parsedTokens
def __check_service_call_result(self, parsedTokens): if (parsedTokens['Result'] == 'true' or parsedTokens['Result'] == 'TRUE'): print('>OPBTs read successfully!') return True else: print('** Reading OPBTs failed! **') if 'StrResult' in parsedTokens: print(' Result string: ', parsedTokens['StrResult']) return False
def __finish_session(self, session, dbg, ideCtrl) -> None: if self.__winIDEA_supports_new_startup(ideCtrl): print('>disconnecting from debug session') session.end() else: print('>performing reset again to end up in debug session') dbg.reset()
# Public methods def read_OPBT(self): cmgr = ic.ConnectionMgr() cmgr.connectMRU('') dbg = ic.CDebugFacade(cmgr) ideCtrl = ic.CIDEController(cmgr) session = ic.CSessionCtrl(cmgr) self.__prepare_winIDEA(session, dbg, ideCtrl)
service_call_URL = self.__get_service_call_URL(ideCtrl) service_call_Options = self.__get_service_call_options(ideCtrl) print('>OPBT serviceCall: ' + service_call_URL + ', options: ' + service_call_Options)
# FP5 flash programming access is used. # Any errors are logged to winIDEA log-file. out = ideCtrl.serviceCall(service_call_URL, service_call_Options)
parsedTokens = self.__parse_output_string(out)
if not self.__check_service_call_result(parsedTokens): dbg.reset() input('Press Enter to exit...') exit(-1)
self.__finish_session(session, dbg, ideCtrl) self.__parsedTokens = parsedTokens return parsedTokens
def print_OPBTs(self, parsedTokens): print(' Result: ', parsedTokens['Result'])
for index in range(8): print(' OPBT{a:02d}: '.format(a=index), '0x{pt}'.format(pt=parsedTokens['FLASHMaskOptions'+str(index)])) def main(): print('##################################################') print('Starting script for reading OPBTs') O = OPBT_cfg(device_family) O.print_OPBTs(O.read_OPBT()) print('Script finished') print('##################################################') input('Press Enter to exit...')
if __name__ == '__main__': try: main() except RuntimeError as ex: print('ERROR:', ex) |
The example above lists only the first 8 OPBTs. The 2nd set of OPBTs, 8 to 15, may not be readable or, not available in F1x and other families. Where applicable, write access is supported for the complete set of 16 OPBTs, though.
The console output looks like this:
To program the RH850 Option bytes please note that this is a critical operation and that the OPBT values are different within the extensive RH850 family of devices. Renesas FP5 communication protocol is used for setting the OPBTs.
Use the script with CAUTION! The device can get permanently LOCKED if incorrect values are specified! Should always double-check. |
Below is an example script for a RH850/F1KM device. Again, please double-check the OPBT values and consult the Hardware User's Manual of the device used.
Note that all 16 OPBTs are defined and that this is the recommended approach.
# OPBT_write_F1KM_example.py |