Example #1
0
//------------------------------------------------------------------------------
/// Writes data at the specified address on the serial firmware dataflash. The
/// page(s) to program must have been erased prior to writing. This function
/// handles page boundary crossing automatically.
/// Returns 0 if successful; otherwise, returns AT26_ERROR_PROGRAM is there has
/// been an error during the data programming.
/// \param pAt26  Pointer to an AT26 driver instance.
/// \param pData  Data buffer.
/// \param size  Number of bytes in buffer.
/// \param address  Write address.
//------------------------------------------------------------------------------
unsigned char AT26D_Write(
    At26 *pAt26,
    unsigned char *pData,
    unsigned int size,
    unsigned int address)
{
    unsigned int pageSize;
    unsigned int writeSize;
    unsigned char error;
    unsigned char status;

    SANITY_CHECK(pAt26);
    SANITY_CHECK(pData);

    // Retrieve device page size
    pageSize = AT26_PageSize(pAt26);

    // Program one page after the other
    while (size > 0) {
        // Compute number of bytes to program in page
        writeSize = min(size, pageSize - (address % pageSize));

        // Enable critical write operation
        AT26D_EnableWrite(pAt26);
     
         // Program page
          error = AT26_SendCommand(pAt26, AT26_BYTE_PAGE_PROGRAM, 4,
                           pData, writeSize, address, 0, 0);
        ASSERT(!error, "-F- AT26_WritePage: Failed to issue command.\n\r");
        // Wait for transfer to finish
        AT26D_Wait(pAt26);
        // Poll the Serial flash status register until the operation is achieved
        AT26D_WaitReady(pAt26);

        // Make sure that write was without error
        status = AT26D_ReadStatus(pAt26);
        if ((status & AT26_STATUS_EPE) == AT26_STATUS_EPE_ERROR) {

            return AT26_ERROR_PROGRAM;
        }
        pData += writeSize;
        size -= writeSize;
        address += writeSize;
    }

    return 0;
}
Example #2
0
//------------------------------------------------------------------------------
/// Writes data at the specified address on the serial firmware dataflash. The
/// page(s) to program must have been erased prior to writing. This function
/// handles page boundary crossing automatically.
/// Returns 0 if successful; otherwise, returns AT26_ERROR_PROGRAM is there has
/// been an error during the data programming.
/// \param pAt26  Pointer to an AT26 driver instance.
/// \param pData  Data buffer.
/// \param size  Number of bytes in buffer.
/// \param address  Write address.
//------------------------------------------------------------------------------
unsigned char AT26D_Write(
    At26 *pAt26,
    unsigned char *pData,
    unsigned int size,
    unsigned int address)
{
    unsigned int pageSize;
    unsigned int writeSize;
    unsigned char error;
    #if !defined(BOARD_AT26F004)
    unsigned char status;
    #endif
    unsigned int i = 0;

    SANITY_CHECK(pAt26);
    SANITY_CHECK(pData);

    // Retrieve device page size
    pageSize = AT26_PageSize(pAt26);

    // Program one page after the other
    while (size > 0) {
        // Compute number of bytes to program in page
        #if defined(BOARD_AT26F004)
        writeSize = 1;
        #else
        writeSize = min(size, pageSize - (address % pageSize));
        #endif

        // Enable critical write operation
        AT26D_EnableWrite(pAt26);
        if (AT26_ManId(pAt26) == SST_SPI_FLASH) {

            error = AT26_SendCommand(pAt26, AT26_SEQUENTIAL_PROGRAM_1, 4,
                               pData, 2, address, 0, 0);
            
            ASSERT(!error, "-F- AT26_WritePage: Failed to issue command.\n\r");
    
            /* Wait for transfer to finish */
            AT26D_Wait(pAt26);
            /* Poll the Serial flash status register until the operation is achieved */
            AT26D_WaitReady(pAt26);

            for (i = 2; i < pageSize; i += 2) {
                error = AT26_SendCommand(pAt26, AT26_SEQUENTIAL_PROGRAM_1, 1,
                                   pData + i, 2, 0, 0, 0);

                ASSERT(!error, "-F- AT26_WritePage: Failed to issue command.\n\r");
        
                /* Wait for transfer to finish */
                AT26D_Wait(pAt26);
                /* Poll the Serial flash status register until the operation is achieved */
                AT26D_WaitReady(pAt26);
            }
        
        }
     else
     {
        // Program page
        error = AT26_SendCommand(pAt26, AT26_BYTE_PAGE_PROGRAM, 4,
                           pData, writeSize, address, 0, 0);
        ASSERT(!error, "-F- AT26_WritePage: Failed to issue command.\n\r");
        // Wait for transfer to finish
        AT26D_Wait(pAt26);
        // Poll the Serial flash status register until the operation is achieved
        AT26D_WaitReady(pAt26);
     }
 
        #if !defined(AT26F004)
        // Make sure that write was without error
        status = AT26D_ReadStatus(pAt26);
        if ((status & AT26_STATUS_EPE) == AT26_STATUS_EPE_ERROR) {

            return AT26_ERROR_PROGRAM;
        }
        #endif

        pData += writeSize;
        size -= writeSize;
        address += writeSize;
    }

    return 0;
}