--- c/src/lib/libbsp/sparc/shared/can/grcan.c | 28 ++++++++++++++++++++++++--- c/src/lib/libbsp/sparc/shared/include/grcan.h | 11 +++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/c/src/lib/libbsp/sparc/shared/can/grcan.c b/c/src/lib/libbsp/sparc/shared/can/grcan.c index 9e1c05d..515efa3 100644 --- a/c/src/lib/libbsp/sparc/shared/can/grcan.c +++ b/c/src/lib/libbsp/sparc/shared/can/grcan.c @@ -217,6 +217,8 @@ static unsigned int __inline__ _grcan_read_nocache(unsigned int address) } #endif +#define NELEM(a) ((int) (sizeof (a) / sizeof (a[0]))) + static int grcan_count = 0; static struct grcan_priv *priv_tab[GRCAN_COUNT_MAX]; @@ -307,12 +309,12 @@ int grcan_init3(struct drvmgr_dev *dev) /* Failed to get prefix, make sure of a unique FS name * by using the driver minor. */ - sprintf(priv->devName, "/dev/grcan%d", dev->minor_drv); + sprintf(priv->devName, "grcan%d", dev->minor_drv); } else { /* Got special prefix, this means we have a bus prefix * And we should use our "bus minor" */ - sprintf(priv->devName, "/dev/%sgrcan%d", prefix, dev->minor_bus); + sprintf(priv->devName, "%sgrcan%d", prefix, dev->minor_bus); } return DRVMGR_OK; @@ -1177,6 +1179,25 @@ int grcan_dev_count(void) return grcan_count; } +void *grcan_open_by_name(char *name, int *dev_no) +{ + int i; + for (i = 0; i < grcan_count; i++){ + struct grcan_priv *pDev; + + pDev = priv_tab[i]; + if (NULL == pDev) { + continue; + } + if (strncmp(pDev->devName, name, NELEM(pDev->devName)) == 0) { + if (dev_no) + *dev_no = i; + return grcan_open(i); + } + } + return NULL; +} + void *grcan_open(int dev_no) { struct grcan_priv *pDev; @@ -1463,7 +1484,8 @@ int grcan_start(void *d) pDev->started = 1; /* Register interrupt routine and enable IRQ at IRQ ctrl */ - drvmgr_interrupt_register(pDev->dev, 0, "grcan", grcan_interrupt, pDev); + drvmgr_interrupt_register(pDev->dev, 0, pDev->devName, + grcan_interrupt, pDev); return 0; } diff --git a/c/src/lib/libbsp/sparc/shared/include/grcan.h b/c/src/lib/libbsp/sparc/shared/include/grcan.h index 08e6638..7de76a7 100644 --- a/c/src/lib/libbsp/sparc/shared/include/grcan.h +++ b/c/src/lib/libbsp/sparc/shared/include/grcan.h @@ -171,6 +171,17 @@ extern int grcan_dev_count(void); extern void *grcan_open(int dev_no); /* + * Open a GRCAN device by name. Finds device index then calls + * grcan_open(index). + * + * name: Device name to open + * dev_no: Device number matching name. Will be set if device found. + * return: Device handle to use with all other grcan_ API functions. The + * function returns NULL if device can not be opened or not found. + */ +extern void *grcan_open_by_name(char *name, int *dev_no); + +/* * Close a GRCAN device * * return: This function always returns 0 (success) -- 2.7.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel