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; }
// 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; }
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; }