flash.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Parallel NOR Flash tests
  3. *
  4. * Copyright (c) 2005-2011 Analog Devices Inc.
  5. *
  6. * Licensed under the GPL-2 or later.
  7. */
  8. #if CFG_POST & CFG_SYS_POST_FLASH
  9. #include <common.h>
  10. #include <malloc.h>
  11. #include <post.h>
  12. #include <flash.h>
  13. /*
  14. * This code will walk over the declared sectors erasing them,
  15. * then programming them, then verifying the written contents.
  16. * Possible future work:
  17. * - verify sectors before/after are not erased/written
  18. * - verify partial writes (e.g. programming only middle of sector)
  19. * - verify the contents of the erased sector
  20. * - better seed pattern than 0x00..0xff
  21. */
  22. #ifndef CFG_SYS_POST_FLASH_NUM
  23. # define CFG_SYS_POST_FLASH_NUM 0
  24. #endif
  25. #if CFG_SYS_POST_FLASH_START >= CFG_SYS_POST_FLASH_END
  26. # error "invalid flash block start/end"
  27. #endif
  28. static void *seed_src_data(void *ptr, ulong *old_len, ulong new_len)
  29. {
  30. unsigned char *p;
  31. ulong i;
  32. p = ptr = realloc(ptr, new_len);
  33. if (!ptr)
  34. return ptr;
  35. for (i = *old_len; i < new_len; ++i)
  36. p[i] = i;
  37. *old_len = new_len;
  38. return ptr;
  39. }
  40. int flash_post_test(int flags)
  41. {
  42. ulong len;
  43. void *src;
  44. int ret, n, n_start, n_end;
  45. flash_info_t *info;
  46. /* the output from the common flash layers needs help */
  47. puts("\n");
  48. len = 0;
  49. src = NULL;
  50. info = &flash_info[CFG_SYS_POST_FLASH_NUM];
  51. n_start = CFG_SYS_POST_FLASH_START;
  52. n_end = CFG_SYS_POST_FLASH_END;
  53. for (n = n_start; n < n_end; ++n) {
  54. ulong s_start, s_len, s_off;
  55. s_start = info->start[n];
  56. s_len = flash_sector_size(info, n);
  57. s_off = s_start - info->start[0];
  58. src = seed_src_data(src, &len, s_len);
  59. if (!src) {
  60. printf("malloc(%#lx) failed\n", s_len);
  61. return 1;
  62. }
  63. printf("\tsector %i: %#lx +%#lx", n, s_start, s_len);
  64. ret = flash_erase(info, n, n + 1);
  65. if (ret) {
  66. flash_perror(ret);
  67. break;
  68. }
  69. ret = write_buff(info, src, s_start, s_len);
  70. if (ret) {
  71. flash_perror(ret);
  72. break;
  73. }
  74. ret = memcmp(src, (void *)s_start, s_len);
  75. if (ret) {
  76. printf(" verify failed with %i\n", ret);
  77. break;
  78. }
  79. }
  80. free(src);
  81. return ret;
  82. }
  83. #endif