Implement read device info for NRF5x

This commit is contained in:
Boris Sorochkin 2018-12-19 22:57:07 +02:00 committed by Uwe Bonnes
parent 3f89fed32e
commit 691ada17e9
1 changed files with 61 additions and 0 deletions

View File

@ -35,6 +35,7 @@ static bool nrf51_cmd_read_hwid(target *t);
static bool nrf51_cmd_read_fwid(target *t);
static bool nrf51_cmd_read_deviceid(target *t);
static bool nrf51_cmd_read_deviceaddr(target *t);
static bool nrf51_cmd_read_deviceinfo(target *t);
static bool nrf51_cmd_read_help(target *t);
static bool nrf51_cmd_read(target *t, int argc, const char *argv[]);
@ -49,6 +50,7 @@ const struct command_s nrf51_read_cmd_list[] = {
{"fwid", (cmd_handler)nrf51_cmd_read_fwid, "Read pre-loaded firmware ID"},
{"deviceid", (cmd_handler)nrf51_cmd_read_deviceid, "Read unique device ID"},
{"deviceaddr", (cmd_handler)nrf51_cmd_read_deviceaddr, "Read device address"},
{"deviceinfo", (cmd_handler)nrf51_cmd_read_deviceinfo, "Read device information"},
{NULL, NULL, NULL}
};
@ -76,6 +78,15 @@ const struct command_s nrf51_read_cmd_list[] = {
#define NRF51_FICR_DEVICEADDR_HIGH (NRF51_FICR + 0x0A8)
#define NRF52_PART_INFO (NRF51_FICR + 0x100)
#define NRF52_INFO_RAM (NRF51_FICR + 0x10C)
/* Device Info Registers */
#define NRF51_FICR_DEVICE_INFO_BASE (NRF51_FICR + 0x100)
#define NRF51_FICR_DEVICE_INFO_PART NRF51_FICR_DEVICE_INFO_BASE
#define NRF51_FICR_DEVICE_INFO_VARIANT (NRF51_FICR_DEVICE_INFO_BASE + 4)
#define NRF51_FICR_DEVICE_INFO_PACKAGE (NRF51_FICR_DEVICE_INFO_BASE + 8)
#define NRF51_FICR_DEVICE_INFO_RAM (NRF51_FICR_DEVICE_INFO_BASE + 12)
#define NRF51_FICR_DEVICE_INFO_FLASH (NRF51_FICR_DEVICE_INFO_BASE + 16)
#define NRF51_FIELD_UNSPECIFIED (0xFFFFFFFF)
/* User Information Configuration Registers (UICR) */
#define NRF51_UICR 0x10001000
@ -245,6 +256,56 @@ static bool nrf51_cmd_read_deviceid(target *t)
return true;
}
static bool nrf51_cmd_read_deviceinfo(target *t)
{
struct deviceinfo{
uint32_t part;
union{
char c[4];
uint32_t f;
} variant;
uint32_t package;
uint32_t ram;
uint32_t flash;
} di;
di.package = target_mem_read32(t, NRF51_FICR_DEVICE_INFO_PACKAGE);
di.part = target_mem_read32(t, NRF51_FICR_DEVICE_INFO_PART);
di.ram = target_mem_read32(t, NRF51_FICR_DEVICE_INFO_RAM);
di.flash = target_mem_read32(t, NRF51_FICR_DEVICE_INFO_FLASH);
di.variant.f = target_mem_read32(t, NRF51_FICR_DEVICE_INFO_VARIANT);
tc_printf(t, "Part:\t\tNRF%X\n",di.part);
tc_printf(t, "Variant:\t%c%c%c%c\n",
di.variant.c[3],
di.variant.c[2],
di.variant.c[1],
di.variant.c[0]);
tc_printf(t, "Package:\t");
switch (di.package)
{
case NRF51_FIELD_UNSPECIFIED:
tc_printf(t,"Unspecified\n");
break;
case 0x2000:
tc_printf(t,"QF\n");
break;
case 0x2001:
tc_printf(t,"CI\n");
break;
case 0x2004:
tc_printf(t,"QIxx\n");
break;
default:
tc_printf(t,"Unknown (Code %X)\n",di.package);
break;
}
tc_printf(t, "Ram:\t\t%uK\n", di.ram);
tc_printf(t, "Flash:\t\t%uK\n", di.flash);
return true;
}
static bool nrf51_cmd_read_deviceaddr(target *t)
{
uint32_t addr_type = target_mem_read32(t, NRF51_FICR_DEVICEADDRTYPE);