banner
ekko

ekko's blog

时间不在于你拥有多少,而在于你怎样使用
github
xbox
email

openocd Jim-Tcl コマンドの登録と呼び出し

本文主要说明 [[openocd]] のコマンドがどのように登録され、実行されるかについて説明します。参考文献はJim-TCL について(OpenOCD ユーザーガイド)です。
本文ではtarget namesを例に、主に 2 つの部分について説明します。一つは登録で、コマンドパラメータと対応する処理関数を関連付けること、もう一つは呼び出しで、target namesを実行する際の具体的な実行フローについて説明します。

登録#

コマンド登録#

コマンド登録は構造体の形式で行われます。以下の部分ではtarget namesコマンドと最終的に呼び出されるhandle_target_names関数を登録しています:

static const struct command_registration target_command_handlers[] = {
    ......
    {
        .name = "target",
        .mode = COMMAND_CONFIG,
        .help = "ターゲットを設定する",
        .chain = target_subcommand_handlers,
        .usage = "",
    },
    COMMAND_REGISTRATION_DONE
};
static const struct command_registration target_subcommand_handlers[] = {
    ......
    {
		.name = "names",
		.mode = COMMAND_ANY,
		.handler = handle_target_names,
		.help = "すべてのターゲットの名前を文字列のリストとして返します",
		.usage = "",
	},
    ......
    COMMAND_REGISTRATION_DONE
};
int target_register_commands(struct command_context *cmd_ctx)
{
	return register_commands(cmd_ctx, NULL, target_command_handlers);
}

ここで.modeのパラメータは、このコマンドがどの段階で実行できるかを示します:

/**
 * OpenOCDコマンドモードは最初はCOMMAND_CONFIGで、次にコマンド'init'の実行中にCOMMAND_EXECに切り替わります。
 * 構造体command_registrationの' mode'フィールドは、コマンドがどのコマンドモードで実行できるかを指定します:
 * - COMMAND_CONFIGの間のみ、
 * - COMMAND_EXECの間のみ、
 * - 両方のモードで(COMMAND_ANY)。
 */
enum command_mode {
	COMMAND_EXEC,
	COMMAND_CONFIG,
	COMMAND_ANY,
	COMMAND_UNKNOWN = -1, /* エラー条件 */
};

initコマンドの後、openocd は実行段階に入り、target initコマンドは設定段階でのみ実行可能です。この時、実行するとエラーが発生します:

> target init
command - target init
' target init'コマンドは'init'の前に使用する必要があります。

参考サーバー設定(OpenOCD ユーザーガイド)

最終的に呼び出されるhandle_target_names関数に印刷情報を追加し、後続の検証内容とします:

COMMAND_HANDLER(handle_target_names)
{
	if (CMD_ARGC != 0)
		return ERROR_COMMAND_SYNTAX_ERROR;

	LOG_INFO("handle_target_names");
	struct target *target = all_targets;
	while (target) {
		command_print(CMD, "%s", target_name(target));
		target = target->next;
	}

	return ERROR_OK;
}

実行登録#

実際の登録プロセスは openocd の起動プロセス中に行われます。以下は openocd の main 関数で、setup_command_handlerが実行登録の機能を果たします:

int openocd_main(int argc, char *argv[])
{
	int ret;

	/* コマンドラインインターフェースの初期化 */
	struct command_context *cmd_ctx;

	cmd_ctx = setup_command_handler(NULL);
	......
}


static struct command_context *setup_command_handler(Jim_Interp *interp)
{
	log_init();
	LOG_INFO("log_init: 完了");

	struct command_context *cmd_ctx = command_init(openocd_startup_tcl, interp);

	/* サブシステムコマンドの登録 */
	typedef int (*command_registrant_t)(struct command_context *cmd_ctx_value);
	static const command_registrant_t command_registrants[] = {
		&openocd_register_commands,
		&server_register_commands,
		&gdb_register_commands,
		&log_register_commands,
		&rtt_server_register_commands,
		&transport_register_commands,
		&adapter_register_commands,
		&target_register_commands,
		&flash_register_commands,
		&nand_register_commands,
		&pld_register_commands,
		&cti_register_commands,
		&dap_register_commands,
		&arm_tpiu_swo_register_commands,
		NULL
	};
	for (unsigned i = 0; command_registrants[i]; i++) {
		int retval = (*command_registrants[i])(cmd_ctx);
		if (retval != ERROR_OK) {
			command_done(cmd_ctx);
			return NULL;
		}
	}
	LOG_INFO("コマンド登録: 完了");

	LOG_OUTPUT(OPENOCD_VERSION "\n"
		"GNU GPL v2の下でライセンスされています\n");

	global_cmd_ctx = cmd_ctx;

	return cmd_ctx;
}

