From 0e73d65e58777f77882bc6dbbfd0e3e3aa5860b2 Mon Sep 17 00:00:00 2001 From: inmarket Date: Thu, 25 Sep 2014 17:43:43 +1000 Subject: [PATCH] Additional GDriver call --- src/gdriver/gdriver_gdriver.c | 27 ++++++++++++++++++--------- src/gdriver/sys_defs.h | 9 +++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/gdriver/gdriver_gdriver.c b/src/gdriver/gdriver_gdriver.c index 0a53aaf7..3c17fca0 100644 --- a/src/gdriver/gdriver_gdriver.c +++ b/src/gdriver/gdriver_gdriver.c @@ -11,19 +11,13 @@ #include "sys_defs.h" +#include // For memset + // Define the tables to hold the driver instances. static GDriver *dhead; // The system initialization. void _gdriverInit(void) { - - // Drivers not loaded yet - // GINPUT_NEED_MOUSE - // GINPUT_NEED_DIAL - // GINPUT_NEED_TOGGLE - // GINPUT_NEED_KEYBOARD - // GINPUT_NEED_STRING - // GFX_USE_GBLOCK } // The system de-initialization. @@ -51,7 +45,7 @@ GDriver *gdriverRegister(const GDriverVMT *vmt) { pd = gfxAlloc(vmt->objsize); if (!pd) return 0; - pd->driverchain = 0; + memset(pd, 0, vmt->objsize); pd->vmt = vmt; if (vmt->init && !vmt->init(pd, dinstance, sinstance)) { gfxFree(pd); @@ -136,4 +130,19 @@ GDriver *gdriverGetNext(uint16_t type, GDriver *driver) { return driver; } +unsigned gdriverGetDriverInstanceNumber(GDriver *driver) { + GDriver *pd; + unsigned instance; + + // Loop to find the system instance + instance = 0; + for(pd = dhead; pd; pd = pd->driverchain) { + if (pd == driver) + return instance; + if (pd->vmt->type == driver->vmt->type) + instance++; + } + return (unsigned)-1; +} + #endif /* GFX_USE_GDRIVER */ diff --git a/src/gdriver/sys_defs.h b/src/gdriver/sys_defs.h index 546246de..d8de25fc 100644 --- a/src/gdriver/sys_defs.h +++ b/src/gdriver/sys_defs.h @@ -70,6 +70,7 @@ typedef struct GDriverVMT { bool_t (*init)(GDriver *driver, unsigned driverinstance, unsigned systeminstance); // @< Initialise the driver. Returns TRUE if OK. // driverinstance is the instance 0..n of this driver. // systeminstance is the instance 0..n of this type of device. + // The memory allocated is cleared before this call. void (*postinit)(GDriver *driver); // @< Called once the driver is registered. void (*deinit)(GDriver *driver); // @< De-initialise the driver } GDriverVMT; @@ -130,6 +131,14 @@ extern "C" { */ unsigned gdriverInstanceCount(uint16_t type); + /** + * @brief Get the instance number for a device + * @return The instance number or (unsigned)-1 if it fails. + * + * @param[in] driver The driver to find the instance number for + */ + unsigned gdriverGetDriverInstanceNumber(GDriver *driver); + /** * @brief Get the next driver for a type of device * @return The runtime driver structure or NULL if there are no more.