[PATCH] cpukit/libi2c allowed to probe on device init
Sebastian Huber
sebastian.huber at embedded-brains.de
Thu Apr 2 06:53:03 UTC 2015
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.sever.h at 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.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list