Probe chip ID bytes on startup.
This commit is contained in:
parent
377e30ea03
commit
886fbd59c9
|
@ -16,6 +16,7 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "output.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
|
||||||
device_t device_default;
|
device_t device_default;
|
||||||
|
@ -88,3 +89,48 @@ int device_setbrk(device_t dev, int which, int enabled, address_t addr,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int device_probe_id(device_t dev)
|
||||||
|
{
|
||||||
|
uint8_t data[16];
|
||||||
|
|
||||||
|
if (dev->type->readmem(dev, 0xff0, data, sizeof(data)) < 0) {
|
||||||
|
printc_err("device_probe_id: read failed\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data[0] == 0x80) {
|
||||||
|
if (dev->type->readmem(dev, 0x1a00, data, sizeof(data)) < 0) {
|
||||||
|
printc_err("device_probe_id: read failed\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->dev_id[0] = data[4];
|
||||||
|
dev->dev_id[1] = data[5];
|
||||||
|
dev->dev_id[2] = data[6];
|
||||||
|
} else {
|
||||||
|
dev->dev_id[0] = data[0];
|
||||||
|
dev->dev_id[1] = data[1];
|
||||||
|
dev->dev_id[2] = data[13];
|
||||||
|
}
|
||||||
|
|
||||||
|
printc_dbg("Chip ID data: %02x %02x", dev->dev_id[0], dev->dev_id[1]);
|
||||||
|
if (dev->dev_id[2])
|
||||||
|
printc(" %02x", dev->dev_id[2]);
|
||||||
|
|
||||||
|
if (device_is_fram(dev))
|
||||||
|
printc(" [FRAM]");
|
||||||
|
|
||||||
|
printc("\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is there a more reliable way of doing this? */
|
||||||
|
int device_is_fram(device_t dev)
|
||||||
|
{
|
||||||
|
const uint8_t a = dev->dev_id[0];
|
||||||
|
const uint8_t b = dev->dev_id[1];
|
||||||
|
|
||||||
|
return ((a < 0x04) && (b == 0x81)) ||
|
||||||
|
(((a & 0xf0) == 0x70) && ((b & 0x8e) == 0x80));
|
||||||
|
}
|
||||||
|
|
|
@ -113,6 +113,8 @@ struct device_class {
|
||||||
struct device {
|
struct device {
|
||||||
const struct device_class *type;
|
const struct device_class *type;
|
||||||
|
|
||||||
|
uint8_t dev_id[3];
|
||||||
|
|
||||||
/* Breakpoint table. This should not be modified directly.
|
/* Breakpoint table. This should not be modified directly.
|
||||||
* Instead, you should use the device_setbrk() helper function. This
|
* Instead, you should use the device_setbrk() helper function. This
|
||||||
* will set the appropriate flags and ensure that the breakpoint is
|
* will set the appropriate flags and ensure that the breakpoint is
|
||||||
|
@ -122,6 +124,16 @@ struct device {
|
||||||
struct device_breakpoint breakpoints[DEVICE_MAX_BREAKPOINTS];
|
struct device_breakpoint breakpoints[DEVICE_MAX_BREAKPOINTS];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Probe the device memory and extract ID bytes. This should be called
|
||||||
|
* after the device structure is ready.
|
||||||
|
*/
|
||||||
|
int device_probe_id(device_t dev);
|
||||||
|
|
||||||
|
/* Determine, from the device ID bytes, whether this chip is an FRAM or
|
||||||
|
* flash-based device.
|
||||||
|
*/
|
||||||
|
int device_is_fram(device_t dev);
|
||||||
|
|
||||||
/* Set or clear a breakpoint. The index of the modified entry is
|
/* Set or clear a breakpoint. The index of the modified entry is
|
||||||
* returned, or -1 if no free entries were available. The modified
|
* returned, or -1 if no free entries were available. The modified
|
||||||
* entry is flagged so that it will be reloaded on the next run.
|
* entry is flagged so that it will be reloaded on the next run.
|
||||||
|
|
Loading…
Reference in New Issue