Factoring of jtag_examine_chain for maintainability:

- Factor TAP ID matching into new helper function.
- Simplifies the main jtag_examine_chain loop logic considerably.


git-svn-id: svn://svn.berlios.de/openocd/trunk@2089 b42882b7-edfa-0310-969c-e2dbd0fdcd60
__archive__
zwelch 2009-06-07 05:24:12 +00:00
parent f106382055
commit 63c4848d11
1 changed files with 43 additions and 35 deletions

View File

@ -1021,6 +1021,45 @@ static void jtag_examine_chain_end(u8 *idcodes, unsigned count, unsigned max)
}
}
static bool jtag_examine_chain_match_tap(const struct jtag_tap_s *tap)
{
if (0 == tap->expected_ids_cnt)
{
/// @todo Enable LOG_INFO to ask for reports about unknown TAP IDs.
#if 0
LOG_INFO("Uknown JTAG TAP ID: 0x%08x", tap->idcode)
LOG_INFO("Please report the chip name and reported ID code to the openocd project");
#endif
return true;
}
/* Loop over the expected identification codes and test for a match */
u8 ii;
for (ii = 0; ii < tap->expected_ids_cnt; ii++)
{
if (tap->idcode == tap->expected_ids[ii])
break;
}
/* If none of the expected ids matched, log an error */
if (ii != tap->expected_ids_cnt)
{
LOG_INFO("JTAG Tap/device matched");
return true;
}
jtag_examine_chain_display(LOG_LVL_ERROR, "got",
tap->dotted_name, tap->idcode);
for (ii = 0; ii < tap->expected_ids_cnt; ii++)
{
char msg[32];
snprintf(msg, sizeof(msg), "expected %hhu of %hhu",
ii + 1, tap->expected_ids_cnt);
jtag_examine_chain_display(LOG_LVL_ERROR, msg,
tap->dotted_name, tap->expected_ids[ii]);
}
return false;
}
/* Try to examine chain layout according to IEEE 1149.1 §12
*/
static int jtag_examine_chain(void)
@ -1080,42 +1119,11 @@ static int jtag_examine_chain(void)
tap->idcode = idcode;
if (0 == tap->expected_ids_cnt)
{
/// @todo Enable LOG_INFO to ask for reports about unknown TAP IDs.
#if 0
LOG_INFO("Uknown JTAG TAP ID: 0x%08x", tap->idcode)
LOG_INFO("Please report the chip name and reported ID code to the openocd project");
#endif
tap = jtag_tap_next_enabled(tap);
continue;
}
/* Loop over the expected identification codes and test for a match */
u8 ii;
for (ii = 0; ii < tap->expected_ids_cnt; ii++)
{
if (tap->idcode == tap->expected_ids[ii])
break;
}
/* If none of the expected ids matched, log an error */
if (ii != tap->expected_ids_cnt)
{
LOG_INFO("JTAG Tap/device matched");
tap = jtag_tap_next_enabled(tap);
continue;
}
jtag_examine_chain_display(LOG_LVL_ERROR, "got",
tap->dotted_name, tap->idcode);
for (ii = 0; ii < tap->expected_ids_cnt; ii++)
{
char msg[20];
snprintf(msg, 20, "expected %hhu of %hhu",
ii + 1, tap->expected_ids_cnt);
jtag_examine_chain_display(LOG_LVL_ERROR, msg,
tap->dotted_name, tap->expected_ids[ii]);
}
// ensure the TAP ID does matches what was expected
if (!jtag_examine_chain_match_tap(tap))
return ERROR_JTAG_INIT_FAILED;
tap = jtag_tap_next_enabled(tap);
}
/* see if number of discovered devices matches configuration */