qspi_sample.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "rtconfig.h"
  2. #ifdef BSP_USING_QSPI
  3. #include <rtthread.h>
  4. #ifdef RT_USING_SMART
  5. #include <ioremap.h>
  6. #endif
  7. #include "auto_test.h"
  8. #include "rtdevice.h"
  9. #include "drv_qspi.h"
  10. #include "fqspi_flash.h"
  11. #include "fiopad.h"
  12. #include "fqspi_hw.h"
  13. #include "drv_qspi.h"
  14. /*example*/
  15. struct rt_qspi_message qspi_write_message;
  16. struct rt_qspi_message qspi_read_message;
  17. static struct rt_qspi_device *qspi_test_device; /* phytium device bus handle */
  18. rt_err_t qspi_init()
  19. {
  20. rt_err_t res = RT_EOK;
  21. res = phytium_qspi_bus_attach_device("QSPI0", "QSPIDEV");
  22. RT_ASSERT(res == RT_EOK);
  23. qspi_test_device = (struct rt_qspi_device *)rt_device_find("QSPIDEV");
  24. return res;
  25. }
  26. /*write cmd example message improvement*/
  27. rt_err_t qspi_sample()
  28. {
  29. rt_err_t res = RT_EOK;
  30. rt_size_t trans_res = 0;
  31. res = qspi_init();
  32. phytium_qspi_bus *qspi_bus;
  33. qspi_bus = (phytium_qspi_bus *) qspi_test_device->parent.bus->parent.user_data;
  34. /*Read and write flash chip fixed area repeatedly*/
  35. qspi_write_message.address.content = qspi_bus->fqspi.flash_size[0] - 0x100;/*Flash address*/
  36. qspi_write_message.instruction.content = 0x02 ;/*write cmd*/
  37. qspi_write_message.parent.send_buf = "phytium hello world!";
  38. qspi_write_message.parent.length = strlen((char *)qspi_write_message.parent.send_buf) + 1;
  39. rt_qspi_transfer_message(qspi_test_device, &qspi_write_message);
  40. qspi_read_message.address.content = qspi_bus->fqspi.flash_size[0] - 0x100;/*Flash address*/
  41. qspi_read_message.instruction.content = 0x03 ;/*write cmd*/
  42. qspi_read_message.parent.length = 128;/*write cmd*/
  43. qspi_read_message.parent.recv_buf = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * qspi_read_message.parent.length);
  44. trans_res = rt_qspi_transfer_message(qspi_test_device, &qspi_read_message);
  45. if (trans_res != qspi_read_message.parent.length)
  46. {
  47. LOG_E("The qspi read data length is incorrect.\r\n");
  48. res = RT_ERROR;
  49. goto exit;
  50. }
  51. char *send_ptr = (char *)qspi_write_message.parent.send_buf;
  52. char *recv_ptr = (char *)qspi_read_message.parent.recv_buf;
  53. for (int i = 0; i < qspi_write_message.parent.length; i++)
  54. {
  55. if (send_ptr[i] != recv_ptr[i])
  56. {
  57. LOG_E("The qspi read and write data is inconsistent.\r\n");
  58. res = RT_ERROR;
  59. goto exit;
  60. }
  61. }
  62. rt_uint8_t recv;
  63. rt_uint8_t cmd = 0x9F;/*read the flash status reg2*/
  64. rt_qspi_send_then_recv(qspi_test_device, &cmd, sizeof(cmd), &recv, sizeof(recv));
  65. if (recv == 0x0)
  66. {
  67. LOG_E("The status reg is incorrect, recv = %x, res = %x\n", recv, res);
  68. res = RT_ERROR;
  69. goto exit;
  70. }
  71. exit:
  72. /* print message on example run result */
  73. if (res == RT_EOK)
  74. {
  75. rt_kprintf("%s@%d:rtthread qspi flash test example [success].\r\n", __func__, __LINE__);
  76. }
  77. else
  78. {
  79. rt_kprintf("%s@%d:rtthread qspi flash test example [failure], res = %d\r\n", __func__, __LINE__, res);
  80. }
  81. return res;
  82. }
  83. /* Enter qspi_sample command for testing */
  84. MSH_CMD_EXPORT(qspi_sample, qspi sample);
  85. #endif