самопильный ХАЛ над библиотекой milandr SPL. позиционируется наличие порта порт на STM32 SPL.
Revisión | 1054648fa1b755a13e90f03ebf29688c945580c4 (tree) |
---|---|
Tiempo | 2022-06-27 02:24:09 |
Autor | alexrayne <alexraynepe196@gmai...> |
Commiter | alexrayne |
!hal: warns typo
@@ -31,9 +31,10 @@ | ||
31 | 31 | POSSIBILITY OF SUCH DAMAGE. * |
32 | 32 | */ |
33 | 33 | |
34 | +#include <string.h> | |
34 | 35 | #include "flash_hal.h" |
35 | 36 | #include "ptx.h" |
36 | -#include <string.h> | |
37 | +#include "OsProcess.h" | |
37 | 38 | |
38 | 39 | |
39 | 40 | ///////////////////////////////////////////////////////////////////////////////// |
@@ -108,9 +109,11 @@ | ||
108 | 109 | this->info = x; |
109 | 110 | this->_sec_size = flashchip_sec_size(x); |
110 | 111 | this->_size = flashchip_chip_size(x); |
112 | + ASSERT(this->_sec_size > 0); | |
111 | 113 | this->sec_width = ctz(this->_sec_size); |
112 | 114 | } |
113 | 115 | |
116 | + | |
114 | 117 | // \return true - if addr ... + len places in one page |
115 | 118 | bool flash_in_single_page(const FLASH_Device* this, flash_addr_t addr, unsigned len){ |
116 | 119 | //!!!WARN: этот код работает только со страницами размера 2^n |
@@ -263,7 +266,7 @@ | ||
263 | 266 | // цикл над многими страницами некоторой базовой операции. |
264 | 267 | // !!! пересечения page границы памяти ведет к заворачиванию адреса |
265 | 268 | PTResult flash_cycles(FLASH_Device* this){ |
266 | - DevResult res = ptOK; | |
269 | + FlashState res = ptOK; | |
267 | 270 | FlashCycling* me = &this->cycx; |
268 | 271 | struct pt* pt = &me->pt; |
269 | 272 |
@@ -280,7 +283,7 @@ | ||
280 | 283 | if (!flash_is_status(res)) |
281 | 284 | PT_RESULT(pt, AS_PTRESULT(res) ); |
282 | 285 | if (!flash_is_ready(res)) |
283 | - PT_RESULT(pt, res); | |
286 | + PT_RESULT(pt, AS_PTRESULT(res) ); | |
284 | 287 | |
285 | 288 | } //if ((me->len > 0) && (me->cycle_to > 0)) |
286 | 289 |
@@ -292,7 +295,7 @@ | ||
292 | 295 | if (!flash_is_status(res)) |
293 | 296 | PT_RESULT(pt, AS_PTRESULT(res) ); |
294 | 297 | if (!flash_is_ready(res)) |
295 | - PT_RESULT(pt, res); | |
298 | + PT_RESULT(pt, AS_PTRESULT(res) ); | |
296 | 299 | } |
297 | 300 | else { |
298 | 301 | PT_SCHEDULE_RESULT_WHILE( pt, res, this->flush(this) ); |
@@ -310,8 +313,8 @@ | ||
310 | 313 | trace_flash_pause_twist(); |
311 | 314 | |
312 | 315 | // отдам процессор другим ниткам |
313 | - process_post_pause(); | |
314 | - PT_YIELD(pt); | |
316 | + PT_PAUSE(pt); | |
317 | + //PT_YIELD(pt); | |
315 | 318 | } |
316 | 319 | } |
317 | 320 | } |
@@ -408,18 +411,24 @@ | ||
408 | 411 | } |
409 | 412 | |
410 | 413 | DevResult flash_bind_dummy(FLASH_Device* this){ |
414 | + (void)this; | |
411 | 415 | return DEV_NOT_IMPLEMENTED; |
412 | 416 | } |
413 | 417 | |
414 | 418 | PTResult flash_flush_dummy(FLASH_Device* this){ |
419 | + (void)this; | |
415 | 420 | return ptOK; |
416 | 421 | } |
417 | 422 | |
418 | 423 | PTResult flash_protect_sectors_dummy(FLASH_Device* this, flash_addr_t addr, unsigned len, bool onoff){ |
424 | + (void)this; (void)addr; (void)len; (void)onoff; | |
419 | 425 | return ptOK; |
420 | 426 | } |
421 | 427 | |
422 | -DevResult flash_select_addr_dummy(FLASH_Device* this, flash_addr_t addr){ return DEV_OK; } | |
428 | +DevResult flash_select_addr_dummy(FLASH_Device* this, flash_addr_t addr){ | |
429 | + (void)this; (void)addr; | |
430 | + return DEV_OK; | |
431 | +} | |
423 | 432 | |
424 | 433 | |
425 | 434 | void flash_init(FLASH_Device* this){ |
@@ -54,6 +54,9 @@ | ||
54 | 54 | |
55 | 55 | |
56 | 56 | typedef uint32_t flash_addr_t; |
57 | +//typedef uint64_t flashsize_t; | |
58 | +typedef flash_addr_t flashsize_t; | |
59 | + | |
57 | 60 | typedef flash_addr_t flash_page_t; |
58 | 61 | typedef flash_page_t flash_sector_t; |
59 | 62 |
@@ -232,7 +235,6 @@ | ||
232 | 235 | flash_timeout_t erase_all_ticks; |
233 | 236 | }; |
234 | 237 | typedef struct FlashChipDescribe FlasChiphDescribe; |
235 | -typedef uint64_t flashsize_t; | |
236 | 238 | |
237 | 239 | static inline |
238 | 240 | unsigned flashchip_sec_size(const FlasChiphDescribe* x) {return x->page_size * x->nb_pages_in_sector;}; |
@@ -59,9 +59,15 @@ | ||
59 | 59 | #endif |
60 | 60 | |
61 | 61 | |
62 | -DevResult flashi2c_write_enable(FLASH_Device* self, bool onoff){ return DEV_NOT_IMPLEMENTED; } | |
63 | -DevResult flashi2c_erase_all(FLASH_Device* self) { return DEV_NOT_IMPLEMENTED; } | |
64 | -PTResult flashi2c_erase_sectors(FLASH_Device* self, flash_addr_t sec, unsigned len) { return DEV_NOT_IMPLEMENTED; } | |
62 | +DevResult flashi2c_write_enable(FLASH_Device* self, bool onoff){ | |
63 | + (void)self; (void)onoff; | |
64 | + return DEV_NOT_IMPLEMENTED; | |
65 | +} | |
66 | +DevResult flashi2c_erase_all(FLASH_Device* self) { (void)self; return DEV_NOT_IMPLEMENTED; } | |
67 | +PTResult flashi2c_erase_sectors(FLASH_Device* self, flash_addr_t sec, unsigned len) { | |
68 | + (void)self; (void)sec; (void)len; | |
69 | + return DEV_NOT_IMPLEMENTED; | |
70 | +} | |
65 | 71 | |
66 | 72 | |
67 | 73 |
@@ -209,11 +209,13 @@ | ||
209 | 209 | } |
210 | 210 | |
211 | 211 | DevResult flashspi_erase_sec(FLASH_Device* self, void* dst, flash_page_t page, unsigned len){ |
212 | + (void)dst;(void)len; | |
212 | 213 | SPIFlash_GenDevice* this = (SPIFlash_GenDevice*)self; |
213 | 214 | return flashspi_wr_cmd1(self, page, this->CMD_SE); |
214 | 215 | } |
215 | 216 | |
216 | 217 | DevResult flashspi_erase_64k(FLASH_Device* self, void* dst, flash_page_t page, unsigned len){ |
218 | + (void)dst;(void)len; | |
217 | 219 | return flashspi_wr_cmd1(self, page, FLASH_CMD_SE_64K); |
218 | 220 | } |
219 | 221 |
@@ -280,10 +282,12 @@ | ||
280 | 282 | ////////////////////////////////////////////////////////////////////////////////////////// |
281 | 283 | |
282 | 284 | DevResult eepromspi_erase_all_dummy(FLASH_Device* this){ |
285 | + (void)this; | |
283 | 286 | return DEV_OK; |
284 | 287 | } |
285 | 288 | |
286 | 289 | PTResult eepromspi_erase_sectors_dummy(FLASH_Device* self, flash_addr_t sec, unsigned len){ |
290 | + (void)self; (void)sec; (void)len; | |
287 | 291 | return ptOK; |
288 | 292 | } |
289 | 293 |
@@ -469,12 +473,14 @@ | ||
469 | 473 | } |
470 | 474 | |
471 | 475 | DevResult wre_flashspi_erase_sec(FLASH_Device* self, void* dst, flash_page_t page, unsigned len){ |
476 | + (void)dst; (void)len; | |
472 | 477 | SPIFlash_WritableDevice* this = (SPIFlash_WritableDevice*)self; |
473 | 478 | |
474 | 479 | return wre_flashspi_wr_cmd1(self, page, this->CMD_SE); |
475 | 480 | } |
476 | 481 | |
477 | 482 | DevResult wre_flashspi_erase_64k(FLASH_Device* self, void* dst, flash_page_t page, unsigned len){ |
483 | + (void)dst; (void)len; | |
478 | 484 | return wre_flashspi_wr_cmd1(self, page, FLASH_CMD_SE_64K); |
479 | 485 | } |
480 | 486 |
@@ -80,7 +80,7 @@ | ||
80 | 80 | SSP_IODevice ssp; |
81 | 81 | |
82 | 82 | // protected: |
83 | - int CMD_SE; //CMD_SE selected by chip conf | |
83 | + uint8_t CMD_SE; //CMD_SE selected by chip conf | |
84 | 84 | |
85 | 85 | // все сложные операции имеют контекст своей работы, он здесь |
86 | 86 | union ctx_t { |
@@ -23,7 +23,7 @@ | ||
23 | 23 | ////////////////////////////////////////////////////////////////////////////////////// |
24 | 24 | /// SSP_IOPort API |
25 | 25 | |
26 | -#include "sys/process.h" | |
26 | +#include "OsProcess.h" | |
27 | 27 | |
28 | 28 | void ssp_signal_to_me(SSP_IOPort* this){ |
29 | 29 | this->msg_signal = PROCESS_CURRENT(); |
@@ -48,7 +48,7 @@ | ||
48 | 48 | return io->wait(io, &this->ssp_msg, to); |
49 | 49 | }; |
50 | 50 | |
51 | -void sspio_msg_assign_buf(SSP_Client* this, size_t words){ | |
51 | +void sspio_msg_assign_buf(SSP_Client* this, uint16_t words){ | |
52 | 52 | this->ssp_msg.dst = this->ssp_buf; |
53 | 53 | this->ssp_msg.src = this->ssp_buf; |
54 | 54 | this->ssp_msg.word_count = words; |
@@ -112,7 +112,7 @@ | ||
112 | 112 | |
113 | 113 | if (wok==ptOK) |
114 | 114 | return DEV_OK; |
115 | - return wok; //DEV_NOK; | |
115 | + return (DevResult)wok; //DEV_NOK; | |
116 | 116 | } |
117 | 117 | |
118 | 118 |
@@ -123,20 +123,20 @@ | ||
123 | 123 | |
124 | 124 | // функции настройки ssp_msg |
125 | 125 | inline static |
126 | -void msg_bytes(SSP_IODevice* this, void *data, const void *src, size_t words){ | |
126 | +void msg_bytes(SSP_IODevice* this, void *data, const void *src, unsigned words){ | |
127 | 127 | sspio_msg_assign_head(&this->io, NULL, 0); // cleanup head |
128 | - sspio_msg_assign(&this->io, data, src, words); | |
128 | + sspio_msg_assign(&this->io, data, src, (uint16_t)words); | |
129 | 129 | }; |
130 | 130 | |
131 | 131 | // функции настройки ssp_msg |
132 | 132 | inline static |
133 | -void msg_data_bytes(SSP_IODevice* this, void *data, const void *src, size_t words){ | |
134 | - sspio_msg_assign(&this->io, data, src, words); | |
133 | +void msg_data_bytes(SSP_IODevice* this, void *data, const void *src, unsigned words){ | |
134 | + sspio_msg_assign(&this->io, data, src, (uint16_t)words); | |
135 | 135 | }; |
136 | 136 | |
137 | 137 | inline static |
138 | -void msg_head_bytes(SSP_IODevice* this, const void *src, size_t words){ | |
139 | - sspio_msg_assign_head(&this->io, src, words); | |
138 | +void msg_head_bytes(SSP_IODevice* this, const void *src, int words){ | |
139 | + sspio_msg_assign_head(&this->io, src, (uint8_t)words); | |
140 | 140 | }; |
141 | 141 | |
142 | 142 | // return adress bytes adjusted by adress style |
@@ -218,7 +218,7 @@ | ||
218 | 218 | address = bswap32(address); |
219 | 219 | } |
220 | 220 | this->io.ssp_words[0] = (address << 8) | cmd; |
221 | - this->io.ssp_buf[5] = (address>>24); | |
221 | + this->io.ssp_buf[5] = (uint8_t)(address>>24); | |
222 | 222 | msg_bytes(this, NULL, this->io.ssp_buf, 5); |
223 | 223 | return sspdev_trx(this); |
224 | 224 | } |
@@ -291,7 +291,7 @@ | ||
291 | 291 | address = bswap32(address); |
292 | 292 | } |
293 | 293 | this->io.ssp_words[0] = (address << 8) | cmd; |
294 | - this->io.ssp_buf[5] = (address>>24); | |
294 | + this->io.ssp_buf[5] = (uint8_t)(address>>24); | |
295 | 295 | } |
296 | 296 | } |
297 | 297 |
@@ -73,53 +73,53 @@ | ||
73 | 73 | enum SSPModeStyleID{ |
74 | 74 | // Полярность линии синхроимпульсов. Если флаг не задан, то в режиме ожидания |
75 | 75 | // линия переводится в низкий уровень; если задан, то в высокий. |
76 | - SSP_msCPOL = 1 | |
77 | - , SSP_msCLKHI = SSP_msCPOL, SSP_msCLKLO = 0 | |
76 | + SSP_msCPOL = 1u | |
77 | + , SSP_msCLKHI = SSP_msCPOL, SSP_msCLKLO = 0u | |
78 | 78 | // Выбор фронта синхроимпульса, по которому осуществляется выборка данных. |
79 | 79 | // Если CPOL не задан, то при заданном CPHA - по заднему, при незаданном - по |
80 | 80 | // переднему. Если CPOL задан, то при заданном CPHA - по переднему, при |
81 | 81 | // незаданном - по заднему. |
82 | - , SSP_msCPHA = 2 | |
83 | - , SSP_msCLKFALL = SSP_msCPHA, SSP_msCLKRISE = 0 | |
82 | + , SSP_msCPHA = 2u | |
83 | + , SSP_msCLKFALL = SSP_msCPHA, SSP_msCLKRISE = 0u | |
84 | 84 | // Выбор порядка следования бит на линиях данных. Если флаг не задан, то |
85 | 85 | // первый передаётся старший бит, иначе младший бит. |
86 | 86 | // !!! При несовпадении этого порядка, с поддерживаемым устройством, |
87 | 87 | // драйвер может попробовать инвертировать порядок в исходных отсылаемых/принимаемых |
88 | 88 | // данных |
89 | - , SSP_msENDIAN = 4 | |
89 | + , SSP_msENDIAN = 4u | |
90 | 90 | , SSP_msLSB_FIRST = SSP_msENDIAN |
91 | - , SSP_msMSB_FIRST = 0 | |
91 | + , SSP_msMSB_FIRST = 0u | |
92 | 92 | |
93 | 93 | // Поведение линии выбора устройства после передачи сообщения. Если флаг не |
94 | 94 | // задан, то линия переходит в неактивное состояние автоматически. Иначе |
95 | 95 | // остаётся активным до передачи сообщения, в поле mode которого будет |
96 | 96 | // отсутствовать этот флаг. |
97 | - , SSP_msCS_HOLD = 8 | |
97 | + , SSP_msCS_HOLD = 8u | |
98 | 98 | |
99 | 99 | //маска режима SPI |
100 | - , SSP_msMASK = 0xff | |
100 | + , SSP_msMASK = 0xffu | |
101 | 101 | |
102 | 102 | //селектор CS абонента |
103 | - , SSP_msCS_Msk = 0xff00, SSP_msCS_Pos = 8 | |
104 | - , SSP_msCS1 = 1 << SSP_msCS_Pos | |
103 | + , SSP_msCS_Msk = 0xff00u, SSP_msCS_Pos = 8u | |
104 | + , SSP_msCS1 = 1u << SSP_msCS_Pos | |
105 | 105 | // CS == 0 - использую чтобы снять все активные CS |
106 | - , SSP_msCS_NONE = 0 | |
106 | + , SSP_msCS_NONE = 0u | |
107 | 107 | // CS == ~0 - нереальный CS, не управляет линией CS, |
108 | 108 | , SSP_msCS_KEEP = SSP_msCS_Msk |
109 | 109 | |
110 | 110 | // количество бит в слове |
111 | - , SSP_msNB_Msk = 0xff0000, SSP_msNB_Pos = 16 | |
112 | - , SSP_msNB_KEEP = 0 | |
113 | - , SSP_msNB8 = (8<<SSP_msNB_Pos) | |
114 | - , SSP_msNB16 = (16<<SSP_msNB_Pos) | |
111 | + , SSP_msNB_Msk = 0xff0000u, SSP_msNB_Pos = 16u | |
112 | + , SSP_msNB_KEEP = 0u | |
113 | + , SSP_msNB8 = (8u<<SSP_msNB_Pos) | |
114 | + , SSP_msNB16 = (16u<<SSP_msNB_Pos) | |
115 | 115 | |
116 | 116 | |
117 | 117 | /// @brief SSP I2C specific flags. |
118 | 118 | // sspdev_touch use empty msg - with no send/recv data. |
119 | 119 | // this flag choose what i2c SLA operation use - RD/WR |
120 | - , SSPI2C_TOUCH = 1, | |
121 | - SSPI2C_TOUCH_RD = 0, | |
122 | - SSPI2C_TOUCH_WR = 1, | |
120 | + , SSPI2C_TOUCH = 1u, | |
121 | + SSPI2C_TOUCH_RD = 0u, | |
122 | + SSPI2C_TOUCH_WR = 1u, | |
123 | 123 | |
124 | 124 | }; |
125 | 125 | static inline unsigned ssp_as_msNB(unsigned bits) {return (bits << SSP_msNB_Pos)& SSP_msNB_Msk;}; |
@@ -129,7 +129,7 @@ | ||
129 | 129 | |
130 | 130 | enum SSPSpeedID{ |
131 | 131 | // \ value == 0 , not affect speed |
132 | - SSP_speedKEEP = 0 | |
132 | + SSP_speedKEEP = 0u | |
133 | 133 | , SSP_speedMAX = ~0u |
134 | 134 | }; |
135 | 135 |
@@ -171,7 +171,7 @@ | ||
171 | 171 | |
172 | 172 | // функции настройки ssp_msg |
173 | 173 | static inline |
174 | -void sspmsg_assign(SSPMessage* this, void *data, const void *src, size_t words){ | |
174 | +void sspmsg_assign(SSPMessage* this, void *data, const void *src, uint16_t words){ | |
175 | 175 | this->dst = data; |
176 | 176 | this->src = src; |
177 | 177 | this->word_count = words; |
@@ -179,7 +179,7 @@ | ||
179 | 179 | |
180 | 180 | // функции настройки ssp_msg |
181 | 181 | static inline |
182 | -void sspmsg_assign_head(SSPMessage* this, const void *head, size_t words){ | |
182 | +void sspmsg_assign_head(SSPMessage* this, const void *head, uint8_t words){ | |
183 | 183 | this->head = head; |
184 | 184 | this->head_count = words; |
185 | 185 | }; |
@@ -322,7 +322,7 @@ | ||
322 | 322 | if (onoff) |
323 | 323 | this->ssp_msg.mode |= SSP_msCS_HOLD; |
324 | 324 | else |
325 | - this->ssp_msg.mode &= ~SSP_msCS_HOLD; | |
325 | + this->ssp_msg.mode &= (unsigned)~SSP_msCS_HOLD; | |
326 | 326 | }; |
327 | 327 | |
328 | 328 |
@@ -335,7 +335,7 @@ | ||
335 | 335 | |
336 | 336 | // функции настройки ssp_msg |
337 | 337 | static inline |
338 | -void sspio_msg_assign(SSP_Client* this, void *data, const void *src, size_t words){ | |
338 | +void sspio_msg_assign(SSP_Client* this, void *data, const void *src, uint16_t words){ | |
339 | 339 | this->ssp_msg.dst = data; |
340 | 340 | this->ssp_msg.src = src; |
341 | 341 | this->ssp_msg.word_count = words; |
@@ -343,12 +343,12 @@ | ||
343 | 343 | |
344 | 344 | // функции настройки ssp_msg |
345 | 345 | static inline |
346 | -void sspio_msg_assign_head(SSP_Client* this, const void *head, size_t words){ | |
346 | +void sspio_msg_assign_head(SSP_Client* this, const void *head, uint8_t words){ | |
347 | 347 | this->ssp_msg.head = head; |
348 | 348 | this->ssp_msg.head_count = words; |
349 | 349 | }; |
350 | 350 | |
351 | -void sspio_msg_assign_buf(SSP_Client* this, size_t words); | |
351 | +void sspio_msg_assign_buf(SSP_Client* this, uint16_t words); | |
352 | 352 | |
353 | 353 | // функции отправки ssp_msg -> io() |
354 | 354 | // @return - bytes sent, msg->word_count |