qspi_sample.c 3.0 KB

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