Exemplo n.º 1
0
bool eeprom_write(uint32_t address, void* data, uint16_t length)
{
    uint8_t* p = (uint8_t*)data;
    uint8_t currentLength;
    uint8_t currentPageAddress;
    
    while (length > 0){
        currentPageAddress = (uint8_t)(address & (PAGE_SIZE - 1));
        currentLength = (uint8_t)(PAGE_SIZE - currentPageAddress); // calculate maximum byte that can be written to this page from the current offset
        if (length < currentLength){
            currentLength = (uint8_t)length;
        }

        if (eeprom_page_write(address, p, currentLength) == false){
            return false;
        }
        address += currentLength;
        p += currentLength;
        length -= currentLength;
    }
    
    return true;
}
Exemplo n.º 2
0
unsigned int firmware_handle_packet(unsigned char* data)
{
    firmware_packet *packet = (firmware_packet*) data;

    rs_text_P(PSTR("Firmware: offset "));
    rs_hex( packet->offset >> 16);
    rs_hex( packet->offset >> 8);
    rs_hex( packet->offset);

    rs_send(' ');
    rs_send('#');
    rs_hex(packet->op);

    switch (packet->op) {

    // pakiet z danymi strony do wgrania do pamieci
    case FIRMWARE_OP_SEND:

        // na poczatku aktualizacji wyczysc cala pamiec
        if (packet->offset == 0L) {
            eeprom_enable_write(1);
            eeprom_chip_erase();
        }

        // wlacz zapis do pamieci EEPROM
        eeprom_enable_write(1);

        // zapisz dane do pamieci
        eeprom_page_write(packet->offset, packet->data, packet->len);

        //rs_dump(packet->data, packet->len);

        // odsylamy pakiet z potwierdzeniem wgrania danych
        packet->op = FIRMWARE_OP_SEND_OK;

        return 6 + packet->len;

    // weryfikacja danych (odeslij zawartosci podanej strony)
    case FIRMWARE_OP_VERIFY:

        // pobierz cala strone
        packet->len = 255;

        // pobierz dane
        eeprom_page_read(packet->offset, packet->data, packet->len);

        //rs_dump(packet->data, packet->len+1);

        // odsylamy pakiet z danymi z pamieci (skrypt aktualizujacy dokona porownania)
        return 6 + packet->len + 1;

    // pakiet z blednym kodem operacji
    default:
        packet->op     = 0;
        packet->offset = 0UL;
        packet->len    = 0;
        return 6;
    }

    return 0;
}