parent
3eb6cf0fc0
commit
e6e2070692
|
@ -21,6 +21,41 @@
|
||||||
* currently in IR. They should set IR to dbus explicitly.
|
* currently in IR. They should set IR to dbus explicitly.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Code structure
|
||||||
|
*
|
||||||
|
* At the bottom of the stack are the OpenOCD JTAG functions:
|
||||||
|
* jtag_add_[id]r_scan
|
||||||
|
* jtag_execute_query
|
||||||
|
* jtag_add_runtest
|
||||||
|
*
|
||||||
|
* There are a few functions to just instantly shift a register and get its
|
||||||
|
* value:
|
||||||
|
* dtmcontrol_scan
|
||||||
|
* idcode_scan
|
||||||
|
* dbus_scan
|
||||||
|
*
|
||||||
|
* Because doing one scan and waiting for the result is slow, most functions
|
||||||
|
* batch up a bunch of dbus writes and then execute them all at once. They use
|
||||||
|
* the scans "class" for this:
|
||||||
|
* scans_new
|
||||||
|
* scans_delete
|
||||||
|
* scans_execute
|
||||||
|
* scans_add_...
|
||||||
|
* Usually you new(), call a bunch of add functions, then execute() and look
|
||||||
|
* at the results by calling scans_get...()
|
||||||
|
*
|
||||||
|
* Optimized functions will directly use the scans class above, but slightly
|
||||||
|
* lazier code will use the cache functions that in turn use the scans
|
||||||
|
* functions:
|
||||||
|
* cache_get...
|
||||||
|
* cache_set...
|
||||||
|
* cache_write
|
||||||
|
* cache_set... update a local structure, which is then synced to the target
|
||||||
|
* with cache_write(). Only Debug RAM words that are actually changed are sent
|
||||||
|
* to the target. Afterwards use cache_get... to read results.
|
||||||
|
*/
|
||||||
|
|
||||||
#define get_field(reg, mask) (((reg) & (mask)) / ((mask) & ~((mask) << 1)))
|
#define get_field(reg, mask) (((reg) & (mask)) / ((mask) & ~((mask) << 1)))
|
||||||
#define set_field(reg, mask, val) (((reg) & ~(mask)) | (((val) * ((mask) & ~((mask) << 1))) & (mask)))
|
#define set_field(reg, mask, val) (((reg) & ~(mask)) | (((val) * ((mask) & ~((mask) << 1))) & (mask)))
|
||||||
|
|
||||||
|
@ -574,6 +609,7 @@ static int scans_execute(scans_t *scans)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add a 32-bit dbus write to the scans structure. */
|
||||||
static void scans_add_write32(scans_t *scans, uint16_t address, uint32_t data,
|
static void scans_add_write32(scans_t *scans, uint16_t address, uint32_t data,
|
||||||
bool set_interrupt)
|
bool set_interrupt)
|
||||||
{
|
{
|
||||||
|
@ -586,6 +622,8 @@ static void scans_add_write32(scans_t *scans, uint16_t address, uint32_t data,
|
||||||
assert(scans->next_scan <= scans->scan_count);
|
assert(scans->next_scan <= scans->scan_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add a 32-bit dbus write for an instruction that jumps to the beginning of
|
||||||
|
* debug RAM. */
|
||||||
static void scans_add_write_jump(scans_t *scans, uint16_t address,
|
static void scans_add_write_jump(scans_t *scans, uint16_t address,
|
||||||
bool set_interrupt)
|
bool set_interrupt)
|
||||||
{
|
{
|
||||||
|
@ -594,6 +632,8 @@ static void scans_add_write_jump(scans_t *scans, uint16_t address,
|
||||||
set_interrupt);
|
set_interrupt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add a 32-bit dbus write for an instruction that loads from the indicated
|
||||||
|
* slot. */
|
||||||
static void scans_add_write_load(scans_t *scans, uint16_t address,
|
static void scans_add_write_load(scans_t *scans, uint16_t address,
|
||||||
unsigned int reg, slot_t slot, bool set_interrupt)
|
unsigned int reg, slot_t slot, bool set_interrupt)
|
||||||
{
|
{
|
||||||
|
@ -601,6 +641,8 @@ static void scans_add_write_load(scans_t *scans, uint16_t address,
|
||||||
set_interrupt);
|
set_interrupt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add a 32-bit dbus write for an instruction that stores to the indicated
|
||||||
|
* slot. */
|
||||||
static void scans_add_write_store(scans_t *scans, uint16_t address,
|
static void scans_add_write_store(scans_t *scans, uint16_t address,
|
||||||
unsigned int reg, slot_t slot, bool set_interrupt)
|
unsigned int reg, slot_t slot, bool set_interrupt)
|
||||||
{
|
{
|
||||||
|
@ -608,6 +650,7 @@ static void scans_add_write_store(scans_t *scans, uint16_t address,
|
||||||
set_interrupt);
|
set_interrupt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add a 32-bit dbus read. */
|
||||||
static void scans_add_read32(scans_t *scans, uint16_t address, bool set_interrupt)
|
static void scans_add_read32(scans_t *scans, uint16_t address, bool set_interrupt)
|
||||||
{
|
{
|
||||||
assert(scans->next_scan < scans->scan_count);
|
assert(scans->next_scan < scans->scan_count);
|
||||||
|
@ -619,6 +662,7 @@ static void scans_add_read32(scans_t *scans, uint16_t address, bool set_interrup
|
||||||
scans->next_scan++;
|
scans->next_scan++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add one or more scans to read the indicated slot. */
|
||||||
static void scans_add_read(scans_t *scans, slot_t slot, bool set_interrupt)
|
static void scans_add_read(scans_t *scans, slot_t slot, bool set_interrupt)
|
||||||
{
|
{
|
||||||
const struct target *target = scans->target;
|
const struct target *target = scans->target;
|
||||||
|
|
Loading…
Reference in New Issue