ここでtarget_register_commandsは以前のコマンド登録部分で登場した登録関数です。登録プロセスは上記の関数で、登録が完了するとLOG_INFO("コマンド登録: 完了");が印刷されます。

具体的な登録内容はtarget_register_commands関数の内部にあります:

static struct command *register_command(struct command_context *context,
	const char *cmd_prefix, const struct command_registration *cr)
{
	char *full_name;

	if (!context || !cr->name)
		return NULL;

	if (cmd_prefix)
		full_name = alloc_printf("%s %s", cmd_prefix, cr->name);
	else
		full_name = strdup(cr->name);
	if (!full_name)
		return NULL;

	struct command *c = command_find_from_name(context->interp, full_name);
	if (c) {
		/* TODO: 元々はコマンドを二重に登録しようとすることをエラーと見なしていました
		 * 時々この動作が必要です。フラッシュバンクなど。
		 * http://www.mail-archive.com/openocd-development@lists.berlios.de/msg11152.html */
		LOG_DEBUG("コマンド'%s'はすでに登録されています", full_name);
		free(full_name);
		return c;
	}

	c = command_new(context, full_name, cr);
	if (!c) {
		free(full_name);
		return NULL;
	}

	// if (false) /* デバッグレベル3ではノイズが多すぎる */
		LOG_INFO("'%s'を登録中...", full_name);
	int retval = Jim_CreateCommand(context->interp, full_name,
				jim_command_dispatch, c, command_free);
	if (retval != JIM_OK) {
		command_run_linef(context, "del_help_text {%s}", full_name);
		command_run_linef(context, "del_usage_text {%s}", full_name);
		free(c);
		free(full_name);
		return NULL;
	}

	free(full_name);
	return c;
}

登録プロセスではLOG_INFO("'%s'を登録中...", full_name);が印刷され、具体的な登録コマンド値が関数ポインタjim_command_dispatchに関連付けられ、後続の実行時にはこの関数が実行されます。

初期化登録ログ#

以下は登録プロセス中の関連印刷情報です:

$ openocd -f interface/jlink.cfg -f target/rk3568.cfg                                             [16:04:06]
Info : log_init: 完了
Info : 'ocd_find'を登録中...
Info : 'capture'を登録中...
Info : 'echo'を登録中...
Info : 'add_help_text'を登録中...
Info : 'add_usage_text'を登録中...
Info : 'sleep'を登録中...
Info : 'help'を登録中...
Info : 'usage'を登録中...
Info : 'command'を登録中...
Info : 'command mode'を登録中...
Info : 'version'を登録中...
Info : 'noinit'を登録中...
Info : 'init'を登録中...
Info : 'add_script_search_dir'を登録中...
Info : 'exit'を登録中...
Info : 'telnet_port'を登録中...
Info : 'tcl_port'を登録中...
Info : 'tcl_notifications'を登録中...
Info : 'tcl_trace'を登録中...
Info : 'jsp_port'を登録中...
Info : 'shutdown'を登録中...
Info : 'poll_period'を登録中...
Info : 'bindto'を登録中...
Info : 'gdb_sync'を登録中...
Info : 'gdb_port'を登録中...
Info : 'gdb_memory_map'を登録中...
Info : 'gdb_flash_program'を登録中...
Info : 'gdb_report_data_abort'を登録中...
Info : 'gdb_report_register_access_error'を登録中...
Info : 'gdb_breakpoint_override'を登録中...
Info : 'gdb_target_description'を登録中...
Info : 'gdb_save_tdesc'を登録中...
Info : 'log_output'を登録中...
Info : 'debug_level'を登録中...
Info : 'rtt'を登録中...
Info : 'rtt server'を登録中...
Info : 'rtt server start'を登録中...
Info : 'rtt server stop'を登録中...
Info : 'transport'を登録中...
Info : 'transport init'を登録中...
Info : 'transport list'を登録中...
Info : 'transport select'を登録中...
Info : 'adapter'を登録中...
Info : 'adapter driver'を登録中...
Info : 'adapter speed'を登録中...
Info : 'adapter serial'を登録中...
Info : 'adapter list'を登録中...
Info : 'adapter name'を登録中...
Info : 'adapter srst'を登録中...
Info : 'adapter srst delay'を登録中...
Info : 'adapter srst pulse_width'を登録中...
Info : 'adapter transports'を登録中...
Info : 'adapter usb'を登録中...
Info : 'adapter usb location'を登録中...
Info : 'adapter assert'を登録中...
Info : 'adapter deassert'を登録中...
Info : 'adapter gpio'を登録中...
Info : 'reset_config'を登録中...
Info : target_register_commands
Info : 'targets'を登録中...
Info : 'target'を登録中...
Info : 'target init'を登録中...
Info : 'target create'を登録中...
Info : 'target current'を登録中...
Info : 'target types'を登録中...
Info : 'target names'を登録中...
Info : 'target smp'を登録中...
Info : 'flash'を登録中...
Info : 'flash bank'を登録中...
Info : 'flash init'を登録中...
Info : 'flash banks'を登録中...
Info : 'flash list'を登録中...
Info : 'nand'を登録中...
Info : 'nand device'を登録中...
Info : 'nand drivers'を登録中...
Info : 'nand init'を登録中...
Info : 'pld'を登録中...
Info : 'pld create'を登録中...
Info : 'pld init'を登録中...
Info : 'cti'を登録中...
Info : 'cti create'を登録中...
Info : 'cti names'を登録中...
Info : 'dap'を登録中...
Info : 'dap create'を登録中...
Info : 'dap names'を登録中...
Info : 'dap init'を登録中...
Info : 'dap info'を登録中...
Info : 'tpiu'を登録中...
Info : 'tpiu create'を登録中...
Info : 'tpiu names'を登録中...
Info : 'tpiu init'を登録中...
Info : 'swo'を登録中...
Info : 'swo create'を登録中...
Info : 'swo names'を登録中...
Info : 'swo init'を登録中...
Info : コマンド登録: 完了  #登録完了
Open On-Chip Debugger 0.12.0+dev-01573-gbc9ca5f4a-dirty (2024-05-09-16:04)
GNU GPL v2の下でライセンスされています
Info : 'ms'を登録中...
バグ報告については、次をお読みください
        http://openocd.org/doc/doxygen/bugs.html

