Exemplo n.º 1
0
/*
 * Function called from task's main loop.
 */
void task_ad_spi_at45_worker_func(const struct task_item *task)
{
        /*
         * Handle to flash device.
         */
        spi_device dev;
        uint8_t sum;
        uint8_t prev_sum = 0;
        int i, j;

        /*
         * Open device connected to SPI bus.
         * This will not start any transmission yet.
         */
        dev = ad_spi_open(AT45DB011D);

        for (;;) {
                OS_DELAY(2000);
                sum = 0;
                /*
                 * Calculate checksum of 1000 bytes starting from address 0x8000.
                 * This could be done in one call to at45db_read but this would required to have
                 * 1000 bytes in buffer. For purpose of demonstration only 10 bytes buffer will
                 * be used.
                 * To have accurate checksum flash memory will be locked for all read transactions.
                 */
                ad_spi_device_acquire(dev);

                for (i = 0; i < 1000; i += sizeof(buf)) {
                        /*
                         * Read some part of memory, and calculate checksum.
                         */
                        at45db_read(dev, 0x8000 + i, buf, sizeof(buf));
                        for (j = 0; j < sizeof(buf); ++j) {
                                sum += buf[j];
                        }
                }

                /*
                 * Device access finished, let other task use it.
                 */
                ad_spi_device_release(dev);

                /*
                 * If something changed in memory from last checksum computation notify user
                 * and update checksum.
                 */
                if (sum != prev_sum) {
                        uart_printfln_s("Memory updated, checksum now 0x%X", sum);
                        prev_sum = sum;
                }
        }

        /*
         * This task will not use flash for time being, close it.
         */
        ad_spi_close(dev);
}
Exemplo n.º 2
0
static int flash_read(uint8_t *buf, off_t sector, unsigned int sector_num)
{
    int ret = 0;
    off_t off;

    off = (sector << SECTOR_PGSHIFT);

    d_print("Reading %d bytes at offset %lu\r\n",
            sector_num << SECTOR_PGSHIFT, off);

    ret = at45db_read(off, sector_num << SECTOR_PGSHIFT, buf);
    if (ret == -1)
        return -EIO;

    return sector_num;
}
Exemplo n.º 3
0
void menu_ad_spi_at45_print_log_func(const struct menu_item *m, bool checked)
{
        char buf[32];
        int i;

        /*
         * Handle to flash device.
         */
        spi_device dev;

        /*
         * Open device connected to SPI bus.
         * This will not start any transmission yet.
         */
        dev = ad_spi_open(AT45DB011D);

        uart_printfln(false, "Start of log:");
        /*
         * Read records from memory, record is empty when first byte if 0xFF.
         * Stop reading on first empty record.
         */
        for (i = 0; i < 1024; i += 32) {
                /*
                 * Read just one record at a time.
                 */
                at45db_read(dev, 0x8000 + i, (uint8_t *) buf, 32);
                if (buf[0] == (char) 0xFF) {
                        break;
                }
                uart_printfln(false, buf);
        }

        uart_printfln(false, "End of log");

        /*
         * This task will not use flash for time being, close it.
         */
        ad_spi_close(dev);
}