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