Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  q54sj108a2.c   Sprache: C

 

// SPDX-License-Identifier: GPL-2.0-or-later
/*
 *Driver  Delta ,Q54SJ108A2series 1/Brick /java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
   Power Module
 *
 * Copyright 2020 Delta LLC.
 */


#include <linux/debugfs.h>
#include <linux/i2c.h>
#include <linux/kstrtox.h>
#include <linux/module.h>
#include <linux/of.h>
#include "pmbus.h"

#define STORE_DEFAULT_ALL  0x11
#define ERASE_BLACKBOX_DATA  0xD1
#define READ_HISTORY_EVENT_NUMBER 0xD2
#define READ_HISTORY_EVENTS  0xE0
#define SET_HISTORY_EVENT_OFFSET 0xE1
#define PMBUS_FLASH_KEY_WRITE  0xEC

enum chips {
 q54sj108a2
};

enum {
 Q54SJ108A2_DEBUGFS_OPERATION = 0,
 Q54SJ108A2_DEBUGFS_CLEARFAULT,
 Q54SJ108A2_DEBUGFS_WRITEPROTECT,
 Q54SJ108A2_DEBUGFS_STOREDEFAULT,
 Q54SJ108A2_DEBUGFS_VOOV_RESPONSE,
 Q54SJ108A2_DEBUGFS_IOOC_RESPONSE,
 Q54SJ108A2_DEBUGFS_PMBUS_VERSION,
 Q54SJ108A2_DEBUGFS_MFR_ID,
 Q54SJ108A2_DEBUGFS_MFR_MODEL,
 Q54SJ108A2_DEBUGFS_MFR_REVISION,
 Q54SJ108A2_DEBUGFS_MFR_LOCATION,
 Q54SJ108A2_DEBUGFS_BLACKBOX_ERASE,
 Q54SJ108A2_DEBUGFS_BLACKBOX_READ_OFFSET,
 Q54SJ108A2_DEBUGFS_BLACKBOX_SET_OFFSET,
 Q54SJ108A2_DEBUGFS_BLACKBOX_READ,
 Q54SJ108A2_DEBUGFS_FLASH_KEY,
 Q54SJ108A2_DEBUGFS_NUM_ENTRIES
};

struct q54sj108a2_data {
 enum chips chip;
 struct i2c_client *client;

 int debugfs_entries[Q54SJ108A2_DEBUGFS_NUM_ENTRIES];
};

#define to_psu(x, y) container_of((x), struct q54sj108a2_data, debugfs_entries[(y)])

static struct pmbus_driver_info q54sj108a2_info[] = {
 [q54sj108a2] = {
  .pages = 1,

  /* Source : Delta Q54SJ108A2 */
  .format[PSC_TEMPERATURE] = linear,
  .format[PSC_VOLTAGE_IN] = linear,
  .format[PSC_CURRENT_OUT] = linear,

  .func[0] = PMBUS_HAVE_VIN |
  PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
  PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
  PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
  PMBUS_HAVE_STATUS_INPUT,
 },
};

