Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

/**
 * $Id: calib.c 881 2013-12-16 05:37:34Z rp_jmenart $
 *
 * @brief Red Pitaya Oscilloscope Calibration Module.
 *
 * @Author Jure Menart <juremenart@gmail.com>
 *        
 * (c) Red Pitaya  http://www.redpitaya.com
 *
 * This part of code is written in C programming language.
 * Please visit http://en.wikipedia.org/wiki/C_(programming_language)
 * for more details on the language used herein.
 */


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#include "calib.h"

const char eeprom_device[]="/sys/bus/i2c/devices/0-0050/eeprom";
const int  eeprom_calib_off=0x0008;


/*----------------------------------------------------------------------------*/
/**
 * @brief Read calibration parameters from EEPROM device.
 *
 * Function reads calibration parameters from EEPROM device and stores them to the
 * specified buffer. Communication to the EEPROM device is taken place through
 * appropriate system driver accessed through the file system device
 * /sys/bus/i2c/devices/0-0050/eeprom.
 *
 * @param[out]   calib_params  Pointer to destination buffer.
 * @retval       0 Success
 * @retval      -1 Failure, error message is put on stderr device
 *
 */

int rp_read_calib_params(rp_calib_params_t *calib_params)
{
    FILE   *fp;
    size_t  size;

    /* sanity check */
    if(calib_params == NULL) {
        fprintf(stderr, "rp_read_calib_params(): input structure "
                "not initialized\n");
        return -1;
    }

    /* open eeprom device */
    fp=fopen(eeprom_device, "r");
    if(fp == NULL) {
        fprintf(stderr, "rp_read_calib_params(): Can not open EEPROM device: "
                " %s\n", strerror(errno));
       return -1;
    }

    /* ...and seek to the appropriate storage offset */
    if(fseek(fp, eeprom_calib_off, SEEK_SET) < 0) {
        fclose(fp);
        fprintf(stderr, "rp_read_calib_params(): fseek() failed: %s\n",
                strerror(errno));
        return -1;
    }

    /* read data from eeprom component and store it to the specified buffer */
    size=fread(calib_params, sizeof(char), sizeof(rp_calib_params_t), fp);
    if(size != sizeof(rp_calib_params_t)) {
        fclose(fp);
        fprintf(stderr, "rp_read_calib_params(): fread() failed, "
                "returned bytes: %d (should be :%d)\n", size,
                sizeof(rp_calib_params_t));
        return -1;
    }
    fclose(fp);

    return 0;
}


/*----------------------------------------------------------------------------*/
/**
 * Initialize calibration parameters to default values.
 *
 * @param[out] calib_params  Pointer to target buffer to be initialized.
 * @retval 0 Success, could never fail.
 */


int rp_default_calib_params(rp_calib_params_t *calib_params)
{
    calib_params->fe_ch1_fs_g_hi = 28101971; /* 0.6543 [V] */
    calib_params->fe_ch2_fs_g_hi = 28101971; /* 0.6543 [V] */
    calib_params->fe_ch1_fs_g_lo = 625682246; /* 14.56 [V] */
    calib_params->fe_ch2_fs_g_lo = 625682246; /* 14.56 [V] */
    calib_params->fe_ch1_dc_offs = 585;
    calib_params->fe_ch2_dc_offs = 585;
    calib_params->be_ch1_fs = 42949673; /* 1 [V] */
    calib_params->be_ch2_fs = 42949673; /* 1 [V] */
    calib_params->be_ch1_dc_offs = 0x3eac;
    calib_params->be_ch2_dc_offs = 0x3eac;

    return 0;
}