1+ #include " QSPI.h"
2+
3+ // Define the QSPI flash device - will be available when overlay is active
4+ #if DT_NODE_EXISTS(DT_NODELABEL(qspi_flash))
5+ #define QSPI_FLASH_NODE DT_NODELABEL (qspi_flash)
6+ #define QSPI_FLASH_DEVICE DEVICE_DT_GET (QSPI_FLASH_NODE)
7+ #else
8+ #define QSPI_FLASH_DEVICE NULL
9+ #warning "QSPI flash device not found in device tree"
10+ #endif
11+
12+ QSPIClass::QSPIClass () : flash_dev(nullptr ), initialized(false ) {
13+ }
14+
15+ bool QSPIClass::begin () {
16+ if (QSPI_FLASH_DEVICE == NULL ) {
17+ return false ;
18+ }
19+
20+ flash_dev = QSPI_FLASH_DEVICE;
21+
22+ if (!device_is_ready (flash_dev)) {
23+ flash_dev = nullptr ;
24+ return false ;
25+ }
26+
27+ initialized = true ;
28+ return true ;
29+ }
30+
31+ bool QSPIClass::read (uint32_t address, void * data, size_t size) {
32+ if (!initialized || !flash_dev) {
33+ return false ;
34+ }
35+
36+ int ret = flash_read (flash_dev, address, data, size);
37+ return (ret == 0 );
38+ }
39+
40+ bool QSPIClass::write (uint32_t address, const void * data, size_t size) {
41+ if (!initialized || !flash_dev) {
42+ return false ;
43+ }
44+
45+ int ret = flash_write (flash_dev, address, data, size);
46+ return (ret == 0 );
47+ }
48+
49+ bool QSPIClass::erase (uint32_t address, size_t size) {
50+ if (!initialized || !flash_dev) {
51+ return false ;
52+ }
53+
54+ int ret = flash_erase (flash_dev, address, size);
55+ return (ret == 0 );
56+ }
57+
58+ size_t QSPIClass::getFlashSize () {
59+ if (!initialized || !flash_dev) {
60+ return 0 ;
61+ }
62+
63+ uint64_t size = 0 ;
64+ int ret = flash_get_size (flash_dev, &size);
65+ if (ret != 0 ) {
66+ return 0 ;
67+ }
68+
69+ return (size_t )size;
70+ }
71+
72+ size_t QSPIClass::getSectorSize () {
73+ if (!initialized || !flash_dev) {
74+ return 0 ;
75+ }
76+
77+ struct flash_pages_info page_info;
78+ int ret = flash_get_page_info_by_offs (flash_dev, 0 , &page_info);
79+ if (ret != 0 ) {
80+ return 0 ;
81+ }
82+
83+ return page_info.size ;
84+ }
85+
86+ size_t QSPIClass::getPageSize () {
87+ if (!initialized || !flash_dev) {
88+ return 0 ;
89+ }
90+
91+ const struct flash_parameters *flash_params = flash_get_parameters (flash_dev);
92+ if (!flash_params) {
93+ return 0 ;
94+ }
95+
96+ return flash_params->write_block_size ;
97+ }
98+
99+ bool QSPIClass::isReady () {
100+ if (!flash_dev) {
101+ return false ;
102+ }
103+
104+ return device_is_ready (flash_dev);
105+ }
106+
107+ uint32_t QSPIClass::getFlashID () {
108+ // This would require implementing JEDEC ID reading
109+ // For now, return 0 as placeholder
110+ return 0 ;
111+ }
112+
113+ bool QSPIClass::isValidAddress (uint32_t address, size_t size) {
114+ if (!initialized || !flash_dev) {
115+ return false ;
116+ }
117+
118+ size_t flash_size = getFlashSize ();
119+ return (address + size <= flash_size);
120+ }
121+
122+ void QSPIClass::end () {
123+ flash_dev = nullptr ;
124+ initialized = false ;
125+ }
126+
127+ // Create global instance
128+ QSPIClass QSPI;
0 commit comments