Пример #1
0
void e300_eeprom_manager::write_db_eeprom(const dboard_eeprom_t& eeprom)
{
    boost::mutex::scoped_lock(_mutex);
    _db_eeprom = eeprom;
    std::vector<boost::uint8_t> bytes;
    bytes.resize(sizeof(db_eeprom_map_t));


    db_eeprom_map_t *map_ptr = reinterpret_cast<db_eeprom_map_t*>(&bytes[0]);
    memset(map_ptr, 0xff, sizeof(db_eeprom_map_t));

    // get the old contents
    for(size_t i = 0; i < sizeof(db_eeprom_map_t); i++)
        bytes[i] = _i2c->get_i2c_reg16(DB_ADDR, i);

    db_eeprom_map_t &map = *map_ptr;

    if (_db_eeprom.id != dboard_id_t::none()) {
        map.hw_product = uhd::htonx<boost::uint16_t>(
            _db_eeprom.id.to_uint16());
    }

    if (not _db_eeprom.revision.empty()) {
        map.hw_revision = uhd::htonx<boost::uint16_t>(
            boost::lexical_cast<boost::uint16_t>(_db_eeprom.revision));
    }

    if (not _db_eeprom.serial.empty()) {
        _string_to_bytes(_db_eeprom.serial, DB_SERIAL_LEN, map.serial);
    }
    for(size_t i = 0; i < sizeof(mb_eeprom_map_t); i++)
        _i2c->set_i2c_reg16(DB_ADDR, i, bytes[i]);
}
Пример #2
0
void e300_eeprom_manager::write_mb_eeprom(const mboard_eeprom_t& eeprom)
{
    boost::mutex::scoped_lock(_mutex);
    _mb_eeprom = eeprom;
    std::vector<boost::uint8_t> bytes;
    bytes.resize(sizeof(mb_eeprom_map_t));


    mb_eeprom_map_t *map_ptr = reinterpret_cast<mb_eeprom_map_t*>(&bytes[0]);
    memset(map_ptr, 0xff, sizeof(mb_eeprom_map_t));

    // get the old contents
    for(size_t i = 0; i < sizeof(mb_eeprom_map_t); i++)
        bytes[i] = _i2c->get_i2c_reg8(MB_ADDR, i);

    mb_eeprom_map_t &map = *map_ptr;

    // set the data version, that can be used to distinguish eeprom layouts
    map.data_version_major = E310_MB_MAP_MAJOR;
    map.data_version_minor = E310_MB_MAP_MINOR;


    if (_mb_eeprom.has_key("product")) {
        map.hw_product = uhd::htonx<boost::uint16_t>(
            boost::lexical_cast<boost::uint16_t>(_mb_eeprom["product"]));
    }
    if (_mb_eeprom.has_key("revision")) {
        map.hw_revision = uhd::htonx<boost::uint16_t>(
            boost::lexical_cast<boost::uint16_t>(_mb_eeprom["revision"]));
    }
    if (_mb_eeprom.has_key("serial")) {
        _string_to_bytes(_mb_eeprom["serial"], MB_SERIAL_LEN, map.serial);
    }
    if (_mb_eeprom.has_key("mac-addr")) {
        byte_vector_t mac_addr = mac_addr_t::from_string(_mb_eeprom["mac-addr"]).to_bytes();
        std::copy(mac_addr.begin(), mac_addr.end(), map.mac_addr);
    }

    //store the name
    if (_mb_eeprom.has_key("name")) {
        _string_to_bytes(_mb_eeprom["name"], MB_NAME_LEN, map.user_name);
    }

    for(size_t i = 0; i < sizeof(mb_eeprom_map_t); i++)
        _i2c->set_i2c_reg8(MB_ADDR, i, bytes[i]);

}
Пример #3
0
void n230_eeprom_manager::write_mb_eeprom(const mboard_eeprom_t& eeprom)
{
    boost::mutex::scoped_lock lock(_mutex);

    _mb_eeprom = eeprom;

    n230_eeprom_map_t* map_ptr = reinterpret_cast<n230_eeprom_map_t*>(_request.data);
    memset(map_ptr, 0xff, sizeof(n230_eeprom_map_t)); //Initialize to erased state
    //Read EEPROM from device
    _transact(N230_FLASH_COMM_CMD_READ_NV_DATA);
    memcpy(map_ptr, _response.data, sizeof(n230_eeprom_map_t));
    n230_eeprom_map_t& map = *map_ptr;

    // Automatic version upgrade handling
    uint16_t old_ver_major = uhd::htonx<uint16_t>(map.data_version_major);
    uint16_t old_ver_minor = uhd::htonx<uint16_t>(map.data_version_minor);

    //The revision_compat field does not exist for version 1.0 so force write it
    //EEPROM version 1.0 will only exist on HW revision 1 so it is safe to set
    //revision_compat = revision for the upgrade
    bool force_write_version_compat = (old_ver_major == 1 and old_ver_minor == 0);

    map.data_version_major = uhd::htonx<uint16_t>(N230_EEPROM_VER_MAJOR);
    map.data_version_minor = uhd::htonx<uint16_t>(N230_EEPROM_VER_MINOR);

    if (_mb_eeprom.has_key("product")) {
        map.hw_product = uhd::htonx<uint16_t>(
            boost::lexical_cast<uint16_t>(_mb_eeprom["product"]));
    }
    if (_mb_eeprom.has_key("revision")) {
        map.hw_revision = uhd::htonx<uint16_t>(
            boost::lexical_cast<uint16_t>(_mb_eeprom["revision"]));
    }
    if (_mb_eeprom.has_key("revision_compat")) {
        map.hw_revision_compat = uhd::htonx<uint16_t>(
            boost::lexical_cast<uint16_t>(_mb_eeprom["revision_compat"]));
    } else if (force_write_version_compat) {
        map.hw_revision_compat = map.hw_revision;
    }
    if (_mb_eeprom.has_key("serial")) {
        _string_to_bytes(_mb_eeprom["serial"], N230_EEPROM_SERIAL_LEN, map.serial);
    }

    //Push ethernet info
    if (_mb_eeprom.has_key("gateway")){
        map.gateway = uhd::htonx<uint32_t>(
            boost::asio::ip::address_v4::from_string(_mb_eeprom["gateway"]).to_ulong());
    }
    for (size_t i = 0; i < N230_MAX_NUM_ETH_PORTS; i++) {
        const std::string n(1, i+'0');
        if (_mb_eeprom.has_key("ip-addr"+n)){
            map.eth_info[i].ip_addr = uhd::htonx<uint32_t>(
                boost::asio::ip::address_v4::from_string(_mb_eeprom["ip-addr"+n]).to_ulong());
        }
        if (_mb_eeprom.has_key("subnet"+n)){
            map.eth_info[i].subnet = uhd::htonx<uint32_t>(
                boost::asio::ip::address_v4::from_string(_mb_eeprom["subnet"+n]).to_ulong());
        }
        if (_mb_eeprom.has_key("mac-addr"+n)) {
            byte_vector_t mac_addr = mac_addr_t::from_string(_mb_eeprom["mac-addr"+n]).to_bytes();
            std::copy(mac_addr.begin(), mac_addr.end(), map.eth_info[i].mac_addr);
        }
    }
    //store the name
    if (_mb_eeprom.has_key("name")) {
        _string_to_bytes(_mb_eeprom["name"], N230_EEPROM_NAME_LEN, map.user_name);
    }

    //Write EEPROM to device
    _transact(N230_FLASH_COMM_CMD_WRITE_NV_DATA);
}