呼び出し#

呼び出しフロー#

前述の登録時にコマンドがjim_command_dispatch関数に関連付けられることが言及されました:

static int jim_command_dispatch(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
{
	/* サブコマンドをチェック */
	if (argc > 1) {
		char *s = alloc_printf("%s %s", Jim_GetString(argv[0], NULL), Jim_GetString(argv[1], NULL));
		Jim_Obj *js = Jim_NewStringObj(interp, s, -1);
		Jim_IncrRefCount(js);
		free(s);
		Jim_Cmd *cmd = Jim_GetCommand(interp, js, JIM_NONE);
		if (cmd) {
			int retval = Jim_EvalObjPrefix(interp, js, argc - 2, argv + 2);
			Jim_DecrRefCount(interp, js);
			return retval;
		}
		Jim_DecrRefCount(interp, js);
	}

	script_debug(interp, argc, argv);

	struct command *c = jim_to_command(interp);
	if (!c->jim_handler && !c->handler) {
		Jim_EvalObjPrefix(interp, Jim_NewStringObj(interp, "usage", -1), 1, argv);
		return JIM_ERR;
	}

	struct command_context *cmd_ctx = current_command_context(interp);

	if (!command_can_run(cmd_ctx, c, Jim_GetString(argv[0], NULL)))
		return JIM_ERR;

	target_call_timer_callbacks();

	/*
	 * 現在のターゲットをオーバーライドするためのブラックマジック:
	 * 処理しようとしているコマンドにターゲットプレフィックスがある場合、
	 * コマンドの処理中に一時的に現在のターゲットをオーバーライドします。
	 * current_target_overrideはイベントハンドラにも使用されるため、
	 * コマンドにプレフィックスがない場合は触れないようにします。
	 * 前のオーバーライドは保存され、戻されて、再入時に正しく動作することを保証します。
	 */
	struct target *saved_target_override = cmd_ctx->current_target_override;
	if (c->jim_override_target)
		cmd_ctx->current_target_override = c->jim_override_target;

	LOG_INFO("exec_command begin");
	int retval = exec_command(interp, cmd_ctx, c, argc, argv);
	LOG_INFO("exec_command finsh");

	if (c->jim_override_target)
		cmd_ctx->current_target_override = saved_target_override;

	return retval;
}

script_debug(interp, argc, argv);では現在のコマンド内容が印刷され、次のexec_commandが実際にコマンドに関連付けられた関数を呼び出します。つまり、最初のhandle_target_names関数です。

初期化呼び出しログ#

初期化プロセス中には多くの設定ファイル内のコマンドが実行されます。以下のログは呼び出しに関連する部分のみを保持しています:

$ openocd -f interface/jlink.cfg -f target/rk3568.cfg                                             [16:04:06]
Info : command - add_usage_text find <file>
Info : exec_command begin
Info : exec_command finsh
Info : command - add_help_text find print full path to file according to OpenOCD search rules
Info : exec_command begin
Info : exec_command finsh
Info : command - add_help_text script filename of OpenOCD script (tcl) to run
Info : exec_command begin
Info : exec_command finsh
Info : command - add_usage_text script <file>
Info : exec_command begin
Info : exec_command finsh
Info : command - add_help_text power_restore Overridable procedure run when power restore is detected. Runs 'reset init' by default.
Info : exec_command begin
Info : exec_command finsh
Info : command - add_help_text srst_deasserted Overridable procedure run when srst deassert is detected. Runs 'reset init' by default.
Info : exec_command begin
Info : exec_command finsh
Info : command - add_help_text measure_clk Runs a test to measure the JTAG clk. Useful with RCLK / RTCK.
Info : exec_command begin
Info : exec_command finsh
Info : command - add_help_text program write an image to flash, address is only required for binary images. verify, reset, exit are optional
Info : exec_command begin
Info : exec_command finsh
Info : command - add_usage_text program <filename> [address] [pre-verify] [verify] [reset] [exit]
Info : exec_command begin
Info : exec_command finsh
Open On-Chip Debugger 0.12.0+dev-01573-gbc9ca5f4a-dirty (2024-05-09-16:04)
GNU GPL v2の下でライセンスされています
Info : registering 'ms'...
バグ報告については、次をお読みください
        http://openocd.org/doc/doxygen/bugs.html
Info : command - ocd_find interface/jlink.cfg
Info : exec_command begin
Info : exec_command finsh
Info : command - adapter driver jlink
Info : exec_command begin
Info : registering 'jlink'...
Info : registering 'jlink jtag'...
Info : registering 'jlink targetpower'...
Info : registering 'jlink freemem'...
Info : registering 'jlink hwstatus'...
Info : registering 'jlink usb'...
Info : registering 'jlink config'...
Info : registering 'jlink config usb'...
Info : registering 'jlink config targetpower'...
Info : registering 'jlink config mac'...
Info : registering 'jlink config ip'...
Info : registering 'jlink config reset'...
Info : registering 'jlink config write'...
Info : registering 'jlink emucom'...
Info : registering 'jlink emucom write'...
Info : registering 'jlink emucom read'...
Info : exec_command finsh
Info : command - ocd_find target/rk3568.cfg
Info : exec_command begin
Info : exec_command finsh
Info : command - reset_config trst_and_srst separate
Info : exec_command begin
Info : exec_command finsh
Info : command - adapter driver jlink
Info : exec_command begin
Info : Warn : インターフェースはすでに設定されているため、無視します
Info : exec_command finsh
Info : command - adapter speed 12000
Info : exec_command begin
Info : exec_command finsh
Info : command - transport select swd
Info : exec_command begin
Info : registering 'swd'...
Info : registering 'swd newdap'...
Info : exec_command finsh
Info : command - swd newdap rk3568 cpu -expected-id 0x2ba01477 -ignore-version
Info : exec_command begin
Info : exec_command finsh
Info : command - dap create rk3568.dap -chain-position rk3568.cpu
Info : exec_command begin
Info : registering 'rk3568.dap'...
Info : registering 'rk3568.dap info'...
Info : registering 'rk3568.dap apsel'...
Info : registering 'rk3568.dap apcsw'...
Info : registering 'rk3568.dap apid'...
Info : registering 'rk3568.dap apreg'...
Info : registering 'rk3568.dap dpreg'...
Info : registering 'rk3568.dap baseaddr'...
Info : registering 'rk3568.dap memaccess'...
Info : registering 'rk3568.dap ti_be_32_quirks'...
Info : registering 'rk3568.dap nu_npcx_quirks'...
Info : exec_command finsh
Info : command - target create rk3568.ahb mem_ap -dap rk3568.dap -ap-num 0
Info : exec_command begin
Info : registering 'rk3568.ahb'...
Info : registering 'rk3568.ahb configure'...
Info : registering 'rk3568.ahb cget'...
Info : registering 'rk3568.ahb mwd'...
Info : registering 'rk3568.ahb mww'...
Info : registering 'rk3568.ahb mwh'...
Info : registering 'rk3568.ahb mwb'...
Info : registering 'rk3568.ahb mdd'...
Info : registering 'rk3568.ahb mdw'...
Info : registering 'rk3568.ahb mdh'...
Info : registering 'rk3568.ahb mdb'...
Info : registering 'rk3568.ahb get_reg'...
Info : registering 'rk3568.ahb set_reg'...
Info : registering 'rk3568.ahb read_memory'...
Info : registering 'rk3568.ahb write_memory'...
Info : registering 'rk3568.ahb eventlist'...
Info : registering 'rk3568.ahb curstate'...
Info : registering 'rk3568.ahb debug_reason'...
Info : registering 'rk3568.ahb arp_examine'...
Info : registering 'rk3568.ahb was_examined'...
Info : registering 'rk3568.ahb examine_deferred'...
Info : registering 'rk3568.ahb arp_halt_gdb'...
Info : registering 'rk3568.ahb arp_poll'...
Info : registering 'rk3568.ahb arp_reset'...
Info : registering 'rk3568.ahb arp_halt'...
Info : registering 'rk3568.ahb arp_waitstate'...
Info : registering 'rk3568.ahb invoke-event'...
Info : exec_command finsh
Info : command - cti create cti0 -dap rk3568.dap -baseaddr 0x81014000 -ap-num 0
Info : exec_command begin
Info : registering 'cti0'...
Info : registering 'cti0 dump'...
Info : registering 'cti0 enable'...
Info : registering 'cti0 testmode'...
Info : registering 'cti0 write'...
Info : registering 'cti0 read'...
Info : registering 'cti0 ack'...
Info : registering 'cti0 channel'...
Info : exec_command finsh
Info : command - target create rk3568.lcore0 aarch64 -dap rk3568.dap -coreid 0 -cti cti0 -dbgbase 0x81004000
Info : exec_command begin
Info : registering 'arm'...
Info : registering 'arm semihosting'...
Info : registering 'arm semihosting_redirect'...
Info : registering 'arm semihosting_cmdline'...
Info : registering 'arm semihosting_fileio'...
Info : registering 'arm semihosting_resexit'...
Info : registering 'arm semihosting_read_user_param'...
Info : registering 'arm semihosting_basedir'...
Info : registering 'catch_exc'...
Info : registering 'pauth'...
Info : registering 'aarch64'...
Info : registering 'aarch64 cache_info'...
Info : registering 'aarch64 dbginit'...
Info : registering 'aarch64 disassemble'...
Info : registering 'aarch64 maskisr'...
Info : registering 'aarch64 mcr'...
Info : registering 'aarch64 mrc'...
Info : registering 'aarch64 smp'...
Info : registering 'aarch64 smp_gdb'...
Info : registering 'rk3568.lcore0'...
Info : registering 'rk3568.lcore0 configure'...
Info : registering 'rk3568.lcore0 cget'...
Info : registering 'rk3568.lcore0 mwd'...
Info : registering 'rk3568.lcore0 mww'...
Info : registering 'rk3568.lcore0 mwh'...
Info : registering 'rk3568.lcore0 mwb'...
Info : registering 'rk3568.lcore0 mdd'...
Info : registering 'rk3568.lcore0 mdw'...
Info : registering 'rk3568.lcore0 mdh'...
Info : registering 'rk3568.lcore0 mdb'...
Info : registering 'rk3568.lcore0 get_reg'...
Info : registering 'rk3568.lcore0 set_reg'...
Info : registering 'rk3568.lcore0 read_memory'...
Info : registering 'rk3568.lcore0 write_memory'...
Info : registering 'rk3568.lcore0 eventlist'...
Info : registering 'rk3568.lcore0 curstate'...
Info : registering 'rk3568.lcore0 debug_reason'...
Info : registering 'rk3568.lcore0 arp_examine'...
Info : registering 'rk3568.lcore0 was_examined'...
Info : registering 'rk3568.lcore0 examine_deferred'...
Info : registering 'rk3568.lcore0 arp_halt_gdb'...
Info : registering 'rk3568.lcore0 arp_poll'...
Info : registering 'rk3568.lcore0 arp_reset'...
Info : registering 'rk3568.lcore0 arp_halt'...
Info : registering 'rk3568.lcore0 arp_waitstate'...
Info : registering 'rk3568.lcore0 invoke-event'...
Info : exec_command finsh
Info : command - rk3568.lcore0 configure -work-area-size 0x30000 -work-area-phys 0xff8c0000 -work-area-backup 0
Info : exec_command begin
Info : exec_command finsh
Info : command - cti create cti1 -dap rk3568.dap -baseaddr 0x81015000 -ap-num 0
Info : exec_command begin
Info : registering 'cti1'...
Info : registering 'cti1 dump'...
Info : registering 'cti1 enable'...
Info : registering 'cti1 testmode'...
Info : registering 'cti1 write'...
Info : registering 'cti1 read'...
Info : registering 'cti1 ack'...
Info : registering 'cti1 channel'...
Info : exec_command finsh
Info : command - target create rk3568.lcore1 aarch64 -dap rk3568.dap -coreid 1 -cti cti1 -dbgbase 0x81005000
Info : exec_command begin
Info : registering 'rk3568.lcore1'...
Info : registering 'rk3568.lcore1 configure'...
Info : registering 'rk3568.lcore1 cget'...
Info : registering 'rk3568.lcore1 mwd'...
Info : registering 'rk3568.lcore1 mww'...
Info : registering 'rk3568.lcore1 mwh'...
Info : registering 'rk3568.lcore1 mwb'...
Info : registering 'rk3568.lcore1 mdd'...
Info : registering 'rk3568.lcore1 mdw'...
Info : registering 'rk3568.lcore1 mdh'...
Info : registering 'rk3568.lcore1 mdb'...
Info : registering 'rk3568.lcore1 get_reg'...
Info : registering 'rk3568.lcore1 set_reg'...
Info : registering 'rk3568.lcore1 read_memory'...
Info : registering 'rk3568.lcore1 write_memory'...
Info : registering 'rk3568.lcore1 eventlist'...
Info : registering 'rk3568.lcore1 curstate'...
Info : registering 'rk3568.lcore1 debug_reason'...
Info : registering 'rk3568.lcore1 arp_examine'...
Info : registering 'rk3568.lcore1 was_examined'...
Info : registering 'rk3568.lcore1 examine_deferred'...
Info : registering 'rk3568.lcore1 arp_halt_gdb'...
Info : registering 'rk3568.lcore1 arp_poll'...
Info : registering 'rk3568.lcore1 arp_reset'...
Info : registering 'rk3568.lcore1 arp_halt'...
Info : registering 'rk3568.lcore1 arp_waitstate'...
Info : registering 'rk3568.lcore1 invoke-event'...
Info : registering 'rk3568.lcore1 arm'...
Info : registering 'rk3568.lcore1 arm semihosting'...
Info : registering 'rk3568.lcore1 arm semihosting_redirect'...
Info : registering 'rk3568.lcore1 arm semihosting_cmdline'...
Info : registering 'rk3568.lcore1 arm semihosting_fileio'...
Info : registering 'rk3568.lcore1 arm semihosting_resexit'...
Info : registering 'rk3568.lcore1 arm semihosting_read_user_param'...
Info : registering 'rk3568.lcore1 arm semihosting_basedir'...
Info : registering 'rk3568.lcore1 catch_exc'...
Info : registering 'rk3568.lcore1 pauth'...
Info : registering 'rk3568.lcore1 aarch64'...
Info : registering 'rk3568.lcore1 aarch64 cache_info'...
Info : registering 'rk3568.lcore1 aarch64 dbginit'...
Info : registering 'rk3568.lcore1 aarch64 disassemble'...
Info : registering 'rk3568.lcore1 aarch64 maskisr'...
Info : registering 'rk3568.lcore1 aarch64 mcr'...
Info : registering 'rk3568.lcore1 aarch64 mrc'...
Info : registering 'rk3568.lcore1 aarch64 smp'...
Info : registering 'rk3568.lcore1 aarch64 smp_gdb'...
Info : exec_command finsh
Info : command - rk3568.lcore1 configure -defer-examine
Info : exec_command begin
Info : exec_command finsh
Info : command - cti create cti2 -dap rk3568.dap -baseaddr 0x81016000 -ap-num 0
Info : exec_command begin
Info : registering 'cti2'...
Info : registering 'cti2 dump'...
Info : registering 'cti2 enable'...
Info : registering 'cti2 testmode'...
Info : registering 'cti2 write'...
Info : registering 'cti2 read'...
Info : registering 'cti2 ack'...
Info : registering 'cti2 channel'...
Info : exec_command finsh
Info : command - target create rk3568.lcore2 aarch64 -dap rk3568.dap -coreid 2 -cti cti2 -dbgbase 0x81006000
Info : exec_command begin
Info : registering 'rk3568.lcore2'...
Info : registering 'rk3568.lcore2 configure'...
Info : registering 'rk3568.lcore2 cget'...
Info : registering 'rk3568.lcore2 mwd'...
Info : registering 'rk3568.lcore2 mww'...
Info : registering 'rk3568.lcore2 mwh'...
Info : registering 'rk3568.lcore2 mwb'...
Info : registering 'rk3568.lcore2 mdd'...
Info : registering 'rk3568.lcore2 mdw'...
Info : registering 'rk3568.lcore2 mdh'...
Info : registering 'rk3568.lcore2 mdb'...
Info : registering 'rk3568.lcore2 get_reg'...
Info : registering 'rk3568.lcore2 set_reg'...
Info : registering 'rk3568.lcore2 read_memory'...
Info : registering 'rk3568.lcore2 write_memory'...
Info : registering 'rk3568.lcore2 eventlist'...
Info : registering 'rk3568.lcore2 curstate'...
Info : registering 'rk3568.lcore2 debug_reason'...
Info : registering 'rk3568.lcore2 arp_examine'...
Info : registering 'rk3568.lcore2 was_examined'...
Info : registering 'rk3568.lcore2 examine_deferred'...
Info : registering 'rk3568.lcore2 arp_halt_gdb'...
Info : registering 'rk3568.lcore2 arp_poll'...
Info : registering 'rk3568.lcore2 arp_reset'...
Info : registering 'rk3568.lcore2 arp_halt'...
Info : registering 'rk3568.lcore2 arp_waitstate'...
Info : registering 'rk3568.lcore2 invoke-event'...
Info : exec_command finsh
Info : command - rk3568.lcore3 aarch64 -dap rk3568.dap -coreid 3 -cti cti3 -dbgbase 0x81007000
Info : exec_command begin
Info : registering 'rk3568.lcore3'...
Info : registering 'rk3568.lcore3 configure'...
Info : registering 'rk3568.lcore3 cget'...
Info : registering 'rk3568.lcore3 mwd'...
Info : registering 'rk3568.lcore3 mww'...
Info : registering 'rk3568.lcore3 mwh'...
Info : registering 'rk3568.lcore3 mwb'...
Info : registering 'rk3568.lcore3 mdd'...
Info : registering 'rk3568.lcore3 mdw'...
Info : registering 'rk3568.lcore3 mdh'...
Info : registering 'rk3568.lcore3 mdb'...
Info : registering 'rk3568.lcore3 get_reg'...
Info : registering 'rk3568.lcore3 set_reg'...
Info : registering 'rk3568.lcore3 read_memory'...
Info : registering 'rk3568.lcore3 write_memory'...
Info : registering 'rk3568.lcore3 eventlist'...
Info : registering 'rk3568.lcore3 curstate'...
Info : registering 'rk3568.lcore3 debug_reason'...
Info : registering 'rk3568.lcore3 arp_examine'...
Info : registering 'rk3568.lcore3 was_examined'...
Info : registering 'rk3568.lcore3 examine_deferred'...
Info : registering 'rk3568.lcore3 arp_halt_gdb'...
Info : registering 'rk3568.lcore3 arp_poll'...
Info : registering 'rk3568.lcore3 arp_reset'...
Info : registering 'rk3568.lcore3 arp_halt'...
Info : registering 'rk3568.lcore3 arp_waitstate'...
Info : registering 'rk3568.lcore3 invoke-event'...
Info : registering 'rk3568.lcore3 arm'...
Info : registering 'rk3568.lcore3 arm semihosting'...
Info : registering 'rk3568.lcore3 arm semihosting_redirect'...
Info : registering 'rk3568.lcore3 arm semihosting_cmdline'...
Info : registering 'rk3568.lcore3 arm semihosting_fileio'...
Info : registering 'rk3568.lcore3 arm semihosting_resexit'...
Info : registering 'rk3568.lcore3 arm semihosting_read_user_param'...
Info : registering 'rk3568.lcore3 arm semihosting_basedir'...
Info : registering 'rk3568.lcore3 catch_exc'...
Info : registering 'rk3568.lcore3 pauth'...
Info : registering 'rk3568.lcore3 aarch64'...
Info : registering 'rk3568.lcore3 aarch64 cache_info'...
Info : registering 'rk3568.lcore3 aarch64 dbginit'...
Info : registering 'rk3568.lcore3 aarch64 disassemble'...
Info : registering 'rk3568.lcore3 aarch64 maskisr'...
Info : registering 'rk3568.lcore3 aarch64 mcr'...
Info : registering 'rk3568.lcore3 aarch64 mrc'...
Info : registering 'rk3568.lcore3 aarch64 smp'...
Info : registering 'rk3568.lcore3 aarch64 smp_gdb'...
Info : exec_command finsh
Info : command - rk3568.lcore3 configure -defer-examine
Info : exec_command begin
Info : exec_command finsh
Info : command - target smp  rk3568.lcore0 rk3568.lcore1 rk3568.lcore2 rk3568.lcore3
Info : exec_command begin
Error: 無効なコマンド引数
Info : exec_command finsh
Info : command - targets rk3568.lcore0
Info : exec_command begin
Info : exec_command finsh
Info : ポート6666でtcl接続を待機中
Info : ポート4444でtelnet接続を待機中
Info : command - init
Info : exec_command begin
Info : command - target init
Info : exec_command begin
Info : command - target names
Info : exec_command begin
Info : handle_target_names
Info : exec_command finsh
Info : command - rk3568.ahb cget -event gdb-flash-erase-start
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.ahb configure -event gdb-flash-erase-start reset init
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.ahb cget -event gdb-flash-write-end
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.ahb configure -event gdb-flash-write-end reset halt
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.ahb cget -event gdb-attach
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.ahb configure -event gdb-attach halt 1000
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore0 cget -event gdb-flash-erase-start
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore0 configure -event gdb-flash-erase-start reset init
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore0 cget -event gdb-flash-write-end
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore0 configure -event gdb-flash-write-end reset halt
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore0 cget -event gdb-attach
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore0 configure -event gdb-attach halt 1000
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore1 cget -event gdb-flash-erase-start
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore1 configure -event gdb-flash-erase-start reset init
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore1 cget -event gdb-flash-write-end
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore1 configure -event gdb-flash-write-end reset halt
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore1 cget -event gdb-attach
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore1 configure -event gdb-attach halt 1000
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore2 cget -event gdb-flash-erase-start
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore2 configure -event gdb-flash-erase-start reset init
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore2 cget -event gdb-flash-write-end
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore2 configure -event gdb-flash-write-end reset halt
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore2 cget -event gdb-attach
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore2 configure -event gdb-attach halt 1000
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore3 cget -event gdb-flash-erase-start
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore3 configure -event gdb-flash-erase-start reset init
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore3 cget -event gdb-flash-write-end
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore3 configure -event gdb-flash-write-end reset halt
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore3 cget -event gdb-attach
Info : exec_command begin
Info : exec_command finsh
Info : command - rk3568.lcore3 configure -event gdb-attach halt 1000
Info : exec_command begin
Info : exec_command finsh
Info : registering 'target_request'...
Info : registering 'target_request debugmsgs'...
Info : registering 'trace'...
Info : registering 'trace history'...
Info : registering 'trace point'...
Info : registering 'fast_load_image'...
Info : registering 'fast_load'...
Info : registering 'profile'...
Info : registering 'virt2phys'...
Info : registering 'reg'...
Info : registering 'poll'...
Info : registering 'wait_halt'...
Info : registering 'halt'...
Info : registering 'resume'...
Info : registering 'reset'...
Info : registering 'soft_reset_halt'...
Info : registering 'step'...
Info : registering 'mdd'...
Info : registering 'mdw'...
Info : registering 'mdh'...
Info : registering 'mdb'...
Info : registering 'mwd'...
Info : registering 'mww'...
Info : registering 'mwh'...
Info : registering 'mwb'...
Info : registering 'bp'...
Info : registering 'rbp'...
Info : registering 'wp'...
Info : registering 'rwp'...
Info : registering 'load_image'...
Info : registering 'dump_image'...
Info : registering 'verify_image_checksum'...
Info : registering 'verify_image'...
Info : registering 'test_image'...
Info : registering 'get_reg'...
Info : registering 'set_reg'...
Info : registering 'read_memory'...
Info : registering 'write_memory'...
Info : registering 'debug_reason'...
Info : registering 'reset_nag'...
Info : registering 'ps'...
Info : registering 'test_mem_access'...
Info : exec_command finsh
Info : J-Link V11 compiled Jun 20 2023 17:59:57
Info : ハードウェアバージョン: 11.00
Info : VTarget = 3.184 V
Info : クロックスピード 12000 kHz
Info : command - transport init
Info : exec_command begin
Info : exec_command finsh
Info : command - dap init
Info : exec_command begin
Info : SWD DPIDR 0x2ba01477
Info : exec_command finsh
Info : [rk3568.ahb] 検査成功
Info : rk3568.lcore0: ハードウェアには6つのブレークポイントと4つのウォッチポイントがあります
Info : rk3568.lcore0 クラスター0 コア0 マルチコア
Info : [rk3568.lcore0] 検査成功
Info : command - flash init
Info : exec_command begin
Info : exec_command finsh
Info : command - nand init
Info : exec_command begin
Info : exec_command finsh
Info : command - pld init
Info : exec_command begin
Info : exec_command finsh
Info : command - tpiu init
Info : exec_command begin
Info : exec_command finsh
Info : gdbポート無効
Info : rk3568.lcore0のgdbサーバーを3333で開始
Info : ポート3333でgdb接続を待機中
Info : rk3568.lcore1のgdbサーバーを3334で開始
Info : ポート3334でgdb接続を待機中
Info : rk3568.lcore2のgdbサーバーを3335で開始
Info : ポート3335でgdb接続を待機中
Info : rk3568.lcore3のgdbサーバーを3336で開始
Info : ポート3336でgdb接続を待機中
Info : command - target names
Info : exec_command begin
Info : handle_target_names
Info : exec_command finsh
Info : exec_command finsh

初期化プロセスで呼び出されたコマンドが多数あり、一部のコマンドの呼び出しではコマンドの登録操作も行われています。ログの最後にはtarget namesコマンドが実行され、handle_target_names関数内のログ情報が確かに印刷されていることが確認できます。

コマンドライン呼び出しログ#

まずは telnet ログ:

$ telnet localhost 4444                                                                                   [15:40:43]
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> target names
command - target names
exec_command begin
handle_target_names
exec_command finsh
rk3568.ahb
rk3568.lcore0
rk3568.lcore1
rk3568.lcore2
rk3568.lcore3
>

次に openocd バックグラウンドログ:

Info : accepting 'telnet' connection on tcp/4444
Info : command - target names
Info : exec_command begin
Info : handle_target_names
Info : exec_command finsh

全体の呼び出しプロセスが初期化呼び出しと完全に一致していることが確認できます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。