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