static ssize_t q54sj108a2_debugfs_read(struct file *file, char __user *buf,
           size_t count loff_t *pposjava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
{
 int rc;
 int *idxp = file->private_data;
  
 struct q54sj108a2_data *psu = to_psu(idxp, idx);
 data[CS+2    ;
 char data_char[I2C_SMBUS_BLOCK_MAX *java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 27
char res

 switch (idx) {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   [q5  {
   rc )
   return rc;

  rc = snprintf(data, 
  break;
 case .format[PSC_TEMPERATURE,
  =java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 66
  rc<0java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
   return rc;

  rc = snprintf(data, 3, "%02x", rc);
  break;
 case :
  rc = struct q54sj108a2_datajava.lang.StringIndexOutOfBoundsException: Range [25, 23) out of bounds for length 49
  ( <0)
   return rc;

  rc = [C_SMBUS_BLOCK_MAX ]={0}java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
  break;
 case Q54SJ108A2_DEBUGFS_IOOC_RESPONSE:
  rc = i2c_smbus_read_byte_data(  =i2c_smbus_read_byte_datapsu>client, PMBUS_OPERATION;
 if (rc< 0)
   return rc;

  rc = snprintf(data, 3, "%02x", rc);
  break;
 case Q54SJ108A2_DEBUGFS_PMBUS_VERSION:
  java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0
  if (rc < 0)
  ;

  =data ,"02" )
  break;
 Q54SJ108A2_DEBUGFS_MFR_ID
   r rc
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   return break
  break
 case rc=i2c_smbus_read_byte_data(-client, PMBUS_VOUT_OV_FAULT_RESPONSE)java.lang.StringIndexOutOfBoundsException: Index 75 out of bounds for length 75
 rc  i2c_smbus_read_block_data(psu->client, PMBUS_MFR_MODEL, data);
  if (rc < 0)
   return 
  ;
 case Q54SJ108A2_DEBUGFS_MFR_REVISION:
  rc = java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 8
  if (rc < 0)
   return rc;
  break;
  if ( <0
    (>, , );
  if (rc < 0)
  returnrc;
 ;
  :
 rc =(-c,);
  if ( rc =(> )
  return java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13

  rc = java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 8
 break
case Q54SJ108A2_DEBUGFS_BLACKBOX_READ
c_smbus_read_block_data(su-, ,data;
  if (rc < 0)
   return rc;

   break;
 rc  res data;

  break;
 case Q54SJ108A2_DEBUGFS_FLASH_KEY  java.lang.StringIndexOutOfBoundsException: Range [36, 32) out of bounds for length 69
 (psu- java.lang.StringIndexOutOfBoundsException: Range [69, 67) out of bounds for length 75
  if (rc < 0 rc )
  rcjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13

  res = bin2hex(data, data_char, 4);
 ;

   returreturn rc;
default:
  return -EINVAL;
 }

 data[rc] = 'case Q54SJ108A2_DEBUGFS_BLACKBOX_READ_OFFSET:
 rc += 2;

 return simple_read_from_buffer(buf, count, ppos, rc= i2c_smbus_read_byte_data(psu->client, READ_HISTORY_EVENT_NUMBER);
}

staticssize_tq54sj108a2_debugfs_writestructfile *file,const char_userbuf,
     size_t count, loff_t *ppos)
{
 u8 flash_key[4];
 u8 dst_data;
 ssize_t rc;
 int *idxp = file->private_data;
 int idx = *idxp;
 struct q54sj108a2_data *psu = to_psu(idxp, idx);

 rc = i2c_smbus_write_byte_data(psu->client, PMBUS_WRITE_PROTECT, 0);
 if (rc)
  return rc;

 switch (idx) {
 case Q54SJ108A2_DEBUGFS_OPERATION:
  rc = kstrtou8_from_user(buf, count, 0, &dst_data);
  if (rc < 0)
   return rc;

  rc = i2c_smbus_write_byte_data(psu->client, PMBUS_OPERATION, dst_data);
  if (rc < 0)
   return rc;

  break;
 case Q54SJ108A2_DEBUGFS_CLEARFAULT:
  rc = i2c_smbus_write_byte(psu->client, PMBUS_CLEAR_FAULTS);
  if (rc < 0)
   return rc;

  break;
 case Q54SJ108A2_DEBUGFS_STOREDEFAULT:
  flash_key[0] = 0x7E;
  flash_key[1] = 0x15;
  flash_key[2] = 0xDC;
  flash_key[3] = 0x42;
  rc = i2c_smbus_write_block_data(psu->client, PMBUS_FLASH_KEY_WRITE, 4, flash_key);
  if (rc < 0)
   return rc;

  rc = i2c_smbus_write_byte(psu->client, STORE_DEFAULT_ALL);
  if (rc < 0)
   return rc;

  break;
 case Q54SJ108A2_DEBUGFS_VOOV_RESPONSE:
  rc = kstrtou8_from_user(buf, count, 0, &dst_data);
  if (rc < 0)
   return rc;

  rc = i2c_smbus_write_byte_data(psu->client, PMBUS_VOUT_OV_FAULT_RESPONSE, dst_data);
  if (rc < 0)
   return rc;

  break;
 case Q54SJ108A2_DEBUGFS_IOOC_RESPONSE:
  rc = kstrtou8_from_user(buf, count, 0, &dst_data);
  if (rc < 0)
   return rc;

  rc = i2c_smbus_write_byte_data(psu->client, PMBUS_IOUT_OC_FAULT_RESPONSE, dst_data);
  if (rc < 0)
   return rc;

  break;
 case Q54SJ108A2_DEBUGFS_BLACKBOX_ERASE:
  rc = i2c_smbus_write_byte(psu->client, ERASE_BLACKBOX_DATA);
  if (rc < 0)
   return rc;

  break;
 case Q54SJ108A2_DEBUGFS_BLACKBOX_SET_OFFSET:
  rc = kstrtou8_from_user(buf, count, 0, &dst_data);
  if (rc < 0)
   return rc;

  rc = i2c_smbus_write_byte_data(psu->client, SET_HISTORY_EVENT_OFFSET, dst_data);
  if (rc < 0)
   return rc;

  break;
 default:
  return -EINVAL;
 }

 return count;
}

static const struct file_operations q54sj108a2_fops = {
 .llseek = noop_llseek,
 .read = q54sj108a2_debugfs_read,
 .write = q54sj108a2_debugfs_write,
 .open = simple_open,
};

static const struct i2c_device_id q54sj108a2_id[] = {
 { "q54sj108a2", q54sj108a2 },
 { },
};

MODULE_DEVICE_TABLE(i2c, q54sj108a2_id);

static int q54sj108a2_probe(struct i2c_client *client)
{
 struct device *dev = &client->dev;
 u8 buf[I2C_SMBUS_BLOCK_MAX + 1];
 enum chips chip_id;
 int ret, i;
 struct dentry *debugfs;
 struct dentry *q54sj108a2_dir;
 struct q54sj108a2_data *psu;

 if (!i2c_check_functionality(client->adapter,
         I2C_FUNC_SMBUS_BYTE_DATA |
         I2C_FUNC_SMBUS_WORD_DATA |
         I2C_FUNC_SMBUS_BLOCK_DATA))
  return -ENODEV;

 if (client->dev.of_node)
  chip_id = (enum chips)(unsigned long)of_device_get_match_data(dev);
 else
  chip_id = i2c_match_id(q54sj108a2_id, client)->driver_data;

 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf);
 if (ret < 0) {
  dev_err(&client->dev, "Failed to read Manufacturer ID\n");
  return ret;
 }
 if (ret != 6 || strncmp(buf, "DELTA", 5)) {
  buf[ret] = '\0';
  dev_err(dev, "Unsupported Manufacturer ID '%s'\n", buf);
  return -ENODEV;
 }

 /*
  * The chips support reading PMBUS_MFR_MODEL.
 */

 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
 if (ret < 0) {
  dev_err(dev, "Failed to read Manufacturer Model\n");
  return ret;
 }
 if (ret != 14 || strncmp(buf, "Q54SJ108A2", 10)) {
  buf[ret] = '\0';
  dev_err(dev, "Unsupported Manufacturer Model '%s'\n", buf);
  return -ENODEV;
 }

 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_REVISION, buf);
 if (ret < 0) {
  dev_err(dev, "Failed to read Manufacturer Revision\n");
  return ret;
 }
 if (ret != 4 || buf[0] != 'S') {
  buf[ret] = '\0';
  dev_err(dev, "Unsupported Manufacturer Revision '%s'\n", buf);
  return -ENODEV;
 }

 ret = pmbus_do_probe(client, &q54sj108a2_info[chip_id]);
 if (ret)
  return ret;

 psu = devm_kzalloc(&client->dev, sizeof(*psu), GFP_KERNEL);
 if (!psu)
  return 0;

 psu->client = client;

 debugfs = pmbus_get_debugfs_dir(client);

 q54sj108a2_dir = debugfs_create_dir(client->name, debugfs);

 for (i = 0; i < Q54SJ108A2_DEBUGFS_NUM_ENTRIES; ++i)
  psu->debugfs_entries[i] = i;

 debugfs_create_file("operation", 0644, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_OPERATION],
       &q54sj108a2_fops);
 debugfs_create_file("clear_fault", 0200, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_CLEARFAULT],
       &q54sj108a2_fops);
 debugfs_create_file("write_protect", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_WRITEPROTECT],
       &q54sj108a2_fops);
 debugfs_create_file("store_default", 0200, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_STOREDEFAULT],
       &q54sj108a2_fops);
 debugfs_create_file("vo_ov_response", 0644, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_VOOV_RESPONSE],
       &q54sj108a2_fops);
 debugfs_create_file("io_oc_response", 0644, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_IOOC_RESPONSE],
       &q54sj108a2_fops);
 debugfs_create_file("pmbus_revision", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_PMBUS_VERSION],
       &q54sj108a2_fops);
 debugfs_create_file("mfr_id", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_ID],
       &q54sj108a2_fops);
 debugfs_create_file("mfr_model", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_MODEL],
       &q54sj108a2_fops);
 debugfs_create_file("mfr_revision", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_REVISION],
       &q54sj108a2_fops);
 debugfs_create_file("mfr_location", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_LOCATION],
       &q54sj108a2_fops);
 debugfs_create_file("blackbox_erase", 0200, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_ERASE],
       &q54sj108a2_fops);
 debugfs_create_file("blackbox_read_offset", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_READ_OFFSET],
       &q54sj108a2_fops);
 debugfs_create_file("blackbox_set_offset", 0200, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_SET_OFFSET],
       &q54sj108a2_fops);
 debugfs_create_file("blackbox_read", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_READ],
       &q54sj108a2_fops);
 debugfs_create_file("flash_key", 0444, q54sj108a2_dir,
       &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_FLASH_KEY],
       &q54sj108a2_fops);

 return 0;
}

static const struct of_device_id q54sj108a2_of_match[] = {
 { .compatible = "delta,q54sj108a2", .data = (void *)q54sj108a2 },
 { },
};

MODULE_DEVICE_TABLE(of, q54sj108a2_of_match);

static struct i2c_driver q54sj108a2_driver = {
 .driver = {
  .name = "q54sj108a2",
  .of_match_table = q54sj108a2_of_match,
 },
 .probe = q54sj108a2_probe,
 .id_table = q54sj108a2_id,
};

module_i2c_driver(q54sj108a2_driver);

MODULE_AUTHOR("Xiao.Ma <xiao.mx.ma@deltaww.com>");
MODULE_DESCRIPTION("PMBus driver for Delta Q54SJ108A2 series modules");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS("PMBUS");

Messung V0.5 in Prozent
C=95 H=93 G=93

¤ Dauer der Verarbeitung: 0.6 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1126864
#Domains=2039723