aboutsummaryrefslogtreecommitdiffstats
path: root/src/gdriver
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2014-09-25 17:43:43 +1000
committerinmarket <andrewh@inmarket.com.au>2014-09-25 17:45:14 +1000
commit0e73d65e58777f77882bc6dbbfd0e3e3aa5860b2 (patch)
treec5fddc5391c166a064533c8353d88f15ae56718c /src/gdriver
parent9f720b1f122ffc7986cc467ef1a7607000c6b491 (diff)
downloaduGFX-0e73d65e58777f77882bc6dbbfd0e3e3aa5860b2.tar.gz
uGFX-0e73d65e58777f77882bc6dbbfd0e3e3aa5860b2.tar.bz2
uGFX-0e73d65e58777f77882bc6dbbfd0e3e3aa5860b2.zip
Additional GDriver call
Diffstat (limited to 'src/gdriver')
-rw-r--r--src/gdriver/gdriver_gdriver.c27
-rw-r--r--src/gdriver/sys_defs.h9
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 <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 */
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;
@@ -131,6 +132,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.
*