tilib: automatically detect path to uif when -d is not specified.
This commit is contained in:
parent
09ca20c91c
commit
2ce7a82657
|
@ -42,6 +42,8 @@ struct tilib_device {
|
||||||
|
|
||||||
uint16_t bp_handles[DEVICE_MAX_BREAKPOINTS];
|
uint16_t bp_handles[DEVICE_MAX_BREAKPOINTS];
|
||||||
|
|
||||||
|
char uifPath[1024];
|
||||||
|
|
||||||
/* MSP430.h */
|
/* MSP430.h */
|
||||||
STATUS_T WINAPI (*MSP430_Initialize)(char *port, long *version);
|
STATUS_T WINAPI (*MSP430_Initialize)(char *port, long *version);
|
||||||
STATUS_T WINAPI (*MSP430_VCC)(long voltage);
|
STATUS_T WINAPI (*MSP430_VCC)(long voltage);
|
||||||
|
@ -58,14 +60,18 @@ struct tilib_device {
|
||||||
long releaseJTAG);
|
long releaseJTAG);
|
||||||
STATUS_T WINAPI (*MSP430_Erase)(long type, long address, long length);
|
STATUS_T WINAPI (*MSP430_Erase)(long type, long address, long length);
|
||||||
STATUS_T WINAPI (*MSP430_Error_Number)(void);
|
STATUS_T WINAPI (*MSP430_Error_Number)(void);
|
||||||
const char * WINAPI (*MSP430_Error_String)(long errNumber);
|
const char *WINAPI (*MSP430_Error_String)(long errNumber);
|
||||||
|
|
||||||
|
STATUS_T WINAPI (*MSP430_GetNumberOfUsbIfs)(long* number);
|
||||||
|
STATUS_T WINAPI (*MSP430_GetNameOfUsbIf)(long idx, char **name,
|
||||||
|
long *status);
|
||||||
|
|
||||||
/* MSP430_Debug.h */
|
/* MSP430_Debug.h */
|
||||||
STATUS_T WINAPI (*MSP430_Registers)(long *registers, long mask,
|
STATUS_T WINAPI (*MSP430_Registers)(long *registers, long mask,
|
||||||
long rw);
|
long rw);
|
||||||
STATUS_T WINAPI (*MSP430_Run)(long mode, long releaseJTAG);
|
STATUS_T WINAPI (*MSP430_Run)(long mode, long releaseJTAG);
|
||||||
STATUS_T WINAPI (*MSP430_State)(long* state, long stop,
|
STATUS_T WINAPI (*MSP430_State)(long *state, long stop,
|
||||||
long* pCPUCycles);
|
long *pCPUCycles);
|
||||||
|
|
||||||
/* MSP430_EEM.h */
|
/* MSP430_EEM.h */
|
||||||
STATUS_T WINAPI (*MSP430_EEM_Init)(DLL430_EVENTNOTIFY_FUNC callback,
|
STATUS_T WINAPI (*MSP430_EEM_Init)(DLL430_EVENTNOTIFY_FUNC callback,
|
||||||
|
@ -184,6 +190,16 @@ static int get_all_funcs(struct tilib_device *dev)
|
||||||
if (!dev->MSP430_Error_String)
|
if (!dev->MSP430_Error_String)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
dev->MSP430_GetNumberOfUsbIfs =
|
||||||
|
get_func(dev->hnd, "MSP430_GetNumberOfUsbIfs");
|
||||||
|
if (!dev->MSP430_GetNumberOfUsbIfs)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
dev->MSP430_GetNameOfUsbIf =
|
||||||
|
get_func(dev->hnd, "MSP430_GetNameOfUsbIf");
|
||||||
|
if (!dev->MSP430_GetNameOfUsbIf)
|
||||||
|
return -1;
|
||||||
|
|
||||||
dev->MSP430_Registers = get_func(dev->hnd, "MSP430_Registers");
|
dev->MSP430_Registers = get_func(dev->hnd, "MSP430_Registers");
|
||||||
if (!dev->MSP430_Registers)
|
if (!dev->MSP430_Registers)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -541,17 +557,10 @@ static int do_fw_update(struct tilib_device *dev, const char *filename)
|
||||||
static int do_init(struct tilib_device *dev, const struct device_args *args)
|
static int do_init(struct tilib_device *dev, const struct device_args *args)
|
||||||
{
|
{
|
||||||
long version;
|
long version;
|
||||||
char buf[1024];
|
|
||||||
union DEVICE_T device;
|
union DEVICE_T device;
|
||||||
|
|
||||||
/* Not sure if the path is actually modified by MSP430_Initialize,
|
printc_dbg("MSP430_Initialize: %s\n", dev->uifPath);
|
||||||
* but the argument isn't const, so probably safest to copy it.
|
if (dev->MSP430_Initialize(dev->uifPath, &version) < 0) {
|
||||||
*/
|
|
||||||
strncpy(buf, args->path, sizeof(buf));
|
|
||||||
buf[sizeof(buf) - 1] = 0;
|
|
||||||
|
|
||||||
printc_dbg("MSP430_Initialize: %s\n", buf);
|
|
||||||
if (dev->MSP430_Initialize(buf, &version) < 0) {
|
|
||||||
report_error(dev, "MSP430_Initialize");
|
report_error(dev, "MSP430_Initialize");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -626,15 +635,47 @@ static int do_init(struct tilib_device *dev, const struct device_args *args)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int do_findUif(struct tilib_device *dev)
|
||||||
|
{
|
||||||
|
// Find the first uif and store the path name into dev->uifPath
|
||||||
|
long attachedUifCount = 0;
|
||||||
|
long uifIndex = 0;
|
||||||
|
|
||||||
|
printc_dbg("MSP430_GetNumberOfUsbIfs\n");
|
||||||
|
if (dev->MSP430_GetNumberOfUsbIfs(&attachedUifCount) < 0) {
|
||||||
|
report_error(dev, "MSP430_GetNumberOfUsbIfs");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uifIndex = 0; uifIndex < attachedUifCount; uifIndex++)
|
||||||
|
{
|
||||||
|
char *name = NULL;
|
||||||
|
long status = 0;
|
||||||
|
|
||||||
|
printc_dbg("MSP430_GetNameOfUsbIf\n");
|
||||||
|
if (dev->MSP430_GetNameOfUsbIf(uifIndex, &name, &status) < 0) {
|
||||||
|
report_error(dev, "MSP430_GetNameOfUsbIf");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == 0) /* status == 1 when fet is in use */
|
||||||
|
{
|
||||||
|
// This fet is unused
|
||||||
|
strncpy(dev->uifPath, name, sizeof(dev->uifPath));
|
||||||
|
printc_dbg("Found FET: %s\n", dev->uifPath);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printc_err("No unused FET found.\n");
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static device_t tilib_open(const struct device_args *args)
|
static device_t tilib_open(const struct device_args *args)
|
||||||
{
|
{
|
||||||
struct tilib_device *dev;
|
struct tilib_device *dev;
|
||||||
|
|
||||||
if (!(args->flags & DEVICE_FLAG_TTY)) {
|
|
||||||
printc_err("This driver does not support raw USB access.\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev = malloc(sizeof(*dev));
|
dev = malloc(sizeof(*dev));
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
printc_err("tilib: can't allocate memory: %s\n",
|
printc_err("tilib: can't allocate memory: %s\n",
|
||||||
|
@ -659,6 +700,24 @@ static device_t tilib_open(const struct device_args *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy the args->path to the dev->uifPath buffer
|
||||||
|
* we may need to change it for automatic detection, and
|
||||||
|
* not sure if the path is actually modified by MSP430_Initialize,
|
||||||
|
* but the argument isn't const, so probably safest to copy it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((args->flags & DEVICE_FLAG_TTY)) {
|
||||||
|
strncpy(dev->uifPath, args->path, sizeof(dev->uifPath));
|
||||||
|
dev->uifPath[sizeof(dev->uifPath) - 1] = 0;
|
||||||
|
} else {
|
||||||
|
// No path was supplied, use the first UIF we can find
|
||||||
|
if (do_findUif(dev) < 0) {
|
||||||
|
dynload_close(dev->hnd);
|
||||||
|
free(dev);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (do_init(dev, args) < 0) {
|
if (do_init(dev, args) < 0) {
|
||||||
printc_err("tilib: device initialization failed\n");
|
printc_err("tilib: device initialization failed\n");
|
||||||
dynload_close(dev->hnd);
|
dynload_close(dev->hnd);
|
||||||
|
|
Loading…
Reference in New Issue