Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:11

0001 /**
0002  * @file
0003  *
0004  * @brief Switch NXP PCA9548A Driver Implementation
0005  *
0006  * @ingroup I2CSWITCHNXPPCA9548A
0007  */
0008 
0009 /*
0010  * Copyright (c) 2014 embedded brains GmbH & Co. KG
0011  *
0012  * The license and distribution terms for this file may be
0013  * found in the file LICENSE in this distribution or at
0014  * http://www.rtems.org/license/LICENSE.
0015  */
0016 
0017 #ifdef HAVE_CONFIG_H
0018 #include "config.h"
0019 #endif
0020 
0021 #include <dev/i2c/switch-nxp-pca9548a.h>
0022 
0023 static int switch_nxp_pca9548a_do_get_control(
0024   i2c_dev *dev,
0025   uint8_t *val
0026 )
0027 {
0028   i2c_msg msg = {
0029     .addr = dev->address,
0030     .flags = I2C_M_RD,
0031     .len = (uint16_t) sizeof(*val),
0032     .buf = val
0033   };
0034 
0035   return i2c_bus_transfer(dev->bus, &msg, 1);
0036 }
0037 
0038 static int switch_nxp_pca9548a_do_set_control(
0039   i2c_dev *dev,
0040   uint8_t val
0041 )
0042 {
0043   i2c_msg msg = {
0044     .addr = dev->address,
0045     .flags = 0,
0046     .len = (uint16_t) sizeof(val),
0047     .buf = &val
0048   };
0049 
0050   return i2c_bus_transfer(dev->bus, &msg, 1);
0051 }
0052 
0053 static int switch_nxp_pca9548a_ioctl(
0054   i2c_dev *dev,
0055   ioctl_command_t command,
0056   void *arg
0057 )
0058 {
0059   uint8_t v8 = (uint8_t)(uintptr_t) arg;
0060   int err;
0061 
0062   switch (command) {
0063     case SWITCH_NXP_PCA9548A_GET_CONTROL:
0064       err = switch_nxp_pca9548a_do_get_control(dev, arg);
0065       break;
0066     case SWITCH_NXP_PCA9548A_SET_CONTROL:
0067       err = switch_nxp_pca9548a_do_set_control(dev, v8);
0068       break;
0069     default:
0070       err = -ENOTTY;
0071       break;
0072   }
0073 
0074   return err;
0075 }
0076 
0077 int i2c_dev_register_switch_nxp_pca9548a(
0078   const char *bus_path,
0079   const char *dev_path,
0080   uint16_t address
0081 )
0082 {
0083   i2c_dev *dev;
0084 
0085   dev = i2c_dev_alloc_and_init(sizeof(*dev), bus_path, address);
0086   if (dev == NULL) {
0087     return -1;
0088   }
0089 
0090   dev->ioctl = switch_nxp_pca9548a_ioctl;
0091 
0092   return i2c_dev_register(dev, dev_path);
0093 }