Additional GDriver call

This commit is contained in:
inmarket 2014-09-25 17:43:43 +10:00
parent 6b9ff5de2a
commit 33200c1a97
2 changed files with 27 additions and 9 deletions

View File

@ -11,19 +11,13 @@
#include "sys_defs.h"
#include <string.h> // 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 */

View File

@ -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.