spinand_test_frameworks.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include <errno.h>
  2. #include <disk/disk_access.h>
  3. #include "spinand_acts.h"
  4. #include <drivers/spinand.h>
  5. #include <board.h>
  6. #include <dvfs.h>
  7. #include <logging/log.h>
  8. LOG_MODULE_REGISTER(spinand_test_frameworks, CONFIG_FLASH_LOG_LEVEL);
  9. #if (CONFIG_SPINAND_USE_SPICONTROLER == 0)
  10. #define DC_MAX 64
  11. #else
  12. #define DC_MAX 32
  13. #endif
  14. #define SECTOR_SIZE 512
  15. #define PAGE_SIZE 2048
  16. static uint8_t in_buf[PAGE_SIZE], out_buf[PAGE_SIZE];
  17. static uint8_t result[DC_MAX];
  18. #include <drivers/flash.h>
  19. #include <partition/partition.h>
  20. uint32_t get_udisk_offset(void)
  21. {
  22. const struct partition_entry *parti;
  23. #ifdef CONFIG_BOARD_NANDBOOT
  24. parti = partition_get_stf_part(STORAGE_ID_BOOTNAND, PARTITION_FILE_ID_UDISK);
  25. #else
  26. parti = partition_get_stf_part(STORAGE_ID_NAND, PARTITION_FILE_ID_UDISK);
  27. #endif
  28. if (parti != NULL) {
  29. LOG_INF("udisk offset=0x%x secotr\n", parti->offset);
  30. return (parti->offset);
  31. }
  32. LOG_ERR("get udisk offset err!\n");
  33. return 0;
  34. }
  35. uint32_t get_udisk_size(void)
  36. {
  37. const struct partition_entry *parti;
  38. #ifdef CONFIG_BOARD_NANDBOOT
  39. parti = partition_get_stf_part(STORAGE_ID_BOOTNAND, PARTITION_FILE_ID_UDISK);
  40. #else
  41. parti = partition_get_stf_part(STORAGE_ID_NAND, PARTITION_FILE_ID_UDISK);
  42. #endif
  43. if (parti != NULL) {
  44. LOG_INF("udisk size=0x%x\n", parti->size);
  45. return (parti->size);
  46. }
  47. LOG_ERR("get udisk size err!\n");
  48. return 0;
  49. }
  50. extern int spinand_get_chipid(struct spinand_info *sni, u32_t *chipid);
  51. extern int get_storage_params(struct spinand_info *sni, u8_t *id, struct FlashChipInfo **ChipInfo);
  52. int spinand_scan_delaychain(const struct device *dev)
  53. {
  54. int i = 0;
  55. uint8_t j = 0;
  56. uint8_t sum = 0;
  57. uint8_t ret = 0;
  58. uint8_t tmp_buf[SECTOR_SIZE];
  59. uint8_t dl = 0;
  60. int dvfs_level = 0;
  61. uint8_t spi_clk = 0;
  62. uint8_t min_dc = 0;
  63. uint8_t max_dc = 0;
  64. struct spinand_info *sni = DEV_DATA(dev);
  65. uint8_t old_dc = sni->spi->delay_chain;
  66. uint32_t chipid = 0;
  67. struct FlashChipInfo *NandFlashInfo;
  68. u32_t offset = get_udisk_offset();
  69. u32_t len = SECTOR_SIZE;
  70. struct k_mutex mutex;
  71. k_mutex_init(&mutex);
  72. memset(result, 0x0, DC_MAX);
  73. memset(tmp_buf, 0x0, SECTOR_SIZE);
  74. memset(in_buf, 0x0, SECTOR_SIZE);
  75. k_mutex_lock(&mutex, K_FOREVER);
  76. #ifndef CONFIG_SPINAND_LIB
  77. p_spinand_api->read(sni, offset >> 9, tmp_buf, len >> 9);
  78. #else
  79. spinand_read(sni, offset >> 9, tmp_buf, len >> 9);
  80. #endif
  81. k_mutex_unlock(&mutex);
  82. //fill one sector data
  83. for (i = 0; i < SECTOR_SIZE; i++) {
  84. in_buf[i] = (uint8_t)i;
  85. }
  86. dvfs_lock();
  87. for (dl = 20; dl <= DVFS_LEVEL_HIGH_PERFORMANCE; (dl=dl+10)) {
  88. #ifdef CONFIG_DVFS
  89. dvfs_level = dvfs_get_current_level();
  90. dvfs_force_unset_level(dvfs_level, "monkey");
  91. dvfs_force_set_level(dl, "monkey");
  92. #endif
  93. if (dl >= DVFS_LEVEL_MID_PERFORMANCE)
  94. spi_clk = CONFIG_SPINAND_FLASH_FREQ_MHZ;
  95. else
  96. spi_clk = 64;
  97. k_mutex_lock(&mutex, K_FOREVER);
  98. clk_set_rate(CLOCK_ID_SPI0+CONFIG_SPINAND_USE_SPICONTROLER, MHZ(spi_clk));
  99. k_mutex_unlock(&mutex);
  100. min_dc = 0;
  101. max_dc = 0;
  102. for (i = 0; i < DC_MAX; i++)
  103. {
  104. sni->spi->delay_chain = i;
  105. if (spinand_get_chipid(sni, &chipid) != 0) {
  106. printk("delay_chain:%d; spinand get chipid err!\n", i);
  107. continue;
  108. }
  109. if (get_storage_params(sni, (u8_t *)&chipid, &NandFlashInfo) != 0) {
  110. printk("delay_chain:%d; Can't get flashinfo.\n", i);
  111. continue;
  112. }
  113. printk("spinand chipid: 0x%x; chipname: %s; delay_chain: %d \n", chipid, NandFlashInfo->FlashMark, i);
  114. k_mutex_lock(&mutex, K_FOREVER);
  115. ret = spinand_write(sni, offset >> 9, in_buf, len >> 9);
  116. k_mutex_unlock(&mutex);
  117. if (ret != 0) {
  118. printk("delaychain=%d fail!\n", i);
  119. result[i] = 0;
  120. continue;
  121. }
  122. memset(out_buf, 0x0, SECTOR_SIZE);
  123. k_mutex_lock(&mutex, K_FOREVER);
  124. spinand_read(sni, offset >> 9, out_buf, len >> 9);
  125. k_mutex_unlock(&mutex);
  126. ret = memcmp(out_buf, in_buf, SECTOR_SIZE);
  127. if (ret != 0) {
  128. printk("delaychain=%d fail!\n", i);
  129. result[i] = 0;
  130. continue;
  131. }
  132. printk("delaychain=%d pass!\n", i);
  133. result[i] = 1;
  134. if (min_dc == 0)
  135. min_dc = i;
  136. max_dc = i;
  137. }
  138. printk("spinand scan delaychain result:\n");
  139. for (i = 0; i < DC_MAX; i++) {
  140. printk("[%d]=%d\r\n", i, result[i]);
  141. if (result[i] == 1) {
  142. j += 1;
  143. sum += i;
  144. }
  145. }
  146. if (j != 0) {
  147. printk("spinand best delaychain is(dvfs_level=%d; spi_clk=%d): %d; old delaychain before test is: %d \n", dl, spi_clk, (min_dc+max_dc)/2, old_dc);
  148. //writeback udisk sector.
  149. k_mutex_lock(&mutex, K_FOREVER);
  150. spinand_write(sni, offset >> 9, tmp_buf, len >> 9);
  151. k_mutex_unlock(&mutex);
  152. sni->spi->delay_chain = old_dc;
  153. } else {
  154. printk("spinand scan delaychain failed! get all delaychain is 0!\n");
  155. }
  156. }
  157. dvfs_unlock();
  158. return 0;
  159. }
  160. int spinand_manual_flush(const struct device *dev)
  161. {
  162. struct spinand_info *sni = DEV_DATA(dev);
  163. struct k_mutex mutex;
  164. k_mutex_init(&mutex);
  165. k_mutex_lock(&mutex, K_FOREVER);
  166. #ifndef CONFIG_SPINAND_LIB
  167. p_spinand_api->flush(sni);
  168. #else
  169. spinand_flush(sni, 0);
  170. #endif
  171. k_mutex_lock(&mutex, K_FOREVER);
  172. return 0;
  173. }