Line data Source code
1 : /* 2 : * This file is free software: you can redistribute it and/or modify it 3 : * under the terms of the GNU General Public License as published by the 4 : * Free Software Foundation, either version 3 of the License, or 5 : * (at your option) any later version. 6 : * 7 : * This file is distributed in the hope that it will be useful, but 8 : * WITHOUT ANY WARRANTY; without even the implied warranty of 9 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 10 : * See the GNU General Public License for more details. 11 : * 12 : * You should have received a copy of the GNU General Public License along 13 : * with this program. If not, see <http://www.gnu.org/licenses/>. 14 : * 15 : * Code by Andy Piper and Siddharth Bharat Purohit 16 : */ 17 : #pragma once 18 : 19 : #include <inttypes.h> 20 : 21 : #include "AP_HAL_Namespace.h" 22 : #include "Device.h" 23 : #include "utility/OwnPtr.h" 24 : 25 : #ifndef HAL_USE_WSPI_DEFAULT_CFG 26 : #define HAL_USE_WSPI_DEFAULT_CFG 1 27 : #endif 28 : 29 : namespace AP_HAL 30 : { 31 : 32 : // Underlying HAL implementation can override these 33 : #if HAL_USE_WSPI_DEFAULT_CFG 34 : namespace WSPI 35 : { 36 : #if HAL_USE_QUADSPI 37 : constexpr uint32_t CFG_CMD_MODE_MASK = (3LU << 8LU); 38 : constexpr uint32_t CFG_CMD_MODE_NONE = (0LU << 8LU); 39 : constexpr uint32_t CFG_CMD_MODE_ONE_LINE = (1LU << 8LU); 40 : constexpr uint32_t CFG_CMD_MODE_TWO_LINES = (2LU << 8LU); 41 : constexpr uint32_t CFG_CMD_MODE_FOUR_LINES = (3LU << 8LU); 42 : 43 : constexpr uint32_t CFG_CMD_SIZE_MASK = 0LU; 44 : constexpr uint32_t CFG_CMD_SIZE_8 = 0LU; 45 : 46 : constexpr uint32_t CFG_ADDR_MODE_MASK = (3LU << 10LU); 47 : constexpr uint32_t CFG_ADDR_MODE_NONE = (0LU << 10LU); 48 : constexpr uint32_t CFG_ADDR_MODE_ONE_LINE = (1LU << 10LU); 49 : constexpr uint32_t CFG_ADDR_MODE_TWO_LINES = (2LU << 10LU); 50 : constexpr uint32_t CFG_ADDR_MODE_FOUR_LINES = (3LU << 10LU); 51 : 52 : constexpr uint32_t CFG_ADDR_SIZE_MASK = (3LU << 12LU); 53 : constexpr uint32_t CFG_ADDR_SIZE_8 = (0LU << 12LU); 54 : constexpr uint32_t CFG_ADDR_SIZE_16 = (1LU << 12LU); 55 : constexpr uint32_t CFG_ADDR_SIZE_24 = (2LU << 12LU); 56 : constexpr uint32_t CFG_ADDR_SIZE_32 = (3LU << 12LU); 57 : 58 : constexpr uint32_t CFG_ALT_MODE_MASK = (3LU << 14LU); 59 : constexpr uint32_t CFG_ALT_MODE_NONE = (0LU << 14LU); 60 : constexpr uint32_t CFG_ALT_MODE_ONE_LINE = (1LU << 14LU); 61 : constexpr uint32_t CFG_ALT_MODE_TWO_LINES = (2LU << 14LU); 62 : constexpr uint32_t CFG_ALT_MODE_FOUR_LINES = (3LU << 14LU); 63 : 64 : constexpr uint32_t CFG_ALT_DDR = (1LU << 31LU); 65 : 66 : constexpr uint32_t CFG_ALT_SIZE_MASK = (3LU << 16LU); 67 : constexpr uint32_t CFG_ALT_SIZE_8 = (0LU << 16LU); 68 : constexpr uint32_t CFG_ALT_SIZE_16 = (1LU << 16LU); 69 : constexpr uint32_t CFG_ALT_SIZE_24 = (2LU << 16LU); 70 : constexpr uint32_t CFG_ALT_SIZE_32 = (3LU << 16LU); 71 : 72 : constexpr uint32_t CFG_DATA_MODE_MASK = (3LU << 24LU); 73 : constexpr uint32_t CFG_DATA_MODE_NONE = (0LU << 24LU); 74 : constexpr uint32_t CFG_DATA_MODE_ONE_LINE = (1LU << 24LU); 75 : constexpr uint32_t CFG_DATA_MODE_TWO_LINES = (2LU << 24LU); 76 : constexpr uint32_t CFG_DATA_MODE_FOUR_LINES = (3LU << 24LU); 77 : 78 : constexpr uint32_t CFG_DATA_DDR = (1LU << 31LU); 79 : 80 : constexpr uint32_t CFG_SIOO = (1LU << 28LU); 81 : #else // OCTOSPI 82 : constexpr uint32_t CFG_CMD_MODE_MASK = (7LU << 0LU); 83 : constexpr uint32_t CFG_CMD_MODE_NONE = (0LU << 0LU); 84 : constexpr uint32_t CFG_CMD_MODE_ONE_LINE = (1LU << 0LU); 85 : constexpr uint32_t CFG_CMD_MODE_TWO_LINES = (2LU << 0LU); 86 : constexpr uint32_t CFG_CMD_MODE_FOUR_LINES = (3LU << 0LU); 87 : constexpr uint32_t CFG_CMD_MODE_EIGHT_LINES = (4LU << 0LU); 88 : 89 : constexpr uint32_t CFG_CMD_SIZE_MASK = (3LU << 4LU); 90 : constexpr uint32_t CFG_CMD_SIZE_8 = (0LU << 4LU); 91 : 92 : constexpr uint32_t CFG_ADDR_MODE_MASK = (7LU << 8LU); 93 : constexpr uint32_t CFG_ADDR_MODE_NONE = (0LU << 8LU); 94 : constexpr uint32_t CFG_ADDR_MODE_ONE_LINE = (1LU << 8LU); 95 : constexpr uint32_t CFG_ADDR_MODE_TWO_LINES = (2LU << 8LU); 96 : constexpr uint32_t CFG_ADDR_MODE_FOUR_LINES = (3LU << 8LU); 97 : constexpr uint32_t CFG_ADDR_MODE_EIGHT_LINES = (4LU << 8LU); 98 : 99 : 100 : constexpr uint32_t CFG_ADDR_SIZE_MASK = (3LU << 12LU); 101 : constexpr uint32_t CFG_ADDR_SIZE_8 = (0LU << 12LU); 102 : constexpr uint32_t CFG_ADDR_SIZE_16 = (1LU << 12LU); 103 : constexpr uint32_t CFG_ADDR_SIZE_24 = (2LU << 12LU); 104 : constexpr uint32_t CFG_ADDR_SIZE_32 = (3LU << 12LU); 105 : 106 : constexpr uint32_t CFG_ALT_MODE_MASK = (7LU << 16LU); 107 : constexpr uint32_t CFG_ALT_MODE_NONE = (0LU << 16LU); 108 : constexpr uint32_t CFG_ALT_MODE_ONE_LINE = (1LU << 16LU); 109 : constexpr uint32_t CFG_ALT_MODE_TWO_LINES = (2LU << 16LU); 110 : constexpr uint32_t CFG_ALT_MODE_FOUR_LINES = (3LU << 16LU); 111 : constexpr uint32_t CFG_ALT_MODE_EIGHT_LINES = (4LU << 16LU); 112 : 113 : constexpr uint32_t CFG_ALT_DDR = (1LU << 19LU); 114 : 115 : constexpr uint32_t CFG_ALT_SIZE_MASK = (3LU << 20LU); 116 : constexpr uint32_t CFG_ALT_SIZE_8 = (0LU << 20LU); 117 : constexpr uint32_t CFG_ALT_SIZE_16 = (1LU << 20LU); 118 : constexpr uint32_t CFG_ALT_SIZE_24 = (2LU << 20LU); 119 : constexpr uint32_t CFG_ALT_SIZE_32 = (3LU << 20LU); 120 : 121 : constexpr uint32_t CFG_DATA_MODE_MASK = (7LU << 24LU); 122 : constexpr uint32_t CFG_DATA_MODE_NONE = (0LU << 24LU); 123 : constexpr uint32_t CFG_DATA_MODE_ONE_LINE = (1LU << 24LU); 124 : constexpr uint32_t CFG_DATA_MODE_TWO_LINES = (2LU << 24LU); 125 : constexpr uint32_t CFG_DATA_MODE_FOUR_LINES = (3LU << 24LU); 126 : constexpr uint32_t CFG_DATA_MODE_EIGHT_LINES= (4LU << 24LU); 127 : 128 : constexpr uint32_t CFG_DATA_DDR = (1LU << 27LU); 129 : 130 : constexpr uint32_t CFG_SIOO = (1LU << 31LU); 131 : #endif // HAL_USE_QUADSPI 132 : } 133 : #endif //#if HAL_USE_WSPI_DEFAULT_CFG 134 : 135 : class WSPIDevice : public Device 136 : { 137 : public: 138 : 139 : WSPIDevice() : Device(BUS_TYPE_WSPI) { } 140 : 141 : /* See AP_HAL::Device::transfer() */ 142 : virtual bool transfer(const uint8_t *send, uint32_t send_len, 143 : uint8_t *recv, uint32_t recv_len) override = 0; 144 : 145 : // Set command header for upcoming transfer call(s) 146 : virtual void set_cmd_header(const CommandHeader& cmd_hdr) override = 0; 147 : 148 : virtual bool is_busy() = 0; 149 : 150 : virtual AP_HAL::Semaphore* get_semaphore() override = 0; 151 : 152 : protected: 153 : uint32_t _trx_flags; 154 : }; 155 : 156 : class WSPIDeviceManager 157 : { 158 : public: 159 0 : virtual OwnPtr<WSPIDevice> get_device(const char *name) 160 : { 161 0 : return nullptr; 162 : } 163 : 164 : /* Return the number of WSPI devices currently registered. */ 165 0 : virtual uint8_t get_count() const 166 : { 167 0 : return 0; 168 : } 169 : 170 : /* Get wspi device name at @idx */ 171 0 : virtual const char *get_device_name(uint8_t idx) const 172 : { 173 0 : return nullptr; 174 : } 175 : }; 176 : 177 : }