Hello Alexandru-Sever,

in case you use the latest RTEMS version, then I would consider to use the new I2C support:

https://docs.rtems.org/doxygen/cpukit/html/group__I2C.html

For example see:

https://git.rtems.org/rtems/tree/cpukit/dev/i2c

https://git.rtems.org/rtems/tree/testsuites/libtests/i2c01

On 02/04/15 08:48, Alexandru-Sever Horin wrote:
From: Alexandru-Sever Horin <alex.seve...@gmail.com>

libi2c registration of a device fails if the device initialization fails
Benefits: allows for device probing on multiple addresses
---
  cpukit/libi2c/libi2c.c | 27 ++++++++++++++++-----------
  1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/cpukit/libi2c/libi2c.c b/cpukit/libi2c/libi2c.c
index 233cb68..315a761 100644
--- a/cpukit/libi2c/libi2c.c
+++ b/cpukit/libi2c/libi2c.c
@@ -736,6 +736,16 @@ rtems_libi2c_register_drv (const char *name, 
rtems_libi2c_drv_t * drvtbl,
        /* found a free slot; encode slot + 1 ! */
        minor = ((i + 1) << 13) | RTEMS_LIBI2C_MAKE_MINOR (busno, i2caddr);
+ /* before registering, try to initialize the device to check it's there */
+      if (drvtbl->ops->initialization_entry) {
+        err = drvtbl->ops->initialization_entry (rtems_libi2c_major, minor, 0);
+        if (err) {
+          LIBUNLOCK ();
+          /* returned value must be negative on failure */
+          return err < 0 ? err : -err;
+        }
+      }
+
        if (name) {
          size_t length = strlen (busses[busno].name) + strlen (name) + 2;
          str = malloc (length);
@@ -751,9 +761,10 @@ rtems_libi2c_register_drv (const char *name, 
rtems_libi2c_drv_t * drvtbl,
/* note that 'umask' is applied to 'mode' */
          if (mknod (str, mode, dev)) {
-          safe_printf( DRVNM
-                   "Creating device node failed: %s; you can try to do it 
manually...\n",
-                   strerror (errno));
+          safe_printf ( DRVNM
+                        "Creating device node failed: %s;\n"
+                        "you can try to do it manually...\n",
+                        strerror (errno));
          }
free (str);
@@ -761,17 +772,11 @@ rtems_libi2c_register_drv (const char *name, 
rtems_libi2c_drv_t * drvtbl,
drvs[i].drv = drvtbl; - if (drvtbl->ops->initialization_entry)
-        err =
-          drvs[i].drv->ops->initialization_entry (rtems_libi2c_major, minor,
-                                                  0);
-      else
-        err = RTEMS_SUCCESSFUL;
-
        LIBUNLOCK ();
-      return err ? -err : minor;
+      return minor;
      }
    }
+
    LIBUNLOCK ();
    return -RTEMS_TOO_MANY;
  }

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.hu...@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to