Beispiel #1
0
static bool test_erase_block(bdev_t *device, uint32_t block_addr)
{
    bool success = false;
    uint8_t valid_byte[1];

    uint8_t *block_contents = memalign(DMA_ALIGNMENT, device->block_size);
    memset(block_contents, ~(device->erase_byte), device->block_size);

    ssize_t err = bio_write_block(device, block_contents, block_addr, 1);
    if (err != (ssize_t)device->block_size) {
        goto finish;
    }

    valid_byte[0] = ~(device->erase_byte);
    if (!is_valid_block(device, block_addr, valid_byte, 1)) {
        goto finish;
    }

    err = bio_erase(device, block_addr * device->block_size, 1);
    if (err <= 0) {
        goto finish;
    }

    valid_byte[0] = device->erase_byte;
    if (is_valid_block(device, block_addr, valid_byte, 1)) {
        success = true;
    }

finish:
    free(block_contents);
    return success;
}
Beispiel #2
0
// returns the number of blocks where the write was not successful.
static ssize_t write_test(bdev_t *device)
{
    uint8_t *test_buffer = memalign(DMA_ALIGNMENT, device->block_size);

    for (bnum_t bnum = 0; bnum < device->block_count; bnum++) {
        memset(test_buffer, get_signature(bnum), device->block_size);
        ssize_t err = bio_write_block(device, test_buffer, bnum, 1);
        if (err < 0) {
            free(test_buffer);
            return err;
        }
    }

    size_t num_errors = 0;
    uint8_t expected_pattern[1];
    for (bnum_t bnum = 0; bnum < device->block_count; bnum++) {
        expected_pattern[0] = get_signature(bnum);
        if (!is_valid_block(device, bnum, expected_pattern, sizeof(expected_pattern))) {
            num_errors++;
        }
    }

    free(test_buffer);

    return num_errors;
}
rtems_status_code lpc32xx_mlc_is_valid_block(uint32_t block_index)
{
  uint32_t pages_per_block = lpc32xx_mlc_pages_per_block();
  uint32_t page_begin = block_index * pages_per_block;

  return is_valid_block(page_begin);
}
rtems_status_code lpc32xx_mlc_erase_block_safe_3(
  uint32_t block_index,
  uint32_t page_begin,
  uint32_t page_end
)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;

  sc = is_valid_block(page_begin);
  if (sc == RTEMS_SUCCESSFUL) {
    sc = lpc32xx_mlc_erase_block(block_index);
    if (sc == RTEMS_UNSATISFIED) {
      lpc32xx_mlc_zero_pages(page_begin, page_end);
    }
  }

  return sc;
}
Beispiel #5
0
static ssize_t erase_test(bdev_t *device)
{
    printf("erasing device...\n");

    ssize_t err = bio_erase(device, 0, device->total_size);
    if (err < 0) {
        return err;
    } else if (err != device->total_size) {
        return ERR_IO;
    }

    printf("validating erase...\n");
    size_t num_invalid_blocks = 0;
    for (bnum_t bnum = 0; bnum < device->block_count; bnum++) {
        if (!is_valid_block(device, bnum, &device->erase_byte, sizeof(device->erase_byte))) {
            num_invalid_blocks++;
        }
    }
    return num_invalid_blocks;
}